13 #include <QTreeWidget> 14 #include <QTreeWidgetItem> 15 #include <QStringList> 16 #include <QVBoxLayout> 17 #include <QHeaderView> 47 void MetricBase::colorSelected()
54 QString retval = this->
getData()->getValueAsString();
63 "Set color of metric",
64 this->
getData()->getColor(), QDomNode());
65 QHBoxLayout* line =
new QHBoxLayout;
69 layout->addLayout(line);
70 connect(
mColorSelector.get(), SIGNAL(valueWasSet()),
this, SLOT(colorSelected()));
75 QWidget* widget =
new QWidget;
76 widget->setFocusPolicy(Qt::StrongFocus);
77 widget->setObjectName(objectName);
88 mInternalUpdate =
false;
93 mArguments = arguments;
94 connect(mArguments.get(), SIGNAL(argumentsChanged()),
this, SLOT(dataChangedSlot()));
101 mPSelector.resize(mArguments->getCount());
102 for (
unsigned i=0; i<mPSelector.size(); ++i)
105 QString(
"p%1").arg(i),
106 mArguments->getDescription(i),
107 mArguments->get(i) ? mArguments->get(i)->getUid() :
"",
112 connect(mPSelector[i].
get(), SIGNAL(valueWasSet()),
this, SLOT(pointSelected()));
115 this->dataChangedSlot();
118 void MetricReferenceArgumentListGui::getAvailableArgumentMetrics(QStringList* uid, std::map<QString,QString>* namemap)
120 std::map<QString, DataPtr> data = mServices->patient()->getDatas();
121 for (std::map<QString, DataPtr>::iterator iter=data.begin(); iter!=data.end(); ++iter)
123 if (mArguments->validArgument(iter->second))
126 (*namemap)[iter->first] = iter->second->getName();
134 for (
unsigned i=0; i<mArguments->getCount(); ++i)
135 data << (mArguments->get(i) ? mArguments->get(i)->getName() : QString(
"*"));
136 return data.join(
"-");
139 void MetricReferenceArgumentListGui::pointSelected()
143 for (
unsigned i=0; i<mPSelector.size(); ++i)
145 DataPtr data = mServices->patient()->getData(mPSelector[i]->getValue());
146 if (mArguments->validArgument(data))
147 mArguments->set(i, data);
149 reportWarning(QString(
"Failed to set data [%1] in metric, invalid argument.").arg(data?data->getName():
"NULL"));
153 void MetricReferenceArgumentListGui::dataChangedSlot()
162 mInternalUpdate =
true;
165 std::map<QString,QString> names;
166 this->getAvailableArgumentMetrics(&range, &names);
168 for (
unsigned i=0; i<mPSelector.size(); ++i)
170 if (!mArguments->get(i))
172 mPSelector[i]->setValue(mArguments->get(i)->getUid());
173 mPSelector[i]->setDisplayNames(names);
174 mPSelector[i]->setValueRange(range);
177 mInternalUpdate =
false;
190 mInternalUpdate =
false;
202 QWidget* widget = this->
newWidget(
"point_metric");
203 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
204 QHBoxLayout* hLayout =
new QHBoxLayout;
205 hLayout->setMargin(0);
206 topLayout->setMargin(0);
207 topLayout->addLayout(hLayout);
209 mSpaceSelector = this->createSpaceSelector();
212 mCoordinate = this->createCoordinateSelector();
215 QWidget* sampleButton = this->createSampleButton(widget);
216 hLayout->addWidget(sampleButton);
219 topLayout->addStretch();
230 "Select coordinate system to store position in.");
231 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(spaceSelected()));
232 retval->setSpaceProvider(
mServices->spaceProvider());
241 "Coordinate values.",
247 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(coordinateChanged()));
251 QWidget* PointMetricWrapper::createSampleButton(QWidget* parent)
const 253 QAction* sampleAction =
new QAction(
"Sample", parent);
254 QString sampleTip(
"Set the position equal to the current tool tip position.");
255 sampleAction->setStatusTip(sampleTip);
256 sampleAction->setWhatsThis(sampleTip);
257 sampleAction->setToolTip(sampleTip);
258 connect(sampleAction, SIGNAL(triggered()),
this, SLOT(moveToToolPosition()));
261 sampleButton->setDefaultAction(sampleAction);
277 Vector3D p = mData->getCoordinate();
279 if (mData->getSpace().mId==
csREF)
282 return mData->getSpace().toString() +
" " + coord;
285 void PointMetricWrapper::moveToToolPosition()
287 Vector3D p =
mServices->spaceProvider()->getActiveToolTipPoint(mData->getSpace(),
true);
288 mData->setCoordinate(p);
291 void PointMetricWrapper::spaceSelected()
298 mData->setSpace(space);
301 void PointMetricWrapper::coordinateChanged()
305 mData->setCoordinate(mCoordinate->getValue());
314 mInternalUpdate =
true;
315 mSpaceSelector->setValue(mData->getSpace());
316 mCoordinate->setValue(mData->getCoordinate());
317 mInternalUpdate =
false;
330 mInternalUpdate =
false;
331 connect(mData.get(), SIGNAL(transformChanged()),
this, SLOT(dataChangedSlot()));
332 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
333 connect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
338 disconnect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
343 QWidget* widget = this->
newWidget(
"plane_metric");
344 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
345 QHBoxLayout* hLayout =
new QHBoxLayout;
346 hLayout->setMargin(0);
347 topLayout->setMargin(0);
348 topLayout->addLayout(hLayout);
352 topLayout->addStretch();
354 this->dataChangedSlot();
374 void PlaneMetricWrapper::dataChangedSlot()
377 mInternalUpdate =
false;
395 mInternalUpdate =
false;
396 connect(mData.get(), SIGNAL(transformChanged()),
this, SLOT(dataChangedSlot()));
397 connect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
402 QWidget* widget = this->
newWidget(
"distance_metric");
403 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
404 QHBoxLayout* hLayout =
new QHBoxLayout;
405 hLayout->setMargin(0);
406 topLayout->setMargin(0);
407 topLayout->addLayout(hLayout);
411 topLayout->addStretch();
413 this->dataChangedSlot();
432 void DistanceMetricWrapper::dataChangedSlot()
435 mInternalUpdate =
false;
454 mInternalUpdate =
false;
455 connect(mData.get(), SIGNAL(transformChanged()),
this, SLOT(dataChangedSlot()));
456 connect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
461 disconnect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
466 QWidget* widget = this->
newWidget(
"angle_metric");
467 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
468 QHBoxLayout* hLayout =
new QHBoxLayout;
469 hLayout->setMargin(0);
470 topLayout->setMargin(0);
471 topLayout->addLayout(hLayout);
475 mUseSimpleVisualization = this->createUseSimpleVisualizationSelector();
479 topLayout->addStretch();
481 this->dataChangedSlot();
499 void AngleMetricWrapper::dataChangedSlot()
501 mInternalUpdate =
true;
502 mUseSimpleVisualization->setValue(mData->getUseSimpleVisualization());
503 mInternalUpdate =
false;
506 void AngleMetricWrapper::guiChanged()
510 mData->setUseSimpleVisualization(mUseSimpleVisualization->getValue());
513 BoolPropertyPtr AngleMetricWrapper::createUseSimpleVisualizationSelector()
const 517 "Simple Visualization",
518 mData->getUseSimpleVisualization());
520 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
539 mInternalUpdate =
false;
540 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
545 QWidget* widget = this->
newWidget(
"donut_metric");
546 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
547 QHBoxLayout* hLayout =
new QHBoxLayout;
548 hLayout->setMargin(0);
549 topLayout->setMargin(0);
550 topLayout->addLayout(hLayout);
554 mRadius = this->createRadiusSelector();
556 mThickness = this->createThicknessSelector();
558 mFlat = this->createFlatSelector();
560 mHeight = this->createHeightSelector();
564 topLayout->addStretch();
566 this->dataChangedSlot();
590 mInternalUpdate =
true;
591 mRadius->setValue(mData->getRadius());
592 mThickness->setValue(mData->getThickness());
593 mHeight->setValue(mData->getHeight());
594 mFlat->setValue(mData->getFlat());
595 mInternalUpdate =
false;
598 void DonutMetricWrapper::dataChangedSlot()
609 void DonutMetricWrapper::guiChanged()
613 mInternalUpdate =
true;
614 mData->setRadius(mRadius->getValue());
615 mData->setThickness(mThickness->getValue());
616 mData->setHeight(mHeight->getValue());
617 mData->setFlat(mFlat->getValue());
618 mInternalUpdate =
false;
633 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
643 mData->getThickness(),
648 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
657 "Disc height, NA to torus",
663 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
672 "Flat disk or torus",
676 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
686 mScaleToP1Widget(NULL),
690 mInternalUpdate =
false;
691 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
696 QWidget* widget = this->
newWidget(
"custom_metric");
697 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
698 QHBoxLayout* hLayout =
new QHBoxLayout;
699 hLayout->setMargin(0);
700 topLayout->setMargin(0);
701 topLayout->addLayout(hLayout);
705 mDefineVectorUpMethod = this->createDefineVectorUpMethodSelector();
707 mModel = this->createModelSelector();
710 mOffsetFromP0 = this->createOffsetFromP0();
712 mOffsetFromP1 = this->createOffsetFromP1();
714 mRepeatDistance = this->createRepeatDistance();
717 mShowDistanceMarkers = this->createShowDistanceMarkers();
719 mDistanceMarkerVisibility = this->createDistanceMarkerVisibility();
721 topLayout->addWidget(mDistanceMarkerVisibilityWidget);
723 mScaleToP1 = this->createScaletoP1();
725 topLayout->addWidget(mScaleToP1Widget);
727 mTranslationOnly= this->createTranslationOnly();
730 mTextureFollowTool= this->createTextureFollowTool();
734 topLayout->addStretch();
736 this->dataChangedSlot();
760 mInternalUpdate =
true;
761 mDefineVectorUpMethod->setValue(mData->getDefineVectorUpMethod());
762 mModel->setValue(mData->getModelUid());
763 mInternalUpdate =
false;
767 void CustomMetricWrapper::dataChangedSlot()
778 void CustomMetricWrapper::guiChanged()
783 if(mModel->getData() && mModel->getData()->getType() ==
"image")
784 mScaleToP1Widget->setEnabled(
false);
786 mScaleToP1Widget->setEnabled(
true);
788 if(mShowDistanceMarkers->getValue())
789 mDistanceMarkerVisibilityWidget->setEnabled(
true);
791 mDistanceMarkerVisibilityWidget->setEnabled(
false);
793 mInternalUpdate =
true;
794 mData->setDefineVectorUpMethod(mDefineVectorUpMethod->getValue());
795 mData->setModelUid(mModel->getValue());
796 mData->setOffsetFromP0(mOffsetFromP0->getValue());
797 mData->setOffsetFromP1(mOffsetFromP1->getValue());
798 mData->setRepeatDistance(mRepeatDistance->getValue());
799 mData->setScaleToP1(mScaleToP1->getValue());
800 mData->setShowDistanceMarkers(mShowDistanceMarkers->getValue());
801 mData->setDistanceMarkerVisibility(mDistanceMarkerVisibility->getValue());
802 mData->setTranslationOnly(mTranslationOnly->getValue());
803 mData->setTextureFollowTool(mTextureFollowTool->getValue());
805 mInternalUpdate =
false;
812 "Scale model so that it fits between P0 and P1",
813 mData->getScaleToP1());
814 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
822 "Show distance to P0 for each repeated model",
823 mData->getShowDistanceMarkers());
824 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
832 "Ignore scale and rotate",
833 mData->getTranslationOnly());
834 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
842 "Any texture on the model will move with the tool",
843 mData->getTextureFollowTool());
844 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
852 "Position model an offset from P0 towards P1",
853 mData->getOffsetFromP0(),
DoubleRange(-100, 100, 1), 0);
854 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
862 "When scaling to P1, scale to a point offset from P1 towards P0",
863 mData->getOffsetFromP1(),
DoubleRange(-100, 100, 1), 0);
864 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
872 "Repeat model with this distance",
873 mData->getRepeatDistance(),
DoubleRange(0, 100, 1), 0);
874 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
882 "Hide the markers if the distance to the camera exceeds this threshold",
883 mData->getDistanceMarkerVisibility(),
DoubleRange(0, 1000, 1), 0);
884 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
888 StringPropertyPtr CustomMetricWrapper::createDefineVectorUpMethodSelector()
const 892 "Use to define the vector up",
893 "The vector up of the metric will be connected to one of:\n" 894 "- a) The static up vector of the operating table\n" 895 "- b) To a frame in p1, which might well be connected " 896 "to a tool giving a dynamic up vector.\n" 897 "- c) The tool up (tool negative x)",
898 mData->getDefineVectorUpMethod(),
899 mData->getDefineVectorUpMethods().getAvailableDefineVectorUpMethods(),
901 retval->setDisplayNames(mData->getDefineVectorUpMethods().getAvailableDefineVectorUpMethodsDisplayNames());
904 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
912 retval->setOnly2DImagesFilter(
true);
913 retval->setValueName(
"Model");
914 retval->setHelp(
"Model can be mesh or 2D image");
929 mInternalUpdate =
false;
930 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
935 QWidget* widget = this->
newWidget(
"sphere_metric");
936 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
937 QHBoxLayout* hLayout =
new QHBoxLayout;
938 hLayout->setMargin(0);
939 topLayout->setMargin(0);
940 topLayout->addLayout(hLayout);
944 mRadius = this->createRadiusSelector();
948 topLayout->addStretch();
950 this->dataChangedSlot();
968 void SphereMetricWrapper::dataChangedSlot()
976 mInternalUpdate =
true;
977 mRadius->setValue(mData->getRadius());
978 mInternalUpdate =
false;
981 void SphereMetricWrapper::guiChanged()
985 mData->setRadius(mRadius->getValue());
999 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
1011 mInternalUpdate =
false;
1012 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
1017 QWidget* widget = this->
newWidget(
"region_of_interest_metric");
1018 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
1019 QHBoxLayout* hLayout =
new QHBoxLayout;
1020 hLayout->setMargin(0);
1021 topLayout->setMargin(0);
1022 topLayout->addLayout(hLayout);
1024 mDataListProperty = this->createDataListProperty();
1026 topLayout->addWidget(datalistwidget);
1028 mUseActiveTooltipProperty = this->createUseActiveTooltipSelector();
1031 mMaxBoundsDataProperty = this->createMaxBoundsDataSelector();
1034 mMarginProperty = this->createMarginSelector();
1038 topLayout->addStretch();
1040 this->dataChangedSlot();
1058 void RegionOfInterestMetricWrapper::dataChangedSlot()
1067 "Select data to define ROI",
1070 connect(retval.get(), &
Property::changed,
this, &RegionOfInterestMetricWrapper::guiChanged);
1079 "Select data to define maximal extent of ROI",
1083 connect(retval.get(), &
Property::changed,
this, &RegionOfInterestMetricWrapper::guiChanged);
1092 "Margin added outside the data",
1098 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
1102 BoolPropertyPtr RegionOfInterestMetricWrapper::createUseActiveTooltipSelector()
const 1106 "Include tool tip in the roi",
1109 connect(retval.get(), &
Property::changed,
this, &RegionOfInterestMetricWrapper::guiChanged);
1116 mInternalUpdate =
true;
1119 std::map<QString, QString> names;
1120 std::map<QString, DataPtr> alldata =
mServices->patient()->getDatas();
1121 for (std::map<QString, DataPtr>::iterator i=alldata.begin(); i!=alldata.end(); ++i)
1123 if (i->first == mData->getUid())
1126 names[i->first] = i->second->getName();
1129 mDataListProperty->setValue(mData->getDataList());
1130 mDataListProperty->setValueRange(data);
1131 mDataListProperty->setDisplayNames(names);
1133 mMaxBoundsDataProperty->setValue(mData->getMaxBoundsData());
1134 mMaxBoundsDataProperty->setValueRange(data);
1135 mMaxBoundsDataProperty->setDisplayNames(names);
1137 mMarginProperty->setValue(mData->getMargin());
1138 mUseActiveTooltipProperty->setValue(mData->getUseActiveTooltip());
1140 mInternalUpdate =
false;
1143 void RegionOfInterestMetricWrapper::guiChanged()
1145 if (mInternalUpdate)
1147 mData->setDataList(mDataListProperty->getValue());
1148 mData->setUseActiveTooltip(mUseActiveTooltipProperty->getValue());
1149 mData->setMargin(mMarginProperty->getValue());
1150 mData->setMaxBoundsData(mMaxBoundsDataProperty->getValue());
virtual QString getArguments() const
static BoolPropertyPtr initialize(const QString &uid, QString name, QString help, bool value, QDomNode root=QDomNode())
virtual QString getType() const
boost::shared_ptr< class DistanceMetric > DistanceMetricPtr
void setArguments(MetricReferenceArgumentListPtr arguments)
virtual QString getArguments() const
virtual DataMetricPtr getData() const
virtual DataMetricPtr getData() const
virtual QWidget * createWidget()
virtual DataMetricPtr getData() const
boost::shared_ptr< class VisServices > VisServicesPtr
boost::shared_ptr< class DonutMetric > DonutMetricPtr
boost::shared_ptr< DataMetric > DataMetricPtr
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())
QString getAsString() const
Utility class for describing a bounded numeric range.
virtual ~PlaneMetricWrapper()
CustomMetricWrapper(VisServicesPtr services, CustomMetricPtr data)
virtual QString getType() const
QString prettyFormat(Vector3D val, int decimals, int fieldWidth)
boost::shared_ptr< class SpaceProperty > SpacePropertyPtr
csREF
the data reference space (r) using LPS (left-posterior-superior) coordinates.
boost::shared_ptr< class SphereMetric > SphereMetricPtr
PlaneMetricWrapper(VisServicesPtr services, PlaneMetricPtr data)
virtual DataMetricPtr getData() const =0
virtual DataMetricPtr getData() const
virtual QString getArguments() const
virtual DataMetricPtr getData() const
virtual QWidget * createWidget()
boost::shared_ptr< class AngleMetric > AngleMetricPtr
SphereMetricWrapper(VisServicesPtr services, SphereMetricPtr data)
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
MetricBase(VisServicesPtr services)
virtual QString getArguments() const
boost::shared_ptr< class PlaneMetric > PlaneMetricPtr
boost::shared_ptr< class Data > DataPtr
boost::shared_ptr< class StringProperty > StringPropertyPtr
virtual QString getType() const
virtual QWidget * createWidget()
virtual QString getType() const
void reportWarning(QString msg)
static Vector3DPropertyPtr initialize(const QString &uid, QString name, QString help, Vector3D value, DoubleRange range, int decimals, QDomNode root=QDomNode())
virtual QString getType() const
DonutMetricWrapper(VisServicesPtr services, DonutMetricPtr data)
virtual QWidget * createWidget()
void addWidgets(QBoxLayout *layout)
boost::shared_ptr< class MetricReferenceArgumentList > MetricReferenceArgumentListPtr
AngleMetricWrapper(VisServicesPtr services, AngleMetricPtr data)
PointMetricWrapper(VisServicesPtr services, PointMetricPtr data)
Identification of a Coordinate system.
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.
static StringPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList range, QDomNode root=QDomNode())
DistanceMetricWrapper(VisServicesPtr services, DistanceMetricPtr data)
virtual QString getType() const
boost::shared_ptr< class DoubleProperty > DoublePropertyPtr
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
boost::shared_ptr< class StringListProperty > StringListPropertyPtr
virtual QWidget * createWidget()
boost::shared_ptr< class Vector3DProperty > Vector3DPropertyPtr
virtual DataMetricPtr getData() const
virtual ~PointMetricWrapper()
virtual QString getArguments() const
static DoublePropertyPtr initialize(const QString &uid, QString name, QString help, double value, DoubleRange range, int decimals, QDomNode root=QDomNode())
virtual QString getType() const
RegionOfInterestMetricWrapper(VisServicesPtr services, RegionOfInterestMetricPtr data)
virtual QWidget * createWidget()
boost::shared_ptr< class StringPropertySelectData > StringPropertySelectDataPtr
virtual QWidget * createWidget()
static ColorPropertyPtr initialize(const QString &uid, QString name, QString help, QColor value, QDomNode root=QDomNode())
virtual QString getArguments() const
virtual ~AngleMetricWrapper()
boost::shared_ptr< class BoolProperty > BoolPropertyPtr
MetricReferenceArgumentListGui(VisServicesPtr services)
QWidget * newWidget(QString objectName)
virtual QString getValue() const
virtual QWidget * createWidget()
boost::shared_ptr< class CustomMetric > CustomMetricPtr
virtual DataMetricPtr getData() const
Namespace for all CustusX production code.
boost::shared_ptr< class PointMetric > PointMetricPtr