37 #include <QStringList>
38 #include <QTextStream>
57 mCalibration.ImportTransform(*cal.getVtkMatrix());
62 QString filename = mCalibrationFilename;
64 if (!filename.isEmpty() && QFile::exists(filename))
72 filename = mSROMFilename.remove(
".rom", Qt::CaseInsensitive);
73 filename.append(
".cal");
78 file.
write(this->getCalibrationAsSSC());
98 report(
"Replaced calibration in " + filename);
105 QString verificationError(
"Internal verification of tool " + mUid +
" failed! REASON: ");
106 if (!mIsPointer && !mIsReference && !mIsProbe)
111 +
" Tag <tool>::<type> is invalid, must be one one of pointer/probe/reference ");
116 reportError(verificationError +
" Tag <tool>::<uid> is empty. Give tool a unique id.");
119 if (mTrackerType ==
tsNONE)
122 verificationError +
" Tag <sensor>::<type> is invalid ["
124 +
"]. Valid types: [polaris, spectra, vicra, aurora, micron (NOT SUPPORTED YET)]");
127 if ((mTrackerType ==
tsAURORA) && (mPortNumber >= 4))
130 verificationError +
" Tag <sensor>::<portnumber> is invalid ["
132 +
"]. Valid numbers: [0, 1, 2, 3]");
135 if ((mTrackerType ==
tsAURORA) && (mChannelNumber >= 1))
138 verificationError +
" Tag <sensor>::<channelnumber> is invalid ["
139 +
qstring_cast(mChannelNumber) +
"]. Valid numbers: [0, 1]");
143 if (!mSROMFilename.isEmpty() && !dir.exists(mSROMFilename))
146 verificationError +
" Tag <sensor>::<rom_file> is invalid [" + mSROMFilename
147 +
"]. Valid path: relative path to existing rom file.");
150 if (!mCalibrationFilename.isEmpty() && !dir.exists(mCalibrationFilename))
153 verificationError +
" Tag <calibration>::<cal_file> is invalid ["
154 + mCalibrationFilename
155 +
"]. Valid path: relative path to existing calibration file.");
158 if (!mTransformSaveFileName.isEmpty() && !dir.exists(mTransformSaveFileName))
160 reportError(verificationError +
" Logging folder is invalid. Contact programmer! :)");
163 if (!mLoggingFolderName.isEmpty() && !dir.exists(mLoggingFolderName))
165 reportError(verificationError +
" Logging folder is invalid. Contact programmer! :)");
175 mInternalStructure.
mCalibration.ImportTransform(*cal.getVtkMatrix());
190 mToolObserver(itk::ReceptorMemberCommand<
IgstkTool>::New()), mValid(false), mVisible(false), mAttachedToTracker(
193 qRegisterMetaType<Transform3D>(
"Transform3D");
195 mInternalStructure = internalStructure;
197 mToolObserver->SetCallbackFunction(
this, &IgstkTool::toolTransformCallback);
199 if (mInternalStructure.verify())
201 mTool = this->buildInternalTool();
207 reportError(mInternalStructure.mUid +
" was created with invalid internal structure.");
218 return mInternalStructure;
223 return mInternalStructure.
mUid;
248 return mAttachedToTracker;
263 mReferenceTool = refTool;
271 void IgstkTool::toolTransformCallback(
const itk::EventObject &event)
273 if (igstk::CoordinateSystemTransformToEvent().CheckEvent(&event))
275 const igstk::CoordinateSystemTransformToEvent *transformEvent;
276 transformEvent =
dynamic_cast<const igstk::CoordinateSystemTransformToEvent*
>(&event);
280 igstk::CoordinateSystemTransformToResult result = transformEvent->Get();
281 igstk::Transform
transform = result.GetTransform();
282 if (transform.IsIdentity())
284 if (!transform.IsValidNow())
294 const igstk::CoordinateSystem* destination = result.GetDestination();
299 if (!strongReference->getPointer()->IsCoordinateSystem(destination))
305 if (!tracker || !tracker->getPointer()->IsCoordinateSystem(destination))
310 transform.ExportTransform(*vtkMatrix.GetPointer());
313 double timestamp = transform.GetStartTime();
318 else if (igstk::TrackerToolConfigurationEvent().CheckEvent(&event))
321 report(QString(
"Configured [%1] with the tracking system").arg(mInternalStructure.
mUid));
323 else if (igstk::TrackerToolAttachmentToTrackerEvent().CheckEvent(&event))
325 this->internalAttachedToTracker(
true);
327 else if (igstk::TrackerToolDetachmentFromTrackerEvent().CheckEvent(&event))
329 this->internalAttachedToTracker(
false);
331 else if (igstk::TrackerToolMadeTransitionToTrackedStateEvent().CheckEvent(&event))
333 this->internalVisible(
true);
336 else if (igstk::TrackerToolNotAvailableToBeTrackedEvent().CheckEvent(&event))
338 this->internalVisible(
false);
341 else if (igstk::ToolTrackingStartedEvent().CheckEvent(&event))
343 this->internalTracked(
true);
344 report(mInternalStructure.
mUid +
" is tracked.");
346 else if (igstk::ToolTrackingStoppedEvent().CheckEvent(&event))
348 this->internalTracked(
false);
349 report(mInternalStructure.
mUid +
" is not tracked anymore.");
352 else if (igstk::InvalidRequestErrorEvent().CheckEvent(&event))
355 mInternalStructure.
mUid
356 +
" received an invalid request. This means that the internal igstk trackertool did not accept the request. Do not know which request.");
358 else if (igstk::TrackerToolConfigurationErrorEvent().CheckEvent(&event))
360 reportError(mInternalStructure.
mUid +
" could not configure with the tracking system.");
362 else if (igstk::InvalidRequestToAttachTrackerToolErrorEvent().CheckEvent(&event))
364 reportError(mInternalStructure.
mUid +
" could not request to attach to tracker.");
366 else if (igstk::InvalidRequestToDetachTrackerToolErrorEvent().CheckEvent(&event))
368 reportError(mInternalStructure.
mUid +
" could not request to detach from tracker.");
370 else if (igstk::TrackerToolAttachmentToTrackerErrorEvent().CheckEvent(&event))
372 reportError(mInternalStructure.
mUid +
" could not attach to tracker.");
374 else if (igstk::TrackerToolDetachmentFromTrackerErrorEvent().CheckEvent(&event))
376 reportError(mInternalStructure.
mUid +
" could not detach from tracker.");
379 else if (igstk::InvalidPolarisPortNumberErrorEvent().CheckEvent(&event))
382 mInternalStructure.
mUid +
" sendt invalid Polaris port number: "
385 else if (igstk::InvalidPolarisSROMFilenameErrorEvent().CheckEvent(&event))
388 mInternalStructure.
mUid +
" sendt invalid ROM file: " + mInternalStructure.
mSROMFilename);
390 else if (igstk::InvalidPolarisPartNumberErrorEvent().CheckEvent(&event))
395 else if (igstk::InvalidAuroraPortNumberErrorEvent().CheckEvent(&event))
398 mInternalStructure.
mUid +
" has an invalid port number: "
401 else if (igstk::InvalidAuroraSROMFilenameErrorEvent().CheckEvent(&event))
404 mInternalStructure.
mUid +
" sendt invalid ROM file: " + mInternalStructure.
mSROMFilename);
406 else if (igstk::InvalidAuroraPartNumberErrorEvent().CheckEvent(&event))
410 else if (igstk::InvalidAuroraChannelNumberErrorEvent().CheckEvent(&event))
413 mInternalStructure.
mUid +
" has an invalid channel number:"
418 igstk::TrackerTool::Pointer IgstkTool::buildInternalTool()
420 igstk::TrackerTool::Pointer tool;
422 igstk::PolarisTrackerTool::Pointer tempPolarisTool;
423 igstk::AuroraTrackerTool::Pointer tempAuroraTool;
432 tempPolarisTool = igstk::PolarisTrackerTool::New();
433 tempPolarisTool->AddObserver(igstk::IGSTKEvent(), mToolObserver);
435 return tool = tempPolarisTool.GetPointer();
436 tempPolarisTool->RequestSelectWirelessTrackerTool();
438 tempPolarisTool->RequestConfigure();
439 tempPolarisTool->SetCalibrationTransform(mInternalStructure.
mCalibration);
440 tool = tempPolarisTool;
443 tempAuroraTool = igstk::AuroraTrackerTool::New();
444 tempAuroraTool->AddObserver(igstk::IGSTKEvent(), mToolObserver);
445 if (mInternalStructure.
m5DOF)
447 tempAuroraTool->RequestSelect5DOFTrackerTool();
448 tempAuroraTool->RequestSetPortNumber(mInternalStructure.
mPortNumber);
449 tempAuroraTool->RequestSetChannelNumber(mInternalStructure.
mChannelNumber);
453 tempAuroraTool->RequestSelect6DOFTrackerTool();
454 tempAuroraTool->RequestSetPortNumber(mInternalStructure.
mPortNumber);
456 tempAuroraTool->RequestConfigure();
457 tempAuroraTool->SetCalibrationTransform(mInternalStructure.
mCalibration);
458 tool = tempAuroraTool;
472 mTool->SetCalibrationTransform(calibration);
475 void IgstkTool::internalAttachedToTracker(
bool value)
477 if (mAttachedToTracker == value)
479 mAttachedToTracker = value;
481 mInternalStructure.
mUid +
" is " + (value ?
"at" :
"de") +
"tached " + (value ?
"to" :
"from")
486 void IgstkTool::internalTracked(
bool value)
488 if (mTracked == value)
492 if (!mTracked && mVisible)
493 this->internalVisible(
false);
498 void IgstkTool::internalVisible(
bool value)
500 if (mVisible == value)
506 void IgstkTool::addLogging()
508 bool logging =
settings()->
value(
"IGSTKDebugLogging",
true).toBool();
511 std::ofstream* loggerFile =
new std::ofstream();
514 mLogger = igstk::Logger::New();
515 mLogOutput = itk::StdStreamLogOutput::New();
516 mLogOutput->SetStream(*loggerFile);
517 mLogger->AddLogOutput(mLogOutput);
518 mLogger->SetPriorityLevel(itk::Logger::DEBUG);
520 mTool->SetLogger(mLogger);
526 std::cout <<
"------------------------------------------------------------------" << std::endl;
527 std::cout <<
"mIsProbe: " << mInternalStructure.
mIsProbe << std::endl;
528 std::cout <<
"mIsReference: " << mInternalStructure.
mIsReference << std::endl;
529 std::cout <<
"mIsPointer: " << mInternalStructure.
mIsPointer << std::endl;
530 std::cout <<
"mName: " << mInternalStructure.
mName << std::endl;
531 std::cout <<
"mUid: " << mInternalStructure.
mUid << std::endl;
532 std::cout <<
"mTrackerType: " << mInternalStructure.
mTrackerType << std::endl;
533 std::cout <<
"mSROMFilename: " << mInternalStructure.
mSROMFilename << std::endl;
534 std::cout <<
"mPortNumber: " << mInternalStructure.
mPortNumber << std::endl;
535 std::cout <<
"mChannelNumber: " << mInternalStructure.
mChannelNumber << std::endl;
537 std::cout <<
"mWireless: " << mInternalStructure.
mWireless << std::endl;
538 std::cout <<
"m5DOF: " << mInternalStructure.
m5DOF << std::endl;
539 std::cout <<
"mCalibration: " << std::endl;
540 mInternalStructure.
mCalibration.Print(std::cout, itk::Indent());
542 std::cout <<
"mGraphicsFileName: " << mInternalStructure.
mGraphicsFileName << std::endl;
544 std::cout <<
"mLoggingFolderName: " << mInternalStructure.
mLoggingFolderName << std::endl;
545 std::cout <<
"------------------------------------------------------------------" << std::endl;
QString qstring_cast(const T &val)
vtkSmartPointer< class vtkMatrix4x4 > vtkMatrix4x4Ptr
boost::shared_ptr< IgstkTracker > TrackerPtr
DoubleBoundingBox3D transform(const Transform3D &m, const DoubleBoundingBox3D &bb)
void reportError(QString msg)
tsPOLARIS
NDIs Polaris tracker.
boost::shared_ptr< IgstkTool > IgstkToolPtr
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
cstring_cast_Placeholder cstring_cast(const T &val)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
std::string string_cast(const T &val)
tsPOLARIS_SPECTRA
NDIs Polaris Spectra tracker.
void reportWarning(QString msg)
Settings * settings()
Shortcut for accessing the settings instance.
tsAURORA
NDIs Aurora tracker.
tsMICRON
Claron Technologys Micron tracker.
tsPOLARIS_VICRA
NDIs Polaris Vicra tracker.