Fraxinus  17.12
An IGT application
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 #include "cxSharedOpenGLContext.h"
56 
57 namespace cx
58 {
59 
61 {
62  this->clear();
63 }
64 
65 CameraStyleData::CameraStyleData(CAMERA_STYLE_TYPE style)
66 {
67  this->setCameraStyle(style);
68 }
69 
70 void CameraStyleData::setCameraStyle(CAMERA_STYLE_TYPE style)
71 {
72  this->clear();
73 
74  if (style==cstDEFAULT_STYLE)
75  {
76  }
77  if (style==cstTOOL_STYLE)
78  {
79  mCameraFollowTool = true;
80  mFocusFollowTool = true;
81  }
82  if (style==cstANGLED_TOOL_STYLE)
83  {
84  mCameraFollowTool = true;
85  mFocusFollowTool = true;
86  mElevation = 20.0/180.0*M_PI;
87  }
88  if (style==cstUNICAM_STYLE)
89  {
90  mUniCam = true;
91  }
92 }
93 
94 CAMERA_STYLE_TYPE CameraStyleData::getStyle()
95 {
96  for (unsigned int i=0; i<cstCOUNT; ++i)
97  {
98  CAMERA_STYLE_TYPE current = static_cast<CAMERA_STYLE_TYPE>(i);
99  if (CameraStyleData(current)==*this)
100  return current;
101  }
102  return cstCOUNT;
103 }
104 
105 
107 {
108  mCameraViewAngle = 30.0/180*M_PI;
109  mCameraFollowTool = false;
110  mFocusFollowTool = false;
111  mCameraLockToTooltip = false;
113  mCameraNotBehindROI = "";
114  mTableLock = false;
115  mElevation = 0;
116  mUniCam = false;
117  mAutoZoomROI = "";
118  mFocusROI = "";
119 }
120 
121 void CameraStyleData::addXml(QDomNode &dataNode)
122 {
123  QDomElement elem = dataNode.toElement();
124  elem.setAttribute("cameraViewAngle", mCameraViewAngle);
125  elem.setAttribute("cameraFollowTool", mCameraFollowTool);
126  elem.setAttribute("focusFollowTool", mFocusFollowTool);
127  elem.setAttribute("cameraOnTooltip", mCameraLockToTooltip);
128  elem.setAttribute("cameraTooltipOffset", mCameraTooltipOffset);
129  elem.setAttribute("cameraNotBehindROI", mCameraNotBehindROI);
130  elem.setAttribute("tableLock", mTableLock);
131  elem.setAttribute("elevation", mElevation);
132  elem.setAttribute("uniCam", mUniCam);
133  elem.setAttribute("autoZoomROI", mAutoZoomROI);
134  elem.setAttribute("focusROI", mFocusROI);
135 }
136 
137 void CameraStyleData::parseXml(QDomNode dataNode)
138 {
139  QDomElement elem = dataNode.toElement();
140  mCameraViewAngle = elem.attribute("cameraViewAngle", QString::number(mCameraViewAngle)).toDouble();
141  mCameraFollowTool = elem.attribute("cameraFollowTool", QString::number(mCameraFollowTool)).toInt();
142  mFocusFollowTool = elem.attribute("focusFollowTool", QString::number(mFocusFollowTool)).toInt();
143  mCameraLockToTooltip = elem.attribute("cameraOnTooltip", QString::number(mCameraLockToTooltip)).toInt();
144  mCameraTooltipOffset = elem.attribute("cameraTooltipOffset", QString::number(mCameraTooltipOffset)).toDouble();
145  mCameraNotBehindROI = elem.attribute("cameraNotBehindROI", mCameraNotBehindROI);
146  mTableLock = elem.attribute("tableLock", QString::number(mTableLock)).toInt();
147  mElevation = elem.attribute("elevation", QString::number(mElevation)).toDouble();
148  mUniCam = elem.attribute("uniCam", QString::number(mUniCam)).toInt();
149  mAutoZoomROI = elem.attribute("autoZoomROI", mAutoZoomROI);
150  mFocusROI = elem.attribute("focusROI", mFocusROI);
151 }
152 
153 bool operator==(const CameraStyleData& lhs, const CameraStyleData& rhs)
154 {
155  return ((lhs.mCameraViewAngle==rhs.mCameraViewAngle) &&
157  (lhs.mFocusFollowTool==rhs.mFocusFollowTool) &&
161  (lhs.mTableLock==rhs.mTableLock) &&
162  similar(lhs.mElevation, rhs.mElevation) &&
163  (lhs.mUniCam==rhs.mUniCam) &&
164  (lhs.mAutoZoomROI==rhs.mAutoZoomROI) &&
165  (lhs.mFocusROI==rhs.mFocusROI)
166  );
167 }
168 
169 
170 
171 
173 {
174  DataViewProperties retval;
175  retval.mVolume3D = true;
176  retval.mSlice3D = false;
177  retval.mSlice2D = true;
178  return retval;
179 }
181 {
182  DataViewProperties retval;
183  retval.mVolume3D = true;
184  retval.mSlice3D = true;
185  retval.mSlice2D = true;
186  return retval;
187 }
188 
190 {
191  DataViewProperties retval;
192  retval.mVolume3D = true;
193  retval.mSlice3D = false;
194  retval.mSlice2D = false;
195  return retval;
196 }
197 
199 {
200  DataViewProperties retval;
201  retval.mVolume3D = false;
202  retval.mSlice3D = true;
203  retval.mSlice2D = false;
204  return retval;
205 }
206 
208 {
209  DataViewProperties retval;
210  retval.mVolume3D = false;
211  retval.mSlice3D = false;
212  retval.mSlice2D = true;
213  return retval;
214 }
215 
217 {
218  DataViewProperties retval;
219  retval.mVolume3D = true;
220  retval.mSlice3D = true;
221  retval.mSlice2D = false;
222  return retval;
223 }
224 
225 
226 void DataViewProperties::addXml(QDomNode& dataNode)
227 {
228  QDomElement elem = dataNode.toElement();
229  elem.setAttribute("volume3D", mVolume3D);
230  elem.setAttribute("slice3D", mSlice3D);
231  elem.setAttribute("slice2D", mSlice2D);
232 }
233 
234 void DataViewProperties::parseXml(QDomNode dataNode)
235 {
236  QDomElement elem = dataNode.toElement();
237  mVolume3D = elem.attribute("volume3D", QString::number(mVolume3D)).toInt();
238  mSlice3D = elem.attribute("slice3D", QString::number(mSlice3D)).toInt();
239  mSlice2D = elem.attribute("slice2D", QString::number(mSlice2D)).toInt();
240 }
241 
243 {
244  return !(mVolume3D || mSlice3D || mSlice2D);
245 }
246 
248 {
249  DataViewProperties retval;
250  retval.mSlice2D = mSlice2D || rhs.mSlice2D;
251  retval.mSlice3D = mSlice3D || rhs.mSlice3D;
252  retval.mVolume3D = mVolume3D || rhs.mVolume3D;
253  return retval;
254 }
255 
257 {
258  DataViewProperties retval;
259  retval.mSlice2D = mSlice2D && !rhs.mSlice2D;
260  retval.mSlice3D = mSlice3D && !rhs.mSlice3D;
261  retval.mVolume3D = mVolume3D && !rhs.mVolume3D;
262  return retval;
263 }
264 
266 {
267  if (required.mSlice2D && mSlice2D) return true;
268  if (required.mSlice3D && mSlice3D) return true;
269  if (required.mVolume3D && mVolume3D) return true;
270  return false;
271 }
272 
273 
274 
278 
279 bool dataTypeSort(const DataPtr data1, const DataPtr data2)
280 {
281  return getPriority(data1) < getPriority(data2);
282 }
283 
285 {
286  if (data->getType()=="mesh")
287  return 6;
288  DataMetricPtr metric = boost::dynamic_pointer_cast<DataMetric>(data);
289  if (metric)
290  return 7;
291 
292  ImagePtr image = boost::dynamic_pointer_cast<Image>(data);
293  if (image)
294  {
295  if (image->getModality().toUpper().contains("US"))
296  {
297  if (image->getImageType().toUpper().contains("B-MODE"))
298  return 4;
299  else // angio types
300  return 5;
301  }
302  else if (image->getModality().toUpper().contains("MR"))
303  {
304  // MR, CT, SC, others
305  return 2;
306  }
307  else if (image->getModality().toUpper().contains("CT"))
308  {
309  // MR, CT, SC, others
310  return 1;
311  }
312  else
313  {
314  return 0;
315  }
316  }
317 
318  return 3;
319 }
320 
324 
326  mShowLandmarks(false), mShowPointPickerProbe(false),
327  mPickerGlyph(new Mesh("PickerGlyph"))
328 {
329 }
330 
332  mServices(services),
333  mCamera3D(CameraData::create()),
334  mUid(uid)
335 {
336  if(mServices)
337  connect(mServices->patient().get(), &PatientModelService::dataAddedOrRemoved, this, &ViewGroupData::purgeDataNotExistingInPatientModelService);
338  mVideoSource = "active";
339  mGroup2DZoom = SyncedValue::create(1);
340  mGlobal2DZoom = mGroup2DZoom;
341 
342  this->createSliceDefinitionProperty();
343 }
344 
345 //Remove all data, and wait to emit signals until all data is removed
346 void ViewGroupData::purgeDataNotExistingInPatientModelService()
347 {
348  QStringList purged;
349  for (unsigned i = 0; i < mData.size(); )
350  {
351  QString uid = mData[i].first;
352  if (!mServices->patient()->getData(uid))
353  {
354  if (this->contains(uid))
355  {
356  purged << uid;
357  mData.erase(std::find_if(mData.begin(), mData.end(), data_equals(uid)));
358  }
359  }
360  else
361  ++i;
362  }
363  //Emit delayed signals
364  for(unsigned i = 0; i < purged.size(); ++i)
365  emit dataViewPropertiesChanged(purged[i]);
366 }
367 
368 
370 {
371  emit initialized();
372 }
373 
374 void ViewGroupData::addData(QString uid)
375 {
376  DataViewProperties properties = this->getProperties(uid);
377  properties = properties.addFlagsIn(DataViewProperties::createDefault());
378  this->setProperties(uid, properties);
379 }
380 
382 {
383  if (this->contains(uid))
384  return;
385 
387  DataAndViewPropertiesPair item(uid, properties);
388 
389  for (int i=int(mData.size())-1; i>=0; --i)
390  {
391  if (!dataTypeSort(this->getData(uid), this->getData(mData[i].first)))
392  {
393  this->insertData(mData.begin()+i+1, item);
394  break;
395  }
396  }
397  if (!this->contains(uid))
398  this->insertData(mData.begin(), item);
399  emit dataViewPropertiesChanged(uid);
400 }
401 
402 void ViewGroupData::insertData(std::vector<DataAndViewPropertiesPair>::iterator iter, DataAndViewPropertiesPair &item)
403 {
404  //this->upload3DTextureIfImageToSharedContext(item.first);
405  this->mData.insert(iter, item);
406 }
407 
408 /*
409 //TODO remove? maybe it is better to do this in the proxy?
410 void ViewGroupData::upload3DTextureIfImageToSharedContext(QString uid)
411 {
412  CX_LOG_DEBUG() << "upload3DTextureIfImageToSharedContext: " << uid;
413  ImagePtr image = mServices->patient()->getData<Image>(uid);
414  if(image)
415  {
416  if(mSharedOpenGLContext)
417  mSharedOpenGLContext->upload3DTexture(image);
418  else
419  CX_LOG_ERROR() << "ViewGroupData::uploadIfImageToSharedContext: Got no shared OpenGL context";
420  }
421 }
422 */
423 
425 {
426  if (this->contains(uid))
427  return std::find_if(mData.begin(), mData.end(), data_equals(uid))->second;
428  return DataViewProperties();
429 }
430 
432 {
433  if (uid.isEmpty())
434  return;
435 
436  if (properties.empty())
437  {
438  this->removeData(uid);
439  return;
440  }
441 
442  if (!this->contains(uid))
443  {
444  DataAndViewPropertiesPair item(uid, properties);
445 // mData.push_back(item);
446  this->insertData(mData.end(), item);
447  }
448  else
449  {
450  std::find_if(mData.begin(), mData.end(), data_equals(uid))->second = properties;
451  }
452 
453  emit dataViewPropertiesChanged(uid);
454 }
455 
456 bool ViewGroupData::contains(QString uid) const
457 {
458  return std::count_if(mData.begin(), mData.end(), data_equals(uid));
459 }
460 
461 bool ViewGroupData::removeData(QString uid)
462 {
463  if (!this->contains(uid))
464  return false;
465  mData.erase(std::find_if(mData.begin(), mData.end(), data_equals(uid)));
466  emit dataViewPropertiesChanged(uid);
467  return true;
468 }
469 
471 {
472  while (!mData.empty())
473  this->removeData(mData.front().first);
474  this->setVideoSource("active");
475 
476  mGroup2DZoom->set(1.0);
477  mGlobal2DZoom->set(1.0);
478 }
479 
480 DataPtr ViewGroupData::getData(QString uid) const
481 {
482  DataPtr data = mServices->patient()->getData(uid);
483  if (!data)
484  {
485  reportError("Couldn't find the data: [" + uid + "] in the datamanager.");
486  return DataPtr();
487  }
488  return data;
489 }
490 
492 {
493  if (mVideoSource==uid)
494  return;
495  mVideoSource = uid;
496  emit videoSourceChanged(mVideoSource);
497 }
498 
500 {
501  return mVideoSource;
502 }
503 
504 std::vector<DataPtr> ViewGroupData::getData(DataViewProperties properties) const
505 {
506  return this->getDataOfType<Data>(properties);
507 }
508 
509 
510 template<class DATA_TYPE>
511 std::vector<boost::shared_ptr<DATA_TYPE> > ViewGroupData::getDataOfType(DataViewProperties requiredProperties) const
512 {
513  // speed optimization: call getdatas() instead of getdata() in for loop
514  std::map<QString, DataPtr> alldata = mServices->patient()->getDatas();
515 
516  typedef boost::shared_ptr<DATA_TYPE> DATA_PTR;
517  std::vector<DATA_PTR> retval;
518  for (unsigned i = 0; i < mData.size(); ++i)
519  {
520  DATA_PTR data = boost::dynamic_pointer_cast<DATA_TYPE>(alldata[mData[i].first]);
521  if (!data)
522  continue;
523  DataViewProperties properties = mData[i].second;
524  if (!properties.containsAnyFlagsIn(requiredProperties))
525  continue;
526  retval.push_back(data);
527  }
528  return retval;
529 }
530 
531 std::vector<ImagePtr> ViewGroupData::getImages(DataViewProperties properties) const
532 {
533  return this->getDataOfType<Image>(properties);
534 }
535 
536 std::vector<MeshPtr> ViewGroupData::getMeshes(DataViewProperties properties) const
537 {
538  return this->getDataOfType<Mesh>(properties);
539 }
540 
541 std::vector<TrackedStreamPtr> ViewGroupData::getTrackedStreams(DataViewProperties properties) const
542 {
543  return this->getDataOfType<TrackedStream>(properties);
544 }
545 
546 std::vector<TrackedStreamPtr> ViewGroupData::getTracked2DStreams(DataViewProperties properties) const
547 {
548  std::vector<TrackedStreamPtr> streams = this->getTrackedStreams(properties);
549  std::vector<TrackedStreamPtr> retval;
550 
551  for(int i = 0; i < streams.size(); ++i)
552  {
553  if(streams[i]->is2D() )
554  retval.push_back(streams[i]);
555  }
556  return retval;
557 }
558 
559 std::vector<ImagePtr> ViewGroupData::getImagesAndChangingImagesFromTrackedStreams(DataViewProperties properties, bool include2D) const
560 {
561  std::vector<ImagePtr> images = this->getImages(properties);
562  std::vector<TrackedStreamPtr> streams = this->getTrackedStreams(properties);
563 
564  for(int i = 0; i < streams.size(); ++i)
565  {
566  ImagePtr changingImage = streams[i]->getChangingImage();
567  if(streams[i]->is3D())
568  images.push_back(changingImage);
569  if(include2D && streams[i]->is2D())
570  images.push_back(changingImage);
571  }
572  return images;
573 }
574 
576 {
577  return mOptions;
578 }
579 
581 {
582  mOptions = options;
583  emit optionsChanged();
584 }
585 
587 {
588  mGlobal2DZoom = val;
589 }
590 
592 {
593  return mGroup2DZoom;
594 }
596 {
597  return mGlobal2DZoom;
598 }
599 
600 void ViewGroupData::zoomCamera3D(int zoomFactor)
601 {
602  CameraDataPtr cameraData = this->getCamera3D();
603  if(!cameraData)
604  return;
605 
606  vtkCameraPtr camera = cameraData->getCamera();
607  if(!camera)
608  return;
609 
610  camera->Dolly(zoomFactor);
611 }
612 
613 void ViewGroupData::createSliceDefinitionProperty()
614 {
615  QStringList slicedefs;
616  for (int i=0; i<ptCOUNT; ++i)
617  slicedefs << enum2string(PLANE_TYPE(i));
618  QStringList slicedefaults;
620  mSliceDefinitionProperty = StringListProperty::initialize("slice_definition_3D",
621  "3D Slices",
622  "Select slice planes to view in 3D",
623  slicedefaults,
624  slicedefs);
625  connect(mSliceDefinitionProperty.get(), &Property::changed, this, &ViewGroupData::optionsChanged);
626 }
627 
629 {
630  QStringList val = mSliceDefinitionProperty->getValue();
631  return PlaneTypeCollection::fromString(val.join("/"));
632 }
633 
635 {
636  QStringList val_list = val.toString().split("/");
637  mSliceDefinitionProperty->setValue(val_list);
638 }
639 
641 {
642  return mSliceDefinitionProperty;
643 }
644 
645 void ViewGroupData::addXml(QDomNode& dataNode)
646 {
647  XMLNodeAdder base(dataNode);
648 
649  for (unsigned i = 0; i < mData.size(); ++i)
650  {
651  QDomElement elem;
652  elem = base.addTextToElement("data", mData[i].first);
653  mData[i].second.addXml(elem);
654  }
655 
656  base.addObjectToElement("camera3D", this->getCamera3D());
657  base.addTextToElement("slicesPlanes3D", this->getSliceDefinitions().toString());
658 
659  Options options = this->getOptions();
660  base.addObjectToElement("cameraStyle", &options.mCameraStyle);
661 }
662 
663 void ViewGroupData::parseXml(QDomNode dataNode)
664 {
665  XMLNodeParser base(dataNode);
666 
667  QString sliceText = base.parseTextFromElement("slicesPlanes3D");
669 
670  std::vector<QDomElement> dataElems = base.getDuplicateElements("data");
671  for (unsigned i=0; i<dataElems.size(); ++i)
672  {
673  QDomElement elem = dataElems[i];
674  QString uid = elem.text();
676  properties.parseXml(elem);
677 
678  this->addData(uid);
679  this->setProperties(uid, properties);
680  }
681 
682  base.parseObjectFromElement("camera3D", this->getCamera3D());
683 
684  Options options = this->getOptions();
685  base.parseObjectFromElement("cameraStyle", &options.mCameraStyle);
686  this->setOptions(options);
687 }
688 
689 void ViewGroupData::setRegistrationMode(REGISTRATION_STATUS mode)
690 {
691  ViewGroupData::Options options = this->getOptions();
692 
693  options.mShowLandmarks = false;
694  options.mShowPointPickerProbe = false;
695 
696  if (mode == rsIMAGE_REGISTRATED)
697  {
698  options.mShowLandmarks = true;
699  options.mShowPointPickerProbe = true;
700  }
701  if (mode == rsPATIENT_REGISTRATED)
702  {
703  options.mShowLandmarks = true;
704  options.mShowPointPickerProbe = false;
705  }
706 
707  this->setOptions(options);
708 }
709 
710 
711 } // 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()
boost::shared_ptr< class CameraData > CameraDataPtr
Definition: cxViewWrapper.h:57
PlaneTypeCollection getSliceDefinitions()
std::string toString(T const &value)
converts any type to a string
Definition: catch.hpp:755
boost::shared_ptr< DataMetric > DataMetricPtr
Definition: cxDataMetric.h:94
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:55
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:55
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:55
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()
void zoomCamera3D(int zoomFactor)
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:55
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
vtkSmartPointer< class vtkCamera > vtkCameraPtr
rsIMAGE_REGISTRATED
Namespace for all CustusX production code.