CustusX  16.12
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 #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 
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  mTooltipPointColor = c;
189 }
190 
192 {
193  mOffsetPointColor = c;
194 }
195 
197 {
198  mOffsetLineColor = c;
199 }
200 
202 {
203  mStipplePattern = pattern;
204 }
205 
207 {
208  if (mSphereRadiusInNormalizedViewport == on)
209  return;
210 
211  mSphereRadiusInNormalizedViewport = on;
212 
213  if (on)
214  {
215  mViewportListener.reset(new ViewportListener);
216  mViewportListener->setCallback(boost::bind(&ToolRep3D::scaleSpheres, this));
217  }
218  else
219  {
220  mViewportListener.reset();
221  }
222 }
223 
225 {
226  view->getRenderer()->AddActor(mTracer->getActor());
227 
228  view->getRenderer()->AddActor(mToolActor);
229  view->getRenderer()->AddActor(mProbeSectorActor);
230 
231  mOffsetPoint.reset(new GraphicalPoint3D(view->getRenderer()));
232  mOffsetPoint->setRadius(mSphereRadius);
233  mOffsetPoint->setColor(mOffsetPointColor);
234 
235  mTooltipPoint.reset(new GraphicalPoint3D(view->getRenderer()));
236  mTooltipPoint->setRadius(mSphereRadius);
237  mTooltipPoint->setColor(mTooltipPointColor);
238 
239  mOffsetLine.reset(new GraphicalLine3D(view->getRenderer()));
240  mOffsetLine->setColor(mOffsetLineColor);
241  mOffsetLine->setStipple(mStipplePattern);
242 
243  mTooltipPoint->getActor()->SetVisibility(false);
244  mOffsetPoint->getActor()->SetVisibility(false);
245  mOffsetLine->getActor()->SetVisibility(false);
246 
247  if (mViewportListener)
248  mViewportListener->startListen(view->getRenderer());
249 }
250 
252 {
253  view->getRenderer()->RemoveActor(mTracer->getActor());
254  view->getRenderer()->RemoveActor(mToolActor);
255  view->getRenderer()->RemoveActor(mProbeSectorActor);
256 
257  mTooltipPoint.reset(new GraphicalPoint3D());
258  mOffsetPoint.reset(new GraphicalPoint3D());
259  mOffsetLine.reset(new GraphicalLine3D());
260 
261  if (mViewportListener)
262  mViewportListener->stopListen();
263 }
264 
271 void ToolRep3D::scaleSpheres()
272 {
273  if (!mViewportListener)
274  return;
275  if (!mViewportListener->isListening())
276  return;
277 
278  double size = mViewportListener->getVpnZoom();
279  double sphereSize = mSphereRadius/100/size;
280 
281  if (mOffsetPoint)
282  mOffsetPoint->setRadius(sphereSize);
283  if (mTooltipPoint)
284  mTooltipPoint->setRadius(sphereSize);
285 }
286 
288 {
289  this->update();
290 }
291 
292 
293 void ToolRep3D::update()
294 {
295  Transform3D prMt = Transform3D::Identity();
296  if (mTool)
297  prMt = mTool->get_prMt();
298  Transform3D rMpr = mSpaceProvider->get_rMpr();
299 
300  Transform3D rMt = rMpr * prMt;
301  mToolActor->SetUserMatrix(rMt.getVtkMatrix());
302 
303  if (this->showProbe())
304  {
305  Transform3D tMu = mProbeSector->get_tMu();
306  mProbeSectorActor->SetUserMatrix((rMpr * prMt * tMu).getVtkMatrix());
307  mProbeSectorActor->SetVisibility(mTool->getVisible());
308  }
309  else
310  mProbeSectorActor->SetVisibility(false);
311 
312  this->updateOffsetGraphics();
313 }
314 
315 void ToolRep3D::probeSectorChanged()
316 {
317  if (!mTool)
318  return;
319 
320  Transform3D prMt = mTool->get_prMt();
321  Transform3D rMpr = mSpaceProvider->get_rMpr();
322 
323  if (this->showProbe())
324  {
325  mProbeSector->setData(mTool->getProbe()->getProbeDefinition());
326  Transform3D tMu = mProbeSector->get_tMu();
327 
328  mProbeSectorPolyDataMapper->SetInputData(mProbeSector->getSectorLinesOnly());
329  if (mProbeSectorPolyDataMapper->GetInput())
330  {
331  mProbeSectorActor->SetMapper(mProbeSectorPolyDataMapper);
332  }
333  mProbeSectorActor->SetUserMatrix((rMpr * prMt * tMu).getVtkMatrix());
334  mProbeSectorActor->SetVisibility(mTool->getVisible());
335  }
336  else
337  mProbeSectorActor->SetVisibility(false);
338 }
339 
340 void ToolRep3D::updateOffsetGraphics()
341 {
342  bool visible = mTool && mTool->getVisible();
343 
344  if (!mStayVisibleAfterHide || (mOffsetPoint->getActor()->GetVisibility() == false))
345  {
346  mOffsetPoint->getActor()->SetVisibility(visible);
347  mTooltipPoint->getActor()->SetVisibility(visible);
348  //Don't show tooltipPoint when in tool view, as this will obscure the offsetPoint
349  if (mStayHiddenAfterVisible)
350  mTooltipPoint->getActor()->SetVisibility(false);
351  mOffsetLine->getActor()->SetVisibility(visible);
352  }
353 
354  if (similar(0.0, mTool->getTooltipOffset()))
355  {
356  if(mTool->hasType(Tool::TOOL_US_PROBE))
357  mTooltipPoint->getActor()->SetVisibility(false);
358  else
359  mTooltipPoint->getActor()->SetVisibility(visible && mOffsetPointVisibleAtZeroOffset);
360  mOffsetPoint->getActor()->SetVisibility(false);
361  mOffsetLine->getActor()->SetVisibility(false);
362  }
363 
364  if (!mTool)
365  return;
366  Transform3D rMpr = mSpaceProvider->get_rMpr();
367  Transform3D rMt = rMpr * mTool->get_prMt();
368 
369  Vector3D p0 = rMt.coord(Vector3D(0, 0, 0));
370  Vector3D p1 = rMt.coord(Vector3D(0, 0, mTool->getTooltipOffset()));
371  mOffsetPoint->setValue(p1);
372  mOffsetLine->setValue(p0, p1);
373  mTooltipPoint->setValue(Vector3D(p0));
374 
375  this->scaleSpheres();
376 }
377 
378 void ToolRep3D::receiveVisible(bool visible)
379 {
380  if (!visible && mStayVisibleAfterHide)
381  return; // don't hide
382  mToolActor->SetVisibility(visible);
383 
384  if (mStayHiddenAfterVisible)
385  mToolActor->SetVisibility(false);
386  else
387  mToolActor->SetVisibility(mTool->getVisible());
388 
389  this->update();
390 }
391 
393 {
394  mStayHiddenAfterVisible = val;
395  if (mTool)
396  receiveVisible(mTool->getVisible());
397 }
398 
404 {
405  mStayVisibleAfterHide = val;
406 }
407 
409 {
410  mOffsetPointVisibleAtZeroOffset = val;
411 }
412 
413 void ToolRep3D::tooltipOffsetSlot(double val)
414 {
415  updateOffsetGraphics();
416 }
417 
419 {
420  return mTool && (mTool->hasType(Tool::TOOL_US_PROBE)) && (mTool->getProbe()->getProbeDefinition().getType()!=ProbeDefinition::tNONE);
421 }
422 
423 } // 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: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 setSphereRadius(double radius)
vtkSmartPointer< class vtkPolyData > vtkPolyDataPtr
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
void setOffsetStipplePattern(int pattern)
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
cxLogicManager_EXPORT SpaceProviderPtr spaceProvider()
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
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 setColorAndOpacity(vtkPropertyPtr property, QColor color)
virtual ~ToolRep3D()
Definition: cxToolRep3D.cpp:87
void setModified()
Definition: cxRepImpl.cpp:133
void setOffsetLineColor(QColor c)
boost::shared_ptr< class Tool > ToolPtr