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;
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);
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);
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
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 QString(
"%1 %2")
375 return mDefineVectorUpMethod;
380 mDefineVectorUpMethod = defineVectorUpMethod;
401 if (mScaleToP1 == val)
414 if (mOffsetFromP0 == val)
422 return mOffsetFromP0;
427 if (mOffsetFromP1 == val)
435 return mOffsetFromP1;
440 if (mRepeatDistance == val)
442 mRepeatDistance = val;
448 return mRepeatDistance;
453 if(mShowDistanceMarkers == show)
455 mShowDistanceMarkers = show;
461 return mShowDistanceMarkers;
465 if (mTranslationOnly == val)
467 mTranslationOnly = val;
473 if (mDistanceMarkerVisibility == val)
475 mDistanceMarkerVisibility = val;
481 return mDistanceMarkerVisibility;
486 return mTranslationOnly;
491 if (mTextureFollowTool == val)
493 mTextureFollowTool = val;
499 return mTextureFollowTool;
502 QStringList CustomMetric::DefineVectorUpMethods::getAvailableDefineVectorUpMethods()
const
506 retval << connectedFrameInP1;
511 std::map<QString, QString> CustomMetric::DefineVectorUpMethods::getAvailableDefineVectorUpMethodsDisplayNames()
const
513 std::map<QString, QString> names;
514 names[table] =
"The operating table";
515 names[connectedFrameInP1] =
"The connected frame in p1";
516 names[tool] =
"The active tool";
523 std::vector<Vector3D> pos = this->getPositions();
524 Vector3D dir = this->getDirection();
528 std::vector<Transform3D> retval(pos.size());
529 for (
unsigned i=0; i<retval.size(); ++i)
531 if (mTranslationOnly)
537 retval[i] = this->calculateOrientation(pos[i], dir, vup, scale);
552 Transform3D center2DImage = this->calculateTransformTo2DImageCenter();
560 Transform3D CustomMetric::calculateTransformTo2DImageCenter()
const
562 Transform3D position2DImage = Transform3D::Identity();
566 ImagePtr imageModel = boost::dynamic_pointer_cast<Image>(model);
568 int xSize = vtkImage->GetExtent()[1] - vtkImage->GetExtent()[0];
569 int ySize = vtkImage->GetExtent()[3] - vtkImage->GetExtent()[2];
570 Eigen::Array3d spacing(vtkImage->GetSpacing());
574 return position2DImage;
581 return (model && model->getType() ==
"image");
587 bool directionAlongUp =
similar(
dot(vup, dir.normal()), 1.0);
588 if (!directionAlongUp)
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()
SpaceProviderPtr mSpaceProvider
static DoubleBoundingBox3D fromCloud(std::vector< Vector3D > cloud)
virtual QString getType() const
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)
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)
QString getSingleLineHeader() const
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
cxLogicManager_EXPORT SpaceProviderPtr spaceProvider()
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)
virtual QString getAsSingleLineString() const
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