CustusX  16.12
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxDataManagerImpl.cpp
Go to the documentation of this file.
1 /*=========================================================================
2 This file is part of CustusX, an Image Guided Therapy Application.
3 
4 Copyright (c) 2008-2014, SINTEF Department of Medical Technology
5 All rights reserved.
6 
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9 
10 1. Redistributions of source code must retain the above copyright notice,
11  this list of conditions and the following disclaimer.
12 
13 2. Redistributions in binary form must reproduce the above copyright notice,
14  this list of conditions and the following disclaimer in the documentation
15  and/or other materials provided with the distribution.
16 
17 3. Neither the name of the copyright holder nor the names of its contributors
18  may be used to endorse or promote products derived from this software
19  without specific prior written permission.
20 
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 =========================================================================*/
32 
33 
34 #include "cxDataManagerImpl.h"
35 
36 #include <QtCore>
37 #include <QDomDocument>
38 #include <QFileInfo>
39 #include <QFile>
40 #include <QTextStream>
41 #include <QDir>
42 
43 #include "cxTransform3D.h"
45 #include "cxLogger.h"
46 #include "cxTypeConversions.h"
47 #include "cxUtilHelpers.h"
48 #include "cxVideoSource.h"
49 #include "cxDataLocations.h"
50 
51 #include "cxImageLUT2D.h"
52 #include "cxImageTF3D.h"
53 
54 #include "cxDataReaderWriter.h"
55 #include "cxSpaceProvider.h"
56 #include "cxDataFactory.h"
57 
58 #include "cxXmlOptionItem.h"
60 #include "cxProfile.h"
61 #include "cxSettings.h"
62 #include "cxDefinitionStrings.h"
63 #include "cxActiveData.h"
64 
65 
66 namespace cx
67 {
68 
70 {
71  DataManagerImplPtr retval;
72  retval.reset(new DataManagerImpl(activeData));
73  return retval;
74 }
75 
77  mClinicalApplication(mdNEUROLOGICAL),
78  mActiveData(activeData)
79 {
83 
84  connect(settings(), SIGNAL(valueChangedFor(QString)), this, SLOT(settingsChangedSlot(QString)));
85  this->readClinicalView();
86 
87  this->clear();
88 }
89 
91 {
92 }
93 
95 {
97 }
98 
100 {
101  mDataFactory = dataFactory;
102 }
103 
105 {
106  return mSpaceProvider;
107 }
108 
110 {
111  return mDataFactory;
112 }
113 
115 {
116  mData.clear();
117  mCenter = Vector3D(0, 0, 0);
118  mLandmarkProperties.clear();
119 
120  m_rMpr_History->clear();
121  mPatientLandmarks->clear();
122 
123  emit dataAddedOrRemoved();
124  emit centerChanged();
126 }
127 
129 {
130  return mPatientLandmarks;
131 }
132 
133 // streams
135 {
136  if (mStreams.count(uid))
137  return mStreams.find(uid)->second;
138  return VideoSourcePtr();
139 }
140 
142 {
143  return mStreams;
144 }
145 
147 {
148  if (!stream)
149  return;
150  mStreams[stream->getUid()] = stream;
151  emit streamLoaded();
152 }
153 
154 std::map<QString, VideoSourcePtr> mStreams;
155 
157 {
158  return mCenter;
159 }
161 {
162  if (similar(mCenter, center))
163  return;
164  mCenter = center;
165  emit centerChanged();
166 }
167 
169 {
170  mOperatingTable = ot;
171  emit operatingTableChanged();
172 }
173 
175 {
176  return mOperatingTable;
177 }
178 
179 
180 void DataManagerImpl::setLandmarkNames(std::vector<QString> names)
181 {
182  mLandmarkProperties.clear();
183  for (unsigned i = 0; i < names.size(); ++i)
184  {
185  LandmarkProperty prop(qstring_cast(i + 1), names[i]); // generate 1-indexed uids (keep users happy)
186  mLandmarkProperties[prop.getUid()] = prop;
187  }
189 }
190 
192 {
193  int max = 0;
194  std::map<QString, LandmarkProperty>::iterator iter;
195  for (iter = mLandmarkProperties.begin(); iter != mLandmarkProperties.end(); ++iter)
196  {
197  //max = std::max(max, qstring_cast(iter->second.getName()).toInt());
198  max = std::max(max, qstring_cast(iter->first).toInt());
199  }
200  QString uid = qstring_cast(max + 1);
202 
204  return uid;
205 }
206 
207 void DataManagerImpl::setLandmarkName(QString uid, QString name)
208 {
209  mLandmarkProperties[uid].setName(name);
211 }
212 
213 std::map<QString, LandmarkProperty> DataManagerImpl::getLandmarkProperties() const
214 {
215  return mLandmarkProperties;
216 }
217 
218 void DataManagerImpl::setLandmarkActive(QString uid, bool active)
219 {
220  mLandmarkProperties[uid].setActive(active);
222 }
223 
224 DataPtr DataManagerImpl::loadData(const QString& uid, const QString& path)
225 {
226  if (mData.count(uid)) // dont load same image twice
227  return mData[uid];
228 
229  QString type = DataReaderWriter().findDataTypeFromFile(path);
230  if(!mDataFactory)
231  reportError("DataManagerImpl::loadData() Got no DataFactory");
232  DataPtr data = mDataFactory->create(type, uid);
233 
234  if (!data)
235  {
236  reportError("Failed to find loaded for: [" + path + "]");
237  return DataPtr();
238  }
239 
240  bool loaded = data->load(path);
241 
242  if (!loaded)
243  {
244  reportError("Failed to load file: [" + path + "]");
245  return DataPtr();
246  }
247 
248  this->loadData(data);
249  return data;
250 }
251 
253 {
254  if (data->getUid().contains('%'))
255  {
256  QString uid = data->getUid();
257  QString name = data->getName();
258  this->generateUidAndName(&uid, &name);
259  data->setName(name);
260  data->setUid(uid);
261  }
262 
263  if (data)
264  {
265  if (mData.count(data->getUid()) && mData[data->getUid()]!=data)
266  reportError(QString("Overwriting Data with uid=%1 with new object into PasM").arg(data->getUid()));
267 // this->verifyParentFrame(data);
268  mData[data->getUid()] = data;
269  emit dataAddedOrRemoved();
270  }
271 }
272 
273 DataPtr DataManagerImpl::getData(const QString& uid) const
274 {
275  DataMap::const_iterator iter = mData.find(uid);
276  if (iter == mData.end())
277  return DataPtr();
278  return iter->second;
279 }
280 
281 std::map<QString, DataPtr> DataManagerImpl::getData() const
282 {
283  return mData;
284 }
285 
286 std::map<QString, ImagePtr> DataManagerImpl::getImages() const
287 {
288  std::map<QString, ImagePtr> retval;
289  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
290  {
291  ImagePtr image = this->getImage(iter->first);
292  if (!image)
293  continue;
294  retval[iter->first] = image;
295  }
296  return retval;
297 }
298 
299 std::map<QString, MeshPtr> DataManagerImpl::getMeshes() const
300 {
301  std::map<QString, MeshPtr> retval;
302  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
303  {
304  MeshPtr mesh = this->getMesh(iter->first);
305  if (!mesh)
306  continue;
307  retval[iter->first] = mesh;
308  }
309  return retval;
310 }
311 
312 void DataManagerImpl::addXml(QDomNode& parentNode)
313 {
314  QDomDocument doc = parentNode.ownerDocument();
315  QDomElement dataManagerNode = doc.createElement("datamanager");
316  parentNode.appendChild(dataManagerNode);
317 
318  m_rMpr_History->addXml(dataManagerNode);
319 
320  QDomElement landmarkPropsNode = doc.createElement("landmarkprops");
321  LandmarkPropertyMap::iterator it = mLandmarkProperties.begin();
322  for (; it != mLandmarkProperties.end(); ++it)
323  {
324  QDomElement landmarkPropNode = doc.createElement("landmarkprop");
325  it->second.addXml(landmarkPropNode);
326  landmarkPropsNode.appendChild(landmarkPropNode);
327  }
328  dataManagerNode.appendChild(landmarkPropsNode);
329 
330  QDomElement landmarksNode = doc.createElement("landmarks");
331  mPatientLandmarks->addXml(landmarksNode);
332  dataManagerNode.appendChild(landmarksNode);
333 
334  QDomElement centerNode = doc.createElement("center");
335  centerNode.appendChild(doc.createTextNode(qstring_cast(mCenter)));
336  dataManagerNode.appendChild(centerNode);
337 
338  QDomElement otNode = doc.createElement("operatingTable");
339  otNode.appendChild(doc.createTextNode(qstring_cast(mOperatingTable.rMot)));
340  dataManagerNode.appendChild(otNode);
341 
342  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
343  {
344  QDomElement dataNode = doc.createElement("data");
345  dataManagerNode.appendChild(dataNode);
346  iter->second->addXml(dataNode);
347  }
348 }
349 
350 void DataManagerImpl::parseXml(QDomNode& dataManagerNode, QString rootPath)
351 {
352  // look in the toolmanager, for backwards compatibility (2014-02-21)
353  QDomNode toolManagerNode = dataManagerNode.parentNode().namedItem("toolManager");
354 
355  QDomNode registrationHistory = dataManagerNode.namedItem("registrationHistory");
356  if (registrationHistory.isNull())
357  registrationHistory = toolManagerNode.namedItem("registrationHistory");
358  m_rMpr_History->parseXml(registrationHistory);
359 
360  QDomNode landmarksNode = dataManagerNode.namedItem("landmarkprops");
361  QDomElement landmarkNode = landmarksNode.firstChildElement("landmarkprop");
362  for (; !landmarkNode.isNull(); landmarkNode = landmarkNode.nextSiblingElement("landmarkprop"))
363  {
364  LandmarkProperty landmarkProp;
365  landmarkProp.parseXml(landmarkNode);
366  mLandmarkProperties[landmarkProp.getUid()] = landmarkProp;
367  //std::cout << "Loaded landmarkprop with name: " << landmarkProp.getName() << std::endl;
369  }
370 
371  QDomNode patientLandmarksNode = dataManagerNode.namedItem("landmarks");
372  if (patientLandmarksNode.isNull())
373  patientLandmarksNode = toolManagerNode.namedItem("landmarks");
374  mPatientLandmarks->parseXml(patientLandmarksNode);
375 
376  // All images must be created from the DataManager, so the image nodes are parsed here
377  std::map<DataPtr, QDomNode> datanodes;
378 
379  QDomNode child = dataManagerNode.firstChild();
380  for (; !child.isNull(); child = child.nextSibling())
381  {
382  if (child.nodeName() == "data")
383  {
384  DataPtr data = this->loadData(child.toElement(), rootPath);
385  if (data)
386  datanodes[data] = child.toElement();
387  }
388  }
389 
390  // parse xml data separately: we want to first load all data
391  // because there might be interdependencies (cx::DistanceMetric)
392  for (std::map<DataPtr, QDomNode>::iterator iter = datanodes.begin(); iter != datanodes.end(); ++iter)
393  {
394  iter->first->parseXml(iter->second);
395  }
396 
397  emit dataAddedOrRemoved();
398 
399  //we need to make sure all images are loaded before we try to set an active image
400  child = dataManagerNode.firstChild();
401  while (!child.isNull())
402  {
403  if (child.toElement().tagName() == "center")
404  {
405  const QString centerString = child.toElement().text();
406  if (!centerString.isEmpty())
407  {
408  Vector3D center = Vector3D::fromString(centerString);
409  this->setCenter(center);
410  }
411  }
412  if (child.toElement().tagName() == "operatingTable")
413  {
414  const QString ot = child.toElement().text();
415  if (!ot.isEmpty())
416  {
417  Transform3D tr = Transform3D::fromString(ot);
418  OperatingTable t(tr);
419  this->setOperatingTable(t);
420  }
421  }
422  child = child.nextSibling();
423  }
424 }
425 
426 DataPtr DataManagerImpl::loadData(QDomElement node, QString rootPath)
427 {
428  QString uid = node.toElement().attribute("uid");
429  QString name = node.toElement().attribute("name");
430  QString type = node.toElement().attribute("type");
431 
432  QDir relativePath = this->findRelativePath(node, rootPath);
433  QString absolutePath = this->findAbsolutePath(relativePath, rootPath);
434 
435  if (mData.count(uid)) // dont load same image twice
436  return mData[uid];
437 
438  DataPtr data = mDataFactory->create(type, uid, name);
439  if (!data)
440  {
441  reportWarning(QString("Unknown type: %1 for file %2").arg(type).arg(absolutePath));
442  return DataPtr();
443  }
444  bool loaded = data->load(absolutePath);
445 
446  if (!loaded)
447  {
448  reportWarning("Unknown file: " + absolutePath);
449  return DataPtr();
450  }
451 
452  if (!name.isEmpty())
453  data->setName(name);
454  data->setFilename(relativePath.path());
455 
456  this->loadData(data);
457 
458  // conversion for change in format 2013-10-29
459  QString newPath = rootPath+"/"+data->getFilename();
460  if (QDir::cleanPath(absolutePath) != QDir::cleanPath(newPath))
461  {
462  reportWarning(QString("Detected old data format, converting from %1 to %2").arg(absolutePath).arg(newPath));
463  data->save(rootPath);
464  }
465 
466  return data;
467 }
468 
469 QDir DataManagerImpl::findRelativePath(QDomElement node, QString rootPath)
470 {
471  QString path = this->findPath(node);
472  QDir relativePath = QDir(QString(path));
473 
474  QDir patientDataDir(rootPath);
475  relativePath.setPath(patientDataDir.relativeFilePath(relativePath.path()));
476 
477  return relativePath;
478 }
479 
480 QString DataManagerImpl::findPath(QDomElement node)
481 {
482  QDomElement filePathNode = node.namedItem("filePath").toElement();
483 
484  if (filePathNode.isNull())
485  return QString();
486 
487  QString path = filePathNode.text();
488  if (path.isEmpty())
489  return QString();
490  return path;
491 }
492 
493 QString DataManagerImpl::findAbsolutePath(QDir relativePath, QString rootPath)
494 {
495  QString absolutePath = relativePath.path();
496  if (!rootPath.isEmpty())
497  absolutePath = rootPath + "/" + relativePath.path();
498  return absolutePath;
499 }
500 
502 {
503  return mClinicalApplication;
504 }
505 
506 void DataManagerImpl::setClinicalApplication(CLINICAL_VIEW application)
507 {
508  if (mClinicalApplication == application)
509  return;
510  mClinicalApplication = application;
511 
512  QString val = enum2string<CLINICAL_VIEW>(mClinicalApplication);
513  settings()->setValue("View/clinicalView", val);
514 
516 }
517 
518 void DataManagerImpl::settingsChangedSlot(QString key)
519 {
520  if (key == "View/clinicalView")
521  {
522  this->readClinicalView();
523  }
524 }
525 
527 {
528  QString defVal = enum2string<CLINICAL_VIEW>(mdNEUROLOGICAL);
529  QString val = settings()->value("View/clinicalView", defVal).toString();
530  CLINICAL_VIEW view = string2enum<CLINICAL_VIEW>(val);
531 
532  this->setClinicalApplication(view);
533 }
534 
535 
536 int DataManagerImpl::findUniqueUidNumber(QString uidBase) const
537 {
538  if (!uidBase.contains("%"))
539  return -1;
540  // Find an uid that is not used before
541  size_t numMatches = 1;
542  int recNumber = 0;
543 
544  if (numMatches != 0)
545  {
546  while (numMatches != 0)
547  {
548  QString newId = qstring_cast(uidBase).arg(++recNumber);
549  numMatches = mData.count(qstring_cast(newId));
550  }
551  }
552  return recNumber;
553 }
554 
559 void DataManagerImpl::generateUidAndName(QString* _uid, QString* _name)
560 {
561  QString& uid = *_uid;
562  QString& name = *_name;
563 
564  int recNumber = this->findUniqueUidNumber(uid);
565 
566  if (uid.contains("%"))
567  {
568  uid = uid.arg(recNumber);
569  }
570 
571  if (name.contains("%"))
572  {
573  if (recNumber == 1)
574  name = name.arg("");
575  else
576  name = name.arg(recNumber);
577  }
578 }
579 
580 void DataManagerImpl::removeData(const QString& uid, QString basePath)
581 {
582  DataPtr dataToBeRemoved = this->getData(uid);
583  mActiveData->remove(dataToBeRemoved);
584 
585  mData.erase(uid);
586 
587  this->deleteFiles(dataToBeRemoved, basePath);
588 
589  emit dataAddedOrRemoved(); // this should alert everybody interested in the data as a collection.
590  report("Removed data [" + uid + "].");
591 }
592 
593 void DataManagerImpl::deleteFiles(DataPtr data, QString basePath)
594 {
595  if (!data)
596  return;
597  ImagePtr image = boost::dynamic_pointer_cast<Image>(data);
598  QStringList files;
599  if (!data->getFilename().isEmpty())
600  {
601  files << QDir(basePath).absoluteFilePath(data->getFilename());
602  if (image)
603  files << changeExtension(files[0], "raw");
604  }
605 
606  for (int i=0; i<files.size(); ++i)
607  {
608  if (!QFileInfo(files[i]).exists())
609  continue;
610  report(QString("Removing %1 from disk").arg(files[i]));
611  QFile(files[i]).remove();
612  }
613 }
614 
616 {
617  return m_rMpr_History->getCurrentRegistration().mValue;
618 }
619 
621 {
622  m_rMpr_History->setRegistration(val);
623 }
624 
626 {
627  return m_rMpr_History;
628 }
629 
631 {
633  XmlOptionFile preset(DataLocations::findConfigFilePath("presets.xml", "/transferFunctions"));
634  XmlOptionFile custom = profile()->getXmlSettings().descend("presetTransferFunctions");
635 
637  mPresetTransferFunctions3D.reset(new TransferFunctions3DPresets(preset, custom));
638 
640 }
641 
642 } // namespace cx
643 
boost::shared_ptr< class SpaceProvider > SpaceProviderPtr
QString qstring_cast(const T &val)
DataFactoryPtr mDataFactory
cxResource_EXPORT ProfilePtr profile()
Definition: cxProfile.cpp:181
void rMprChanged()
emitted when the transformation between patient reference and (data) reference is set ...
int findUniqueUidNumber(QString uidBase) const
virtual void removeData(const QString &uid, QString basePath)
remove data from datamanger, emit signal
void reportError(QString msg)
Definition: cxLogger.cpp:92
virtual CLINICAL_VIEW getClinicalApplication() const
boost::shared_ptr< class RegistrationHistory > RegistrationHistoryPtr
Definition: cxDataManager.h:58
std::map< QString, VideoSourcePtr > mStreams
QString findDataTypeFromFile(QString filename)
void operatingTableChanged()
std::map< QString, VideoSourcePtr > mStreams
OperatingTable getOperatingTable() const
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
OperatingTable mOperatingTable
virtual std::map< QString, LandmarkProperty > getLandmarkProperties() const
boost::shared_ptr< class TransferFunctions3DPresets > PresetTransferFunctions3DPtr
Definition: cxDataManager.h:57
virtual void setLandmarkName(QString uid, QString name)
QString getUid() const
Definition: cxLandmark.cpp:196
boost::shared_ptr< class Image > ImagePtr
Definition: cxDicomWidget.h:48
virtual VideoSourcePtr getStream(const QString &uid) const
boost::shared_ptr< class DataManagerImpl > DataManagerImplPtr
void deleteFiles(DataPtr data, QString basePath)
virtual void generateUidAndName(QString *_uid, QString *_name)
virtual MeshPtr getMesh(const QString &uid) const
boost::shared_ptr< class ActiveData > ActiveDataPtr
Definition: cxColorWidget.h:42
void landmarkPropertiesChanged()
emitted when global info about a landmark changed
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Definition: cxSettings.cpp:87
void centerChanged()
emitted when center is changed.
ActiveDataPtr mActiveData
virtual LandmarksPtr getPatientLandmarks()
virtual void addXml(QDomNode &parentNode)
adds xml information about the datamanger and its variabels
boost::shared_ptr< class Landmarks > LandmarksPtr
Definition: cxData.h:61
PresetTransferFunctions3DPtr mPresetTransferFunctions3D
void setValue(const QString &key, const QVariant &value)
Definition: cxSettings.cpp:79
boost::shared_ptr< class Data > DataPtr
DataManagerImpl(ActiveDataPtr activeData)
virtual void parseXml(QDomNode &datamangerNode, QString absolutePath=QString())
Use a XML node to load data.
virtual StreamMap getStreams() const
static DataManagerImplPtr create(ActiveDataPtr activeData)
virtual std::map< QString, ImagePtr > getImages() const
virtual void setLandmarkNames(std::vector< QString > names)
void reportWarning(QString msg)
Definition: cxLogger.cpp:91
virtual void setClinicalApplication(CLINICAL_VIEW application)
std::map< QString, DataPtr > getData() const
void dataAddedOrRemoved()
A volumetric data set.
Definition: cxImage.h:66
void parseXml(QDomNode &dataNode)
Definition: cxLandmark.cpp:217
virtual PresetTransferFunctions3DPtr getPresetTransferFunctions3D() const
boost::shared_ptr< class VideoSource > VideoSourcePtr
virtual Transform3D get_rMpr() const
get the patient registration transform
static QString findConfigFilePath(QString fileName, QString pathRelativeToConfigRoot, QString alternativeAbsolutePath="")
RegistrationHistoryPtr m_rMpr_History
transform from the patient reference to the reference, along with historical data.
Settings * settings()
Shortcut for accessing the settings instance.
Definition: cxSettings.cpp:42
virtual void setLandmarkActive(QString uid, bool active)
static LandmarksPtr create()
Definition: cxLandmark.cpp:116
Transform3D rMot
Transform from OT to reference space.
void setOperatingTable(const OperatingTable &ot)
LandmarksPtr mPatientLandmarks
in space patient reference.
cxLogicManager_EXPORT SpaceProviderPtr spaceProvider()
virtual Vector3D getCenter() const
current common center point for user viewing.
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:63
virtual void setCenter(const Vector3D &center)
virtual ImagePtr getImage(const QString &uid) const
QString changeExtension(QString name, QString ext)
void report(QString msg)
Definition: cxLogger.cpp:90
bool similar(const CameraInfo &lhs, const CameraInfo &rhs, double tol)
void setDataFactory(DataFactoryPtr dataFactory)
mdNEUROLOGICAL
Definition: cxDefinitions.h:76
virtual SpaceProviderPtr getSpaceProvider()
virtual void set_rMpr(const Transform3D &val)
set the transform from patient to reference space
virtual std::map< QString, MeshPtr > getMeshes() const
virtual QString addLandmark()
CLINICAL_VIEW mClinicalApplication
The OperatingTable class.
LandmarkPropertyMap mLandmarkProperties
uid and name
SpaceProviderPtr mSpaceProvider
boost::shared_ptr< class DataFactory > DataFactoryPtr
boost::shared_ptr< class Mesh > MeshPtr
void loadData(DataPtr data)
void clinicalApplicationChanged()
virtual void loadStream(VideoSourcePtr stream)
A history of registration events.
void setSpaceProvider(SpaceProviderPtr spaceProvider)
Helper class for xml files used to store ssc/cx data.
Handles transfer function presets.
virtual void clear()
remove all stuff from manager
virtual DataFactoryPtr getDataFactory()
virtual RegistrationHistoryPtr get_rMpr_History() const
std::map< QString, VideoSourcePtr > StreamMap
Definition: cxDataManager.h:76