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