34 #include <QTreeWidget> 35 #include <QTreeWidgetItem> 36 #include <QStringList> 37 #include <QVBoxLayout> 38 #include <QHeaderView> 68 void MetricBase::colorSelected()
75 QString retval = this->
getData()->getValueAsString();
84 "Set color of metric",
85 this->
getData()->getColor(), QDomNode());
86 QHBoxLayout* line =
new QHBoxLayout;
90 layout->addLayout(line);
91 connect(
mColorSelector.get(), SIGNAL(valueWasSet()),
this, SLOT(colorSelected()));
96 QWidget* widget =
new QWidget;
97 widget->setFocusPolicy(Qt::StrongFocus);
98 widget->setObjectName(objectName);
109 mInternalUpdate =
false;
114 mArguments = arguments;
115 connect(mArguments.get(), SIGNAL(argumentsChanged()),
this, SLOT(dataChangedSlot()));
122 mPSelector.resize(mArguments->getCount());
123 for (
unsigned i=0; i<mPSelector.size(); ++i)
126 QString(
"p%1").arg(i),
127 mArguments->getDescription(i),
128 mArguments->get(i) ? mArguments->get(i)->getUid() :
"",
133 connect(mPSelector[i].
get(), SIGNAL(valueWasSet()),
this, SLOT(pointSelected()));
136 this->dataChangedSlot();
139 void MetricReferenceArgumentListGui::getAvailableArgumentMetrics(QStringList* uid, std::map<QString,QString>* namemap)
141 std::map<QString, DataPtr> data = mServices->patient()->getDatas();
142 for (std::map<QString, DataPtr>::iterator iter=data.begin(); iter!=data.end(); ++iter)
144 if (mArguments->validArgument(iter->second))
147 (*namemap)[iter->first] = iter->second->getName();
155 for (
unsigned i=0; i<mArguments->getCount(); ++i)
156 data << (mArguments->get(i) ? mArguments->get(i)->getName() : QString(
"*"));
157 return data.join(
"-");
160 void MetricReferenceArgumentListGui::pointSelected()
164 for (
unsigned i=0; i<mPSelector.size(); ++i)
166 DataPtr data = mServices->patient()->getData(mPSelector[i]->getValue());
167 if (mArguments->validArgument(data))
168 mArguments->set(i, data);
170 reportWarning(QString(
"Failed to set data [%1] in metric, invalid argument.").arg(data?data->getName():
"NULL"));
174 void MetricReferenceArgumentListGui::dataChangedSlot()
183 mInternalUpdate =
true;
186 std::map<QString,QString> names;
187 this->getAvailableArgumentMetrics(&range, &names);
189 for (
unsigned i=0; i<mPSelector.size(); ++i)
191 if (!mArguments->get(i))
193 mPSelector[i]->setValue(mArguments->get(i)->getUid());
194 mPSelector[i]->setDisplayNames(names);
195 mPSelector[i]->setValueRange(range);
198 mInternalUpdate =
false;
211 mInternalUpdate =
false;
223 QWidget* widget = this->
newWidget(
"point_metric");
224 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
225 QHBoxLayout* hLayout =
new QHBoxLayout;
226 hLayout->setMargin(0);
227 topLayout->setMargin(0);
228 topLayout->addLayout(hLayout);
230 mSpaceSelector = this->createSpaceSelector();
233 mCoordinate = this->createCoordinateSelector();
236 QWidget* sampleButton = this->createSampleButton(widget);
237 hLayout->addWidget(sampleButton);
240 topLayout->addStretch();
251 "Select coordinate system to store position in.");
252 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(spaceSelected()));
253 retval->setSpaceProvider(
mServices->spaceProvider());
262 "Coordinate values.",
268 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(coordinateChanged()));
272 QWidget* PointMetricWrapper::createSampleButton(QWidget* parent)
const 274 QAction* sampleAction =
new QAction(
"Sample", parent);
275 QString sampleTip(
"Set the position equal to the current tool tip position.");
276 sampleAction->setStatusTip(sampleTip);
277 sampleAction->setWhatsThis(sampleTip);
278 sampleAction->setToolTip(sampleTip);
279 connect(sampleAction, SIGNAL(triggered()),
this, SLOT(moveToToolPosition()));
282 sampleButton->setDefaultAction(sampleAction);
298 Vector3D p = mData->getCoordinate();
300 if (mData->getSpace().mId==
csREF)
303 return mData->getSpace().toString() +
" " + coord;
306 void PointMetricWrapper::moveToToolPosition()
308 Vector3D p =
mServices->spaceProvider()->getActiveToolTipPoint(mData->getSpace(),
true);
309 mData->setCoordinate(p);
312 void PointMetricWrapper::spaceSelected()
319 mData->setSpace(space);
322 void PointMetricWrapper::coordinateChanged()
326 mData->setCoordinate(mCoordinate->getValue());
335 mInternalUpdate =
true;
336 mSpaceSelector->setValue(mData->getSpace());
337 mCoordinate->setValue(mData->getCoordinate());
338 mInternalUpdate =
false;
351 mInternalUpdate =
false;
352 connect(mData.get(), SIGNAL(transformChanged()),
this, SLOT(dataChangedSlot()));
353 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
354 connect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
359 disconnect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
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);
373 topLayout->addStretch();
375 this->dataChangedSlot();
395 void PlaneMetricWrapper::dataChangedSlot()
398 mInternalUpdate =
false;
416 mInternalUpdate =
false;
417 connect(mData.get(), SIGNAL(transformChanged()),
this, SLOT(dataChangedSlot()));
418 connect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
423 QWidget* widget = this->
newWidget(
"distance_metric");
424 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
425 QHBoxLayout* hLayout =
new QHBoxLayout;
426 hLayout->setMargin(0);
427 topLayout->setMargin(0);
428 topLayout->addLayout(hLayout);
432 topLayout->addStretch();
434 this->dataChangedSlot();
453 void DistanceMetricWrapper::dataChangedSlot()
456 mInternalUpdate =
false;
475 mInternalUpdate =
false;
476 connect(mData.get(), SIGNAL(transformChanged()),
this, SLOT(dataChangedSlot()));
477 connect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
482 disconnect(
mServices->patient().get(), SIGNAL(dataAddedOrRemoved()),
this, SLOT(dataChangedSlot()));
487 QWidget* widget = this->
newWidget(
"angle_metric");
488 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
489 QHBoxLayout* hLayout =
new QHBoxLayout;
490 hLayout->setMargin(0);
491 topLayout->setMargin(0);
492 topLayout->addLayout(hLayout);
496 mUseSimpleVisualization = this->createUseSimpleVisualizationSelector();
500 topLayout->addStretch();
502 this->dataChangedSlot();
520 void AngleMetricWrapper::dataChangedSlot()
522 mInternalUpdate =
true;
523 mUseSimpleVisualization->setValue(mData->getUseSimpleVisualization());
524 mInternalUpdate =
false;
527 void AngleMetricWrapper::guiChanged()
531 mData->setUseSimpleVisualization(mUseSimpleVisualization->getValue());
534 BoolPropertyPtr AngleMetricWrapper::createUseSimpleVisualizationSelector()
const 538 "Simple Visualization",
539 mData->getUseSimpleVisualization());
541 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
560 mInternalUpdate =
false;
561 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
566 QWidget* widget = this->
newWidget(
"donut_metric");
567 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
568 QHBoxLayout* hLayout =
new QHBoxLayout;
569 hLayout->setMargin(0);
570 topLayout->setMargin(0);
571 topLayout->addLayout(hLayout);
575 mRadius = this->createRadiusSelector();
577 mThickness = this->createThicknessSelector();
579 mFlat = this->createFlatSelector();
581 mHeight = this->createHeightSelector();
585 topLayout->addStretch();
587 this->dataChangedSlot();
611 mInternalUpdate =
true;
612 mRadius->setValue(mData->getRadius());
613 mThickness->setValue(mData->getThickness());
614 mHeight->setValue(mData->getHeight());
615 mFlat->setValue(mData->getFlat());
616 mInternalUpdate =
false;
619 void DonutMetricWrapper::dataChangedSlot()
630 void DonutMetricWrapper::guiChanged()
634 mInternalUpdate =
true;
635 mData->setRadius(mRadius->getValue());
636 mData->setThickness(mThickness->getValue());
637 mData->setHeight(mHeight->getValue());
638 mData->setFlat(mFlat->getValue());
639 mInternalUpdate =
false;
654 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
664 mData->getThickness(),
669 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
678 "Disc height, NA to torus",
684 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
693 "Flat disk or torus",
697 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
707 mScaleToP1Widget(NULL),
711 mInternalUpdate =
false;
712 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
717 QWidget* widget = this->
newWidget(
"custom_metric");
718 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
719 QHBoxLayout* hLayout =
new QHBoxLayout;
720 hLayout->setMargin(0);
721 topLayout->setMargin(0);
722 topLayout->addLayout(hLayout);
726 mDefineVectorUpMethod = this->createDefineVectorUpMethodSelector();
728 mModel = this->createModelSelector();
731 mOffsetFromP0 = this->createOffsetFromP0();
733 mOffsetFromP1 = this->createOffsetFromP1();
735 mRepeatDistance = this->createRepeatDistance();
738 mShowDistanceMarkers = this->createShowDistanceMarkers();
740 mDistanceMarkerVisibility = this->createDistanceMarkerVisibility();
742 topLayout->addWidget(mDistanceMarkerVisibilityWidget);
744 mScaleToP1 = this->createScaletoP1();
746 topLayout->addWidget(mScaleToP1Widget);
748 mTranslationOnly= this->createTranslationOnly();
751 mTextureFollowTool= this->createTextureFollowTool();
755 topLayout->addStretch();
757 this->dataChangedSlot();
781 mInternalUpdate =
true;
782 mDefineVectorUpMethod->setValue(mData->getDefineVectorUpMethod());
783 mModel->setValue(mData->getModelUid());
784 mInternalUpdate =
false;
788 void CustomMetricWrapper::dataChangedSlot()
799 void CustomMetricWrapper::guiChanged()
804 if(mModel->getData() && mModel->getData()->getType() ==
"image")
805 mScaleToP1Widget->setEnabled(
false);
807 mScaleToP1Widget->setEnabled(
true);
809 if(mShowDistanceMarkers->getValue())
810 mDistanceMarkerVisibilityWidget->setEnabled(
true);
812 mDistanceMarkerVisibilityWidget->setEnabled(
false);
814 mInternalUpdate =
true;
815 mData->setDefineVectorUpMethod(mDefineVectorUpMethod->getValue());
816 mData->setModelUid(mModel->getValue());
817 mData->setOffsetFromP0(mOffsetFromP0->getValue());
818 mData->setOffsetFromP1(mOffsetFromP1->getValue());
819 mData->setRepeatDistance(mRepeatDistance->getValue());
820 mData->setScaleToP1(mScaleToP1->getValue());
821 mData->setShowDistanceMarkers(mShowDistanceMarkers->getValue());
822 mData->setDistanceMarkerVisibility(mDistanceMarkerVisibility->getValue());
823 mData->setTranslationOnly(mTranslationOnly->getValue());
824 mData->setTextureFollowTool(mTextureFollowTool->getValue());
826 mInternalUpdate =
false;
833 "Scale model so that it fits between P0 and P1",
834 mData->getScaleToP1());
835 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
843 "Show distance to P0 for each repeated model",
844 mData->getShowDistanceMarkers());
845 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
853 "Ignore scale and rotate",
854 mData->getTranslationOnly());
855 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
863 "Any texture on the model will move with the tool",
864 mData->getTextureFollowTool());
865 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
873 "Position model an offset from P0 towards P1",
874 mData->getOffsetFromP0(),
DoubleRange(-100, 100, 1), 0);
875 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
883 "When scaling to P1, scale to a point offset from P1 towards P0",
884 mData->getOffsetFromP1(),
DoubleRange(-100, 100, 1), 0);
885 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
893 "Repeat model with this distance",
894 mData->getRepeatDistance(),
DoubleRange(0, 100, 1), 0);
895 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
903 "Hide the markers if the distance to the camera exceeds this threshold",
904 mData->getDistanceMarkerVisibility(),
DoubleRange(0, 1000, 1), 0);
905 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
909 StringPropertyPtr CustomMetricWrapper::createDefineVectorUpMethodSelector()
const 913 "Use to define the vector up",
914 "The vector up of the metric will be connected to one of:\n" 915 "- a) The static up vector of the operating table\n" 916 "- b) To a frame in p1, which might well be connected " 917 "to a tool giving a dynamic up vector.\n" 918 "- c) The tool up (tool negative x)",
919 mData->getDefineVectorUpMethod(),
920 mData->getDefineVectorUpMethods().getAvailableDefineVectorUpMethods(),
922 retval->setDisplayNames(mData->getDefineVectorUpMethods().getAvailableDefineVectorUpMethodsDisplayNames());
925 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
933 retval->setOnly2DImagesFilter(
true);
934 retval->setValueName(
"Model");
935 retval->setHelp(
"Model can be mesh or 2D image");
950 mInternalUpdate =
false;
951 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
956 QWidget* widget = this->
newWidget(
"sphere_metric");
957 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
958 QHBoxLayout* hLayout =
new QHBoxLayout;
959 hLayout->setMargin(0);
960 topLayout->setMargin(0);
961 topLayout->addLayout(hLayout);
965 mRadius = this->createRadiusSelector();
969 topLayout->addStretch();
971 this->dataChangedSlot();
989 void SphereMetricWrapper::dataChangedSlot()
997 mInternalUpdate =
true;
998 mRadius->setValue(mData->getRadius());
999 mInternalUpdate =
false;
1002 void SphereMetricWrapper::guiChanged()
1004 if (mInternalUpdate)
1006 mData->setRadius(mRadius->getValue());
1020 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
1032 mInternalUpdate =
false;
1033 connect(mData.get(), SIGNAL(propertiesChanged()),
this, SLOT(dataChangedSlot()));
1038 QWidget* widget = this->
newWidget(
"region_of_interest_metric");
1039 QVBoxLayout* topLayout =
new QVBoxLayout(widget);
1040 QHBoxLayout* hLayout =
new QHBoxLayout;
1041 hLayout->setMargin(0);
1042 topLayout->setMargin(0);
1043 topLayout->addLayout(hLayout);
1045 mDataListProperty = this->createDataListProperty();
1047 topLayout->addWidget(datalistwidget);
1049 mUseActiveTooltipProperty = this->createUseActiveTooltipSelector();
1052 mMaxBoundsDataProperty = this->createMaxBoundsDataSelector();
1055 mMarginProperty = this->createMarginSelector();
1059 topLayout->addStretch();
1061 this->dataChangedSlot();
1079 void RegionOfInterestMetricWrapper::dataChangedSlot()
1088 "Select data to define ROI",
1091 connect(retval.get(), &
Property::changed,
this, &RegionOfInterestMetricWrapper::guiChanged);
1100 "Select data to define maximal extent of ROI",
1104 connect(retval.get(), &
Property::changed,
this, &RegionOfInterestMetricWrapper::guiChanged);
1113 "Margin added outside the data",
1119 connect(retval.get(), SIGNAL(valueWasSet()),
this, SLOT(guiChanged()));
1123 BoolPropertyPtr RegionOfInterestMetricWrapper::createUseActiveTooltipSelector()
const 1127 "Include tool tip in the roi",
1130 connect(retval.get(), &
Property::changed,
this, &RegionOfInterestMetricWrapper::guiChanged);
1137 mInternalUpdate =
true;
1140 std::map<QString, QString> names;
1141 std::map<QString, DataPtr> alldata =
mServices->patient()->getDatas();
1142 for (std::map<QString, DataPtr>::iterator i=alldata.begin(); i!=alldata.end(); ++i)
1144 if (i->first == mData->getUid())
1147 names[i->first] = i->second->getName();
1150 mDataListProperty->setValue(mData->getDataList());
1151 mDataListProperty->setValueRange(data);
1152 mDataListProperty->setDisplayNames(names);
1154 mMaxBoundsDataProperty->setValue(mData->getMaxBoundsData());
1155 mMaxBoundsDataProperty->setValueRange(data);
1156 mMaxBoundsDataProperty->setDisplayNames(names);
1158 mMarginProperty->setValue(mData->getMargin());
1159 mUseActiveTooltipProperty->setValue(mData->getUseActiveTooltip());
1161 mInternalUpdate =
false;
1164 void RegionOfInterestMetricWrapper::guiChanged()
1166 if (mInternalUpdate)
1168 mData->setDataList(mDataListProperty->getValue());
1169 mData->setUseActiveTooltip(mUseActiveTooltipProperty->getValue());
1170 mData->setMargin(mMarginProperty->getValue());
1171 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