CustusX  15.8
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 
64 
65 namespace cx
66 {
67 
69 {
70  DataManagerImplPtr retval;
71  retval.reset(new DataManagerImpl());
72  return retval;
73 }
74 
76 {
78  connect(m_rMpr_History.get(), SIGNAL(currentChanged()), this, SIGNAL(rMprChanged()));
80 
81  connect(settings(), SIGNAL(valueChangedFor(QString)), this, SLOT(settingsChangedSlot(QString)));
82  this->readClinicalView();
83 
84  this->clear();
85 }
86 
88 {
89 }
90 
92 {
94 }
95 
97 {
98  mDataFactory = dataFactory;
99 }
100 
102 {
103  return mSpaceProvider;
104 }
105 
107 {
108  return mDataFactory;
109 }
110 
112 {
113  mData.clear();
114  mCenter = Vector3D(0, 0, 0);
115  mActiveImage.reset();
116  mLandmarkProperties.clear();
117 
118  m_rMpr_History->clear();
119  mPatientLandmarks->clear();
120 
121  emit dataAddedOrRemoved();
122  emit centerChanged();
123  emit activeImageChanged("");
125 }
126 
128 {
129  return mPatientLandmarks;
130 }
131 
132 // streams
134 {
135  if (mStreams.count(uid))
136  return mStreams.find(uid)->second;
137  return VideoSourcePtr();
138 }
139 
141 {
142  return mStreams;
143 }
144 
146 {
147  if (!stream)
148  return;
149  mStreams[stream->getUid()] = stream;
150  emit streamLoaded();
151 }
152 
153 std::map<QString, VideoSourcePtr> mStreams;
154 
156 {
157  return mCenter;
158 }
160 {
161  mCenter = center;
162  emit centerChanged();
163 }
164 
166 {
167  return mActiveImage;
168 }
170 {
171  if (mActiveImage == activeImage)
172  return;
173 
174  mActiveImage = activeImage;
175 
176  QString uid = "";
177  if (mActiveImage)
178  uid = mActiveImage->getUid();
179 
180  emit activeImageChanged(uid);
181 // report("Active image set to " + qstring_cast(uid));
182 }
183 
184 void DataManagerImpl::setLandmarkNames(std::vector<QString> names)
185 {
186  mLandmarkProperties.clear();
187  for (unsigned i = 0; i < names.size(); ++i)
188  {
189  LandmarkProperty prop(qstring_cast(i + 1), names[i]); // generate 1-indexed uids (keep users happy)
190  mLandmarkProperties[prop.getUid()] = prop;
191  }
193 }
194 
196 {
197  int max = 0;
198  std::map<QString, LandmarkProperty>::iterator iter;
199  for (iter = mLandmarkProperties.begin(); iter != mLandmarkProperties.end(); ++iter)
200  {
201  //max = std::max(max, qstring_cast(iter->second.getName()).toInt());
202  max = std::max(max, qstring_cast(iter->first).toInt());
203  }
204  QString uid = qstring_cast(max + 1);
206 
208  return uid;
209 }
210 
211 void DataManagerImpl::setLandmarkName(QString uid, QString name)
212 {
213  mLandmarkProperties[uid].setName(name);
215 }
216 
217 std::map<QString, LandmarkProperty> DataManagerImpl::getLandmarkProperties() const
218 {
219  return mLandmarkProperties;
220 }
221 
222 void DataManagerImpl::setLandmarkActive(QString uid, bool active)
223 {
224  mLandmarkProperties[uid].setActive(active);
226 }
227 
228 DataPtr DataManagerImpl::loadData(const QString& uid, const QString& path)
229 {
230  if (mData.count(uid)) // dont load same image twice
231  return mData[uid];
232 
233  QString type = DataReaderWriter().findDataTypeFromFile(path);
234  DataPtr data = mDataFactory->create(type, uid);
235 
236  if (!data)
237  {
238  reportError("Failed to find loaded for: [" + path + "]");
239  return DataPtr();
240  }
241 
242  bool loaded = data->load(path);
243 
244  if (!loaded)
245  {
246  reportError("Failed to load file: [" + path + "]");
247  return DataPtr();
248  }
249 
250  this->loadData(data);
251  return data;
252 }
253 
255 {
256  if (data->getUid().contains('%'))
257  {
258  QString uid = data->getUid();
259  QString name = data->getName();
260  this->generateUidAndName(&uid, &name);
261  data->setName(name);
262  data->setUid(uid);
263  }
264 
265  if (data)
266  {
267  if (mData.count(data->getUid()) && mData[data->getUid()]!=data)
268  reportError(QString("Overwriting Data with uid=%1 with new object into PasM").arg(data->getUid()));
269 // this->verifyParentFrame(data);
270  mData[data->getUid()] = data;
271  emit dataAddedOrRemoved();
272  }
273 }
274 
275 DataPtr DataManagerImpl::getData(const QString& uid) const
276 {
277  DataMap::const_iterator iter = mData.find(uid);
278  if (iter == mData.end())
279  return DataPtr();
280  return iter->second;
281 }
282 
283 std::map<QString, DataPtr> DataManagerImpl::getData() const
284 {
285  return mData;
286 }
287 
288 std::map<QString, ImagePtr> DataManagerImpl::getImages() const
289 {
290  std::map<QString, ImagePtr> retval;
291  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
292  {
293  ImagePtr image = this->getImage(iter->first);
294  if (!image)
295  continue;
296  retval[iter->first] = image;
297  }
298  return retval;
299 }
300 
301 std::map<QString, MeshPtr> DataManagerImpl::getMeshes() const
302 {
303  std::map<QString, MeshPtr> retval;
304  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
305  {
306  MeshPtr mesh = this->getMesh(iter->first);
307  if (!mesh)
308  continue;
309  retval[iter->first] = mesh;
310  }
311  return retval;
312 }
313 
314 void DataManagerImpl::addXml(QDomNode& parentNode)
315 {
316  QDomDocument doc = parentNode.ownerDocument();
317  QDomElement dataManagerNode = doc.createElement("datamanager");
318  parentNode.appendChild(dataManagerNode);
319 
320  m_rMpr_History->addXml(dataManagerNode);
321 
322  QDomElement activeImageNode = doc.createElement("activeImageUid");
323  if (mActiveImage)
324  activeImageNode.appendChild(doc.createTextNode(mActiveImage->getUid()));
325  dataManagerNode.appendChild(activeImageNode);
326 
327  QDomElement landmarkPropsNode = doc.createElement("landmarkprops");
328  LandmarkPropertyMap::iterator it = mLandmarkProperties.begin();
329  for (; it != mLandmarkProperties.end(); ++it)
330  {
331  QDomElement landmarkPropNode = doc.createElement("landmarkprop");
332  it->second.addXml(landmarkPropNode);
333  landmarkPropsNode.appendChild(landmarkPropNode);
334  }
335  dataManagerNode.appendChild(landmarkPropsNode);
336 
337  QDomElement landmarksNode = doc.createElement("landmarks");
338  mPatientLandmarks->addXml(landmarksNode);
339  dataManagerNode.appendChild(landmarksNode);
340 
341  QDomElement centerNode = doc.createElement("center");
342  centerNode.appendChild(doc.createTextNode(qstring_cast(mCenter)));
343  dataManagerNode.appendChild(centerNode);
344 
345  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
346  {
347  QDomElement dataNode = doc.createElement("data");
348  dataManagerNode.appendChild(dataNode);
349  iter->second->addXml(dataNode);
350  }
351 }
352 
353 void DataManagerImpl::parseXml(QDomNode& dataManagerNode, QString rootPath)
354 {
355  // look in the toolmanager, for backwards compatibility (2014-02-21)
356  QDomNode toolManagerNode = dataManagerNode.parentNode().namedItem("toolManager");
357 
358  QDomNode registrationHistory = dataManagerNode.namedItem("registrationHistory");
359  if (registrationHistory.isNull())
360  registrationHistory = toolManagerNode.namedItem("registrationHistory");
361  m_rMpr_History->parseXml(registrationHistory);
362 
363  QDomNode landmarksNode = dataManagerNode.namedItem("landmarkprops");
364  QDomElement landmarkNode = landmarksNode.firstChildElement("landmarkprop");
365  for (; !landmarkNode.isNull(); landmarkNode = landmarkNode.nextSiblingElement("landmarkprop"))
366  {
367  LandmarkProperty landmarkProp;
368  landmarkProp.parseXml(landmarkNode);
369  mLandmarkProperties[landmarkProp.getUid()] = landmarkProp;
370  //std::cout << "Loaded landmarkprop with name: " << landmarkProp.getName() << std::endl;
372  }
373 
374  QDomNode patientLandmarksNode = dataManagerNode.namedItem("landmarks");
375  if (patientLandmarksNode.isNull())
376  patientLandmarksNode = toolManagerNode.namedItem("landmarks");
377  mPatientLandmarks->parseXml(patientLandmarksNode);
378 
379  // All images must be created from the DataManager, so the image nodes are parsed here
380  std::map<DataPtr, QDomNode> datanodes;
381 
382  QDomNode child = dataManagerNode.firstChild();
383  for (; !child.isNull(); child = child.nextSibling())
384  {
385  if (child.nodeName() == "data")
386  {
387  DataPtr data = this->loadData(child.toElement(), rootPath);
388  if (data)
389  datanodes[data] = child.toElement();
390  }
391  }
392 
393  // parse xml data separately: we want to first load all data
394  // because there might be interdependencies (cx::DistanceMetric)
395  for (std::map<DataPtr, QDomNode>::iterator iter = datanodes.begin(); iter != datanodes.end(); ++iter)
396  {
397  iter->first->parseXml(iter->second);
398  }
399 
400  emit dataAddedOrRemoved();
401 
402  //we need to make sure all images are loaded before we try to set an active image
403  child = dataManagerNode.firstChild();
404  while (!child.isNull())
405  {
406  if (child.toElement().tagName() == "activeImageUid")
407  {
408  const QString activeImageString = child.toElement().text();
409  if (!activeImageString.isEmpty())
410  {
411  ImagePtr image = this->getImage(activeImageString);
412  this->setActiveImage(image);
413  }
414  }
415  //TODO add activeMesh
416  if (child.toElement().tagName() == "center")
417  {
418  const QString centerString = child.toElement().text();
419  if (!centerString.isEmpty())
420  {
421  Vector3D center = Vector3D::fromString(centerString);
422  this->setCenter(center);
423  }
424  }
425  child = child.nextSibling();
426  }
427 }
428 
429 DataPtr DataManagerImpl::loadData(QDomElement node, QString rootPath)
430 {
431  QString uid = node.toElement().attribute("uid");
432  QString name = node.toElement().attribute("name");
433  QString type = node.toElement().attribute("type");
434 
435  QDir relativePath = this->findRelativePath(node, rootPath);
436  QString absolutePath = this->findAbsolutePath(relativePath, rootPath);
437 
438  if (mData.count(uid)) // dont load same image twice
439  return mData[uid];
440 
441  DataPtr data = mDataFactory->create(type, uid, name);
442  if (!data)
443  {
444  reportWarning(QString("Unknown type: %1 for file %2").arg(type).arg(absolutePath));
445  return DataPtr();
446  }
447  bool loaded = data->load(absolutePath);
448 
449  if (!loaded)
450  {
451  reportWarning("Unknown file: " + absolutePath);
452  return DataPtr();
453  }
454 
455  if (!name.isEmpty())
456  data->setName(name);
457  data->setFilename(relativePath.path());
458 
459  this->loadData(data);
460 
461  // conversion for change in format 2013-10-29
462  QString newPath = rootPath+"/"+data->getFilename();
463  if (QDir::cleanPath(absolutePath) != QDir::cleanPath(newPath))
464  {
465  reportWarning(QString("Detected old data format, converting from %1 to %2").arg(absolutePath).arg(newPath));
466  data->save(rootPath);
467  }
468 
469  return data;
470 }
471 
472 QDir DataManagerImpl::findRelativePath(QDomElement node, QString rootPath)
473 {
474  QString path = this->findPath(node);
475  QDir relativePath = QDir(QString(path));
476 
477  QDir patientDataDir(rootPath);
478  relativePath.setPath(patientDataDir.relativeFilePath(relativePath.path()));
479 
480  return relativePath;
481 }
482 
483 QString DataManagerImpl::findPath(QDomElement node)
484 {
485  QDomElement filePathNode = node.namedItem("filePath").toElement();
486 
487  if (filePathNode.isNull())
488  return QString();
489 
490  QString path = filePathNode.text();
491  if (path.isEmpty())
492  return QString();
493  return path;
494 }
495 
496 QString DataManagerImpl::findAbsolutePath(QDir relativePath, QString rootPath)
497 {
498  QString absolutePath = relativePath.path();
499  if (!rootPath.isEmpty())
500  absolutePath = rootPath + "/" + relativePath.path();
501  return absolutePath;
502 }
503 
505 {
506  QString uid = "";
507  if (mActiveImage)
508  uid = mActiveImage->getUid();
509 }
510 
512 {
513  return mClinicalApplication;
514 }
515 
516 void DataManagerImpl::setClinicalApplication(CLINICAL_VIEW application)
517 {
518  if (mClinicalApplication == application)
519  return;
520  mClinicalApplication = application;
521 
522  QString val = enum2string<CLINICAL_VIEW>(mClinicalApplication);
523  settings()->setValue("View/clinicalView", val);
524 
526 }
527 
528 void DataManagerImpl::settingsChangedSlot(QString key)
529 {
530  if (key == "View/clinicalView")
531  {
532  this->readClinicalView();
533  }
534 }
535 
537 {
538  QString defVal = enum2string<CLINICAL_VIEW>(mdNEUROLOGICAL);
539  QString val = settings()->value("View/clinicalView", defVal).toString();
540  CLINICAL_VIEW view = string2enum<CLINICAL_VIEW>(val);
541 
542  this->setClinicalApplication(view);
543 }
544 
545 
546 int DataManagerImpl::findUniqueUidNumber(QString uidBase) const
547 {
548  if (!uidBase.contains("%"))
549  return -1;
550  // Find an uid that is not used before
551  size_t numMatches = 1;
552  int recNumber = 0;
553 
554  if (numMatches != 0)
555  {
556  while (numMatches != 0)
557  {
558  QString newId = qstring_cast(uidBase).arg(++recNumber);
559  numMatches = mData.count(qstring_cast(newId));
560  }
561  }
562  return recNumber;
563 }
564 
569 void DataManagerImpl::generateUidAndName(QString* _uid, QString* _name)
570 {
571  QString& uid = *_uid;
572  QString& name = *_name;
573 
574  int recNumber = this->findUniqueUidNumber(uid);
575 
576  if (uid.contains("%"))
577  {
578  uid = uid.arg(recNumber);
579  }
580 
581  if (name.contains("%"))
582  {
583  if (recNumber == 1)
584  name = name.arg("");
585  else
586  name = name.arg(recNumber);
587  }
588 }
589 
590 void DataManagerImpl::removeData(const QString& uid, QString basePath)
591 {
592  if (this->getActiveImage() && this->getActiveImage()->getUid() == uid)
593  this->setActiveImage(ImagePtr());
594 
595  DataPtr data = this->getData(uid);
596 
597  mData.erase(uid);
598 
599  this->deleteFiles(data, basePath);
600 
601  emit dataAddedOrRemoved(); // this should alert everybody interested in the data as a collection.
602  report("Removed data [" + uid + "].");
603 }
604 
605 void DataManagerImpl::deleteFiles(DataPtr data, QString basePath)
606 {
607  if (!data)
608  return;
609  ImagePtr image = boost::dynamic_pointer_cast<Image>(data);
610  QStringList files;
611  if (!data->getFilename().isEmpty())
612  files << QDir(basePath).absoluteFilePath(data->getFilename());
613 
614  if (image)
615  {
616  files << changeExtension(files[0], "raw");
617  }
618 
619  for (int i=0; i<files.size(); ++i)
620  {
621  if (!QFileInfo(files[i]).exists())
622  continue;
623  report(QString("Removing %1 from disk").arg(files[i]));
624  QFile(files[i]).remove();
625  }
626 }
627 
629 {
630  return m_rMpr_History->getCurrentRegistration().mValue;
631 }
632 
634 {
635  m_rMpr_History->setRegistration(val);
636 }
637 
639 {
640  return m_rMpr_History;
641 }
642 
644 {
646  XmlOptionFile preset(DataLocations::findConfigFilePath("presets.xml", "/transferFunctions"));
647  XmlOptionFile custom = profile()->getXmlSettings().descend("presetTransferFunctions");
648 
650  mPresetTransferFunctions3D.reset(new TransferFunctions3DPresets(preset, custom));
651 
653 }
654 
655 } // namespace cx
656 
boost::shared_ptr< class SpaceProvider > SpaceProviderPtr
QString qstring_cast(const T &val)
virtual ImagePtr getActiveImage() const
used for system state
DataFactoryPtr mDataFactory
cxResource_EXPORT ProfilePtr profile()
Definition: cxProfile.cpp:169
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:57
std::map< QString, VideoSourcePtr > mStreams
QString findDataTypeFromFile(QString filename)
std::map< QString, VideoSourcePtr > mStreams
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
virtual std::map< QString, LandmarkProperty > getLandmarkProperties() const
boost::shared_ptr< class TransferFunctions3DPresets > PresetTransferFunctions3DPtr
Definition: cxDataManager.h:56
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)
static DataManagerImplPtr create()
virtual MeshPtr getMesh(const QString &uid) const
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.
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:60
PresetTransferFunctions3DPtr mPresetTransferFunctions3D
void setValue(const QString &key, const QVariant &value)
Definition: cxSettings.cpp:79
boost::shared_ptr< class Data > DataPtr
virtual void parseXml(QDomNode &datamangerNode, QString absolutePath=QString())
Use a XML node to load data.
virtual StreamMap getStreams() const
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
virtual void setActiveImage(ImagePtr activeImage)
used for system state
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
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
void setDataFactory(DataFactoryPtr dataFactory)
mdNEUROLOGICAL
Definition: cxDefinitions.h:75
void activeImageChanged(const QString &uId)
emitted when the active image is changed
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
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:75