35 #include <vtkImageData.h> 51 DataMetric(uid, name, dataManager, spaceProvider), mShowDistanceMarkers(false), mDistanceMarkerVisibility(50)
53 mArguments.reset(
new MetricReferenceArgumentList(QStringList() <<
"position" <<
"direction"));
54 mArguments->setValidArgumentTypes(QStringList() <<
"pointMetric" <<
"frameMetric");
55 connect(mArguments.get(), SIGNAL(argumentsChanged()),
this, SIGNAL(
transformChanged()));
57 mDefineVectorUpMethod = mDefineVectorUpMethods.table;
62 mRepeatDistance = 0.0;
63 mTranslationOnly =
false;
64 mTextureFollowTool =
false;
67 bool CustomMetric::needForToolListenerHasChanged()
const 69 bool toolDefinesUp = mDefineVectorUpMethod == mDefineVectorUpMethods.tool;
70 bool toolListenerDefined = mToolListener.get()!=NULL;
72 if (mTextureFollowTool != toolListenerDefined || toolDefinesUp != toolListenerDefined)
79 void CustomMetric::createOrDestroyToolListener()
81 if (this->needForToolListenerHasChanged())
83 bool toolDefinesUp = mDefineVectorUpMethod == mDefineVectorUpMethods.tool;
84 if (mTextureFollowTool || toolDefinesUp)
87 mToolListener->setSpace(CoordinateSystem(
csTOOL_OFFSET,
"active"));
93 mToolListener.reset();
98 void CustomMetric::onPropertiesChanged()
100 this->createOrDestroyToolListener();
105 return mDefineVectorUpMethods;
122 mArguments->addXml(dataNode);
124 QDomElement elem = dataNode.toElement();
125 elem.setAttribute(
"definevectorup", mDefineVectorUpMethod);
126 elem.setAttribute(
"meshUid", mModelUid);
128 elem.setAttribute(
"scaleToP1", mScaleToP1);
129 elem.setAttribute(
"offsetFromP0", mOffsetFromP0);
130 elem.setAttribute(
"offsetFromP1", mOffsetFromP1);
131 elem.setAttribute(
"repeatDistance", mRepeatDistance);
132 elem.setAttribute(
"showDistance", mShowDistanceMarkers);
133 elem.setAttribute(
"distanceMarkerVisibility", mDistanceMarkerVisibility);
134 elem.setAttribute(
"translationOnly", mTranslationOnly);
135 elem.setAttribute(
"textureFollowTool", mTextureFollowTool);
142 mArguments->parseXml(dataNode,
mDataManager->getDatas());
144 QDomElement elem = dataNode.toElement();
145 mDefineVectorUpMethod = elem.attribute(
"definevectorup",
qstring_cast(mDefineVectorUpMethod));
146 mModelUid = elem.attribute(
"meshUid",
qstring_cast(mModelUid));
147 mScaleToP1 = elem.attribute(
"scaleToP1", QString::number(mScaleToP1)).toInt();
148 mOffsetFromP0 = elem.attribute(
"offsetFromP0", QString::number(mOffsetFromP0)).toDouble();
149 mOffsetFromP1 = elem.attribute(
"offsetFromP1", QString::number(mOffsetFromP1)).toDouble();
150 mRepeatDistance = elem.attribute(
"repeatDistance", QString::number(mRepeatDistance)).toDouble();
151 mShowDistanceMarkers = elem.attribute(
"showDistance", QString::number(mShowDistanceMarkers)).toInt();
152 mDistanceMarkerVisibility = elem.attribute(
"distanceMarkerVisibility", QString::number(mDistanceMarkerVisibility)).toDouble();
153 mTranslationOnly = elem.attribute(
"translationOnly", QString::number(mTranslationOnly)).toInt();
154 mTextureFollowTool = elem.attribute(
"textureFollowTool", QString::number(mTextureFollowTool)).toInt();
156 this->onPropertiesChanged();
161 return !mArguments->getRefCoords().empty();
166 return mArguments->getRefCoords().front();
176 std::vector<Vector3D> retval;
178 DataPtr model = this->getModel();
180 std::vector<Transform3D> pos = this->calculateOrientations();
181 std::vector<Vector3D> cloud;
186 rrMd = model->get_rMd();
187 cloud = model->getPointCloud();
191 cloud.push_back(Vector3D::Zero());
192 rrMd = Transform3D::Identity();
195 for (
unsigned i=0; i<pos.size(); ++i)
199 for (
unsigned j=0; j<cloud.size(); ++j)
202 retval.push_back(p_r);
212 std::vector<Vector3D> coords = mArguments->getRefCoords();
217 Vector3D dir = this->getDirection();
221 zeroPos = this->calculateOrientation(p0, dir, vup, scale).coord(
Vector3D(0,0,0));
226 std::vector<Vector3D> CustomMetric::getPositions()
const 228 std::vector<Vector3D> retval;
229 std::vector<Vector3D> coords = mArguments->getRefCoords();
230 if (coords.size() < 2)
236 double fullDist =
dot(dir, p1-p0);
238 int reps = this->getRepeatCount();
239 for (
int i=0; i<reps; ++i)
241 double dist = mOffsetFromP0 + mRepeatDistance*i;
251 std::vector<Vector3D> coords = mArguments->getRefCoords();
252 if (coords.size() < 2)
260 if (!
similar(mRepeatDistance, 0.0))
261 reps = (
dot(p1-p0, dir)-mOffsetFromP0-mOffsetFromP1)/mRepeatDistance + 1;
262 reps = std::min(100, reps);
263 reps = std::max(reps, 1);
269 Vector3D CustomMetric::getDirection()
const 271 std::vector<Vector3D> coords = mArguments->getRefCoords();
273 return Vector3D::UnitZ();
274 Vector3D diff = (coords[1]-coords[0]);
275 if (
similar(diff.length(), 0.0))
277 return diff.normal();
280 Vector3D CustomMetric::getVectorUp()
const 282 if(mDefineVectorUpMethod == mDefineVectorUpMethods.connectedFrameInP1)
284 std::vector<Transform3D> transforms = mArguments->getRefFrames();
285 if (transforms.size()<2)
286 return Vector3D::UnitZ();
293 else if (mDefineVectorUpMethod == mDefineVectorUpMethods.tool)
296 Vector3D toolUp = -Vector3D::UnitX();
297 return rMt.vector(toolUp);
311 if (!this->getTextureFollowTool() || !model->hasTexture())
320 Vector3D t_r = rMt.coord(Vector3D::Zero());
321 Vector3D td_r = rMt.vector(Vector3D::UnitZ());
327 Vector3D x_min_r(c[0], bl[1], c[2]);
328 Vector3D x_max_r(c[0], tr[1], c[2]);
329 x_min_r = rMd.coord(x_min_r);
330 x_max_r = rMd.coord(x_max_r);
332 double t_x =
dot(t_r, td_r);
333 double bbmin_x =
dot(x_min_r, td_r);
334 double bbmax_x =
dot(x_max_r, td_r);
335 double range = bbmax_x-bbmin_x;
338 double s = (t_x-bbmin_x)/range;
339 model->getTextureData().getPositionY()->setValue(s);
342 Vector3D CustomMetric::getScale()
const 344 if (!mScaleToP1 || !this->getModel() || this->getModel()->
getType() ==
"image")
345 return Vector3D::Ones();
350 std::vector<Vector3D> coords = mArguments->getRefCoords();
351 double height = (coords[1] - coords[0]).
length();
353 Vector3D dir = this->getDirection();
354 double p0 =
dot(coords[0], dir);
355 double p1 =
dot(coords[1], dir);
358 height -= (mOffsetFromP0 + mOffsetFromP1);
361 height/bounds.
range()[1],
368 return mDefineVectorUpMethod;
373 mDefineVectorUpMethod = defineVectorUpMethod;
394 if (mScaleToP1 == val)
407 if (mOffsetFromP0 == val)
415 return mOffsetFromP0;
420 if (mOffsetFromP1 == val)
428 return mOffsetFromP1;
433 if (mRepeatDistance == val)
435 mRepeatDistance = val;
441 return mRepeatDistance;
446 if(mShowDistanceMarkers == show)
448 mShowDistanceMarkers = show;
454 return mShowDistanceMarkers;
458 if (mTranslationOnly == val)
460 mTranslationOnly = val;
466 if (mDistanceMarkerVisibility == val)
468 mDistanceMarkerVisibility = val;
474 return mDistanceMarkerVisibility;
479 return mTranslationOnly;
484 if (mTextureFollowTool == val)
486 mTextureFollowTool = val;
492 return mTextureFollowTool;
495 QStringList CustomMetric::DefineVectorUpMethods::getAvailableDefineVectorUpMethods()
const 499 retval << connectedFrameInP1;
504 std::map<QString, QString> CustomMetric::DefineVectorUpMethods::getAvailableDefineVectorUpMethodsDisplayNames()
const 506 std::map<QString, QString> names;
507 names[table] =
"The operating table";
508 names[connectedFrameInP1] =
"The connected frame in p1";
509 names[tool] =
"The active tool";
516 std::vector<Vector3D> pos = this->getPositions();
517 Vector3D dir = this->getDirection();
521 std::vector<Transform3D> retval(pos.size());
522 for (
unsigned i=0; i<retval.size(); ++i)
524 if (mTranslationOnly)
530 retval[i] = this->calculateOrientation(pos[i], dir, vup, scale);
545 Transform3D center2DImage = this->calculateTransformTo2DImageCenter();
553 Transform3D CustomMetric::calculateTransformTo2DImageCenter()
const 555 Transform3D position2DImage = Transform3D::Identity();
556 if(this->modelIsImage())
558 DataPtr model = this->getModel();
559 ImagePtr imageModel = boost::dynamic_pointer_cast<
Image>(model);
561 int xSize = vtkImage->GetExtent()[1] - vtkImage->GetExtent()[0];
562 int ySize = vtkImage->GetExtent()[3] - vtkImage->GetExtent()[2];
563 Eigen::Array3d spacing(vtkImage->GetSpacing());
567 return position2DImage;
572 DataPtr model = this->getModel();
574 return (model && model->getType() ==
"image");
580 bool directionAlongUp =
similar(
dot(vup, dir.normal()), 1.0);
581 if (!directionAlongUp)
592 if(this->modelIsImage())
boost::shared_ptr< class SpaceProvider > SpaceProviderPtr
QString qstring_cast(const T &val)
void setOffsetFromP1(double val)
DoubleBoundingBox3D transform(const Transform3D &m, const DoubleBoundingBox3D &bb)
Transform3D createTransformRotateY(const double angle)
virtual Transform3D get_rMd() const
Vector3D topRight() const
void addXml(QDomNode &dataNode)
adds xml information about the data and its variabels
void setScaleToP1(bool val)
bool getTranslationOnly() const
Transform3D createTransformScale(const Vector3D &scale_)
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
void propertiesChanged()
emitted when one of the metadata properties (uid, name etc) changes
Vector3D getZeroPosition() const
void transformChanged()
emitted when transform is changed
boost::shared_ptr< class Image > ImagePtr
void setDefineVectorUpMethod(QString defineVectorUpMethod)
Vector3D bottomLeft() const
void setDistanceMarkerVisibility(double val)
void updateTexture(MeshPtr model, Transform3D rMrr)
virtual void parseXml(QDomNode &dataNode)
Use a XML node to load data.
PatientModelServicePtr mDataManager
static CoordinateSystem reference()
virtual vtkImageDataPtr getBaseVtkImageData()
SpaceProviderPtr mSpaceProvider
static DoubleBoundingBox3D fromCloud(std::vector< Vector3D > cloud)
Vector3D cross(const Vector3D &a, const Vector3D &b)
compute cross product of a and b.
std::vector< Transform3D > calculateOrientations() const
void setTranslationOnly(bool val)
CustomMetric::DefineVectorUpMethods getDefineVectorUpMethods() const
boost::shared_ptr< class Data > DataPtr
QString getDefineVectorUpMethod() const
Transform3D createTransformIJC(const Vector3D &ivec, const Vector3D &jvec, const Vector3D ¢er)
virtual QString getType() const
bool getShowDistanceMarkers() const
void parseXml(QDomNode &dataNode)
Use a XML node to load data.
double getRepeatDistance() const
Data class that represents a custom.
void setOffsetFromP0(double val)
boost::shared_ptr< class PatientModelService > PatientModelServicePtr
virtual Vector3D getRefCoord() const
static CustomMetricPtr create(QString uid, QString name, PatientModelServicePtr dataManager, SpaceProviderPtr spaceProvider)
Transform3D createTransformTranslate(const Vector3D &translation)
csTOOL_OFFSET
the tool space t with a virtual offset added along the z axis. (to)
double dot(const Vector3D &a, const Vector3D &b)
compute inner product (or dot product) of a and b.
Representation of a floating-point bounding box in 3D. The data are stored as {xmin,xmax,ymin,ymax,zmin,zmax}, in order to simplify communication with vtk.
bool getTextureFollowTool() const
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
bool similar(const CameraInfo &lhs, const CameraInfo &rhs, double tol)
void setModelUid(QString val)
RealScalar length() const
std::vector< Vector3D > getPointCloud() const
virtual DoubleBoundingBox3D boundingBox() const
double getOffsetFromP0() const
void setTextureFollowTool(bool val)
int getRepeatCount() const
void setShowDistanceMarkers(bool show)
Transform3D createTransformRotateX(const double angle)
bool modelIsImage() const
boost::shared_ptr< class Mesh > MeshPtr
double getOffsetFromP1() const
double getDistanceMarkerVisibility() const
void setRepeatDistance(double val)
boost::shared_ptr< class CustomMetric > CustomMetricPtr
virtual bool isValid() const
virtual void addXml(QDomNode &dataNode)
adds xml information about the data and its variabels
bool getScaleToP1() const
QString getModelUid() const
Namespace for all CustusX production code.