CustusX  16.12
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxDataMetricWrappers.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 #include <cxDataMetricWrappers.h>
33 
34 #include <QTreeWidget>
35 #include <QTreeWidgetItem>
36 #include <QStringList>
37 #include <QVBoxLayout>
38 #include <QHeaderView>
39 
40 #include "cxLogger.h"
41 #include "cxTypeConversions.h"
43 #include "cxTrackingService.h"
44 #include "cxPointMetric.h"
45 #include "cxDistanceMetric.h"
47 #include "cxVector3DWidget.h"
49 #include "cxHelperWidgets.h"
50 #include "cxBaseWidget.h"
51 #include "cxBoolProperty.h"
52 #include "cxSpaceProvider.h"
53 #include "cxPatientModelService.h"
54 #include "cxSpaceEditWidget.h"
55 #include "cxSpaceProperty.h"
56 #include "cxStringListProperty.h"
58 //TODO :remove
59 #include "cxLegacySingletons.h"
60 
61 namespace cx
62 {
63 
65  mViewService(viewService),
66  mPatientModelService(patientModelService)
67 {
68 }
69 
70 void MetricBase::colorSelected()
71 {
72  this->getData()->setColor(mColorSelector->getValue());
73 }
74 
75 QString MetricBase::getValue() const
76 {
77  QString retval = this->getData()->getValueAsString();
78  if (retval.isEmpty())
79  return "NA";
80  return retval;
81 }
82 
83 void MetricBase::addColorWidget(QVBoxLayout* layout)
84 {
85  mColorSelector = ColorProperty::initialize("color", "Color",
86  "Set color of metric",
87  this->getData()->getColor(), QDomNode());
88  QHBoxLayout* line = new QHBoxLayout;
90  line->addStretch();
91  line->setMargin(0);
92  layout->addLayout(line);
93  connect(mColorSelector.get(), SIGNAL(valueWasSet()), this, SLOT(colorSelected()));
94 }
95 
96 QWidget *cx::MetricBase::newWidget(QString objectName)
97 {
98  QWidget* widget = new QWidget;
99  widget->setFocusPolicy(Qt::StrongFocus); // needed for help system: focus is used to display help text
100  widget->setObjectName(objectName);
101  return widget;
102 }
103 //---------------------------------------------------------
104 //---------------------------------------------------------
105 //---------------------------------------------------------
106 
108 {
109  mModified = true;
110  mInternalUpdate = false;
111 }
112 
114 {
115  mArguments = arguments;
116  connect(mArguments.get(), SIGNAL(argumentsChanged()), this, SLOT(dataChangedSlot()));
117 }
118 
120 {
121  QString value;
122 
123  mPSelector.resize(mArguments->getCount());
124  for (unsigned i=0; i<mPSelector.size(); ++i)
125  {
126  mPSelector[i] = StringProperty::initialize(QString("p%1").arg(i),
127  QString("p%1").arg(i),
128  mArguments->getDescription(i),
129  mArguments->get(i) ? mArguments->get(i)->getUid() : "",
130  QStringList(),
131  QDomNode());
132 // mPSelector[i]->setDisplayNames(names);
133  layout->addWidget(new LabeledComboBoxWidget(NULL, mPSelector[i]));
134  connect(mPSelector[i].get(), SIGNAL(valueWasSet()), this, SLOT(pointSelected()));
135  }
136 
137  this->dataChangedSlot();
138 }
139 
140 void MetricReferenceArgumentListGui::getAvailableArgumentMetrics(QStringList* uid, std::map<QString,QString>* namemap)
141 {
142  std::map<QString, DataPtr> data = patientService()->getDatas();
143  for (std::map<QString, DataPtr>::iterator iter=data.begin(); iter!=data.end(); ++iter)
144  {
145  if (mArguments->validArgument(iter->second))
146  {
147  *uid << iter->first;
148  (*namemap)[iter->first] = iter->second->getName();
149  }
150  }
151 }
152 
154 {
155  QStringList data;
156  for (unsigned i=0; i<mArguments->getCount(); ++i)
157  data << (mArguments->get(i) ? mArguments->get(i)->getName() : QString("*"));
158  return data.join("-");
159 }
160 
161 void MetricReferenceArgumentListGui::pointSelected()
162 {
163  if (mInternalUpdate)
164  return;
165  for (unsigned i=0; i<mPSelector.size(); ++i)
166  {
167  DataPtr data = patientService()->getData(mPSelector[i]->getValue());
168  if (mArguments->validArgument(data))
169  mArguments->set(i, data);
170  else
171  reportWarning(QString("Failed to set data [%1] in metric, invalid argument.").arg(data?data->getName():"NULL"));
172  }
173 }
174 
175 void MetricReferenceArgumentListGui::dataChangedSlot()
176 {
177 // mModified = true;
178 }
179 
181 {
182  if (!mModified)
183  return;
184  mInternalUpdate = true;
185 
186  QStringList range;
187  std::map<QString,QString> names;
188  this->getAvailableArgumentMetrics(&range, &names);
189 
190  for (unsigned i=0; i<mPSelector.size(); ++i)
191  {
192  if (!mArguments->get(i))
193  continue;
194  mPSelector[i]->setValue(mArguments->get(i)->getUid());
195  mPSelector[i]->setDisplayNames(names);
196  mPSelector[i]->setValueRange(range);
197  }
198 
199  mInternalUpdate = false;
200  mModified = true;
201 }
202 
203 
204 //---------------------------------------------------------
205 //---------------------------------------------------------
206 //---------------------------------------------------------
207 
209  MetricBase(viewService, patientModelService),
210  mData(data)
211 {
212  mInternalUpdate = false;
213 // connect(mData.get(), SIGNAL(transformChanged()), this, SLOT(dataChangedSlot()));
214 // connect(mPatientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
215 }
216 
218 {
219 // disconnect(mPatientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
220 }
221 
223 {
224  QWidget* widget = this->newWidget("point_metric");
225  QVBoxLayout* topLayout = new QVBoxLayout(widget);
226  QHBoxLayout* hLayout = new QHBoxLayout;
227  hLayout->setMargin(0);
228  topLayout->setMargin(0);
229  topLayout->addLayout(hLayout);
230 
231  mSpaceSelector = this->createSpaceSelector();
232  hLayout->addWidget(new SpaceEditWidget(widget, mSpaceSelector));
233 
234  mCoordinate = this->createCoordinateSelector();
235  topLayout->addWidget(Vector3DWidget::createSmallHorizontal(widget, mCoordinate));
236 
237  QWidget* sampleButton = this->createSampleButton(widget);
238  hLayout->addWidget(sampleButton);
239 
240  this->addColorWidget(topLayout);
241  topLayout->addStretch();
242 // this->dataChangedSlot();
243 
244  return widget;
245 }
246 
247 SpacePropertyPtr PointMetricWrapper::createSpaceSelector() const
248 {
249  SpacePropertyPtr retval;
250  retval = SpaceProperty::initialize("selectSpace",
251  "Space",
252  "Select coordinate system to store position in.");
253  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(spaceSelected()));
254  retval->setSpaceProvider(spaceProvider());
255  return retval;
256 }
257 
258 Vector3DPropertyPtr PointMetricWrapper::createCoordinateSelector() const
259 {
260  Vector3DPropertyPtr retval;
261  retval = Vector3DProperty::initialize("selectCoordinate",
262  "Coord",
263  "Coordinate values.",
264  Vector3D(0,0,0),
265  DoubleRange(-1000,1000,1),
266  1,
267  QDomNode());
268 
269  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(coordinateChanged()));
270  return retval;
271 }
272 
273 QWidget* PointMetricWrapper::createSampleButton(QWidget* parent) const
274 {
275  QAction* sampleAction = new QAction("Sample", parent);
276  QString sampleTip("Set the position equal to the current tool tip position.");
277  sampleAction->setStatusTip(sampleTip);
278  sampleAction->setWhatsThis(sampleTip);
279  sampleAction->setToolTip(sampleTip);
280  connect(sampleAction, SIGNAL(triggered()), this, SLOT(moveToToolPosition()));
281 
282  CXToolButton* sampleButton = new CXToolButton(parent);
283  sampleButton->setDefaultAction(sampleAction);
284  return sampleButton;
285 }
286 
288 {
289  return mData;
290 }
291 
293 {
294  return "point";
295 }
296 
298 {
299  Vector3D p = mData->getCoordinate();
300  QString coord = prettyFormat(p, 1, 1);
301  if (mData->getSpace().mId==csREF)
302  coord = ""; // ignore display of coord if in ref space
303 
304  return mData->getSpace().toString() + " " + coord;
305 }
306 
307 void PointMetricWrapper::moveToToolPosition()
308 {
309  Vector3D p = spaceProvider()->getActiveToolTipPoint(mData->getSpace(), true);
310  mData->setCoordinate(p);
311 }
312 
313 void PointMetricWrapper::spaceSelected()
314 {
315  if (mInternalUpdate)
316  return;
317  CoordinateSystem space = mSpaceSelector->getValue();
318  if (!space.isValid())
319  return;
320  mData->setSpace(space);
321 }
322 
323 void PointMetricWrapper::coordinateChanged()
324 {
325  if (mInternalUpdate)
326  return;
327  mData->setCoordinate(mCoordinate->getValue());
328 }
329 
330 //void PointMetricWrapper::dataChangedSlot()
331 //{
332 //}
333 
335 {
336  mInternalUpdate = true;
337  mSpaceSelector->setValue(mData->getSpace());
338  mCoordinate->setValue(mData->getCoordinate());
339  mInternalUpdate = false;
340 }
341 
342 //---------------------------------------------------------
343 //---------------------------------------------------------
344 //---------------------------------------------------------
345 
347  MetricBase(viewService, patientModelService),
348  mData(data)
349 {
350  mArguments.setArguments(data->getArguments());
351  mInternalUpdate = false;
352  connect(mData.get(), SIGNAL(transformChanged()), this, SLOT(dataChangedSlot()));
353  connect(mData.get(), SIGNAL(propertiesChanged()), this, SLOT(dataChangedSlot()));
354  connect(mPatientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
355 }
356 
358 {
359  disconnect(mPatientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
360 }
361 
363 {
364  QWidget* widget = this->newWidget("plane_metric");
365  QVBoxLayout* topLayout = new QVBoxLayout(widget);
366  QHBoxLayout* hLayout = new QHBoxLayout;
367  hLayout->setMargin(0);
368  topLayout->setMargin(0);
369  topLayout->addLayout(hLayout);
370 
371  mArguments.addWidgets(hLayout);
372  this->addColorWidget(topLayout);
373  topLayout->addStretch();
374 
375  this->dataChangedSlot();
376 
377  return widget;
378 }
379 
381 {
382  return mData;
383 }
384 
386 {
387  return "plane";
388 }
389 
391 {
392  return mArguments.getAsString();
393 }
394 
395 void PlaneMetricWrapper::dataChangedSlot()
396 {
397 // mInternalUpdate = true;
398  mInternalUpdate = false;
399 }
400 
402 {
403  mArguments.update();
404 }
405 
406 //---------------------------------------------------------
407 //---------------------------------------------------------
408 //---------------------------------------------------------
409 
411  MetricBase(viewService, patientModelService),
412  mData(data)
413 {
414  mArguments.setArguments(data->getArguments());
415  mInternalUpdate = false;
416  connect(mData.get(), SIGNAL(transformChanged()), this, SLOT(dataChangedSlot()));
417  connect(patientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
418 }
419 
421 {
422  QWidget* widget = this->newWidget("distance_metric");
423  QVBoxLayout* topLayout = new QVBoxLayout(widget);
424  QHBoxLayout* hLayout = new QHBoxLayout;
425  hLayout->setMargin(0);
426  topLayout->setMargin(0);
427  topLayout->addLayout(hLayout);
428 
429  mArguments.addWidgets(hLayout);
430  this->addColorWidget(topLayout);
431  topLayout->addStretch();
432 
433  this->dataChangedSlot();
434  return widget;
435 }
436 
438 {
439  return mData;
440 }
441 
443 {
444  return "distance";
445 }
446 
448 {
449  return mArguments.getAsString();
450 }
451 
452 void DistanceMetricWrapper::dataChangedSlot()
453 {
454 // mInternalUpdate = true;
455  mInternalUpdate = false;
456 }
457 
459 {
460  mArguments.update();
461 }
462 
463 
464 //---------------------------------------------------------
465 //---------------------------------------------------------
466 //---------------------------------------------------------
467 
469  MetricBase(viewService, patientModelService),
470  mData(data)
471 {
472  mArguments.setArguments(data->getArguments());
473  mInternalUpdate = false;
474  connect(mData.get(), SIGNAL(transformChanged()), this, SLOT(dataChangedSlot()));
475  connect(mPatientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
476 }
477 
479 {
480  disconnect(mPatientModelService.get(), SIGNAL(dataAddedOrRemoved()), this, SLOT(dataChangedSlot()));
481 }
482 
484 {
485  QWidget* widget = this->newWidget("angle_metric");
486  QVBoxLayout* topLayout = new QVBoxLayout(widget);
487  QHBoxLayout* hLayout = new QHBoxLayout;
488  hLayout->setMargin(0);
489  topLayout->setMargin(0);
490  topLayout->addLayout(hLayout);
491 
492  mArguments.addWidgets(hLayout);
493 
494  mUseSimpleVisualization = this->createUseSimpleVisualizationSelector();
495  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mUseSimpleVisualization));
496 
497  this->addColorWidget(topLayout);
498  topLayout->addStretch();
499 
500  this->dataChangedSlot();
501  return widget;
502 }
503 
505 {
506  return mData;
507 }
509 {
510  return "angle";
511 }
512 
514 {
515  return mArguments.getAsString();
516 }
517 
518 void AngleMetricWrapper::dataChangedSlot()
519 {
520  mInternalUpdate = true;
521  mUseSimpleVisualization->setValue(mData->getUseSimpleVisualization());
522  mInternalUpdate = false;
523 }
524 
525 void AngleMetricWrapper::guiChanged()
526 {
527  if (mInternalUpdate)
528  return;
529  mData->setUseSimpleVisualization(mUseSimpleVisualization->getValue());
530 }
531 
532 BoolPropertyPtr AngleMetricWrapper::createUseSimpleVisualizationSelector() const
533 {
534  BoolPropertyPtr retval;
535  retval = BoolProperty::initialize("Simple Visualization", "",
536  "Simple Visualization",
537  mData->getUseSimpleVisualization());
538 
539  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
540  return retval;
541 }
542 
544 {
545  mArguments.update();
546 }
547 
548 //---------------------------------------------------------
549 //---------------------------------------------------------
550 //---------------------------------------------------------
551 
553  MetricBase(viewService, patientModelService),
554  mData(data)
555 {
556  mArguments.setArguments(data->getArguments());
557  mInternalUpdate = false;
558  connect(mData.get(), SIGNAL(propertiesChanged()), this, SLOT(dataChangedSlot()));
559 }
560 
562 {
563  QWidget* widget = this->newWidget("donut_metric");
564  QVBoxLayout* topLayout = new QVBoxLayout(widget);
565  QHBoxLayout* hLayout = new QHBoxLayout;
566  hLayout->setMargin(0);
567  topLayout->setMargin(0);
568  topLayout->addLayout(hLayout);
569 
570  mArguments.addWidgets(hLayout);
571 
572  mRadius = this->createRadiusSelector();
573  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mRadius));
574  mThickness = this->createThicknessSelector();
575  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mThickness));
576  mFlat = this->createFlatSelector();
577  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mFlat));
578  mHeight = this->createHeightSelector();
579  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mHeight));
580 
581  this->addColorWidget(topLayout);
582  topLayout->addStretch();
583 
584  this->dataChangedSlot();
585  return widget;
586 }
587 
589 {
590  return mData;
591 }
593 {
594  return "donut";
595 }
596 
598 {
599  return mArguments.getAsString();
600 }
601 
603 {
604  mArguments.update();
605 
606  if (mInternalUpdate)
607  return;
608  mInternalUpdate = true;
609  mRadius->setValue(mData->getRadius());
610  mThickness->setValue(mData->getThickness());
611  mHeight->setValue(mData->getHeight());
612  mFlat->setValue(mData->getFlat());
613  mInternalUpdate = false;
614 }
615 
616 void DonutMetricWrapper::dataChangedSlot()
617 {
618 // if (mInternalUpdate)
619 // return;
620 // mInternalUpdate = true;
621 // mRadius->setValue(mData->getRadius());
622 // mThickness->setValue(mData->getThickness());
623 // mFlat->setValue(mData->getFlat());
624 // mInternalUpdate = false;
625 }
626 
627 void DonutMetricWrapper::guiChanged()
628 {
629  if (mInternalUpdate)
630  return;
631  mInternalUpdate = true;
632  mData->setRadius(mRadius->getValue());
633  mData->setThickness(mThickness->getValue());
634  mData->setHeight(mHeight->getValue());
635  mData->setFlat(mFlat->getValue());
636  mInternalUpdate = false;
637 }
638 
639 
640 DoublePropertyPtr DonutMetricWrapper::createRadiusSelector() const
641 {
642  DoublePropertyPtr retval;
643  retval = DoubleProperty::initialize("selectRadius",
644  "Radius",
645  "Donut Radius",
646  mData->getRadius(),
647  DoubleRange(0, 50, 1),
648  1,
649  QDomNode());
650 
651  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
652  return retval;
653 }
654 
655 DoublePropertyPtr DonutMetricWrapper::createThicknessSelector() const
656 {
657  DoublePropertyPtr retval;
658  retval = DoubleProperty::initialize("selectThickness",
659  "Thickness",
660  "Donut Thickness",
661  mData->getThickness(),
662  DoubleRange(0.05, 1, 0.05),
663  2,
664  QDomNode());
665 
666  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
667  return retval;
668 }
669 
670 DoublePropertyPtr DonutMetricWrapper::createHeightSelector() const
671 {
672  DoublePropertyPtr retval;
673  retval = DoubleProperty::initialize("selectHeight",
674  "Height",
675  "Disc height, NA to torus",
676  mData->getHeight(),
677  DoubleRange(0.0, 100, 1),
678  1,
679  QDomNode());
680 
681  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
682  return retval;
683 }
684 
685 BoolPropertyPtr DonutMetricWrapper::createFlatSelector() const
686 {
687  BoolPropertyPtr retval;
688  retval = BoolProperty::initialize("selectFlat",
689  "Flat",
690  "Flat disk or torus",
691  mData->getFlat(),
692  QDomNode());
693 
694  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
695  return retval;
696 }
697 //---------------------------------------------------------
698 //---------------------------------------------------------
699 //---------------------------------------------------------
700 
702  MetricBase(viewService, patientModelService),
703  mData(data),
704  mScaleToP1Widget(NULL)
705 {
706  mArguments.setArguments(data->getArguments());
707  mInternalUpdate = false;
708  connect(mData.get(), SIGNAL(propertiesChanged()), this, SLOT(dataChangedSlot()));
709 }
710 
712 {
713  QWidget* widget = this->newWidget("custom_metric");
714  QVBoxLayout* topLayout = new QVBoxLayout(widget);
715  QHBoxLayout* hLayout = new QHBoxLayout;
716  hLayout->setMargin(0);
717  topLayout->setMargin(0);
718  topLayout->addLayout(hLayout);
719 
720  mArguments.addWidgets(hLayout);
721 
722  mDefineVectorUpMethod = this->createDefineVectorUpMethodSelector();
723  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mDefineVectorUpMethod));
724  mModel = this->createModelSelector();
725  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mModel));
726 
727  mOffsetFromP0 = this->createOffsetFromP0();
728  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mOffsetFromP0));
729  mOffsetFromP1 = this->createOffsetFromP1();
730  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mOffsetFromP1));
731  mRepeatDistance = this->createRepeatDistance();
732  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mRepeatDistance));
733 
734  mShowDistanceMarkers = this->createShowDistanceMarkers();
735  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mShowDistanceMarkers));
736  mDistanceMarkerVisibility = this->createDistanceMarkerVisibility();
737  mDistanceMarkerVisibilityWidget = createDataWidget(mViewService, mPatientModelService, widget, mDistanceMarkerVisibility);
738  topLayout->addWidget(mDistanceMarkerVisibilityWidget);
739 
740  mScaleToP1 = this->createScaletoP1();
741  mScaleToP1Widget = createDataWidget(mViewService, mPatientModelService, widget, mScaleToP1);
742  topLayout->addWidget(mScaleToP1Widget);
743 
744  mTranslationOnly= this->createTranslationOnly();
745  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mTranslationOnly));
746 
747  mTextureFollowTool= this->createTextureFollowTool();
748  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mTextureFollowTool));
749 
750  this->addColorWidget(topLayout);
751  topLayout->addStretch();
752 
753  this->dataChangedSlot();
754  return widget;
755 }
756 
758 {
759  return mData;
760 }
762 {
763  return "Custom";
764 }
765 
767 {
768  return mArguments.getAsString();
769 }
770 
772 {
773  mArguments.update();
774 
775  if (mInternalUpdate)
776  return;
777  mInternalUpdate = true;
778  mDefineVectorUpMethod->setValue(mData->getDefineVectorUpMethod());
779  mModel->setValue(mData->getModelUid());
780  mInternalUpdate = false;
781  guiChanged();
782 }
783 
784 void CustomMetricWrapper::dataChangedSlot()
785 {
786 // if (mInternalUpdate)
787 // return;
788 // mInternalUpdate = true;
789 // mRadius->setValue(mData->getRadius());
790 // mThickness->setValue(mData->getThickness());
791 // mFlat->setValue(mData->getFlat());
792 // mInternalUpdate = false;
793 }
794 
795 void CustomMetricWrapper::guiChanged()
796 {
797  if (mInternalUpdate)
798  return;
799 
800  if(mModel->getData() && mModel->getData()->getType() == "image")
801  mScaleToP1Widget->setEnabled(false);
802  else
803  mScaleToP1Widget->setEnabled(true);
804 
805  if(mShowDistanceMarkers->getValue())
806  mDistanceMarkerVisibilityWidget->setEnabled(true);
807  else
808  mDistanceMarkerVisibilityWidget->setEnabled(false);
809 
810  mInternalUpdate = true;
811  mData->setDefineVectorUpMethod(mDefineVectorUpMethod->getValue());
812  mData->setModelUid(mModel->getValue());
813  mData->setOffsetFromP0(mOffsetFromP0->getValue());
814  mData->setOffsetFromP1(mOffsetFromP1->getValue());
815  mData->setRepeatDistance(mRepeatDistance->getValue());
816  mData->setScaleToP1(mScaleToP1->getValue());
817  mData->setShowDistanceMarkers(mShowDistanceMarkers->getValue());
818  mData->setDistanceMarkerVisibility(mDistanceMarkerVisibility->getValue());
819  mData->setTranslationOnly(mTranslationOnly->getValue());
820  mData->setTextureFollowTool(mTextureFollowTool->getValue());
821 
822  mInternalUpdate = false;
823 }
824 
825 BoolPropertyPtr CustomMetricWrapper::createScaletoP1() const
826 {
827  BoolPropertyPtr retval;
828  retval = BoolProperty::initialize("Scale to P1", "",
829  "Scale model so that it fits between P0 and P1",
830  mData->getScaleToP1());
831  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
832  return retval;
833 }
834 
835 BoolPropertyPtr CustomMetricWrapper::createShowDistanceMarkers() const
836 {
837  BoolPropertyPtr retval;
838  retval = BoolProperty::initialize("Show distance markers", "",
839  "Show distance to P0 for each repeated model",
840  mData->getShowDistanceMarkers());
841  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
842  return retval;
843 }
844 
845 BoolPropertyPtr CustomMetricWrapper::createTranslationOnly() const
846 {
847  BoolPropertyPtr retval;
848  retval = BoolProperty::initialize("Translation Only", "",
849  "Ignore scale and rotate",
850  mData->getTranslationOnly());
851  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
852  return retval;
853 }
854 
855 BoolPropertyPtr CustomMetricWrapper::createTextureFollowTool() const
856 {
857  BoolPropertyPtr retval;
858  retval = BoolProperty::initialize("Texture Follow Tool", "",
859  "Any texture on the model will move with the tool",
860  mData->getTextureFollowTool());
861  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
862  return retval;
863 }
864 
865 DoublePropertyPtr CustomMetricWrapper::createOffsetFromP0() const
866 {
867  DoublePropertyPtr retval;
868  retval = DoubleProperty::initialize("Offset from P0", "",
869  "Position model an offset from P0 towards P1",
870  mData->getOffsetFromP0(), DoubleRange(-100, 100, 1), 0);
871  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
872  return retval;
873 }
874 
875 DoublePropertyPtr CustomMetricWrapper::createOffsetFromP1() const
876 {
877  DoublePropertyPtr retval;
878  retval = DoubleProperty::initialize("Offset from P1", "",
879  "When scaling to P1, scale to a point offset from P1 towards P0",
880  mData->getOffsetFromP1(), DoubleRange(-100, 100, 1), 0);
881  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
882  return retval;
883 }
884 
885 DoublePropertyPtr CustomMetricWrapper::createRepeatDistance() const
886 {
887  DoublePropertyPtr retval;
888  retval = DoubleProperty::initialize("Repeat Distance", "",
889  "Repeat model with this distance",
890  mData->getRepeatDistance(), DoubleRange(0, 100, 1), 0);
891  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
892  return retval;
893 }
894 
895 DoublePropertyPtr CustomMetricWrapper::createDistanceMarkerVisibility() const
896 {
897  DoublePropertyPtr retval;
898  retval = DoubleProperty::initialize("Distance markers visibility threshold", "",
899  "Hide the markers if the distance to the camera exceeds this threshold",
900  mData->getDistanceMarkerVisibility(), DoubleRange(0, 1000, 1), 0);
901  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
902  return retval;
903 }
904 
905 StringPropertyPtr CustomMetricWrapper::createDefineVectorUpMethodSelector() const
906 {
907  StringPropertyPtr retval;
908  retval = StringProperty::initialize("selectDefineVectorUp",
909  "Use to define the vector up",
910  "The vector up of the metric will be connected to one of:\n"
911  "- a) The static up vector of the operating table\n"
912  "- b) To a frame in p1, which might well be connected "
913  "to a tool giving a dynamic up vector.\n"
914  "- c) The tool up (tool negative x)",
915  mData->getDefineVectorUpMethod(),
916  mData->getDefineVectorUpMethods().getAvailableDefineVectorUpMethods(),
917  QDomNode());
918  retval->setDisplayNames(mData->getDefineVectorUpMethods().getAvailableDefineVectorUpMethodsDisplayNames());
919 
920 
921  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
922  return retval;
923 }
924 
925 StringPropertySelectDataPtr CustomMetricWrapper::createModelSelector() const
926 {
928  retval = StringPropertySelectData::New(mPatientModelService, "image|mesh");
929  retval->setOnly2DImagesFilter(true);
930  retval->setValueName("Model");
931  retval->setHelp("Model can be mesh or 2D image");
932  connect(retval.get(), &StringPropertySelectData::changed, this, &CustomMetricWrapper::guiChanged);
933  return retval;
934 }
935 
936 //---------------------------------------------------------
937 //---------------------------------------------------------
938 //---------------------------------------------------------
939 
941  MetricBase(viewService, patientModelService),
942  mData(data)
943 {
944  mArguments.setArguments(data->getArguments());
945  mInternalUpdate = false;
946  connect(mData.get(), SIGNAL(propertiesChanged()), this, SLOT(dataChangedSlot()));
947 }
948 
950 {
951  QWidget* widget = this->newWidget("sphere_metric");
952  QVBoxLayout* topLayout = new QVBoxLayout(widget);
953  QHBoxLayout* hLayout = new QHBoxLayout;
954  hLayout->setMargin(0);
955  topLayout->setMargin(0);
956  topLayout->addLayout(hLayout);
957 
958  mArguments.addWidgets(hLayout);
959 
960  mRadius = this->createRadiusSelector();
961  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mRadius));
962 
963  this->addColorWidget(topLayout);
964  topLayout->addStretch();
965 
966  this->dataChangedSlot();
967  return widget;
968 }
969 
971 {
972  return mData;
973 }
975 {
976  return "sphere";
977 }
978 
980 {
981  return mArguments.getAsString();
982 }
983 
984 void SphereMetricWrapper::dataChangedSlot()
985 {
986 
987 }
988 
990 {
991  mArguments.update();
992  mInternalUpdate = true;
993  mRadius->setValue(mData->getRadius());
994  mInternalUpdate = false;
995 }
996 
997 void SphereMetricWrapper::guiChanged()
998 {
999  if (mInternalUpdate)
1000  return;
1001  mData->setRadius(mRadius->getValue());
1002 }
1003 
1004 DoublePropertyPtr SphereMetricWrapper::createRadiusSelector() const
1005 {
1006  DoublePropertyPtr retval;
1007  retval = DoubleProperty::initialize("selectRadius",
1008  "Radius",
1009  "Sphere Radius",
1010  mData->getRadius(),
1011  DoubleRange(0, 50, 0.5),
1012  1,
1013  QDomNode());
1014 
1015  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
1016  return retval;
1017 }
1018 
1019 //---------------------------------------------------------
1020 //---------------------------------------------------------
1021 //---------------------------------------------------------
1022 
1024  MetricBase(viewService, patientModelService),
1025  mData(data)
1026 {
1027  mInternalUpdate = false;
1028  connect(mData.get(), SIGNAL(propertiesChanged()), this, SLOT(dataChangedSlot()));
1029 }
1030 
1032 {
1033  QWidget* widget = this->newWidget("region_of_interest_metric");
1034  QVBoxLayout* topLayout = new QVBoxLayout(widget);
1035  QHBoxLayout* hLayout = new QHBoxLayout;
1036  hLayout->setMargin(0);
1037  topLayout->setMargin(0);
1038  topLayout->addLayout(hLayout);
1039 
1040  mDataListProperty = this->createDataListProperty();
1041  StringListSelectWidget* datalistwidget = new StringListSelectWidget(widget, mDataListProperty);
1042  topLayout->addWidget(datalistwidget);
1043 
1044  mUseActiveTooltipProperty = this->createUseActiveTooltipSelector();
1045  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mUseActiveTooltipProperty));
1046 
1047  mMaxBoundsDataProperty = this->createMaxBoundsDataSelector();
1048  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mMaxBoundsDataProperty));
1049 
1050  mMarginProperty = this->createMarginSelector();
1051  topLayout->addWidget(createDataWidget(mViewService, mPatientModelService, widget, mMarginProperty));
1052 
1053  this->addColorWidget(topLayout);
1054  topLayout->addStretch();
1055 
1056  this->dataChangedSlot();
1057  return widget;
1058 }
1059 
1061 {
1062  return mData;
1063 }
1065 {
1066  return "roi";
1067 }
1068 
1070 {
1071  return "";
1072 }
1073 
1074 void RegionOfInterestMetricWrapper::dataChangedSlot()
1075 {
1076 
1077 }
1078 
1079 StringListPropertyPtr RegionOfInterestMetricWrapper::createDataListProperty()
1080 {
1082  "Data",
1083  "Select data to define ROI",
1084  QStringList(),
1085  QStringList());
1086  connect(retval.get(), &Property::changed, this, &RegionOfInterestMetricWrapper::guiChanged);
1087  return retval;
1088 }
1089 
1090 StringPropertyPtr RegionOfInterestMetricWrapper::createMaxBoundsDataSelector()
1091 {
1092  StringPropertyPtr retval;
1093  retval = StringProperty::initialize("max_bounds_data",
1094  "Max Bounds",
1095  "Select data to define maximal extent of ROI",
1096  "",
1097  QStringList(),
1098  QDomNode());
1099  connect(retval.get(), &Property::changed, this, &RegionOfInterestMetricWrapper::guiChanged);
1100  return retval;
1101 }
1102 
1103 DoublePropertyPtr RegionOfInterestMetricWrapper::createMarginSelector() const
1104 {
1105  DoublePropertyPtr retval;
1106  retval = DoubleProperty::initialize("margin",
1107  "Margin",
1108  "Margin added outside the data",
1109  0,
1110  DoubleRange(0, 100, 1),
1111  1,
1112  QDomNode());
1113 
1114  connect(retval.get(), SIGNAL(valueWasSet()), this, SLOT(guiChanged()));
1115  return retval;
1116 }
1117 
1118 BoolPropertyPtr RegionOfInterestMetricWrapper::createUseActiveTooltipSelector() const
1119 {
1120  BoolPropertyPtr retval;
1121  retval = BoolProperty::initialize("Use Tool Tip", "",
1122  "Include tool tip in the roi",
1123  false);
1124 
1125  connect(retval.get(), &Property::changed, this, &RegionOfInterestMetricWrapper::guiChanged);
1126  return retval;
1127 }
1128 
1129 
1131 {
1132  mInternalUpdate = true;
1133 
1134  QStringList data;
1135  std::map<QString, QString> names;
1136  std::map<QString, DataPtr> alldata = mPatientModelService->getDatas();
1137  for (std::map<QString, DataPtr>::iterator i=alldata.begin(); i!=alldata.end(); ++i)
1138  {
1139  if (i->first == mData->getUid())
1140  continue;
1141  data << i->first;
1142  names[i->first] = i->second->getName();
1143  }
1144 
1145  mDataListProperty->setValue(mData->getDataList());
1146  mDataListProperty->setValueRange(data);
1147  mDataListProperty->setDisplayNames(names);
1148 
1149  mMaxBoundsDataProperty->setValue(mData->getMaxBoundsData());
1150  mMaxBoundsDataProperty->setValueRange(data);
1151  mMaxBoundsDataProperty->setDisplayNames(names);
1152 
1153  mMarginProperty->setValue(mData->getMargin());
1154  mUseActiveTooltipProperty->setValue(mData->getUseActiveTooltip());
1155 
1156  mInternalUpdate = false;
1157 }
1158 
1159 void RegionOfInterestMetricWrapper::guiChanged()
1160 {
1161  if (mInternalUpdate)
1162  return;
1163  mData->setDataList(mDataListProperty->getValue());
1164  mData->setUseActiveTooltip(mUseActiveTooltipProperty->getValue());
1165  mData->setMargin(mMarginProperty->getValue());
1166  mData->setMaxBoundsData(mMaxBoundsDataProperty->getValue());
1167 }
1168 
1169 }
virtual QString getArguments() const
static BoolPropertyPtr initialize(const QString &uid, QString name, QString help, bool value, QDomNode root=QDomNode())
CustomMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, CustomMetricPtr data)
void setArguments(MetricReferenceArgumentListPtr arguments)
virtual QString getArguments() const
Composite widget for string selection.
RegionOfInterestMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, RegionOfInterestMetricPtr data)
virtual DataMetricPtr getData() const
virtual DataMetricPtr getData() const
virtual QWidget * createWidget()
virtual DataMetricPtr getData() const
boost::shared_ptr< class DonutMetric > DonutMetricPtr
boost::shared_ptr< DataMetric > DataMetricPtr
Definition: cxDataMetric.h:96
void addColorWidget(QVBoxLayout *layout)
static StringPropertySelectDataPtr New(PatientModelServicePtr patientModelService, QString typeRegexp=".*")
static SpacePropertyPtr initialize(const QString &uid, QString name, QString help, Space value=Space(), std::vector< Space > range=std::vector< Space >(), QDomNode root=QDomNode())
Composite widget for string list selection.
SphereMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, SphereMetricPtr data)
virtual QString getType() const
QString prettyFormat(Vector3D val, int decimals, int fieldWidth)
Definition: cxVector3D.cpp:119
boost::shared_ptr< class SpaceProperty > SpacePropertyPtr
PlaneMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, PlaneMetricPtr data)
csREF
the data reference space (r) using LPS (left-posterior-superior) coordinates.
boost::shared_ptr< class SphereMetric > SphereMetricPtr
virtual DataMetricPtr getData() const =0
virtual DataMetricPtr getData() const
virtual QString getArguments() const
boost::shared_ptr< class ViewService > ViewServicePtr
virtual DataMetricPtr getData() const
virtual QWidget * createWidget()
Composite widget for string selection.
boost::shared_ptr< class AngleMetric > AngleMetricPtr
Definition: cxAngleMetric.h:54
ViewServicePtr mViewService
virtual QString getType() const
virtual QString getArguments() const
virtual QString getArguments() const
static StringListPropertyPtr initialize(const QString &uid, QString name, QString help, QStringList value, QStringList range, QDomNode root=QDomNode())
QWidget * createDataWidget(ViewServicePtr viewService, PatientModelServicePtr patientModelService, QWidget *parent, PropertyPtr data, QGridLayout *gridLayout, int row)
Create a widget capable of displaying the input data.
ColorPropertyPtr mColorSelector
virtual QString getArguments() const
boost::shared_ptr< class PlaneMetric > PlaneMetricPtr
Definition: cxPlaneMetric.h:55
boost::shared_ptr< class Data > DataPtr
boost::shared_ptr< class StringProperty > StringPropertyPtr
PatientModelServicePtr mPatientModelService
virtual QString getType() const
virtual QWidget * createWidget()
static Vector3DWidget * createSmallHorizontal(QWidget *parent, Vector3DPropertyBasePtr data)
virtual QString getType() const
void reportWarning(QString msg)
Definition: cxLogger.cpp:91
static Vector3DPropertyPtr initialize(const QString &uid, QString name, QString help, Vector3D value, DoubleRange range, int decimals, QDomNode root=QDomNode())
virtual QString getType() const
boost::shared_ptr< class PatientModelService > PatientModelServicePtr
virtual QWidget * createWidget()
boost::shared_ptr< class MetricReferenceArgumentList > MetricReferenceArgumentListPtr
boost::shared_ptr< class DistanceMetric > DistanceMetricPtr
virtual DataMetricPtr getData() const
boost::shared_ptr< class RegionOfInterestMetric > RegionOfInterestMetricPtr
void changed()
emit when the underlying data value is changed: The user interface will be updated.
cxLogicManager_EXPORT SpaceProviderPtr spaceProvider()
static StringPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList range, QDomNode root=QDomNode())
virtual QString getType() const
DonutMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, DonutMetricPtr data)
boost::shared_ptr< class DoubleProperty > DoublePropertyPtr
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:63
boost::shared_ptr< class StringListProperty > StringListPropertyPtr
virtual QWidget * createWidget()
MetricBase(ViewServicePtr viewService, PatientModelServicePtr patientModelService)
boost::shared_ptr< class Vector3DProperty > Vector3DPropertyPtr
cxLogicManager_EXPORT ViewServicePtr viewService()
virtual DataMetricPtr getData() const
cxLogicManager_EXPORT PatientModelServicePtr patientService()
static DoublePropertyPtr initialize(const QString &uid, QString name, QString help, double value, DoubleRange range, int decimals, QDomNode root=QDomNode())
virtual QString getType() const
AngleMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, AngleMetricPtr data)
boost::shared_ptr< class StringPropertySelectData > StringPropertySelectDataPtr
static ColorPropertyPtr initialize(const QString &uid, QString name, QString help, QColor value, QDomNode root=QDomNode())
virtual QString getArguments() const
boost::shared_ptr< class BoolProperty > BoolPropertyPtr
QWidget * newWidget(QString objectName)
virtual QString getValue() const
virtual QWidget * createWidget()
boost::shared_ptr< class CustomMetric > CustomMetricPtr
DistanceMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, DistanceMetricPtr data)
PointMetricWrapper(ViewServicePtr viewService, PatientModelServicePtr patientModelService, PointMetricPtr data)
virtual DataMetricPtr getData() const
boost::shared_ptr< class PointMetric > PointMetricPtr