CustusX  16.12
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxViewGroupData.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 #include "cxViewGroupData.h"
34 
35 #include <QMenu>
36 #include "vtkCamera.h"
37 
38 #include "cxPatientModelService.h"
39 #include "cxMesh.h"
40 #include "cxTypeConversions.h"
41 #include "cxCameraControl.h"
42 #include "cxImageAlgorithms.h"
43 #include "cxDataMetric.h"
44 #include "cxView.h"
45 #include "cxImage.h"
46 #include "cxTrackedStream.h"
47 #include "cxInteractiveClipper.h"
48 #include "boost/bind.hpp"
49 #include "cxXMLNodeWrapper.h"
50 #include "cxSyncedValue.h"
51 #include "cxCoreServices.h"
52 #include "cxLogger.h"
53 #include "cxDefinitionStrings.h"
54 #include "cxStringListProperty.h"
55 
56 namespace cx
57 {
58 
60 {
61  this->clear();
62 }
63 
64 CameraStyleData::CameraStyleData(CAMERA_STYLE_TYPE style)
65 {
66  this->setCameraStyle(style);
67 }
68 
69 void CameraStyleData::setCameraStyle(CAMERA_STYLE_TYPE style)
70 {
71  this->clear();
72 
73  if (style==cstDEFAULT_STYLE)
74  {
75  }
76  if (style==cstTOOL_STYLE)
77  {
78  mCameraFollowTool = true;
79  mFocusFollowTool = true;
80  }
81  if (style==cstANGLED_TOOL_STYLE)
82  {
83  mCameraFollowTool = true;
84  mFocusFollowTool = true;
85  mElevation = 20.0/180.0*M_PI;
86  }
87  if (style==cstUNICAM_STYLE)
88  {
89  mUniCam = true;
90  }
91 }
92 
93 CAMERA_STYLE_TYPE CameraStyleData::getStyle()
94 {
95  for (unsigned int i=0; i<cstCOUNT; ++i)
96  {
97  CAMERA_STYLE_TYPE current = static_cast<CAMERA_STYLE_TYPE>(i);
98  if (CameraStyleData(current)==*this)
99  return current;
100  }
101  return cstCOUNT;
102 }
103 
104 
106 {
107  mCameraViewAngle = 30.0/180*M_PI;
108  mCameraFollowTool = false;
109  mFocusFollowTool = false;
110  mCameraLockToTooltip = false;
112  mCameraNotBehindROI = "";
113  mTableLock = false;
114  mElevation = 0;
115  mUniCam = false;
116  mAutoZoomROI = "";
117  mFocusROI = "";
118 }
119 
120 void CameraStyleData::addXml(QDomNode &dataNode)
121 {
122  QDomElement elem = dataNode.toElement();
123  elem.setAttribute("cameraViewAngle", mCameraViewAngle);
124  elem.setAttribute("cameraFollowTool", mCameraFollowTool);
125  elem.setAttribute("focusFollowTool", mFocusFollowTool);
126  elem.setAttribute("cameraOnTooltip", mCameraLockToTooltip);
127  elem.setAttribute("cameraTooltipOffset", mCameraTooltipOffset);
128  elem.setAttribute("cameraNotBehindROI", mCameraNotBehindROI);
129  elem.setAttribute("tableLock", mTableLock);
130  elem.setAttribute("elevation", mElevation);
131  elem.setAttribute("uniCam", mUniCam);
132  elem.setAttribute("autoZoomROI", mAutoZoomROI);
133  elem.setAttribute("focusROI", mFocusROI);
134 }
135 
136 void CameraStyleData::parseXml(QDomNode dataNode)
137 {
138  QDomElement elem = dataNode.toElement();
139  mCameraViewAngle = elem.attribute("cameraViewAngle", QString::number(mCameraViewAngle)).toDouble();
140  mCameraFollowTool = elem.attribute("cameraFollowTool", QString::number(mCameraFollowTool)).toInt();
141  mFocusFollowTool = elem.attribute("focusFollowTool", QString::number(mFocusFollowTool)).toInt();
142  mCameraLockToTooltip = elem.attribute("cameraOnTooltip", QString::number(mCameraLockToTooltip)).toInt();
143  mCameraTooltipOffset = elem.attribute("cameraTooltipOffset", QString::number(mCameraTooltipOffset)).toDouble();
144  mCameraNotBehindROI = elem.attribute("cameraNotBehindROI", mCameraNotBehindROI);
145  mTableLock = elem.attribute("tableLock", QString::number(mTableLock)).toInt();
146  mElevation = elem.attribute("elevation", QString::number(mElevation)).toDouble();
147  mUniCam = elem.attribute("uniCam", QString::number(mUniCam)).toInt();
148  mAutoZoomROI = elem.attribute("autoZoomROI", mAutoZoomROI);
149  mFocusROI = elem.attribute("focusROI", mFocusROI);
150 }
151 
152 bool operator==(const CameraStyleData& lhs, const CameraStyleData& rhs)
153 {
154  return ((lhs.mCameraViewAngle==rhs.mCameraViewAngle) &&
156  (lhs.mFocusFollowTool==rhs.mFocusFollowTool) &&
160  (lhs.mTableLock==rhs.mTableLock) &&
161  similar(lhs.mElevation, rhs.mElevation) &&
162  (lhs.mUniCam==rhs.mUniCam) &&
163  (lhs.mAutoZoomROI==rhs.mAutoZoomROI) &&
164  (lhs.mFocusROI==rhs.mFocusROI)
165  );
166 }
167 
168 
169 
170 
172 {
173  DataViewProperties retval;
174  retval.mVolume3D = true;
175  retval.mSlice3D = false;
176  retval.mSlice2D = true;
177  return retval;
178 }
180 {
181  DataViewProperties retval;
182  retval.mVolume3D = true;
183  retval.mSlice3D = true;
184  retval.mSlice2D = true;
185  return retval;
186 }
187 
189 {
190  DataViewProperties retval;
191  retval.mVolume3D = true;
192  retval.mSlice3D = false;
193  retval.mSlice2D = false;
194  return retval;
195 }
196 
198 {
199  DataViewProperties retval;
200  retval.mVolume3D = false;
201  retval.mSlice3D = true;
202  retval.mSlice2D = false;
203  return retval;
204 }
205 
207 {
208  DataViewProperties retval;
209  retval.mVolume3D = false;
210  retval.mSlice3D = false;
211  retval.mSlice2D = true;
212  return retval;
213 }
214 
216 {
217  DataViewProperties retval;
218  retval.mVolume3D = true;
219  retval.mSlice3D = true;
220  retval.mSlice2D = false;
221  return retval;
222 }
223 
224 
225 void DataViewProperties::addXml(QDomNode& dataNode)
226 {
227  QDomElement elem = dataNode.toElement();
228  elem.setAttribute("volume3D", mVolume3D);
229  elem.setAttribute("slice3D", mSlice3D);
230  elem.setAttribute("slice2D", mSlice2D);
231 }
232 
233 void DataViewProperties::parseXml(QDomNode dataNode)
234 {
235  QDomElement elem = dataNode.toElement();
236  mVolume3D = elem.attribute("volume3D", QString::number(mVolume3D)).toInt();
237  mSlice3D = elem.attribute("slice3D", QString::number(mSlice3D)).toInt();
238  mSlice2D = elem.attribute("slice2D", QString::number(mSlice2D)).toInt();
239 }
240 
242 {
243  return !(mVolume3D || mSlice3D || mSlice2D);
244 }
245 
247 {
248  DataViewProperties retval;
249  retval.mSlice2D = mSlice2D || rhs.mSlice2D;
250  retval.mSlice3D = mSlice3D || rhs.mSlice3D;
251  retval.mVolume3D = mVolume3D || rhs.mVolume3D;
252  return retval;
253 }
254 
256 {
257  DataViewProperties retval;
258  retval.mSlice2D = mSlice2D && !rhs.mSlice2D;
259  retval.mSlice3D = mSlice3D && !rhs.mSlice3D;
260  retval.mVolume3D = mVolume3D && !rhs.mVolume3D;
261  return retval;
262 }
263 
265 {
266  if (required.mSlice2D && mSlice2D) return true;
267  if (required.mSlice3D && mSlice3D) return true;
268  if (required.mVolume3D && mVolume3D) return true;
269  return false;
270 }
271 
272 
273 
277 
278 bool dataTypeSort(const DataPtr data1, const DataPtr data2)
279 {
280  return getPriority(data1) < getPriority(data2);
281 }
282 
284 {
285  if (data->getType()=="mesh")
286  return 6;
287  DataMetricPtr metric = boost::dynamic_pointer_cast<DataMetric>(data);
288  if (metric)
289  return 7;
290 
291  ImagePtr image = boost::dynamic_pointer_cast<Image>(data);
292  if (image)
293  {
294  if (image->getModality().toUpper().contains("US"))
295  {
296  if (image->getImageType().toUpper().contains("B-MODE"))
297  return 4;
298  else // angio types
299  return 5;
300  }
301  else if (image->getModality().toUpper().contains("MR"))
302  {
303  // MR, CT, SC, others
304  return 2;
305  }
306  else if (image->getModality().toUpper().contains("CT"))
307  {
308  // MR, CT, SC, others
309  return 1;
310  }
311  else
312  {
313  return 0;
314  }
315  }
316 
317  return 3;
318 }
319 
323 
325  mShowLandmarks(false), mShowPointPickerProbe(false),
326  mPickerGlyph(new Mesh("PickerGlyph"))
327 {
328 }
329 
331  mServices(services),
332  mCamera3D(CameraData::create()),
333  mUid(uid)
334 {
335  if(mServices)
336  connect(mServices->patient().get(), &PatientModelService::dataAddedOrRemoved, this, &ViewGroupData::purgeDataNotExistingInPatientModelService);
337  mVideoSource = "active";
338  mGroup2DZoom = SyncedValue::create(1);
339  mGlobal2DZoom = mGroup2DZoom;
340 
341  this->createSliceDefinitionProperty();
342 }
343 
344 //Remove all data, and wait to emit signals until all data is removed
345 void ViewGroupData::purgeDataNotExistingInPatientModelService()
346 {
347  QStringList purged;
348  for (unsigned i = 0; i < mData.size(); )
349  {
350  QString uid = mData[i].first;
351  if (!mServices->patient()->getData(uid))
352  {
353  if (this->contains(uid))
354  {
355  purged << uid;
356  mData.erase(std::find_if(mData.begin(), mData.end(), data_equals(uid)));
357  }
358  }
359  else
360  ++i;
361  }
362  //Emit delayed signals
363  for(unsigned i = 0; i < purged.size(); ++i)
364  emit dataViewPropertiesChanged(purged[i]);
365 }
366 
367 
369 {
370  emit initialized();
371 }
372 
373 void ViewGroupData::addData(QString uid)
374 {
375  DataViewProperties properties = this->getProperties(uid);
376  properties = properties.addFlagsIn(DataViewProperties::createDefault());
377  this->setProperties(uid, properties);
378 }
379 
381 {
382  if (this->contains(uid))
383  return;
384 
386  DataAndViewProperties item(uid, properties);
387 
388  for (int i=int(mData.size())-1; i>=0; --i)
389  {
390  if (!dataTypeSort(this->getData(uid), this->getData(mData[i].first)))
391  {
392  mData.insert(mData.begin()+i+1, item);
393  break;
394  }
395  }
396  if (!this->contains(uid))
397  mData.insert(mData.begin(), item);
398  emit dataViewPropertiesChanged(uid);
399 }
400 
402 {
403  if (this->contains(uid))
404  return std::find_if(mData.begin(), mData.end(), data_equals(uid))->second;
405  return DataViewProperties();
406 }
407 
409 {
410  if (uid.isEmpty())
411  return;
412 
413  if (properties.empty())
414  {
415  this->removeData(uid);
416  return;
417  }
418 
419  if (!this->contains(uid))
420  {
421  DataAndViewProperties item(uid, properties);
422  mData.push_back(item);
423  }
424  else
425  {
426  std::find_if(mData.begin(), mData.end(), data_equals(uid))->second = properties;
427  }
428 
429  emit dataViewPropertiesChanged(uid);
430 }
431 
432 bool ViewGroupData::contains(QString uid) const
433 {
434  return std::count_if(mData.begin(), mData.end(), data_equals(uid));
435 }
436 
437 bool ViewGroupData::removeData(QString uid)
438 {
439  if (!this->contains(uid))
440  return false;
441  mData.erase(std::find_if(mData.begin(), mData.end(), data_equals(uid)));
442  emit dataViewPropertiesChanged(uid);
443  return true;
444 }
445 
447 {
448  while (!mData.empty())
449  this->removeData(mData.front().first);
450  this->setVideoSource("active");
451 
452  mGroup2DZoom->set(1.0);
453  mGlobal2DZoom->set(1.0);
454 }
455 
456 DataPtr ViewGroupData::getData(QString uid) const
457 {
458  DataPtr data = mServices->patient()->getData(uid);
459  if (!data)
460  {
461  reportError("Couldn't find the data: [" + uid + "] in the datamanager.");
462  return DataPtr();
463  }
464  return data;
465 }
466 
468 {
469  if (mVideoSource==uid)
470  return;
471  mVideoSource = uid;
472  emit videoSourceChanged(mVideoSource);
473 }
474 
476 {
477  return mVideoSource;
478 }
479 
480 std::vector<DataPtr> ViewGroupData::getData(DataViewProperties properties) const
481 {
482  return this->getDataOfType<Data>(properties);
483 }
484 
485 
486 template<class DATA_TYPE>
487 std::vector<boost::shared_ptr<DATA_TYPE> > ViewGroupData::getDataOfType(DataViewProperties requiredProperties) const
488 {
489  // speed optimization: call getdatas() instead of getdata() in for loop
490  std::map<QString, DataPtr> alldata = mServices->patient()->getDatas();
491 
492  typedef boost::shared_ptr<DATA_TYPE> DATA_PTR;
493  std::vector<DATA_PTR> retval;
494  for (unsigned i = 0; i < mData.size(); ++i)
495  {
496  DATA_PTR data = boost::dynamic_pointer_cast<DATA_TYPE>(alldata[mData[i].first]);
497  if (!data)
498  continue;
499  DataViewProperties properties = mData[i].second;
500  if (!properties.containsAnyFlagsIn(requiredProperties))
501  continue;
502  retval.push_back(data);
503  }
504  return retval;
505 }
506 
507 std::vector<ImagePtr> ViewGroupData::getImages(DataViewProperties properties) const
508 {
509  return this->getDataOfType<Image>(properties);
510 }
511 
512 std::vector<MeshPtr> ViewGroupData::getMeshes(DataViewProperties properties) const
513 {
514  return this->getDataOfType<Mesh>(properties);
515 }
516 
517 std::vector<TrackedStreamPtr> ViewGroupData::getTrackedStreams(DataViewProperties properties) const
518 {
519  return this->getDataOfType<TrackedStream>(properties);
520 }
521 
522 std::vector<TrackedStreamPtr> ViewGroupData::getTracked2DStreams(DataViewProperties properties) const
523 {
524  std::vector<TrackedStreamPtr> streams = this->getTrackedStreams(properties);
525  std::vector<TrackedStreamPtr> retval;
526 
527  for(int i = 0; i < streams.size(); ++i)
528  {
529  if(streams[i]->is2D() )
530  retval.push_back(streams[i]);
531  }
532  return retval;
533 }
534 
535 std::vector<ImagePtr> ViewGroupData::getImagesAndChangingImagesFromTrackedStreams(DataViewProperties properties, bool include2D) const
536 {
537  std::vector<ImagePtr> images = this->getImages(properties);
538  std::vector<TrackedStreamPtr> streams = this->getTrackedStreams(properties);
539 
540  for(int i = 0; i < streams.size(); ++i)
541  {
542  ImagePtr changingImage = streams[i]->getChangingImage();
543  if(streams[i]->is3D())
544  images.push_back(changingImage);
545  if(include2D && streams[i]->is2D())
546  images.push_back(changingImage);
547  }
548  return images;
549 }
550 
552 {
553  return mOptions;
554 }
555 
557 {
558  mOptions = options;
559  emit optionsChanged();
560 }
561 
563 {
564  mGlobal2DZoom = val;
565 }
566 
568 {
569  return mGroup2DZoom;
570 }
572 {
573  return mGlobal2DZoom;
574 }
575 
576 void ViewGroupData::createSliceDefinitionProperty()
577 {
578  QStringList slicedefs;
579  for (int i=0; i<ptCOUNT; ++i)
580  slicedefs << enum2string(PLANE_TYPE(i));
581  QStringList slicedefaults;
583  mSliceDefinitionProperty = StringListProperty::initialize("slice_definition_3D",
584  "3D Slices",
585  "Select slice planes to view in 3D",
586  slicedefaults,
587  slicedefs);
588  connect(mSliceDefinitionProperty.get(), &Property::changed, this, &ViewGroupData::optionsChanged);
589 }
590 
592 {
593  QStringList val = mSliceDefinitionProperty->getValue();
594  return PlaneTypeCollection::fromString(val.join("/"));
595 }
596 
598 {
599  QStringList val_list = val.toString().split("/");
600  mSliceDefinitionProperty->setValue(val_list);
601 }
602 
604 {
605  return mSliceDefinitionProperty;
606 }
607 
608 void ViewGroupData::addXml(QDomNode& dataNode)
609 {
610  XMLNodeAdder base(dataNode);
611 
612  for (unsigned i = 0; i < mData.size(); ++i)
613  {
614  QDomElement elem;
615  elem = base.addTextToElement("data", mData[i].first);
616  mData[i].second.addXml(elem);
617  }
618 
619  base.addObjectToElement("camera3D", this->getCamera3D());
620  base.addTextToElement("slicesPlanes3D", this->getSliceDefinitions().toString());
621 
622  Options options = this->getOptions();
623  base.addObjectToElement("cameraStyle", &options.mCameraStyle);
624 }
625 
626 void ViewGroupData::parseXml(QDomNode dataNode)
627 {
628  XMLNodeParser base(dataNode);
629 
630  QString sliceText = base.parseTextFromElement("slicesPlanes3D");
632 
633  std::vector<QDomElement> dataElems = base.getDuplicateElements("data");
634  for (unsigned i=0; i<dataElems.size(); ++i)
635  {
636  QDomElement elem = dataElems[i];
637  QString uid = elem.text();
639  properties.parseXml(elem);
640 
641  this->addData(uid);
642  this->setProperties(uid, properties);
643  }
644 
645  base.parseObjectFromElement("camera3D", this->getCamera3D());
646 
647  Options options = this->getOptions();
648  base.parseObjectFromElement("cameraStyle", &options.mCameraStyle);
649  this->setOptions(options);
650 }
651 
652 void ViewGroupData::setRegistrationMode(REGISTRATION_STATUS mode)
653 {
654  ViewGroupData::Options options = this->getOptions();
655 
656  options.mShowLandmarks = false;
657  options.mShowPointPickerProbe = false;
658 
659  if (mode == rsIMAGE_REGISTRATED)
660  {
661  options.mShowLandmarks = true;
662  options.mShowPointPickerProbe = true;
663  }
664  if (mode == rsPATIENT_REGISTRATED)
665  {
666  options.mShowLandmarks = true;
667  options.mShowPointPickerProbe = false;
668  }
669 
670  this->setOptions(options);
671 }
672 
673 
674 } // namespace cx
int getPriority(DataPtr data)
static DataViewProperties createSlice3D()
ptCORONAL
a slice seen from the front of the patient
Definition: cxDefinitions.h:56
void reportError(QString msg)
Definition: cxLogger.cpp:92
void initializeGlobal2DZoom(SyncedValuePtr val)
A mesh data set.
Definition: cxMesh.h:66
CameraDataPtr getCamera3D()
void addXml(QDomNode &dataNode)
static DataViewProperties createDefault()
PlaneTypeCollection getSliceDefinitions()
boost::shared_ptr< DataMetric > DataMetricPtr
Definition: cxDataMetric.h:96
void parseXml(QDomNode dataNode)
std::vector< QDomElement > getDuplicateElements(QString name)
boost::shared_ptr< class Image > ImagePtr
Definition: cxDicomWidget.h:48
std::vector< ImagePtr > getImagesAndChangingImagesFromTrackedStreams(DataViewProperties properties, bool include2D=false) const
CAMERA_STYLE_TYPE getStyle()
SyncedValuePtr getGroup2DZoom()
void parseXml(QDomNode dataNode)
SyncedValuePtr getGlobal2DZoom()
DataViewProperties getProperties(QString uid)
ptAXIAL
a slice seen from the top of the patient
Definition: cxDefinitions.h:56
cstTOOL_STYLE
Definition: cxViewService.h:62
ViewGroupData(CoreServicesPtr services, QString uid)
void setProperties(QString uid, DataViewProperties properties)
static DataViewProperties createSlice2D()
static StringListPropertyPtr initialize(const QString &uid, QString name, QString help, QStringList value, QStringList range, QDomNode root=QDomNode())
void addObjectToElement(QString name, T object)
cstDEFAULT_STYLE
Definition: cxViewService.h:62
static DataViewProperties create3D()
boost::shared_ptr< class Data > DataPtr
std::vector< MeshPtr > getMeshes(DataViewProperties properties) const
ptSAGITTAL
a slice seen from the side of the patient
Definition: cxDefinitions.h:56
static PlaneTypeCollection fromString(QString input, PlaneTypeCollection defVal=PlaneTypeCollection())
void setCameraStyle(CAMERA_STYLE_TYPE style)
void addData(QString uid)
void addDataSorted(QString uid)
add data in a predefined ordering: CT/MR/SC/US/USA/Mesh/Metrics
std::vector< TrackedStreamPtr > getTracked2DStreams(DataViewProperties properties) const
static SyncedValuePtr create(QVariant val=QVariant())
A volumetric data set.
Definition: cxImage.h:66
cstANGLED_TOOL_STYLE
Definition: cxViewService.h:62
QDomElement addTextToElement(QString name, QString text)
Options getOptions() const
void addXml(QDomNode &dataNode)
bool containsAnyFlagsIn(DataViewProperties required) const
static DataViewProperties createFull()
std::vector< ImagePtr > getImages(DataViewProperties properties) const
void parseXml(QDomNode dataNode)
std::vector< TrackedStreamPtr > getTrackedStreams(DataViewProperties properties) const
void dataViewPropertiesChanged(QString uid)
void changed()
emit when the underlying data value is changed: The user interface will be updated.
static DataViewProperties createVolume3D()
bool dataTypeSort(const DataPtr data1, const DataPtr data2)
bool removeData(QString uid)
boost::shared_ptr< class StringListProperty > StringListPropertyPtr
bool operator==(const RegistrationTransform &lhs, const RegistrationTransform &rhs)
QString parseTextFromElement(QString name)
bool similar(const CameraInfo &lhs, const CameraInfo &rhs, double tol)
void setVideoSource(QString uid)
boost::shared_ptr< class CoreServices > CoreServicesPtr
Definition: cxCameraStyle.h:59
DataViewProperties removeFlagsIn(DataViewProperties rhs) const
void parseObjectFromElement(QString name, T object)
cstUNICAM_STYLE
Definition: cxViewService.h:62
DataViewProperties addFlagsIn(DataViewProperties rhs) const
void videoSourceChanged(QString uid)
boost::shared_ptr< class SyncedValue > SyncedValuePtr
Definition: cxViewGroup.h:51
void setRegistrationMode(REGISTRATION_STATUS mode)
StringListPropertyPtr getSliceDefinitionProperty()
void addXml(QDomNode &dataNode)
std::vector< DataPtr > getData(DataViewProperties properties=DataViewProperties::createFull()) const
Base class for all Data Metrics.
Definition: cxDataMetric.h:64
void setSliceDefinitions(PlaneTypeCollection val)
QString enum2string(const ENUM &val)
QString getVideoSource() const
void setOptions(Options options)
#define M_PI
rsIMAGE_REGISTRATED