NorMIT-nav  2023.01.05-dev+develop.0da12
An IGT application
cxToolTracer.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) SINTEF Department of Medical Technology.
5 All rights reserved.
6 
7 CustusX is released under a BSD 3-Clause license.
8 
9 See Lisence.txt (https://github.com/SINTEFMedtek/CustusX/blob/master/License.txt) for details.
10 =========================================================================*/
11 
12 
13 #include "cxToolTracer.h"
14 
15 #include "vtkImageData.h"
16 #include <vtkPointData.h>
17 #include <vtkUnsignedCharArray.h>
18 #include <vtkPolyData.h>
19 #include <vtkPolyDataMapper.h>
20 #include <vtkActor.h>
21 #include <vtkCellArray.h>
22 #include <vtkFloatArray.h>
23 #include <vtkProperty.h>
24 #include <QColor>
25 #include <vtkMatrix4x4.h>
26 
27 #include "cxTool.h"
28 #include "cxBoundingBox3D.h"
29 #include "cxVolumeHelpers.h"
30 #include "cxSpaceProvider.h"
31 #include "cxSpaceListener.h"
32 #include "cxLogger.h"
33 
34 namespace cx
35 {
36 
38 {
39  ToolTracerPtr retval(new ToolTracer(spaceProvider));
40  return retval;
41 }
42 
43 ToolTracer::ToolTracer(SpaceProviderPtr spaceProvider)
44 {
45  mSpaceProvider = spaceProvider;
46  mRunning = false;
47  mPolyData = vtkPolyDataPtr::New();
48  mActor = vtkActorPtr::New();
49  mPolyDataMapper = vtkPolyDataMapperPtr::New();
50 
51  mPolyDataMapper->SetInputData(mPolyData);
52  mActor->SetMapper(mPolyDataMapper);
53 
54  mProperty = vtkPropertyPtr::New();
55  mActor->SetProperty( mProperty );
56  mProperty->SetPointSize(4);
57 
58  this->setColor(QColor("red"));
59 
60  mPoints = vtkPointsPtr::New();
61  mLines = vtkCellArrayPtr::New();
62 
63  mPolyData->SetPoints(mPoints);
64  mPolyData->SetLines(mLines);
65  mPolyData->SetVerts(mLines);
66  mFirstPoint = false;
67  mMinDistance = -1.0;
68  mSkippedPoints = 0;
69 
70  mSpaceListener = mSpaceProvider->createListener();
71  mSpaceListener->setSpace(CoordinateSystem::patientReference());
72  connect(mSpaceListener.get(), &SpaceListener::changed, this, &ToolTracer::onSpaceChanged);
73  this->onSpaceChanged();
74 }
75 
77 {
78  if (mRunning)
79  return;
80  mRunning = true;
81  mFirstPoint = true;
82  mSkippedPoints = 0;
83  this->connectTool();
84 }
85 
87 {
88  if (!mRunning)
89  return;
90  this->disconnectTool();
91  mRunning = false;
92 }
93 
95 {
96  mPoints->Reset();
97  mLines->Reset();
98  mPolyData->Modified();
99 }
100 
101 void ToolTracer::connectTool()
102 {
103  if (mTool && mRunning)
104  {
105  connect(mTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D, double)), this, SLOT(receiveTransforms(Transform3D, double)));
106  //connect(mTool.get(), SIGNAL(toolVisible(bool)), this, SLOT(receiveVisible(bool)));
107  }
108 }
109 
110 void ToolTracer::disconnectTool()
111 {
112  if (mTool && mRunning)
113  {
114  disconnect(mTool.get(), SIGNAL(toolTransformAndTimestamp(Transform3D, double)), this, SLOT(receiveTransforms(Transform3D, double)));
115  //disconnect(mTool.get(), SIGNAL(toolVisible(bool)), this, SLOT(receiveVisible(bool)));
116  }
117 }
118 
119 void ToolTracer::setColor(QColor color)
120 {
121  mActor->GetProperty()->SetColor(color.redF(), color.greenF(), color.blueF());
122 }
123 
125 {
126  this->disconnectTool();
127  mTool = tool;
128  this->connectTool();
129 }
130 
132 {
133  return mPolyData;
134 }
135 
137 {
138  return mActor;
139 }
140 
141 void ToolTracer::onSpaceChanged()
142 {
143  Transform3D rMpr = mSpaceProvider->get_rMpr();
144 // std::cout << "rMpr ToolTracer: \n" << rMpr << std::endl;
145  mActor->SetUserMatrix(rMpr.getVtkMatrix());
146 }
147 
149 {
150  return mRunning;
151 }
152 
153 void ToolTracer::receiveTransforms(Transform3D prMt, double timestamp)
154 {
155  Vector3D p = prMt.coord(Vector3D(0,0,0));
156 
157  if (mMinDistance > 0.0)
158  {
159  if (!mFirstPoint && (mPreviousPoint - p).length() < mMinDistance)
160  {
161  ++mSkippedPoints;
162  return;
163  }
164  }
165  mFirstPoint = false;
166  mPreviousPoint = p;
167  mPoints->InsertNextPoint(p.begin());
168 
169  if (mPoints->GetNumberOfPoints() > 1)
170  {
171  // fill cell points for the entire polydata.
172  // This is very ineffective, but I have no idea how to update mLines incrementally.
173  mLines->Initialize();
174  std::vector<vtkIdType> ids(mPoints->GetNumberOfPoints());
175  for (unsigned i=0; i<ids.size(); ++i)
176  ids[i] = i;
177  mLines->InsertNextCell(ids.size(), &(*ids.begin()));
178  mLines->Modified();
179 
180  mPolyData->Modified();
181  }
182 }
183 
184 void ToolTracer::addManyPositions(TimedTransformMap trackerRecordedData_prMt)
185 {
186  for(TimedTransformMap::iterator iter=trackerRecordedData_prMt.begin(); iter!=trackerRecordedData_prMt.end(); ++iter)
187  {
188  double timestamp = iter->first;
189  Transform3D prMt = iter->second;
190  this->receiveTransforms(prMt, timestamp);
191  }
192 }
193 
194 
195 }
cxVolumeHelpers.h
cxLogger.h
cx::ToolTracer::create
static ToolTracerPtr create(SpaceProviderPtr spaceProvider)
Definition: cxToolTracer.cpp:37
cxSpaceListener.h
cx
Namespace for all CustusX production code.
Definition: cx_dev_group_definitions.h:13
cx::ToolTracer::addManyPositions
void addManyPositions(TimedTransformMap trackerRecordedData_prMt)
Definition: cxToolTracer.cpp:184
cxToolTracer.h
cx::SpaceListener::changed
void changed()
cx::ToolTracer::setTool
void setTool(ToolPtr tool)
Definition: cxToolTracer.cpp:124
cxBoundingBox3D.h
cx::ToolTracer::getPolyData
vtkPolyDataPtr getPolyData()
Definition: cxToolTracer.cpp:131
length
RealScalar length() const
Definition: cxMatrixBaseEigenAddons.h:35
cx::ToolTracer
3D Graphics class for displaying the trace path traversed by a tool.
Definition: cxToolTracer.h:47
cx::Transform3D
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
Definition: cxLandmarkPatientRegistrationWidget.h:33
cx::ToolTracer::getActor
vtkActorPtr getActor()
Definition: cxToolTracer.cpp:136
cx::CoordinateSystem::patientReference
static CoordinateSystem patientReference()
Definition: cxCoordinateSystemHelpers.h:39
cx::TimedTransformMap
std::map< double, Transform3D > TimedTransformMap
Definition: cxRecordSession.h:36
cxTool.h
cx::vtkPolyDataPtr
vtkSmartPointer< vtkPolyData > vtkPolyDataPtr
Definition: cxCenterlineRegistration.h:42
vtkActorPtr
vtkSmartPointer< class vtkActor > vtkActorPtr
Definition: vtkForwardDeclarations.h:31
cx::ToolPtr
boost::shared_ptr< class Tool > ToolPtr
Definition: cxVideoConnectionWidget.h:43
cx::ToolTracer::isRunning
bool isRunning() const
Definition: cxToolTracer.cpp:148
cx::ToolTracerPtr
boost::shared_ptr< class ToolTracer > ToolTracerPtr
Definition: cxForwardDeclarations.h:106
cx::ToolTracer::clear
void clear()
Definition: cxToolTracer.cpp:94
cx::Vector3D
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:42
cx::ToolTracer::start
void start()
Definition: cxToolTracer.cpp:76
cx::SpaceProviderPtr
boost::shared_ptr< class SpaceProvider > SpaceProviderPtr
Definition: cxLogicManager.h:23
cx::ToolTracer::stop
void stop()
Definition: cxToolTracer.cpp:86
cxSpaceProvider.h
cx::ToolTracer::setColor
void setColor(QColor color)
Definition: cxToolTracer.cpp:119