Fraxinus  17.12
An IGT application
cxToolRep3D.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 
33 
34 #include "cxToolRep3D.h"
35 
36 #include "boost/bind.hpp"
37 #include <vtkActor.h>
38 #include <vtkProperty.h>
39 #include <vtkPolyDataMapper.h>
40 #include <vtkPolyDataNormals.h>
41 #include <vtkSTLReader.h>
42 #include <vtkMatrix4x4.h>
43 #include <vtkRenderer.h>
44 
45 #include "cxGraphicalPrimitives.h"
46 #include "cxProbe.h"
47 #include "cxView.h"
48 #include "cxVideoSourceGraphics.h"
49 #include "cxTypeConversions.h"
50 #include "cxToolTracer.h"
51 #include "cxTool.h"
52 #include "cxSpaceProvider.h"
53 #include "cxSettings.h"
54 
55 namespace cx
56 {
57 
59  RepImpl(),
60  mSpaceProvider(spaceProvider),
61  mSphereRadiusInNormalizedViewport(false),
62  mStipplePattern(0xFFFF)
63 {
64  mTooltipPointColor = settings()->value("View/toolTipPointColor").value<QColor>();
65  mOffsetPointColor = settings()->value("View/toolOffsetPointColor").value<QColor>();
66  mOffsetLineColor = settings()->value("View/toolOffsetLineColor").value<QColor>();
67 
68  mSphereRadius = 2;
69  mStayHiddenAfterVisible = false;
70  mStayVisibleAfterHide = false;
71  mOffsetPointVisibleAtZeroOffset = false;
72  mToolActor = vtkActorPtr::New();
73  mPolyDataMapper = vtkPolyDataMapperPtr::New();
74 // mSTLReader = vtkSTLReaderPtr::New();
75 
76  mOffsetPoint.reset(new GraphicalPoint3D());
77  mOffsetLine.reset(new GraphicalLine3D());
78  mTooltipPoint.reset(new GraphicalPoint3D());
79 
80  mProbeSector.reset(new ProbeSector());
81  mProbeSectorPolyDataMapper = vtkPolyDataMapperPtr::New();
82  mProbeSectorActor = vtkActorPtr::New();
83 
84  mTracer = ToolTracer::create(mSpaceProvider);
85 }
86 
88 {}
89 
91 {
92  return mTracer;
93 }
94 
95 ToolRep3DPtr ToolRep3D::New(SpaceProviderPtr spaceProvider, const QString& uid)
96 {
97  return wrap_new(new ToolRep3D(spaceProvider), uid);
98 }
99 
100 QString ToolRep3D::getType() const
101 {
102  return "ToolRep3D";
103 }
104 
106 {
107  return mTool;
108 }
109 
110 void ToolRep3D::updateToolActor()
111 {
112  if (!mTool)
113  {
114  mToolActor->SetMapper(NULL);
115  return;
116  }
117 
118  vtkPolyDataPtr model = mTool->getGraphicsPolyData();
119 
120  if (model)
121  {
122  vtkPolyDataNormalsPtr normals = vtkPolyDataNormalsPtr::New();
123  normals->SetInputData(model);
124  mPolyDataMapper->SetInputConnection(normals->GetOutputPort());
125  mPolyDataMapper->Update();
126  mToolActor->SetMapper(mPolyDataMapper);
127  }
128 
129  //some color to 3D cursor
130  mToolActor->GetProperty()->SetColor(1.0, 1.0, 1.0);
131  if (mTool->hasType(Tool::TOOL_MANUAL))
132  {
133  setColorAndOpacity(mToolActor->GetProperty(), mTooltipPointColor);
134  }
135 
136  this->setModified();
137  mToolActor->SetVisibility(mTool->getVisible());
138 }
139 
141 {
142  if (tool == mTool)
143  return;
144 
145  mTracer->setTool(tool);
146 
147  if (mTool)
148  {
149  disconnect(mTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D, double)), this, SLOT(setModified()));
150  disconnect(mTool.get(), SIGNAL(toolVisible(bool)), this, SLOT(receiveVisible(bool)));
151  disconnect(mTool.get(), SIGNAL(tooltipOffset(double)), this, SLOT(tooltipOffsetSlot(double)));
152  disconnect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(probeSectorChanged()));
153  disconnect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(updateToolActor()));
154  }
155 
156  mTool = tool;
157 
158  if (mTool)
159  {
160  connect(mTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D, double)), this, SLOT(setModified()));
161  connect(mTool.get(), SIGNAL(toolVisible(bool)), this, SLOT(receiveVisible(bool)));
162  connect(mTool.get(), SIGNAL(tooltipOffset(double)), this, SLOT(tooltipOffsetSlot(double)));
163  connect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(probeSectorChanged()));
164  connect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(updateToolActor()));
165  }
166 
167  this->updateToolActor();
168  this->setModified();
169  this->probeSectorChanged();
170 }
171 
172 bool ToolRep3D::hasTool(ToolPtr tool) const
173 {
174  return (mTool == tool);
175 }
176 
177 void ToolRep3D::setSphereRadius(double radius)
178 {
179  mSphereRadius = radius;
180  if (mOffsetPoint)
181  mOffsetPoint->setRadius(mSphereRadius);
182  if (mTooltipPoint)
183  mTooltipPoint->setRadius(mSphereRadius);
184 }
185 
187 {
188  if (mSphereRadiusInNormalizedViewport == on)
189  return;
190 
191  mSphereRadiusInNormalizedViewport = on;
192 
193  if (on)
194  {
195  mViewportListener.reset(new ViewportListener);
196  mViewportListener->setCallback(boost::bind(&ToolRep3D::scaleSpheres, this));
197  }
198  else
199  {
200  mViewportListener.reset();
201  }
202 }
203 
209 void ToolRep3D::setTooltipPointColor(const QColor& color)
210 {
211  if(mToolActor)
212  setColorAndOpacity(mToolActor->GetProperty(), color);
213  if(mTooltipPoint)
214  mTooltipPoint->setColor(color);
215 }
216 
217 void ToolRep3D::setToolOffsetPointColor(const QColor& color)
218 {
219  if(mOffsetPoint)
220  mOffsetPoint->setColor(color);
221 }
222 
223 void ToolRep3D::setToolOffsetLineColor(const QColor& color)
224 {
225  if(mOffsetLine)
226  mOffsetLine->setColor(color);
227 }
228 
230 {
231  view->getRenderer()->AddActor(mTracer->getActor());
232 
233  view->getRenderer()->AddActor(mToolActor);
234  view->getRenderer()->AddActor(mProbeSectorActor);
235 
236  mOffsetPoint.reset(new GraphicalPoint3D(view->getRenderer()));
237  mOffsetPoint->setRadius(mSphereRadius);
238  mOffsetPoint->setColor(mOffsetPointColor);
239 
240  mTooltipPoint.reset(new GraphicalPoint3D(view->getRenderer()));
241  mTooltipPoint->setRadius(mSphereRadius);
242  mTooltipPoint->setColor(mTooltipPointColor);
243 
244  mOffsetLine.reset(new GraphicalLine3D(view->getRenderer()));
245  mOffsetLine->setColor(mOffsetLineColor);
246  mOffsetLine->setStipple(mStipplePattern);
247 
248  mTooltipPoint->getActor()->SetVisibility(false);
249  mOffsetPoint->getActor()->SetVisibility(false);
250  mOffsetLine->getActor()->SetVisibility(false);
251 
252  if (mViewportListener)
253  mViewportListener->startListen(view->getRenderer());
254 }
255 
257 {
258  view->getRenderer()->RemoveActor(mTracer->getActor());
259  view->getRenderer()->RemoveActor(mToolActor);
260  view->getRenderer()->RemoveActor(mProbeSectorActor);
261 
262  mTooltipPoint.reset(new GraphicalPoint3D());
263  mOffsetPoint.reset(new GraphicalPoint3D());
264  mOffsetLine.reset(new GraphicalLine3D());
265 
266  if (mViewportListener)
267  mViewportListener->stopListen();
268 }
269 
276 void ToolRep3D::scaleSpheres()
277 {
278  if (!mViewportListener)
279  return;
280  if (!mViewportListener->isListening())
281  return;
282 
283  double size = mViewportListener->getVpnZoom(this->getTool()->get_prMt().translation());
284  double sphereSize = mSphereRadius/100/size;
285 
286  if (mOffsetPoint)
287  mOffsetPoint->setRadius(sphereSize);
288  if (mTooltipPoint)
289  mTooltipPoint->setRadius(sphereSize);
290 }
291 
293 {
294  this->update();
295 }
296 
297 
298 void ToolRep3D::update()
299 {
300  Transform3D prMt = Transform3D::Identity();
301  if (mTool)
302  prMt = mTool->get_prMt();
303  Transform3D rMpr = mSpaceProvider->get_rMpr();
304 
305  Transform3D rMt = rMpr * prMt;
306  mToolActor->SetUserMatrix(rMt.getVtkMatrix());
307 
308  if (this->showProbe())
309  {
310  Transform3D tMu = mProbeSector->get_tMu();
311  mProbeSectorActor->SetUserMatrix((rMpr * prMt * tMu).getVtkMatrix());
312  mProbeSectorActor->SetVisibility(mTool->getVisible());
313  }
314  else
315  mProbeSectorActor->SetVisibility(false);
316 
317  this->updateOffsetGraphics();
318 }
319 
320 void ToolRep3D::probeSectorChanged()
321 {
322  if (!mTool)
323  return;
324 
325  Transform3D prMt = mTool->get_prMt();
326  Transform3D rMpr = mSpaceProvider->get_rMpr();
327 
328  if (this->showProbe())
329  {
330  mProbeSector->setData(mTool->getProbe()->getProbeDefinition());
331  Transform3D tMu = mProbeSector->get_tMu();
332 
333  mProbeSectorPolyDataMapper->SetInputData(mProbeSector->getSectorLinesOnly());
334  if (mProbeSectorPolyDataMapper->GetInput())
335  {
336  mProbeSectorActor->SetMapper(mProbeSectorPolyDataMapper);
337  }
338  mProbeSectorActor->SetUserMatrix((rMpr * prMt * tMu).getVtkMatrix());
339  mProbeSectorActor->SetVisibility(mTool->getVisible());
340  }
341  else
342  mProbeSectorActor->SetVisibility(false);
343 }
344 
345 void ToolRep3D::updateOffsetGraphics()
346 {
347  bool visible = mTool && mTool->getVisible();
348 
349  if (!mStayVisibleAfterHide || (mOffsetPoint->getActor()->GetVisibility() == false))
350  {
351  mOffsetPoint->getActor()->SetVisibility(visible);
352  mTooltipPoint->getActor()->SetVisibility(visible);
353  //Don't show tooltipPoint when in tool view, as this will obscure the offsetPoint
354  if (mStayHiddenAfterVisible)
355  mTooltipPoint->getActor()->SetVisibility(false);
356  mOffsetLine->getActor()->SetVisibility(visible);
357  }
358 
359  if (similar(0.0, mTool->getTooltipOffset()))
360  {
361  if(mTool->hasType(Tool::TOOL_US_PROBE))
362  mTooltipPoint->getActor()->SetVisibility(false);
363  else
364  mTooltipPoint->getActor()->SetVisibility(visible && mOffsetPointVisibleAtZeroOffset);
365  mOffsetPoint->getActor()->SetVisibility(false);
366  mOffsetLine->getActor()->SetVisibility(false);
367  }
368 
369  if (!mTool)
370  return;
371  Transform3D rMpr = mSpaceProvider->get_rMpr();
372  Transform3D rMt = rMpr * mTool->get_prMt();
373 
374  Vector3D p0 = rMt.coord(Vector3D(0, 0, 0));
375  Vector3D p1 = rMt.coord(Vector3D(0, 0, mTool->getTooltipOffset()));
376  mOffsetPoint->setValue(p1);
377  mOffsetLine->setValue(p0, p1);
378  mTooltipPoint->setValue(Vector3D(p0));
379 
380  this->scaleSpheres();
381 }
382 
383 void ToolRep3D::receiveVisible(bool visible)
384 {
385  if (!visible && mStayVisibleAfterHide)
386  return; // don't hide
387  mToolActor->SetVisibility(visible);
388 
389  if (mStayHiddenAfterVisible)
390  mToolActor->SetVisibility(false);
391  else
392  mToolActor->SetVisibility(mTool->getVisible());
393 
394  this->update();
395 }
396 
398 {
399  mStayHiddenAfterVisible = val;
400  if (mTool)
401  receiveVisible(mTool->getVisible());
402 }
403 
409 {
410  mStayVisibleAfterHide = val;
411 }
412 
414 {
415  mOffsetPointVisibleAtZeroOffset = val;
416 }
417 
418 void ToolRep3D::tooltipOffsetSlot(double val)
419 {
420  updateOffsetGraphics();
421 }
422 
424 {
425  return mTool && (mTool->hasType(Tool::TOOL_US_PROBE)) && (mTool->getProbe()->getProbeDefinition().getType()!=ProbeDefinition::tNONE);
426 }
427 
428 } // namespace cx
boost::shared_ptr< class SpaceProvider > SpaceProviderPtr
virtual ToolPtr getTool()
virtual void onModifiedStartRender()
virtual void removeRepActorsFromViewRenderer(ViewPtr view)
virtual void setTool(ToolPtr tool)
virtual bool hasTool(ToolPtr tool) const
virtual QString getType() const
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
void setStayVisibleAfterHide(bool val)
if true, tool is still rendered as visible after visibility status is hidden.
static boost::shared_ptr< REP > wrap_new(REP *object, QString uid)
Definition: cxRepImpl.h:83
ToolRep3D(SpaceProviderPtr spaceProvider)
Definition: cxToolRep3D.cpp:58
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Definition: cxSettings.cpp:87
boost::shared_ptr< class ToolTracer > ToolTracerPtr
Helper for rendering a point in 3D.
boost::shared_ptr< class View > ViewPtr
Listens to changes in viewport and camera matrix.
void setToolOffsetLineColor(const QColor &color)
void setSphereRadius(double radius)
vtkMatrix4x4Ptr getVtkMatrix(const Eigen::Affine3d *self)
void setStayHiddenAfterVisible(bool val)
virtual void addRepActorsToViewRenderer(ViewPtr view)
vtkSmartPointer< class vtkPolyDataNormals > vtkPolyDataNormalsPtr
Helper for rendering a line in 3D.
Representation of a mouse/keyboard-controlled virtual tool.
Definition: cxTool.h:106
Default implementation of Rep.
Definition: cxRepImpl.h:63
Settings * settings()
Shortcut for accessing the settings instance.
Definition: cxSettings.cpp:42
void setSphereRadiusInNormalizedViewport(bool on)
void setOffsetPointVisibleAtZeroOffset(bool val)
if true the sphere is visible even when the offset is zero
vtkSmartPointer< vtkPolyData > vtkPolyDataPtr
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:63
bool similar(const CameraInfo &lhs, const CameraInfo &rhs, double tol)
Utility functions for drawing an US Probe sector.
Definition: cxProbeSector.h:59
void setTooltipPointColor(const QColor &color)
ToolRep3D::setTooltipPointColor.
static ToolRep3DPtr New(SpaceProviderPtr spaceProvider, const QString &uid="")
Definition: cxToolRep3D.cpp:95
ToolTracerPtr getTracer()
Definition: cxToolRep3D.cpp:90
boost::shared_ptr< class ToolRep3D > ToolRep3DPtr
static ToolTracerPtr create(SpaceProviderPtr spaceProvider)
Ultrasond probe. The tool has a Probe subinterface with a sector and a video stream.
Definition: cxTool.h:108
void setToolOffsetPointColor(const QColor &color)
void setColorAndOpacity(vtkPropertyOrProperty2DPtr property, QColor color)
virtual ~ToolRep3D()
Definition: cxToolRep3D.cpp:87
void setModified()
Definition: cxRepImpl.cpp:133
Namespace for all CustusX production code.
boost::shared_ptr< class Tool > ToolPtr