CustusX  15.8
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
54 namespace cx
55 {
56 
58  RepImpl(),
59  mSpaceProvider(spaceProvider),
60  mSphereRadiusInNormalizedViewport(false),
61  mTooltipPointColor(QColor::fromRgbF(1.0, 0.8, 0.0)),
62  mOffsetPointColor(QColor::fromRgbF(1.0, 0.8, 0.0)),
63  mOffsetLineColor(QColor::fromRgbF(1.0, 0.8, 0.0)),
64  mStipplePattern(0xFFFF)
65 {
66  mSphereRadius = 2;
67  mStayHiddenAfterVisible = false;
68  mStayVisibleAfterHide = false;
69  mOffsetPointVisibleAtZeroOffset = false;
70  mToolActor = vtkActorPtr::New();
71  mPolyDataMapper = vtkPolyDataMapperPtr::New();
72 // mSTLReader = vtkSTLReaderPtr::New();
73 
74  mOffsetPoint.reset(new GraphicalPoint3D());
75  mOffsetLine.reset(new GraphicalLine3D());
76  mTooltipPoint.reset(new GraphicalPoint3D());
77 
78  mProbeSector.reset(new ProbeSector());
79  mProbeSectorPolyDataMapper = vtkPolyDataMapperPtr::New();
80  mProbeSectorActor = vtkActorPtr::New();
81 
82  bool useMask = true; // if true, use mask instead of texture to render the sector. Mask is identical to the algo used in reconstruction.
83  mRTStream.reset(new VideoSourceGraphics(mSpaceProvider, useMask));
84 
85  mTracer = ToolTracer::create(mSpaceProvider);
86 }
87 
89 {}
90 
92 {
93  return mTracer;
94 }
95 
97 {
98  return wrap_new(new ToolRep3D(spaceProvider), uid);
99 }
100 
101 QString ToolRep3D::getType() const
102 {
103  return "ToolRep3D";
104 }
105 
107 {
108  return mTool;
109 }
110 
111 void ToolRep3D::updateToolActor()
112 {
113  if (!mTool)
114  {
115  mToolActor->SetMapper(NULL);
116  return;
117  }
118 
119  vtkPolyDataPtr model = mTool->getGraphicsPolyData();
120 
121  if (model)
122  {
123  vtkPolyDataNormalsPtr normals = vtkPolyDataNormalsPtr::New();
124  normals->SetInputData(model);
125  mPolyDataMapper->SetInputConnection(normals->GetOutputPort());
126  mPolyDataMapper->Update();
127  mToolActor->SetMapper(mPolyDataMapper);
128  }
129 
130  //some color to 3D cursor
131  mToolActor->GetProperty()->SetColor(1.0, 1.0, 1.0);
132  if (mTool->hasType(Tool::TOOL_MANUAL))
133  {
134  setColorAndOpacity(mToolActor->GetProperty(), mTooltipPointColor);
135  }
136 
137  this->setModified();
138  mToolActor->SetVisibility(mTool->getVisible());
139 }
140 
142 {
143  if (tool == mTool)
144  return;
145 
146  mTracer->setTool(tool);
147 
148  if (mTool)
149  {
150  disconnect(mTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D, double)), this, SLOT(setModified()));
151  disconnect(mTool.get(), SIGNAL(toolVisible(bool)), this, SLOT(receiveVisible(bool)));
152  disconnect(mTool.get(), SIGNAL(tooltipOffset(double)), this, SLOT(tooltipOffsetSlot(double)));
153  disconnect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(probeSectorChanged()));
154  disconnect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(updateToolActor()));
155  }
156 
157  mTool = tool;
158 
159  if (mTool)
160  {
161  connect(mTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D, double)), this, SLOT(setModified()));
162  connect(mTool.get(), SIGNAL(toolVisible(bool)), this, SLOT(receiveVisible(bool)));
163  connect(mTool.get(), SIGNAL(tooltipOffset(double)), this, SLOT(tooltipOffsetSlot(double)));
164  connect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(probeSectorChanged()));
165  connect(mTool.get(), SIGNAL(toolProbeSector()), this, SLOT(updateToolActor()));
166  }
167 
168  this->updateToolActor();
169  this->setModified();
170  this->probeSectorChanged();
171 }
172 
173 bool ToolRep3D::hasTool(ToolPtr tool) const
174 {
175  return (mTool == tool);
176 }
177 
178 void ToolRep3D::setSphereRadius(double radius)
179 {
180  mSphereRadius = radius;
181  if (mOffsetPoint)
182  mOffsetPoint->setRadius(mSphereRadius);
183  if (mTooltipPoint)
184  mTooltipPoint->setRadius(mSphereRadius);
185 }
186 
188 {
189  mTooltipPointColor = c;
190 }
191 
193 {
194  mOffsetPointColor = c;
195 }
196 
198 {
199  mOffsetLineColor = c;
200 }
201 
203 {
204  mStipplePattern = pattern;
205 }
206 
208 {
209  if (mSphereRadiusInNormalizedViewport == on)
210  return;
211 
212  mSphereRadiusInNormalizedViewport = on;
213 
214  if (on)
215  {
216  mViewportListener.reset(new ViewportListener);
217  mViewportListener->setCallback(boost::bind(&ToolRep3D::scaleSpheres, this));
218  }
219  else
220  {
221  mViewportListener.reset();
222  }
223 }
224 
226 {
227  view->getRenderer()->AddActor(mTracer->getActor());
228 
229  view->getRenderer()->AddActor(mToolActor);
230  view->getRenderer()->AddActor(mProbeSectorActor);
231 
232  mOffsetPoint.reset(new GraphicalPoint3D(view->getRenderer()));
233  mOffsetPoint->setRadius(mSphereRadius);
234  mOffsetPoint->setColor(mOffsetPointColor);
235 
236  mTooltipPoint.reset(new GraphicalPoint3D(view->getRenderer()));
237  mTooltipPoint->setRadius(mSphereRadius);
238  mTooltipPoint->setColor(mTooltipPointColor);
239 
240  mOffsetLine.reset(new GraphicalLine3D(view->getRenderer()));
241  mOffsetLine->setColor(mOffsetLineColor);
242  mOffsetLine->setStipple(mStipplePattern);
243 
244  mTooltipPoint->getActor()->SetVisibility(false);
245  mOffsetPoint->getActor()->SetVisibility(false);
246  mOffsetLine->getActor()->SetVisibility(false);
247 
248  if (mViewportListener)
249  mViewportListener->startListen(view->getRenderer());
250 
251  if (mRTStream)
252  view->getRenderer()->AddActor(mRTStream->getActor());
253 }
254 
256 {
257  view->getRenderer()->RemoveActor(mTracer->getActor());
258  view->getRenderer()->RemoveActor(mToolActor);
259  view->getRenderer()->RemoveActor(mProbeSectorActor);
260  if (mRTStream)
261  view->getRenderer()->RemoveActor(mRTStream->getActor());
262 
263  mTooltipPoint.reset(new GraphicalPoint3D());
264  mOffsetPoint.reset(new GraphicalPoint3D());
265  mOffsetLine.reset(new GraphicalLine3D());
266 
267  if (mViewportListener)
268  mViewportListener->stopListen();
269 }
270 
277 void ToolRep3D::scaleSpheres()
278 {
279  if (!mViewportListener)
280  return;
281  if (!mViewportListener->isListening())
282  return;
283 
284  double size = mViewportListener->getVpnZoom();
285  double sphereSize = mSphereRadius/100/size;
286 
287  if (mOffsetPoint)
288  mOffsetPoint->setRadius(sphereSize);
289  if (mTooltipPoint)
290  mTooltipPoint->setRadius(sphereSize);
291 }
292 
294 {
295  this->update();
296 }
297 
298 
299 void ToolRep3D::update()
300 {
301  Transform3D prMt = Transform3D::Identity();
302  if (mTool)
303  prMt = mTool->get_prMt();
304  Transform3D rMpr = mSpaceProvider->get_rMpr();
305 
306  Transform3D rMt = rMpr * prMt;
307  mToolActor->SetUserMatrix(rMt.getVtkMatrix());
308 
309  if (this->showProbe())
310  {
311  Transform3D tMu = mProbeSector->get_tMu();
312  mProbeSectorActor->SetUserMatrix((rMpr * prMt * tMu).getVtkMatrix());
313  mProbeSectorActor->SetVisibility(mTool->getVisible());
314  }
315  else
316  mProbeSectorActor->SetVisibility(false);
317 
318  this->updateOffsetGraphics();
319 }
320 
321 void ToolRep3D::probeSectorChanged()
322 {
323  if (!mTool)
324  return;
325 
326  Transform3D prMt = mTool->get_prMt();
327  Transform3D rMpr = mSpaceProvider->get_rMpr();
328 
329  if (this->showProbe())
330  {
331  mProbeSector->setData(mTool->getProbe()->getProbeData());
332  Transform3D tMu = mProbeSector->get_tMu();
333 
334  mProbeSectorPolyDataMapper->SetInputData(mProbeSector->getSectorLinesOnly());
335  if (mProbeSectorPolyDataMapper->GetInput())
336  {
337  mProbeSectorActor->SetMapper(mProbeSectorPolyDataMapper);
338  }
339  mProbeSectorActor->SetUserMatrix((rMpr * prMt * tMu).getVtkMatrix());
340  mProbeSectorActor->SetVisibility(mTool->getVisible());
341 
342  if (mRTStream)
343  {
344  mRTStream->setTool(mTool);
345  ProbePtr probe = mTool->getProbe();
346  if (probe)
347  mRTStream->setRealtimeStream(probe->getRTSource());
348  }
349  }
350  else
351  mProbeSectorActor->SetVisibility(false);
352 }
353 
354 void ToolRep3D::updateOffsetGraphics()
355 {
356  bool visible = mTool && mTool->getVisible();
357 
358  if (!mStayVisibleAfterHide || (mOffsetPoint->getActor()->GetVisibility() == false))
359  {
360  mOffsetPoint->getActor()->SetVisibility(visible);
361  mTooltipPoint->getActor()->SetVisibility(visible);
362  //Don't show tooltipPoint when in tool view, as this will obscure the offsetPoint
363  if (mStayHiddenAfterVisible)
364  mTooltipPoint->getActor()->SetVisibility(false);
365  mOffsetLine->getActor()->SetVisibility(visible);
366  }
367 
368  if (similar(0.0, mTool->getTooltipOffset()))
369  {
370  if(mTool->hasType(Tool::TOOL_US_PROBE))
371  mTooltipPoint->getActor()->SetVisibility(false);
372  else
373  mTooltipPoint->getActor()->SetVisibility(visible && mOffsetPointVisibleAtZeroOffset);
374  mOffsetPoint->getActor()->SetVisibility(false);
375  mOffsetLine->getActor()->SetVisibility(false);
376  }
377 
378  if (!mTool)
379  return;
380  Transform3D rMpr = mSpaceProvider->get_rMpr();
381  Transform3D rMt = rMpr * mTool->get_prMt();
382 
383  Vector3D p0 = rMt.coord(Vector3D(0, 0, 0));
384  Vector3D p1 = rMt.coord(Vector3D(0, 0, mTool->getTooltipOffset()));
385  mOffsetPoint->setValue(p1);
386  mOffsetLine->setValue(p0, p1);
387  mTooltipPoint->setValue(Vector3D(p0));
388 
389  this->scaleSpheres();
390 }
391 
392 void ToolRep3D::receiveVisible(bool visible)
393 {
394  if (!visible && mStayVisibleAfterHide)
395  return; // don't hide
396  mToolActor->SetVisibility(visible);
397 
398  if (mStayHiddenAfterVisible)
399  mToolActor->SetVisibility(false);
400  else
401  mToolActor->SetVisibility(mTool->getVisible());
402 
403  this->update();
404 }
405 
407 {
408  mStayHiddenAfterVisible = val;
409  if (mTool)
410  receiveVisible(mTool->getVisible());
411 }
412 
418 {
419  mStayVisibleAfterHide = val;
420 }
421 
423 {
424  mOffsetPointVisibleAtZeroOffset = val;
425 }
426 
427 void ToolRep3D::tooltipOffsetSlot(double val)
428 {
429  updateOffsetGraphics();
430 }
431 
433 {
434  return mTool && (mTool->hasType(Tool::TOOL_US_PROBE)) && (mTool->getProbe()->getProbeData().getType()!=ProbeDefinition::tNONE);
435 }
436 
437 } // namespace cx
boost::shared_ptr< class SpaceProvider > SpaceProviderPtr
virtual ToolPtr getTool()
virtual void onModifiedStartRender()
virtual void removeRepActorsFromViewRenderer(ViewPtr view)
virtual void setTool(ToolPtr tool)
void setTooltipPointColor(QColor c)
virtual bool hasTool(ToolPtr tool) const
virtual QString getType() const
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
void setOffsetPointColor(QColor c)
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:57
boost::shared_ptr< class ToolTracer > ToolTracerPtr
Helper for rendering a point in 3D.
boost::shared_ptr< class View > ViewPtr
vtkSmartPointer< class vtkPolyData > vtkPolyDataPtr
Definition: cxProbeSector.h:47
bool similar(const DoubleBoundingBox3D &a, const DoubleBoundingBox3D &b, double tol)
Listens to changes in viewport and camera matrix.
void setSphereRadius(double radius)
Helper class for displaying a VideoSource.
boost::shared_ptr< Probe > ProbePtr
Definition: cxProbe.h:93
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:91
Default implementation of Rep.
Definition: cxRepImpl.h:63
void setOffsetStipplePattern(int pattern)
void setSphereRadiusInNormalizedViewport(bool on)
void setOffsetPointVisibleAtZeroOffset(bool val)
if true the sphere is visible even when the offset is zero
cxLogicManager_EXPORT SpaceProviderPtr spaceProvider()
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:63
Utility functions for drawing an US Probe sector.
Definition: cxProbeSector.h:59
static ToolRep3DPtr New(SpaceProviderPtr spaceProvider, const QString &uid="")
Definition: cxToolRep3D.cpp:96
ToolTracerPtr getTracer()
Definition: cxToolRep3D.cpp:91
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:93
void setColorAndOpacity(vtkPropertyPtr property, QColor color)
virtual ~ToolRep3D()
Definition: cxToolRep3D.cpp:88
void setModified()
Definition: cxRepImpl.cpp:132
void setOffsetLineColor(QColor c)
boost::shared_ptr< class Tool > ToolPtr