CustusX  15.3.4-beta
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 centerChanged();
122  emit activeImageChanged("");
124  emit dataAddedOrRemoved();
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  bool loaded = data->load(path);
236 
237  if (!data || !loaded)
238  {
239  reportError("Error with data file: " + path);
240  return DataPtr();
241  }
242  this->loadData(data);
243  return data;
244 }
245 
247 {
248  if (data->getUid().contains('%'))
249  {
250  QString uid = data->getUid();
251  QString name = data->getName();
252  this->generateUidAndName(&uid, &name);
253  data->setName(name);
254  data->setUid(uid);
255  }
256 
257  if (data)
258  {
259  if (mData.count(data->getUid()) && mData[data->getUid()]!=data)
260  reportError(QString("Overwriting Data with uid=%1 with new object into PasM").arg(data->getUid()));
261 // this->verifyParentFrame(data);
262  mData[data->getUid()] = data;
263  emit dataAddedOrRemoved();
264  }
265 }
266 
267 DataPtr DataManagerImpl::getData(const QString& uid) const
268 {
269  DataMap::const_iterator iter = mData.find(uid);
270  if (iter == mData.end())
271  return DataPtr();
272  return iter->second;
273 }
274 
275 std::map<QString, DataPtr> DataManagerImpl::getData() const
276 {
277  return mData;
278 }
279 
280 std::map<QString, ImagePtr> DataManagerImpl::getImages() const
281 {
282  std::map<QString, ImagePtr> retval;
283  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
284  {
285  ImagePtr image = this->getImage(iter->first);
286  if (!image)
287  continue;
288  retval[iter->first] = image;
289  }
290  return retval;
291 }
292 
293 std::map<QString, MeshPtr> DataManagerImpl::getMeshes() const
294 {
295  std::map<QString, MeshPtr> retval;
296  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
297  {
298  MeshPtr mesh = this->getMesh(iter->first);
299  if (!mesh)
300  continue;
301  retval[iter->first] = mesh;
302  }
303  return retval;
304 }
305 
306 void DataManagerImpl::addXml(QDomNode& parentNode)
307 {
308  QDomDocument doc = parentNode.ownerDocument();
309  QDomElement dataManagerNode = doc.createElement("datamanager");
310  parentNode.appendChild(dataManagerNode);
311 
312  m_rMpr_History->addXml(dataManagerNode);
313 
314  QDomElement activeImageNode = doc.createElement("activeImageUid");
315  if (mActiveImage)
316  activeImageNode.appendChild(doc.createTextNode(mActiveImage->getUid()));
317  dataManagerNode.appendChild(activeImageNode);
318 
319  QDomElement landmarkPropsNode = doc.createElement("landmarkprops");
320  LandmarkPropertyMap::iterator it = mLandmarkProperties.begin();
321  for (; it != mLandmarkProperties.end(); ++it)
322  {
323  QDomElement landmarkPropNode = doc.createElement("landmarkprop");
324  it->second.addXml(landmarkPropNode);
325  landmarkPropsNode.appendChild(landmarkPropNode);
326  }
327  dataManagerNode.appendChild(landmarkPropsNode);
328 
329  QDomElement landmarksNode = doc.createElement("landmarks");
330  mPatientLandmarks->addXml(landmarksNode);
331  dataManagerNode.appendChild(landmarksNode);
332 
333  QDomElement centerNode = doc.createElement("center");
334  centerNode.appendChild(doc.createTextNode(qstring_cast(mCenter)));
335  dataManagerNode.appendChild(centerNode);
336 
337  for (DataMap::const_iterator iter = mData.begin(); iter != mData.end(); ++iter)
338  {
339  QDomElement dataNode = doc.createElement("data");
340  dataManagerNode.appendChild(dataNode);
341  iter->second->addXml(dataNode);
342  }
343 }
344 
345 void DataManagerImpl::parseXml(QDomNode& dataManagerNode, QString rootPath)
346 {
347  // look in the toolmanager, for backwards compatibility (2014-02-21)
348  QDomNode toolManagerNode = dataManagerNode.parentNode().namedItem("toolManager");
349 
350  QDomNode registrationHistory = dataManagerNode.namedItem("registrationHistory");
351  if (registrationHistory.isNull())
352  registrationHistory = toolManagerNode.namedItem("registrationHistory");
353  m_rMpr_History->parseXml(registrationHistory);
354 
355  QDomNode landmarksNode = dataManagerNode.namedItem("landmarkprops");
356  QDomElement landmarkNode = landmarksNode.firstChildElement("landmarkprop");
357  for (; !landmarkNode.isNull(); landmarkNode = landmarkNode.nextSiblingElement("landmarkprop"))
358  {
359  LandmarkProperty landmarkProp;
360  landmarkProp.parseXml(landmarkNode);
361  mLandmarkProperties[landmarkProp.getUid()] = landmarkProp;
362  //std::cout << "Loaded landmarkprop with name: " << landmarkProp.getName() << std::endl;
364  }
365 
366  QDomNode patientLandmarksNode = dataManagerNode.namedItem("landmarks");
367  if (patientLandmarksNode.isNull())
368  patientLandmarksNode = toolManagerNode.namedItem("landmarks");
369  mPatientLandmarks->parseXml(patientLandmarksNode);
370 
371  // All images must be created from the DataManager, so the image nodes are parsed here
372  std::map<DataPtr, QDomNode> datanodes;
373 
374  QDomNode child = dataManagerNode.firstChild();
375  for (; !child.isNull(); child = child.nextSibling())
376  {
377  if (child.nodeName() == "data")
378  {
379  DataPtr data = this->loadData(child.toElement(), rootPath);
380  if (data)
381  datanodes[data] = child.toElement();
382  }
383  }
384 
385  // parse xml data separately: we want to first load all data
386  // because there might be interdependencies (cx::DistanceMetric)
387  for (std::map<DataPtr, QDomNode>::iterator iter = datanodes.begin(); iter != datanodes.end(); ++iter)
388  {
389  iter->first->parseXml(iter->second);
390  }
391 
392  emit dataAddedOrRemoved();
393 
394  //we need to make sure all images are loaded before we try to set an active image
395  child = dataManagerNode.firstChild();
396  while (!child.isNull())
397  {
398  if (child.toElement().tagName() == "activeImageUid")
399  {
400  const QString activeImageString = child.toElement().text();
401  if (!activeImageString.isEmpty())
402  {
403  ImagePtr image = this->getImage(activeImageString);
404  this->setActiveImage(image);
405  }
406  }
407  //TODO add activeMesh
408  if (child.toElement().tagName() == "center")
409  {
410  const QString centerString = child.toElement().text();
411  if (!centerString.isEmpty())
412  {
413  Vector3D center = Vector3D::fromString(centerString);
414  this->setCenter(center);
415  }
416  }
417  child = child.nextSibling();
418  }
419 }
420 
421 DataPtr DataManagerImpl::loadData(QDomElement node, QString rootPath)
422 {
423  QString uid = node.toElement().attribute("uid");
424  QString name = node.toElement().attribute("name");
425  QString type = node.toElement().attribute("type");
426 
427  QDir relativePath = this->findRelativePath(node, rootPath);
428  QString absolutePath = this->findAbsolutePath(relativePath, rootPath);
429 
430  if (mData.count(uid)) // dont load same image twice
431  return mData[uid];
432 
433  DataPtr data = mDataFactory->create(type, uid, name);
434  if (!data)
435  {
436  reportWarning(QString("Unknown type: %1 for file %2").arg(type).arg(absolutePath));
437  return DataPtr();
438  }
439  bool loaded = data->load(absolutePath);
440 
441  if (!loaded)
442  {
443  reportWarning("Unknown file: " + absolutePath);
444  return DataPtr();
445  }
446 
447  if (!name.isEmpty())
448  data->setName(name);
449  data->setFilename(relativePath.path());
450 
451  this->loadData(data);
452 
453  // conversion for change in format 2013-10-29
454  QString newPath = rootPath+"/"+data->getFilename();
455  if (QDir::cleanPath(absolutePath) != QDir::cleanPath(newPath))
456  {
457  reportWarning(QString("Detected old data format, converting from %1 to %2").arg(absolutePath).arg(newPath));
458  data->save(rootPath);
459  }
460 
461  return data;
462 }
463 
464 QDir DataManagerImpl::findRelativePath(QDomElement node, QString rootPath)
465 {
466  QString path = this->findPath(node);
467  QDir relativePath = QDir(QString(path));
468 
469  QDir patientDataDir(rootPath);
470  relativePath.setPath(patientDataDir.relativeFilePath(relativePath.path()));
471 
472  return relativePath;
473 }
474 
475 QString DataManagerImpl::findPath(QDomElement node)
476 {
477  QDomElement filePathNode = node.namedItem("filePath").toElement();
478 
479  if (filePathNode.isNull())
480  return QString();
481 
482  QString path = filePathNode.text();
483  if (path.isEmpty())
484  return QString();
485  return path;
486 }
487 
488 QString DataManagerImpl::findAbsolutePath(QDir relativePath, QString rootPath)
489 {
490  QString absolutePath = relativePath.path();
491  if (!rootPath.isEmpty())
492  absolutePath = rootPath + "/" + relativePath.path();
493  return absolutePath;
494 }
495 
497 {
498  QString uid = "";
499  if (mActiveImage)
500  uid = mActiveImage->getUid();
501 }
502 
504 {
505  return mClinicalApplication;
506 }
507 
508 void DataManagerImpl::setClinicalApplication(CLINICAL_VIEW application)
509 {
510  if (mClinicalApplication == application)
511  return;
512  mClinicalApplication = application;
513 
514  QString val = enum2string<CLINICAL_VIEW>(mClinicalApplication);
515  settings()->setValue("View/clinicalView", val);
516 
518 }
519 
520 void DataManagerImpl::settingsChangedSlot(QString key)
521 {
522  if (key == "View/clinicalView")
523  {
524  this->readClinicalView();
525  }
526 }
527 
529 {
530  QString defVal = enum2string<CLINICAL_VIEW>(mdNEUROLOGICAL);
531  QString val = settings()->value("View/clinicalView", defVal).toString();
532  CLINICAL_VIEW view = string2enum<CLINICAL_VIEW>(val);
533 
534  this->setClinicalApplication(view);
535 }
536 
537 
538 int DataManagerImpl::findUniqueUidNumber(QString uidBase) const
539 {
540  if (!uidBase.contains("%"))
541  return -1;
542  // Find an uid that is not used before
543  size_t numMatches = 1;
544  int recNumber = 0;
545 
546  if (numMatches != 0)
547  {
548  while (numMatches != 0)
549  {
550  QString newId = qstring_cast(uidBase).arg(++recNumber);
551  numMatches = mData.count(qstring_cast(newId));
552  }
553  }
554  return recNumber;
555 }
556 
561 void DataManagerImpl::generateUidAndName(QString* _uid, QString* _name)
562 {
563  QString& uid = *_uid;
564  QString& name = *_name;
565 
566  int recNumber = this->findUniqueUidNumber(uid);
567 
568  if (uid.contains("%"))
569  {
570  uid = uid.arg(recNumber);
571  }
572 
573  if (name.contains("%"))
574  {
575  if (recNumber == 1)
576  name = name.arg("");
577  else
578  name = name.arg(recNumber);
579  }
580 }
581 
582 void DataManagerImpl::removeData(const QString& uid, QString basePath)
583 {
584  if (this->getActiveImage() && this->getActiveImage()->getUid() == uid)
585  this->setActiveImage(ImagePtr());
586 
587  DataPtr data = this->getData(uid);
588 
589  mData.erase(uid);
590 
591  this->deleteFiles(data, basePath);
592 
593  emit dataAddedOrRemoved(); // this should alert everybody interested in the data as a collection.
594  report("Removed data [" + uid + "].");
595 }
596 
597 void DataManagerImpl::deleteFiles(DataPtr data, QString basePath)
598 {
599  if (!data)
600  return;
601  ImagePtr image = boost::dynamic_pointer_cast<Image>(data);
602  QStringList files;
603  if (!data->getFilename().isEmpty())
604  files << QDir(basePath).absoluteFilePath(data->getFilename());
605 
606  if (image)
607  {
608  files << changeExtension(files[0], "raw");
609  }
610 
611  for (int i=0; i<files.size(); ++i)
612  {
613  if (!QFileInfo(files[i]).exists())
614  continue;
615  report(QString("Removing %1 from disk").arg(files[i]));
616  QFile(files[i]).remove();
617  }
618 }
619 
621 {
622  return m_rMpr_History->getCurrentRegistration().mValue;
623 }
624 
626 {
627  m_rMpr_History->setRegistration(val);
628 }
629 
631 {
632  return m_rMpr_History;
633 }
634 
636 {
638  XmlOptionFile preset(DataLocations::findConfigFilePath("presets.xml", "/transferFunctions"));
639  XmlOptionFile custom = profile()->getXmlSettings().descend("presetTransferFunctions");
640 
642  mPresetTransferFunctions3D.reset(new TransferFunctions3DPresets(preset, custom));
643 
645 }
646 
647 } // namespace cx
648 
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:142
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:99
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:91
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:64
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:73
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