CustusX  15.8
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxTrackingImplService.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 #define _USE_MATH_DEFINES
34 
35 #include "cxTrackingImplService.h"
36 
37 #include <QTimer>
38 #include <QDir>
39 #include <QList>
40 #include <QMetaType>
41 #include <QFileInfo>
42 #include <vtkDoubleArray.h>
43 #include <QCoreApplication>
44 
46 #include "cxLogger.h"
47 #include "cxTypeConversions.h"
48 #include "cxPositionStorageFile.h"
49 #include "cxTime.h"
50 #include "cxEnumConverter.h"
51 #include "cxDummyTool.h"
52 #include "cxToolUsingIGSTK.h"
53 #include "cxIgstkTracker.h"
55 #include "cxManualToolAdapter.h"
56 #include "cxSettings.h"
57 #include "cxIgstkTrackerThread.h"
58 #include "cxPlaybackTool.h"
59 
60 #include "cxPlaybackTime.h"
62 #include "cxXMLNodeWrapper.h"
64 #include "cxUtilHelpers.h"
65 
70 
71 namespace cx
72 {
73 
74 TrackingImplService::TrackingImplService(ctkPluginContext *context) :
75 // mLoggingFolder(""),
76  mLastLoadPositionHistory(0),
77  mContext(context),
78  mToolTipOffset(0)
79 {
80  mSession = SessionStorageServiceProxy::create(mContext);
81  connect(mSession.get(), &SessionStorageService::sessionChanged, this, &TrackingImplService::onSessionChanged);
82  connect(mSession.get(), &SessionStorageService::cleared, this, &TrackingImplService::onSessionCleared);
83  connect(mSession.get(), &SessionStorageService::isLoading, this, &TrackingImplService::onSessionLoad);
84  connect(mSession.get(), &SessionStorageService::isSaving, this, &TrackingImplService::onSessionSave);
85 
86  this->initializeManualTool(); // do this after setting self.
87 
89  this->installTrackingSystem(igstk);
90 
91  connect(settings(), SIGNAL(valueChangedFor(QString)), this, SLOT(globalConfigurationFileChangedSlot(QString)));
92 }
93 
95 {
96  while (!mTrackingSystems.empty())
97  this->unInstallTrackingSystem(mTrackingSystems.back());
98 }
99 
100 
102 {
103  return false;
104 }
105 
106 void TrackingImplService::onSystemStateChanged()
107 {
108  this->rebuildCachedTools();
109  emit stateChanged();
110 }
111 
119 {
120  if (mPlaybackSystem)
121  {
122  mPlaybackSystem->setState(Tool::tsNONE);
123  this->unInstallTrackingSystem(mPlaybackSystem);
124  this->installTrackingSystem(mPlaybackSystem->getBase());
125  mPlaybackSystem.reset();
126  }
127 
128  if (controller)
129  {
130  mPlaybackSystem.reset(new TrackingSystemPlaybackService(controller, mTrackingSystems.back(), mManualTool));
131  this->unInstallTrackingSystem(mPlaybackSystem->getBase());
132  this->installTrackingSystem(mPlaybackSystem);
133  mPlaybackSystem->setState(Tool::tsTRACKING);
134  }
135 }
136 
138 {
139  return mPlaybackSystem && (mPlaybackSystem->getState()>=Tool::tsCONFIGURED);
140 }
141 
143 {
144  TrackingSystemServicePtr dummySystem;
145  dummySystem.reset(new TrackingSystemDummyService(tool));
146  this->installTrackingSystem(dummySystem);
147 
148  dummySystem->setState(Tool::tsTRACKING);
149  this->setActiveTool(tool->getUid());
150 }
151 
153 {
154  mTrackingSystems.push_back(system);
155  connect(system.get(), &TrackingSystemService::stateChanged, this, &TrackingImplService::onSystemStateChanged);
156  connect(system.get(), &TrackingSystemService::newProbe, this, &TrackingImplService::newProbe);
157  this->onSystemStateChanged();
158 }
159 
161 {
162  disconnect(system.get(), &TrackingSystemService::stateChanged, this, &TrackingImplService::onSystemStateChanged);
163 
164  for (unsigned i=0; i<mTrackingSystems.size(); ++i)
165  {
166  if (mTrackingSystems[i]!=system)
167  continue;
168  mTrackingSystems.erase(mTrackingSystems.begin()+i);
169  break;
170  }
171 
172  this->onSystemStateChanged();
173 }
174 
175 std::vector<TrackingSystemServicePtr> TrackingImplService::getTrackingSystems()
176 {
177  return mTrackingSystems;
178 }
179 
180 void TrackingImplService::initializeManualTool()
181 {
182  if (!mManualTool)
183  {
184  //adding a manual tool as default
185  mManualTool.reset(new ManualToolAdapter("ManualTool"));
186  mTools["ManualTool"] = mManualTool;
187  mManualTool->setVisible(true);
188  connect(mManualTool.get(), &Tool::toolVisible, this, &TrackingImplService::activeCheckSlot);
189  connect(mManualTool.get(), &Tool::toolTransformAndTimestamp, this, &TrackingImplService::activeCheckSlot);
190  connect(mManualTool.get(), &Tool::tooltipOffset, this, &TrackingImplService::onTooltipOffset);
191  }
192 
193  Transform3D rMpr = Transform3D::Identity(); // not known: not really important either
195  mManualTool->set_prMt(prMt);
196  this->activeCheckSlot();
197 }
198 
200 {
201  Tool::State state = Tool::tsNONE;
202  for (unsigned i=0; i<mTrackingSystems.size(); ++i)
203  state = std::max(state, mTrackingSystems[i]->getState());
204  return state;
205 }
206 
208 {
209  for (unsigned i=0; i<mTrackingSystems.size(); ++i)
210  mTrackingSystems[i]->setState(val);
211 }
212 
213 void TrackingImplService::rebuildCachedTools()
214 {
215  mTools.clear();
216  for (unsigned i=0; i<mTrackingSystems.size(); ++i)
217  {
218  this->addToolsFrom(mTrackingSystems[i]);
219  }
220 
221  mTools[mManualTool->getUid()] = mManualTool;
222  this->imbueManualToolWithRealProperties();
223  this->setActiveTool(this->getManualTool()->getUid());
224  this->loadPositionHistory(); // the tools are always reconfigured after a setloggingfolder
225 
226 // reportSuccess("ToolManager is set to state ...");
227 }
228 
229 void TrackingImplService::imbueManualToolWithRealProperties()
230 {
231  // debug: give the manual tool properties from the first non-manual tool. Nice for testing tools
232  if (!settings()->value("giveManualToolPhysicalProperties").toBool())
233  return;
234 
235  for (ToolMap::iterator iter = mTools.begin(); iter != mTools.end(); ++iter)
236  {
237  if (iter->second == mManualTool)
238  continue;
239  if (iter->second->hasType(Tool::TOOL_REFERENCE))
240  continue;
241  mManualTool->setBase(iter->second);
242 
243  if(iter->second->hasType(Tool::TOOL_US_PROBE))
244  emit newProbe(mManualTool);
245 
246  report("Manual tool imbued with properties from " + iter->first);
247  break;
248  }
249 }
250 
251 void TrackingImplService::addToolsFrom(TrackingSystemServicePtr system)
252 {
253  std::vector<ToolPtr> tools = system->getTools();
254  for (unsigned i=0; i<tools.size(); ++i)
255  {
256  ToolPtr tool = tools[i];
257  mTools[tool->getUid()] = tool;
258  connect(tool.get(), SIGNAL(toolVisible(bool)), this, SLOT(activeCheckSlot()));
259  connect(tool.get(), &Tool::toolTransformAndTimestamp, this, &TrackingImplService::activeCheckSlot);
260  connect(tool.get(), &Tool::tooltipOffset, this, &TrackingImplService::onTooltipOffset);
261 
262  if (tool->hasType(Tool::TOOL_REFERENCE))
263  mReferenceTool = tool;
264  }
265 }
266 
267 void TrackingImplService::onTooltipOffset(double val)
268 {
269  mToolTipOffset = val;
270  for (ToolMap::iterator iter = mTools.begin(); iter != mTools.end(); ++iter)
271  {
272  iter->second->setTooltipOffset(val);
273  }
274 }
275 
277 {
278  SessionToolHistoryMap retval;
279 
280  ToolMap tools = this->getTools();
281  ToolMap::iterator it = tools.begin();
282  for (; it != tools.end(); ++it)
283  {
284  TimedTransformMap toolMap = it->second->getSessionHistory(startTime, stopTime);
285  if (toolMap.empty())
286  continue;
287  retval[it->second] = toolMap;
288  }
289  return retval;
290 }
291 
293 {
294  return mTools;
295 }
296 
298 {
299  if (uid == "active")
300  return this->getActiveTool();
301 
302  ToolPtr retval;
303  ToolMap::iterator it = mTools.find(uid);
304  if (it != mTools.end())
305  retval = it->second;
306 
307  return retval;
308 }
309 
311 {
312  return mActiveTool;
313 }
314 
315 void TrackingImplService::setActiveTool(const QString& uid)
316 {
317  if (mActiveTool && mActiveTool->getUid() == uid)
318  return;
319 
320  ToolPtr newTool;
321  newTool = this->getTool(uid);
322 
323  ToolPtr oldTool = mActiveTool;
324  mActiveTool = newTool; // set active before calling setters, which possibly can emit signal and cause cycles.
325 
326  // special case for manual tool
327  if (newTool && newTool->hasType(Tool::TOOL_MANUAL) && mManualTool)
328  {
329  if (oldTool && (oldTool!=mManualTool))
330  mManualTool->set_prMt(oldTool->get_prMt(), oldTool->getTimestamp() -1);
331  mManualTool->setVisible(true);
332  }
333  else
334  {
335  mManualTool->setVisible(false);
336  }
337 
338  emit activeToolChanged(uid);
339 }
340 
342 {
343  return mReferenceTool;
344 }
345 
346 void TrackingImplService::savePositionHistory()
347 {
348  QString filename = this->getLoggingFolder() + "/toolpositions.snwpos";
349 
350  PositionStorageWriter writer(filename);
351 
352  ToolMap::iterator it = mTools.begin();
353  for (; it != mTools.end(); ++it)
354  {
355  ToolPtr current = it->second;
356  TimedTransformMapPtr data = current->getPositionHistory();
357 
358  if (!data)
359  continue;
360 
361  // save only data acquired after mLastLoadPositionHistory:
362  TimedTransformMap::iterator iter = data->lower_bound(mLastLoadPositionHistory);
363  for (; iter != data->end(); ++iter)
364  writer.write(iter->second, (iter->first), current->getUid());
365  }
366 
367  mLastLoadPositionHistory = getMilliSecondsSinceEpoch();
368 }
369 
370 void TrackingImplService::loadPositionHistory()
371 {
372  if (this->getState()==Tool::tsNONE)
373  return;
374  // save all position data acquired so far, in case of multiple calls.
375  this->savePositionHistory();
376 
377  QString filename = this->getLoggingFolder()+ "/toolpositions.snwpos";
378 
379  PositionStorageReader reader(filename);
380 
381  Transform3D matrix = Transform3D::Identity();
382  double timestamp;
383  QString toolUid;
384 
385  QStringList missingTools;
386 
387  while (!reader.atEnd())
388  {
389  if (!reader.read(&matrix, &timestamp, &toolUid))
390  break;
391 
392  ToolPtr current = this->getTool(toolUid);
393  if (current)
394  {
395  (*current->getPositionHistory())[timestamp] = matrix;
396  }
397  else
398  {
399  missingTools << toolUid;
400  }
401  }
402 
403  missingTools.removeDuplicates();
404  missingTools.removeAll("");
405 
406  if (!missingTools.empty())
407  {
408  reportWarning(QString("Loaded position history, but some of the tools "
409  "are not present in the configuration:"
410  "\n \t%1").arg(missingTools.join("\n \t")));
411  }
412 
413  mLastLoadPositionHistory = getMilliSecondsSinceEpoch();
414 }
415 
416 //void TrackingImplService::setLoggingFolder(QString loggingFolder)
417 //{
418 // if (mLoggingFolder == loggingFolder)
419 // return;
420 
421 // for (unsigned i=0; i<mTrackingSystems.size(); ++i)
422 // mTrackingSystems[i]->setLoggingFolder(loggingFolder);
423 // mLoggingFolder = loggingFolder;
424 //}
425 
426 void TrackingImplService::globalConfigurationFileChangedSlot(QString key)
427 {
428  if (key.contains("TrackingPositionFilter"))
429  {
430  this->resetTrackingPositionFilters();
431  }
432 }
433 
434 void TrackingImplService::resetTrackingPositionFilters()
435 {
436  bool enabled = settings()->value("TrackingPositionFilter/enabled", false).toInt();
437 
438  for (ToolMap::iterator iter=mTools.begin(); iter!=mTools.end(); ++iter)
439  {
441  if (enabled)
442  filter.reset(new TrackingPositionFilter());
443  iter->second->resetTrackingPositionFilter(filter);
444  }
445 }
446 
447 void TrackingImplService::activeCheckSlot()
448 {
449  if (this->manualToolHasMostRecentTimestamp() && mManualTool->getVisible())
450  {
451  this->setActiveTool(this->getManualTool()->getUid());
452  return;
453  }
454 
455  bool use = settings()->value("Automation/autoSelectActiveTool").toBool();
456  if (!use)
457  return;
458 
459  //make a sorted vector of all visible tools
460  std::vector<ToolPtr> tools = this->getVisibleTools();
461  tools.push_back(mManualTool);
462 
463  if (!tools.empty())
464  {
465  //sort most important tool to the start of the vector:
466  sort(tools.begin(), tools.end(), toolTypeSort);
467  const QString uid = tools[0]->getUid();
468  this->setActiveTool(uid);
469  }
470 }
471 
472 bool TrackingImplService::manualToolHasMostRecentTimestamp()
473 {
474  // original comment (was wrapped in an ifplayblack):
475  // In static playback mode, tools does not turn invisible since
476  // time dont move. Here we check whether manual tool has a newer
477  // timestamp than the playback tools. If it has, make it active.
478  // This enables automatic change to manual tool if the user
479  // manipulates the manual tool in some way.
480 
481  double mts = this->getManualTool()->getTimestamp();
482 // std::cout << " manual tooltime " << mts << std::endl;
483 
484  double bestTime = 0;
485  for (ToolMap::iterator it = mTools.begin(); it != mTools.end(); ++it)
486  {
487 // std::cout << " tool " << it->first << " -- "<< it->second->getTimestamp() << std::endl;
488  if (it->second->hasType(Tool::TOOL_MANUAL))
489  continue;
490 // std::cout << " tool " << it->first << " : "<< it->second->getTimestamp() - mts << std::endl;
491  bestTime = std::max(bestTime, it->second->getTimestamp());
492  }
493  double ahead = mts -bestTime;
494 // std::cout << " mts -bestTime " << " : "<< (mts -bestTime) << std::endl;
495 // std::cout << " mts > bestTime " << " : "<< bool(mts > bestTime) << std::endl;
496 
497  return (mts > bestTime);
498 }
499 
500 std::vector<ToolPtr> TrackingImplService::getVisibleTools()
501 {
502  std::vector<ToolPtr> retval;
503  for (ToolMap::iterator it = mTools.begin(); it != mTools.end(); ++it)
504  if (it->second->getVisible())
505  retval.push_back(it->second);
506  return retval;
507 }
508 
509 
510 
511 namespace
512 {
516 int getPriority(ToolPtr tool)
517 {
518  if (tool->hasType(Tool::TOOL_MANUAL)) // place this first, in case a tool has several attributes.
519  return 2;
520 
521  if (tool->hasType(Tool::TOOL_US_PROBE))
522  return 4;
523  if (tool->hasType(Tool::TOOL_POINTER))
524  return 3;
525  if (tool->hasType(Tool::TOOL_REFERENCE))
526  return 1;
527  return 0;
528 }
529 }
530 
537 bool toolTypeSort(const ToolPtr tool1, const ToolPtr tool2)
538 {
539  return getPriority(tool2) < getPriority(tool1);
540 }
541 
542 QString TrackingImplService::getLoggingFolder()
543 {
544  return mSession->getSubFolder("Logs/");
545 }
546 
547 void TrackingImplService::onSessionChanged()
548 {
549  QString loggingFolder = this->getLoggingFolder();
550 
551  for (unsigned i=0; i<mTrackingSystems.size(); ++i)
552  mTrackingSystems[i]->setLoggingFolder(loggingFolder);
553 }
554 
555 void TrackingImplService::onSessionCleared()
556 {
557  mManualTool->set_prMt(Transform3D::Identity());
558 }
559 
560 void TrackingImplService::onSessionLoad(QDomElement& node)
561 {
562  XMLNodeParser root(node);
563  QDomElement toolManagerNode = root.descend("managers/toolManager").node().toElement();
564  if (!toolManagerNode.isNull())
565  this->parseXml(toolManagerNode);
566 
567 }
568 
569 void TrackingImplService::onSessionSave(QDomElement& node)
570 {
571  XMLNodeAdder root(node);
572  QDomElement managerNode = root.descend("managers").node().toElement();
573  this->addXml(managerNode);
574 
575  this->savePositionHistory();
576 }
577 
578 void TrackingImplService::addXml(QDomNode& parentNode)
579 {
580  XMLNodeAdder parent(parentNode);
581  XMLNodeAdder base(parent.addElement("toolManager"));
582 
583  base.addTextToElement("toolTipOffset", qstring_cast(mToolTipOffset));
584  base.addTextToElement("manualTool", "\n" + qstring_cast(mManualTool->get_prMt()));
585 
586  //Tools
587  XMLNodeAdder toolsNode(base.addElement("tools"));
588  ToolMap tools = this->getTools();
589  ToolMap::iterator toolIt = tools.begin();
590  for (; toolIt != tools.end(); ++toolIt)
591  {
592  cxToolPtr tool = boost::dynamic_pointer_cast<ToolUsingIGSTK>(toolIt->second);
593  if (tool)
594  {
595  toolsNode.addObjectToElement("tool", tool);
596  }
597  }
598 
599 }
600 
601 void TrackingImplService::parseXml(QDomNode& dataNode)
602 {
603  if (dataNode.isNull())
604  return;
605 
606  XMLNodeParser base(dataNode);
607 
608  QString manualToolText = dataNode.namedItem("manualTool").toElement().text();
609  mManualTool->set_prMt(Transform3D::fromString(manualToolText));
610 
611  mToolTipOffset = base.parseDoubleFromElementWithDefault("toolTipOffset", 0.0);
612  this->onTooltipOffset(mToolTipOffset);
613 
614  //Tools
615  ToolMap tools = this->getTools();
616  XMLNodeParser toolssNode(dataNode.namedItem("tools"));
617  std::vector<QDomElement> toolNodes = toolssNode.getDuplicateElements("tool");
618 
619  for (unsigned i=0; i<toolNodes.size(); ++i)
620  {
621  QDomElement toolNode = toolNodes[i];
622  QString tool_uid = toolNode.attribute("uid");
623  if (tools.find(tool_uid) != tools.end())
624  {
625  cxToolPtr tool = boost::dynamic_pointer_cast<ToolUsingIGSTK>(tools.find(tool_uid)->second);
626  tool->parseXml(toolNode);
627  }
628  }
629 }
630 
632 {
633  return mManualTool;
634 }
635 
645 {
646  ToolPtr active = this->getActiveTool();
647 
648  // Turned off the check for valid probe fix #1038: No probe sector in 3D scene if no xml emtry for probe.
649  // This will work for digital interfaces where the probe sector definition comes from the interface, and not from the xml file.
650 // if (active && active->getProbe() && active->getProbe()->isValid())
651  if (active && active->getProbe())
652  return active;
653 
654  ToolMap tools = this->getTools();
655 
656  // look for visible probes
657  for (ToolMap::iterator iter = tools.begin(); iter != tools.end(); ++iter)
658  if (iter->second->getProbe() && iter->second->getProbe()->isValid() && iter->second->getVisible())
659  return iter->second;
660 
661  // pick the first probe, visible or not.
662  for (ToolMap::iterator iter = tools.begin(); iter != tools.end(); ++iter)
663  if (iter->second->getProbe() && iter->second->getProbe()->isValid())
664  return iter->second;
665 
666  return ToolPtr();
667 }
668 
669 
671 {
672  for (unsigned i=0; i<mTrackingSystems.size(); ++i)
673  {
674  TrackerConfigurationPtr config = mTrackingSystems[i]->getConfiguration();
675  if (config)
676  return config;
677  }
678  return TrackerConfigurationPtr();
679 }
680 
681 
682 } //namespace cx
int getPriority(DataPtr data)
void newProbe(const ToolPtr probe)
QString qstring_cast(const T &val)
Transform3D createTransformRotateY(const double angle)
virtual void runDummyTool(DummyToolPtr tool)
void isLoading(QDomElement &root)
emitted while loading a session. Xml storage is available, getRootFolder() is set to loaded value...
virtual ToolPtr getFirstProbe()
Find a probe that can be connected to a rt source.
std::map< ToolPtr, TimedTransformMap > SessionToolHistoryMap
virtual ToolPtr getTool(const QString &uid)
get a specific tool
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
double getMilliSecondsSinceEpoch()
Definition: cxTime.cpp:65
static SessionStorageServicePtr create(ctkPluginContext *pluginContext)
void toolTransformAndTimestamp(Transform3D matrix, double timestamp)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Definition: cxSettings.cpp:87
virtual Tool::State getState() const
virtual void setState(const Tool::State val)
virtual void setPlaybackMode(PlaybackTimePtr controller)
configured with basic info
Definition: cxTool.h:81
void sessionChanged()
emitted after change to a new session (new or loaded or cleared)
Reference tool.
Definition: cxTool.h:90
virtual void setActiveTool(const QString &uid)
can be set to either a connected or configured tool
boost::shared_ptr< class DummyTool > DummyToolPtr
boost::shared_ptr< class TrackerConfiguration > TrackerConfigurationPtr
void activeToolChanged(const QString &uId)
void toolVisible(bool visible)
void reportWarning(QString msg)
Definition: cxLogger.cpp:91
void tooltipOffset(double offset)
boost::shared_ptr< TimedTransformMap > TimedTransformMapPtr
Definition: cxTool.h:54
virtual ToolMap getTools()
get all configured and initialized tools
virtual TrackerConfigurationPtr getConfiguration()
virtual ToolPtr getManualTool()
a mouse-controllable virtual tool that is available even when not tracking.
virtual void unInstallTrackingSystem(TrackingSystemServicePtr system)
Representation of a mouse/keyboard-controlled virtual tool.
Definition: cxTool.h:91
not available
Definition: cxTool.h:80
Settings * settings()
Shortcut for accessing the settings instance.
Definition: cxSettings.cpp:42
Writer class for the position file.
void cleared()
emitted when session is cleared, before isLoading is called
std::map< QString, ToolPtr > ToolMap
virtual std::vector< TrackingSystemServicePtr > getTrackingSystems()
virtual ToolPtr getReferenceTool() const
get the tool that is used as a reference, if any
bool toolTypeSort(const ToolPtr tool1, const ToolPtr tool2)
function for sorting tools by type
Interface towards a dummy tracking system.
void report(QString msg)
Definition: cxLogger.cpp:90
TrackingImplService(ctkPluginContext *context)
Adapter class for ManualTool.A ManualToolAdapter inherits from manual tool, but also contains a cx::T...
virtual ToolPtr getActiveTool()
get the tool that has higest priority when tracking
Transform3D createTransformRotateZ(const double angle)
void newProbe(const ToolPtr probe)
virtual bool isPlaybackMode() const
emitting tracking data
Definition: cxTool.h:83
Interface towards a playback tracking system.Wraps another tracking system, enabling playback of the ...
boost::shared_ptr< class TrackingPositionFilter > TrackingPositionFilterPtr
Definition: cxTool.h:55
virtual SessionToolHistoryMap getSessionHistory(double startTime, double stopTime)
boost::shared_ptr< ToolUsingIGSTK > cxToolPtr
Ultrasond probe. The tool has a Probe subinterface with a sector and a video stream.
Definition: cxTool.h:93
boost::shared_ptr< class PlaybackTime > PlaybackTimePtr
virtual void installTrackingSystem(TrackingSystemServicePtr system)
void isSaving(QDomElement &root)
xml storage is available
Navigation pointer. Pointing functionality such as tool offset.
Definition: cxTool.h:92
#define M_PI
std::map< double, Transform3D > TimedTransformMap
Interface towards one tracking system.
boost::shared_ptr< class Tool > ToolPtr
boost::shared_ptr< class TrackingSystemService > TrackingSystemServicePtr