12 #define _USE_MATH_DEFINES 16 #include "boost/bind.hpp" 23 #include <vtkDoubleArray.h> 24 #include <QCoreApplication> 54 mLastLoadPositionHistory(0),
64 this->initializeManualTool();
66 connect(
settings(), SIGNAL(valueChangedFor(QString)),
this, SLOT(globalConfigurationFileChangedSlot(QString)));
68 this->listenForTrackingSystemServices(context);
73 while (!mTrackingSystems.empty())
83 void TrackingImplService::onSystemStateChanged()
85 this->rebuildCachedTools();
102 std::vector<TrackingSystemServicePtr> old = mPlaybackSystem->getBase();
103 for (
unsigned i=0; i<old.size(); ++i)
105 mPlaybackSystem.reset();
112 std::vector<TrackingSystemServicePtr> old = mPlaybackSystem->getBase();
113 for (
unsigned i=0; i<old.size(); ++i)
137 mTrackingSystems.push_back(system);
138 report(
"Installing tracking system: " + system->getUid());
140 this->onSystemStateChanged();
145 report(
"Uninstalling tracking system: " + system->getUid());
148 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
150 if (mTrackingSystems[i]!=system)
152 mTrackingSystems.erase(mTrackingSystems.begin()+i);
156 this->onSystemStateChanged();
161 return mTrackingSystems;
164 void TrackingImplService::initializeManualTool()
170 mTools[
"ManualTool"] = mManualTool;
171 mManualTool->setVisible(
true);
172 connect(mManualTool.get(), &
Tool::toolVisible,
this, &TrackingImplService::activeCheckSlot);
174 connect(mManualTool.get(), &
Tool::tooltipOffset,
this, &TrackingImplService::onTooltipOffset);
179 mManualTool->set_prMt(prMt);
180 this->activeCheckSlot();
186 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
187 state = std::max(state, mTrackingSystems[i]->
getState());
193 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
197 void TrackingImplService::listenForTrackingSystemServices(ctkPluginContext *context)
201 boost::bind(&TrackingImplService::onTrackingSystemAdded,
this, _1),
202 boost::bind(&TrackingImplService::onTrackingSystemModified,
this, _1),
203 boost::bind(&TrackingImplService::onTrackingSystemRemoved,
this, _1)
205 mServiceListener->open();
223 void TrackingImplService::rebuildCachedTools()
226 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
228 this->addToolsFrom(mTrackingSystems[i]);
230 mTools[mManualTool->getUid()] = mManualTool;
231 this->imbueManualToolWithRealProperties();
232 this->loadPositionHistory();
233 this->resetTrackingPositionFilters();
234 this->onTooltipOffset(mToolTipOffset);
238 void TrackingImplService::imbueManualToolWithRealProperties()
241 if (!
settings()->value(
"giveManualToolPhysicalProperties").toBool())
244 for (ToolMap::iterator iter = mTools.begin(); iter != mTools.end(); ++iter)
246 if (iter->second == mManualTool)
250 mManualTool->setBase(iter->second);
251 mManualTool->startEmittingContinuousPositions(100);
253 report(
"Manual tool imbued with properties from " + iter->first);
260 std::vector<ToolPtr> tools = system->getTools();
261 for (
unsigned i=0; i<tools.size(); ++i)
264 mTools[tool->getUid()] = tool;
265 connect(tool.get(), SIGNAL(toolVisible(
bool)),
this, SLOT(activeCheckSlot()));
270 mReferenceTool = tool;
274 void TrackingImplService::onTooltipOffset(
double val)
276 mToolTipOffset = val;
277 for (ToolMap::iterator iter = mTools.begin(); iter != mTools.end(); ++iter)
279 iter->second->setTooltipOffset(val);
288 ToolMap::iterator it = tools.begin();
289 for (; it != tools.end(); ++it)
294 retval[it->second] = toolMap;
310 ToolMap::iterator it = mTools.find(uid);
311 if (it != mTools.end())
324 if (mActiveTool && mActiveTool->getUid() == uid)
331 mActiveTool = newTool;
336 if (oldTool && (oldTool!=mManualTool))
337 mManualTool->set_prMt(oldTool->get_prMt(), oldTool->getTimestamp() -1);
338 mManualTool->setVisible(
true);
342 mManualTool->setVisible(
false);
350 return mReferenceTool;
353 void TrackingImplService::savePositionHistory()
355 QString filename = this->getLoggingFolder() +
"/toolpositions.snwpos";
359 ToolMap::iterator it = mTools.begin();
360 for (; it != mTools.end(); ++it)
369 TimedTransformMap::iterator iter = data->lower_bound(mLastLoadPositionHistory);
370 for (; iter != data->end(); ++iter)
371 writer.
write(iter->second, (iter->first), current->getUid());
377 void TrackingImplService::loadPositionHistory()
382 this->savePositionHistory();
384 QString filename = this->getLoggingFolder()+
"/toolpositions.snwpos";
392 QStringList missingTools;
394 while (!reader.
atEnd())
396 if (!reader.
read(&matrix, ×tamp, &toolUid))
402 (*current->getPositionHistory())[timestamp] = matrix;
406 missingTools << toolUid;
410 missingTools.removeDuplicates();
411 missingTools.removeAll(
"");
413 if (!missingTools.empty())
415 reportWarning(QString(
"Loaded position history, but some of the tools " 416 "are not present in the configuration:" 417 "\n \t%1").arg(missingTools.join(
"\n \t")));
433 void TrackingImplService::globalConfigurationFileChangedSlot(QString key)
435 if (key.contains(
"TrackingPositionFilter"))
437 this->resetTrackingPositionFilters();
441 void TrackingImplService::resetTrackingPositionFilters()
443 bool enabled =
settings()->
value(
"TrackingPositionFilter/enabled",
false).toBool();
444 double cutoff =
settings()->
value(
"TrackingPositionFilter/cutoffFrequency", 0).toDouble();
446 for (ToolMap::iterator iter=mTools.begin(); iter!=mTools.end(); ++iter)
453 filter->setCutOffFrequency(cutoff);
455 iter->second->resetTrackingPositionFilter(filter);
459 void TrackingImplService::activeCheckSlot()
461 if (this->manualToolHasMostRecentTimestamp() && mManualTool->getVisible())
467 bool use =
settings()->
value(
"Automation/autoSelectActiveTool").toBool();
472 std::vector<ToolPtr> tools = this->getVisibleTools();
473 tools.push_back(mManualTool);
479 const QString uid = tools[0]->getUid();
484 bool TrackingImplService::manualToolHasMostRecentTimestamp()
497 for (ToolMap::iterator it = mTools.begin(); it != mTools.end(); ++it)
503 bestTime = std::max(bestTime, it->second->getTimestamp());
509 return (mts > bestTime);
512 std::vector<ToolPtr> TrackingImplService::getVisibleTools()
514 std::vector<ToolPtr> retval;
515 for (ToolMap::iterator it = mTools.begin(); it != mTools.end(); ++it)
516 if (it->second->getVisible())
517 retval.push_back(it->second);
554 QString TrackingImplService::getLoggingFolder()
556 return mSession->getSubFolder(
"Logs/");
559 void TrackingImplService::onSessionChanged()
561 QString loggingFolder = this->getLoggingFolder();
563 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
564 mTrackingSystems[i]->setLoggingFolder(loggingFolder);
567 void TrackingImplService::onSessionCleared()
569 mManualTool->set_prMt(Transform3D::Identity());
572 void TrackingImplService::onSessionLoad(QDomElement& node)
575 QDomElement toolManagerNode = root.
descend(
"managers/toolManager").
node().toElement();
576 if (!toolManagerNode.isNull())
577 this->parseXml(toolManagerNode);
581 void TrackingImplService::onSessionSave(QDomElement& node)
584 QDomElement managerNode = root.
descend(
"managers").
node().toElement();
585 this->addXml(managerNode);
587 this->savePositionHistory();
590 void TrackingImplService::addXml(QDomNode& parentNode)
596 base.addTextToElement(
"manualTool",
"\n" +
qstring_cast(mManualTool->get_prMt()));
601 ToolMap::iterator toolIt = tools.begin();
602 for (; toolIt != tools.end(); ++toolIt)
607 toolsNode.addObjectToElement(
"tool", tool);
613 void TrackingImplService::parseXml(QDomNode& dataNode)
615 if (dataNode.isNull())
620 QString manualToolText = dataNode.namedItem(
"manualTool").toElement().text();
621 mManualTool->set_prMt(Transform3D::fromString(manualToolText));
624 this->onTooltipOffset(mToolTipOffset);
631 for (
unsigned i=0; i<toolNodes.size(); ++i)
633 QDomElement toolNode = toolNodes[i];
634 QString tool_uid = toolNode.attribute(
"uid");
635 if (tools.find(tool_uid) != tools.end())
637 cxToolPtr tool = boost::dynamic_pointer_cast<
ToolImpl>(tools.find(tool_uid)->second);
663 if (active && active->getProbe())
669 for (ToolMap::iterator iter = tools.begin(); iter != tools.end(); ++iter)
670 if (iter->second->getProbe() && iter->second->getProbe()->isValid() && iter->second->getVisible())
674 for (ToolMap::iterator iter = tools.begin(); iter != tools.end(); ++iter)
675 if (iter->second->getProbe() && iter->second->getProbe()->isValid())
685 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
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
QDomElement addElement(QString name)
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
boost::shared_ptr< ToolImpl > cxToolPtr
std::vector< QDomElement > getDuplicateElements(QString name)
double getMilliSecondsSinceEpoch()
static SessionStorageServicePtr create(ctkPluginContext *pluginContext)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
virtual Tool::State getState() const
virtual void setState(const Tool::State val)
virtual void setPlaybackMode(PlaybackTimePtr controller)
void sessionChanged()
emitted after change to a new session (new or loaded or cleared)
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 reportWarning(QString msg)
boost::shared_ptr< TimedTransformMap > TimedTransformMapPtr
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)
Settings * settings()
Shortcut for accessing the settings instance.
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.
virtual ~TrackingImplService()
TrackingImplService(ctkPluginContext *context)
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
Interface towards a playback tracking system.Wraps another tracking system, enabling playback of the ...
boost::shared_ptr< class TrackingPositionFilter > TrackingPositionFilterPtr
virtual SessionToolHistoryMap getSessionHistory(double startTime, double stopTime)
virtual void installTrackingSystem(TrackingSystemServicePtr system)
void isSaving(QDomElement &root)
xml storage is available
std::map< double, Transform3D > TimedTransformMap
Namespace for all CustusX production code.
boost::shared_ptr< class Tool > ToolPtr
boost::shared_ptr< class TrackingSystemService > TrackingSystemServicePtr