33 #define _USE_MATH_DEFINES
42 #include <vtkDoubleArray.h>
43 #include <QCoreApplication>
76 mLastLoadPositionHistory(0),
86 this->initializeManualTool();
91 connect(
settings(), SIGNAL(valueChangedFor(QString)),
this, SLOT(globalConfigurationFileChangedSlot(QString)));
96 while (!mTrackingSystems.empty())
106 void TrackingImplService::onSystemStateChanged()
108 this->rebuildCachedTools();
125 mPlaybackSystem.reset();
154 mTrackingSystems.push_back(system);
157 this->onSystemStateChanged();
164 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
166 if (mTrackingSystems[i]!=system)
168 mTrackingSystems.erase(mTrackingSystems.begin()+i);
172 this->onSystemStateChanged();
177 return mTrackingSystems;
180 void TrackingImplService::initializeManualTool()
186 mTools[
"ManualTool"] = mManualTool;
187 mManualTool->setVisible(
true);
188 connect(mManualTool.get(), &
Tool::toolVisible,
this, &TrackingImplService::activeCheckSlot);
190 connect(mManualTool.get(), &
Tool::tooltipOffset,
this, &TrackingImplService::onTooltipOffset);
195 mManualTool->set_prMt(prMt);
196 this->activeCheckSlot();
202 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
203 state = std::max(state, mTrackingSystems[i]->
getState());
209 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
213 void TrackingImplService::rebuildCachedTools()
216 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
218 this->addToolsFrom(mTrackingSystems[i]);
221 mTools[mManualTool->getUid()] = mManualTool;
222 this->imbueManualToolWithRealProperties();
224 this->loadPositionHistory();
229 void TrackingImplService::imbueManualToolWithRealProperties()
232 if (!
settings()->value(
"giveManualToolPhysicalProperties").toBool())
235 for (ToolMap::iterator iter = mTools.begin(); iter != mTools.end(); ++iter)
237 if (iter->second == mManualTool)
241 mManualTool->setBase(iter->second);
246 report(
"Manual tool imbued with properties from " + iter->first);
253 std::vector<ToolPtr> tools = system->getTools();
254 for (
unsigned i=0; i<tools.size(); ++i)
257 mTools[tool->getUid()] = tool;
258 connect(tool.get(), SIGNAL(toolVisible(
bool)),
this, SLOT(activeCheckSlot()));
263 mReferenceTool = tool;
267 void TrackingImplService::onTooltipOffset(
double val)
269 mToolTipOffset = val;
270 for (ToolMap::iterator iter = mTools.begin(); iter != mTools.end(); ++iter)
272 iter->second->setTooltipOffset(val);
281 ToolMap::iterator it = tools.begin();
282 for (; it != tools.end(); ++it)
287 retval[it->second] = toolMap;
303 ToolMap::iterator it = mTools.find(uid);
304 if (it != mTools.end())
317 if (mActiveTool && mActiveTool->getUid() == uid)
324 mActiveTool = newTool;
329 if (oldTool && (oldTool!=mManualTool))
330 mManualTool->set_prMt(oldTool->get_prMt(), oldTool->getTimestamp() -1);
331 mManualTool->setVisible(
true);
335 mManualTool->setVisible(
false);
343 return mReferenceTool;
346 void TrackingImplService::savePositionHistory()
348 QString filename = this->getLoggingFolder() +
"/toolpositions.snwpos";
352 ToolMap::iterator it = mTools.begin();
353 for (; it != mTools.end(); ++it)
362 TimedTransformMap::iterator iter = data->lower_bound(mLastLoadPositionHistory);
363 for (; iter != data->end(); ++iter)
364 writer.write(iter->second, (iter->first), current->getUid());
370 void TrackingImplService::loadPositionHistory()
375 this->savePositionHistory();
377 QString filename = this->getLoggingFolder()+
"/toolpositions.snwpos";
379 PositionStorageReader reader(filename);
385 QStringList missingTools;
387 while (!reader.atEnd())
389 if (!reader.read(&matrix, ×tamp, &toolUid))
395 (*current->getPositionHistory())[timestamp] = matrix;
399 missingTools << toolUid;
403 missingTools.removeDuplicates();
404 missingTools.removeAll(
"");
406 if (!missingTools.empty())
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")));
426 void TrackingImplService::globalConfigurationFileChangedSlot(QString key)
428 if (key.contains(
"TrackingPositionFilter"))
430 this->resetTrackingPositionFilters();
434 void TrackingImplService::resetTrackingPositionFilters()
436 bool enabled =
settings()->
value(
"TrackingPositionFilter/enabled",
false).toInt();
438 for (ToolMap::iterator iter=mTools.begin(); iter!=mTools.end(); ++iter)
442 filter.reset(
new TrackingPositionFilter());
443 iter->second->resetTrackingPositionFilter(filter);
447 void TrackingImplService::activeCheckSlot()
449 if (this->manualToolHasMostRecentTimestamp() && mManualTool->getVisible())
455 bool use =
settings()->
value(
"Automation/autoSelectActiveTool").toBool();
460 std::vector<ToolPtr> tools = this->getVisibleTools();
461 tools.push_back(mManualTool);
467 const QString uid = tools[0]->getUid();
472 bool TrackingImplService::manualToolHasMostRecentTimestamp()
485 for (ToolMap::iterator it = mTools.begin(); it != mTools.end(); ++it)
491 bestTime = std::max(bestTime, it->second->getTimestamp());
493 double ahead = mts -bestTime;
497 return (mts > bestTime);
500 std::vector<ToolPtr> TrackingImplService::getVisibleTools()
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);
542 QString TrackingImplService::getLoggingFolder()
544 return mSession->getSubFolder(
"Logs/");
547 void TrackingImplService::onSessionChanged()
549 QString loggingFolder = this->getLoggingFolder();
551 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
552 mTrackingSystems[i]->setLoggingFolder(loggingFolder);
555 void TrackingImplService::onSessionCleared()
557 mManualTool->set_prMt(Transform3D::Identity());
560 void TrackingImplService::onSessionLoad(QDomElement& node)
562 XMLNodeParser root(node);
563 QDomElement toolManagerNode = root.descend(
"managers/toolManager").node().toElement();
564 if (!toolManagerNode.isNull())
565 this->parseXml(toolManagerNode);
569 void TrackingImplService::onSessionSave(QDomElement& node)
571 XMLNodeAdder root(node);
572 QDomElement managerNode = root.descend(
"managers").node().toElement();
573 this->addXml(managerNode);
575 this->savePositionHistory();
578 void TrackingImplService::addXml(QDomNode& parentNode)
580 XMLNodeAdder parent(parentNode);
581 XMLNodeAdder base(parent.addElement(
"toolManager"));
583 base.addTextToElement(
"toolTipOffset",
qstring_cast(mToolTipOffset));
584 base.addTextToElement(
"manualTool",
"\n" +
qstring_cast(mManualTool->get_prMt()));
587 XMLNodeAdder toolsNode(base.addElement(
"tools"));
589 ToolMap::iterator toolIt = tools.begin();
590 for (; toolIt != tools.end(); ++toolIt)
592 cxToolPtr tool = boost::dynamic_pointer_cast<ToolUsingIGSTK>(toolIt->second);
595 toolsNode.addObjectToElement(
"tool", tool);
601 void TrackingImplService::parseXml(QDomNode& dataNode)
603 if (dataNode.isNull())
606 XMLNodeParser base(dataNode);
608 QString manualToolText = dataNode.namedItem(
"manualTool").toElement().text();
609 mManualTool->set_prMt(Transform3D::fromString(manualToolText));
611 mToolTipOffset = base.parseDoubleFromElementWithDefault(
"toolTipOffset", 0.0);
612 this->onTooltipOffset(mToolTipOffset);
616 XMLNodeParser toolssNode(dataNode.namedItem(
"tools"));
617 std::vector<QDomElement> toolNodes = toolssNode.getDuplicateElements(
"tool");
619 for (
unsigned i=0; i<toolNodes.size(); ++i)
621 QDomElement toolNode = toolNodes[i];
622 QString tool_uid = toolNode.attribute(
"uid");
623 if (tools.find(tool_uid) != tools.end())
625 cxToolPtr tool = boost::dynamic_pointer_cast<ToolUsingIGSTK>(tools.find(tool_uid)->second);
626 tool->parseXml(toolNode);
651 if (active && active->getProbe())
657 for (ToolMap::iterator iter = tools.begin(); iter != tools.end(); ++iter)
658 if (iter->second->getProbe() && iter->second->getProbe()->isValid() && iter->second->getVisible())
662 for (ToolMap::iterator iter = tools.begin(); iter != tools.end(); ++iter)
663 if (iter->second->getProbe() && iter->second->getProbe()->isValid())
672 for (
unsigned i=0; i<mTrackingSystems.size(); ++i)
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()
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)
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
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)
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
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.
virtual ~TrackingImplService()
TrackingImplService(ctkPluginContext *context)
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
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)
boost::shared_ptr< ToolUsingIGSTK > cxToolPtr
boost::shared_ptr< class PlaybackTime > PlaybackTimePtr
virtual void installTrackingSystem(TrackingSystemServicePtr system)
void isSaving(QDomElement &root)
xml storage is available
std::map< double, Transform3D > TimedTransformMap
Interface towards one tracking system.
boost::shared_ptr< class Tool > ToolPtr
boost::shared_ptr< class TrackingSystemService > TrackingSystemServicePtr