00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "QmitkIGTExampleView.h"
00018
00019
00020
00021 #include "QmitkStdMultiWidget.h"
00022
00023
00024 #include "mitkClaronTool.h"
00025 #include "mitkClaronTrackingDevice.h"
00026 #include "mitkCone.h"
00027 #include "mitkInternalTrackingTool.h"
00028 #include "mitkNDIPassiveTool.h"
00029 #include "mitkNDITrackingDevice.h"
00030 #include "mitkVirtualTrackingDevice.h"
00031 #include "mitkNavigationDataObjectVisualizationFilter.h"
00032 #ifdef MITK_USE_MICROBIRD_TRACKER
00033 #include "mitkMicroBirdTrackingDevice.h"
00034 #endif // MITK_USE_MICROBIRD_TRACKER
00035
00036 #include "mitkProgressBar.h"
00037 #include "mitkProperties.h"
00038 #include "mitkPropertyList.h"
00039 #include "mitkSerialCommunication.h"
00040 #include "mitkStatusBar.h"
00041 #include "mitkTrackingTypes.h"
00042 #include "mitkVector.h"
00043 #include "mitkGeometry3D.h"
00044
00045 #include <itksys/SystemTools.hxx>
00046
00047 #include <QProgressBar>
00048 #include <QMessageBox>
00049
00050
00051
00052
00053
00054 #include <QPushButton>
00055 #include <QTextEdit>
00056 #include <QTimer>
00057 #include <QTime>
00058 #include <QLabel>
00059 #include <QLineEdit>
00060
00061
00062
00063 #include <QFileDialog>
00064
00065
00066 QmitkIGTExampleView::QmitkIGTExampleView(QObject * , const char * )
00067 : QmitkFunctionality()
00068 {
00069 m_Timer = new QTimer(this);
00070 m_RecordingTimer = new QTimer(this);
00071 m_PlayingTimer = new QTimer(this);
00072 m_XValues.clear();
00073 m_YValues.clear();
00074 m_Controls = NULL;
00075 }
00076
00077
00078 QmitkIGTExampleView::~QmitkIGTExampleView()
00079 {
00080 this->OnStop();
00081 m_Timer->stop();
00082 m_RecordingTimer->stop();
00083 m_PlayingTimer->stop();
00084 m_Recorder = NULL;
00085 m_Player = NULL;
00086 m_RecordingTimer = NULL;
00087 m_PlayingTimer = NULL;
00088 }
00089
00090 void QmitkIGTExampleView::CreateQtPartControl(QWidget *parent)
00091 {
00092 if (!m_Controls)
00093 {
00094 m_Controls = new Ui::QmitkIGTExampleControls;
00095 m_Controls->setupUi(parent);
00096
00097
00098 out = m_Controls->m_TextOutput;
00099
00100 CreateConnections();
00101
00102
00103
00104
00105
00106
00107
00108
00109 m_Controls->m_X->setText("10");
00110 m_Controls->m_Y->setText("3");
00111 m_Controls->m_Z->setText("5");
00112
00113 m_Controls->m_PlayingButtonToggle->setEnabled(false);
00114 }
00115 }
00116
00117 void QmitkIGTExampleView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
00118 {
00119 m_MultiWidget = &stdMultiWidget;
00120 }
00121
00122 void QmitkIGTExampleView::StdMultiWidgetNotAvailable()
00123 {
00124 m_MultiWidget = NULL;
00125 }
00126 void QmitkIGTExampleView::CreateConnections()
00127 {
00128 if ( m_Controls )
00129 {
00130 connect((QObject*)(m_Controls->m_ChangeOffset), SIGNAL(clicked()), (QObject*) this, SLOT(OnParametersChanged()));
00131 connect((QObject*)(m_Controls->m_TrackingDevice), SIGNAL(textChanged(QString)), (QObject*) this, SLOT(OnTrackingDeviceTextChanged(QString)));
00132 connect((QObject*)(m_Controls->m_TrackingDevice), SIGNAL(activated(QString)),(QObject*) this, SLOT(OnTrackingDeviceTextChanged(QString)));
00133
00134 connect( (QObject*)(m_Controls->m_StartTrackingButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnTestTracking()));
00135 connect( (QObject*)(m_Controls->m_LoadToolBtn), SIGNAL(clicked()),(QObject*) this, SLOT(OnLoadTool()));
00136 connect( (QObject*)(m_Controls->m_StartNavigationButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnTestNavigation()));
00137 connect( (QObject*)(m_Controls->m_MeasureBtn), SIGNAL(clicked()),(QObject*) this, SLOT(OnMeasure()));
00138 connect( (QObject*)(m_Controls->m_MeasureContinuously), SIGNAL(clicked()),(QObject*) this, SLOT(OnMeasureContinuously()));
00139 connect( (QObject*)(m_Controls->m_StopBtn), SIGNAL(clicked()),(QObject*) this, SLOT(OnStop()));
00140
00141 connect( m_Timer, SIGNAL(timeout()), this, SLOT(OnMeasure()) );
00142 connect( m_RecordingTimer, SIGNAL(timeout()), this, SLOT(OnRecording()) );
00143 connect( m_PlayingTimer, SIGNAL(timeout()), this, SLOT(OnPlaying()) );
00144 connect( (QObject*)(m_Controls->m_RecordingButtonToggle), SIGNAL(toggled(bool)),(QObject*) this, SLOT(OnRecordingToggle(bool)));
00145 connect( (QObject*)(m_Controls->m_PlayingButtonToggle), SIGNAL(toggled(bool)),(QObject*) this, SLOT(OnPlayingToggle(bool)));
00146 connect( (QObject*)(m_Controls->m_ShowErrorPlotBtn), SIGNAL(clicked()),(QObject*) this, SLOT(OnShowErrorPlot()));
00147 }
00148 }
00149
00150 void QmitkIGTExampleView::Activated()
00151 {
00152 QmitkFunctionality::Activated();
00153 }
00154 void QmitkIGTExampleView::Deactivated()
00155 {
00156 QmitkFunctionality::Deactivated();
00157 }
00158 void QmitkIGTExampleView::OnTestTracking()
00159 {
00160 WaitCursorOn();
00161 mitk::StatusBar::GetInstance()->DisplayText("Executing test of the tracking component", 4000);
00162
00163
00164 mitk::TrackingDevice::Pointer tracker = this->ConfigureTrackingDevice();
00165 if (tracker.IsNull())
00166 {
00167 out->append("Error creating tracking device. Did you provide all parameters?");
00168 return;
00169 }
00170
00171
00172 out->append("opening connection to tracking device");
00173 if (tracker->OpenConnection() == false)
00174 {
00175 out->append(QString("ERROR during OpenConnection(): ") + QString(tracker->GetErrorMessage()));
00176 tracker->CloseConnection();
00177 WaitCursorOff();
00178 return;
00179 }
00180 else
00181 out->append("successfully connected to tracking device.");
00182
00183
00184 if (tracker->StartTracking() == false)
00185 {
00186 out->append(QString("ERROR during StartTracking(): ") + QString(tracker->GetErrorMessage()));
00187 tracker->CloseConnection();
00188 WaitCursorOff();
00189 return;
00190 }
00191 else
00192 out->append("tracking device is tracking now.");
00193
00194
00195 out->append("Starting to read tracking data for all tools.");
00196 mitk::TrackingTool* t = NULL;
00197 mitk::Point3D pos;
00198 mitk::Quaternion quat;
00199 for(int i=0; i< 50; i++)
00200 {
00201 for (unsigned int i = 0; i < tracker->GetToolCount(); i++)
00202 {
00203 std::stringstream output;
00204 t = tracker->GetTool(i);
00205 if (t == NULL)
00206 continue;
00207 output << "Tool " << t->GetToolName() << ":" << std::endl;
00208 if (t->IsDataValid() == true)
00209 {
00210 t->GetPosition(pos);
00211 output << " Position = <" << pos[0] << ", " << pos[1] << ", " << pos[2] << ">" << std::endl;
00212 t->GetOrientation(quat);
00213 output << " Orientation = <" << quat[0] << ", " << quat[1] << ", " << quat[2] << ", " << quat[3] << ">" << std::endl;
00214 output << " TrackingError = " << t->GetTrackingError() << std::endl;
00215 }
00216 else
00217 output << " Data is invalid. Error message: " << t->GetErrorMessage() << std::endl;
00218 output << "--------------------------------------------" << std::endl;
00219 out->append(output.str().c_str());
00220 }
00221
00222 itksys::SystemTools::Delay(100);
00223 }
00224
00225
00226 out->append("Enough tracking data. Stopping tracking now.");
00227 if (tracker->StopTracking() == false)
00228 {
00229 out->append(QString("ERROR during StopTracking(): ") + QString(tracker->GetErrorMessage()));
00230 tracker->CloseConnection();
00231 WaitCursorOff();
00232 return;
00233 }
00234 else
00235 out->append("Tracking stopped.");
00236
00237
00238 if (tracker->CloseConnection() == false)
00239 {
00240 out->append(QString("ERROR during CloseConnection(): ") + QString(tracker->GetErrorMessage()));
00241 WaitCursorOff();
00242 return;
00243 }
00244 else
00245 out->append("tracking stopped.");
00246
00247 mitk::StatusBar::GetInstance()->DisplayText("test of the tracking component finished", 2000);
00248 WaitCursorOff();
00249 }
00250
00251
00252 void QmitkIGTExampleView::OnTestNavigation()
00253 {
00254 WaitCursorOn();
00255 mitk::StatusBar::GetInstance()->DisplayText("Executing test of the navigation component", 4000);
00256
00257
00258 mitk::TrackingDevice::Pointer tracker = this->ConfigureTrackingDevice();
00259
00260
00261 try
00262 {
00263 m_Source = mitk::TrackingDeviceSource::New();
00264 m_Source->SetTrackingDevice(tracker);
00265 out->append("created and initialized TrackingDeviceSource filter");
00266
00267
00268 out->append("connected filter pipeline");
00269 m_Source->Connect();
00270
00271 m_Displacer = mitk::NavigationDataDisplacementFilter::New();
00272 mitk::Vector3D offset;
00273
00274
00275
00276 mitk::FillVector3D(offset, 1.0, 1.0, 1800.0);
00277
00278
00279 m_Displacer->SetOffset(offset);
00280
00281
00282
00283
00284
00285 out->append(QString("created and initialized NavigationDataDisplacementFilter filter using <%1, %2, %3> as offset").arg(offset[0]).arg(offset[1]).arg(offset[2]));
00286 unsigned int numberOfOutputs = m_Source->GetNumberOfOutputs();
00287 for (unsigned int i = 0; i < numberOfOutputs; i++)
00288 m_Displacer->SetInput(i , m_Source->GetOutput(i));
00289
00290
00291 mitk::NavigationDataObjectVisualizationFilter::Pointer visualizer = mitk::NavigationDataObjectVisualizationFilter::New();
00292 for (unsigned int i = 0; i < m_Displacer->GetNumberOfOutputs(); i++)
00293 visualizer->SetInput(i, m_Displacer->GetOutput(i));
00294
00295
00296 for (unsigned int i = 0; i < m_Displacer->GetNumberOfOutputs();i++)
00297 {
00298 mitk::Cone::Pointer mitkToolData = mitk::Cone::New();
00299 float scale[] = {20.0, 20.0, 20.0};
00300 mitkToolData->GetGeometry()->SetSpacing(scale);
00301
00302 mitk::DataNode::Pointer toolNode = mitk::DataNode::New();
00303 toolNode->SetData(mitkToolData);
00304 toolNode->SetName(QString("MyInstrument %1").arg(i).toLatin1());
00305 toolNode->SetColor(0.2, 0.3 * i ,0.9 - 0.2 * i);
00306 toolNode->Modified();
00307
00308 this->GetDefaultDataStorage()->Add(toolNode);
00309 visualizer->SetRepresentationObject(i, mitkToolData);
00310 }
00311 m_EndOfPipeline = visualizer;
00312
00313
00314 if (m_Controls->m_ShowTrajectories->isChecked())
00315 {
00316 m_PointSetFilter = mitk::NavigationDataToPointSetFilter::New();
00317 m_PointSetFilter->SetOperationMode(mitk::NavigationDataToPointSetFilter::Mode3D);
00318 for (unsigned int i = 0; i < visualizer->GetNumberOfOutputs(); ++i)
00319 m_PointSetFilter->SetInput(i, visualizer->GetOutput(i));
00320 for (unsigned int i = 0; i < m_PointSetFilter->GetNumberOfOutputs(); i++)
00321 {
00322 mitk::PointSet* p = m_PointSetFilter->GetOutput(i);
00323 assert(p);
00324
00325 mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New();
00326 pointSetNode->SetData(p);
00327 pointSetNode->SetName(QString("Trajectory of Output %1").arg(i).toLatin1());
00328 mitk::Color color;
00329 color.Set(0.2, 0.3 * i ,0.9 - 0.2 * i);
00330 pointSetNode->SetColor(color);
00331 pointSetNode->SetProperty("contourcolor", mitk::ColorProperty::New(color));
00332 pointSetNode->SetProperty("pointsize", mitk::FloatProperty::New(2.0));
00333 pointSetNode->SetProperty("contoursize", mitk::FloatProperty::New(1.0));
00334 pointSetNode->SetBoolProperty("show contour", true);
00335 pointSetNode->SetBoolProperty("updateDataOnRender", false);
00336
00337 GetDefaultDataStorage()->Add(pointSetNode);
00338 out->append(QString("Creating Pointset %1 for trajectory visualization").arg(i));
00339 }
00340 }
00341
00342
00343 m_Source->StartTracking();
00344 out->append("started source filter. tracking is running now.");
00345 }
00346 catch (std::exception& exp)
00347 {
00348 out->append(QString("ERROR during instantiation and initialization of TrackingDeviceSource filter: ") + QString(exp.what()));
00349 m_Displacer = NULL;
00350 m_PointSetFilter = NULL;
00351 m_EndOfPipeline = NULL;
00352 if (m_Source.IsNotNull())
00353 {
00354 m_Source->StopTracking();
00355 m_Source->Disconnect();
00356 m_Source = NULL;
00357 }
00358 tracker = NULL;
00359 WaitCursorOff();
00360 return;
00361 }
00362
00363 m_Controls->m_MeasureBtn->show();
00364 m_Controls->m_MeasureBtn->setEnabled(true);
00365 m_Controls->m_MeasureContinuously->show();
00366 m_Controls->m_MeasureContinuously->setEnabled(true);
00367 m_Controls->m_StopBtn->show();
00368 m_Controls->m_StopBtn->setEnabled(true);
00369 m_Controls->m_StartTrackingButton->setEnabled(false);
00370 m_Controls->m_StartNavigationButton->setEnabled(false);
00371
00372
00373 mitk::RenderingManager::GetInstance()->InitializeViews();
00374
00375 out->append("Tracking Pipeline ready. Click on Measure! button to get most current navigation data");
00376 WaitCursorOff();
00377 }
00378
00379
00380 void QmitkIGTExampleView::OnMeasure()
00381 {
00382 if (m_EndOfPipeline.IsNull())
00383 {
00384 out->append("Tracking Pipeline not ready.");
00385 return;
00386 }
00387
00388 for (unsigned int i = 0; i < m_EndOfPipeline->GetNumberOfOutputs(); ++i)
00389 {
00390 mitk::NavigationData* nd = m_EndOfPipeline->GetOutput(i);
00391 if (nd == NULL)
00392 {
00393 out->append("WARNING: Navigation Data is NULL");
00394 continue;
00395 }
00396 nd->Update();
00397
00398
00399 std::stringstream output;
00400 output << "Navigation Data of Output " << i << ":" << std::endl;
00401 if (nd->IsDataValid() == true)
00402 {
00403 output << " Position = " << nd->GetPosition() << std::endl;
00404 output << " Orientation = <" << nd->GetOrientation() << std::endl;
00405 output << " Error = " << nd->GetCovErrorMatrix() << std::endl;
00406 }
00407 else
00408 output << " Data is invalid."<< std::endl;
00409 output << "--------------------------------------------" << std::endl;
00410 out->append(output.str().c_str());
00411 }
00412 if (m_PointSetFilter.IsNotNull())
00413 m_PointSetFilter->Update();
00414
00415 if (m_MessageFilter.IsNotNull())
00416 m_MessageFilter->Update();
00417
00418 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget4->GetRenderWindow())->RequestUpdate();
00419 }
00420
00421
00422 void QmitkIGTExampleView::OnMeasureContinuously()
00423 {
00424 if (m_Controls->m_MeasureContinuously->text()=="Start measure continuously")
00425 {
00426 m_Timer->start(100);
00427 m_Controls->m_MeasureContinuously->setText("Stop measure continuously");
00428 }
00429 else if (m_Controls->m_MeasureContinuously->text()=="Stop measure continuously")
00430 {
00431 m_Timer->stop();
00432 m_Controls->m_MeasureContinuously->setText("Start measure continuously");
00433 }
00434 }
00435
00436
00437 void QmitkIGTExampleView::OnStop()
00438 {
00439 WaitCursorOn();
00440 m_Controls->m_MeasureBtn->hide();
00441 m_Controls->m_MeasureBtn->setEnabled(false);
00442 m_Controls->m_MeasureContinuously->hide();
00443 m_Controls->m_MeasureContinuously->setEnabled(false);
00444 m_Controls->m_StopBtn->hide();
00445 m_Controls->m_StopBtn->setEnabled(false);
00446 m_Controls->m_StartTrackingButton->setEnabled(true);
00447 m_Controls->m_StartNavigationButton->setEnabled(true);
00448 try
00449 {
00450 if (m_Source.IsNotNull())
00451 {
00452 m_Source->StopTracking();
00453 m_Source->Disconnect();
00454 m_Source = NULL;
00455 }
00456 m_EndOfPipeline = NULL;
00457 m_PointSetFilter = NULL;
00458 m_Displacer = NULL;
00459 m_MessageFilter = NULL;
00460 WaitCursorOff();
00461 }
00462 catch (std::exception& exp)
00463 {
00464 out->append(QString("ERROR during cleanup of filter pipeline: ") + QString(exp.what()));
00465 m_Source = NULL;
00466 WaitCursorOff();
00467 return;
00468 }
00469 out->append("Filter pipeline stopped and destroyed. Everything is back to normal.");
00470 WaitCursorOff();
00471 }
00472
00473
00474 void QmitkIGTExampleView::OnParametersChanged()
00475 {
00476 mitk::Vector3D v;
00477 v[0] = m_Controls->m_X->text().toFloat();
00478 v[1] = m_Controls->m_Y->text().toFloat();
00479 v[2] = m_Controls->m_Z->text().toFloat();
00480
00481 mitk::PropertyList::Pointer parameters = mitk::PropertyList::New();
00482 parameters->SetProperty("NavigationDataDisplacementFilter_Offset", mitk::Vector3DProperty::New(v));
00483
00484 if(m_Displacer.IsNotNull())
00485 {
00486 m_Displacer->SetParameters(parameters.GetPointer());
00487 }
00488 else{
00489 QMessageBox::warning(NULL, "No navigation test started", "Please start a navigationtest first", QMessageBox::Ok, NULL);
00490 }
00491 }
00492
00493
00494 void QmitkIGTExampleView::AddToFunctionalityOptionsList(mitk::PropertyList* )
00495 {
00496
00497
00498
00499
00501
00502
00503
00504
00505
00507 }
00508 void QmitkIGTExampleView::OnLoadTool()
00509 {
00510 QStringList s = QFileDialog::getOpenFileNames(m_Parent, "Select one or more tool definition files",QDir::currentPath(), "NDI Tool Definition Files (*.rom);;All files (*.*)");
00511 if (s.empty() == false)
00512 {
00513 m_Controls->m_ToolFileName->setText(s.front());
00514 }
00515 m_ToolList = s;
00516 }
00517
00518 mitk::TrackingDevice::Pointer QmitkIGTExampleView::ConfigureTrackingDevice()
00519 {
00520 mitk::TrackingDevice::Pointer tracker;
00521 QString selectedDevice = m_Controls->m_TrackingDevice->currentText().toLatin1();
00522 if ((selectedDevice == "NDI Polaris")
00523 || (selectedDevice == "NDI Aurora"))
00524 {
00525 mitk::NDITrackingDevice::Pointer trackerNDI = mitk::NDITrackingDevice::New();
00526 trackerNDI->SetDeviceName(m_Controls->m_Port->text().toStdString());
00527 trackerNDI->SetBaudRate(mitk::SerialCommunication::BaudRate115200);
00528 out->append(QString("creating NDI Tracker on ") + m_Controls->m_Port->text() + QString(" with 115200 Baud"));
00529 tracker = trackerNDI;
00530
00531 if (selectedDevice == "NDI Polaris")
00532 {
00533 trackerNDI->SetType(mitk::NDIPolaris);
00534 QStringList::iterator it;
00535 unsigned int index = 0;
00536 for (it = m_ToolList.begin(); it != m_ToolList.end(); ++it )
00537 {
00538 trackerNDI->AddTool(QString("MyInstrument %1").arg(index++).toLatin1(), (*it).toLatin1());
00539 out->append(QString("adding tool 'MyInstrument' with rom file '") + (*it) + QString("'"));
00540 }
00541 }
00542 else if (selectedDevice == "NDI Aurora")
00543 {
00544 trackerNDI->SetType(mitk::NDIAurora);
00545 }
00546 }
00547 else if (selectedDevice == "Micron Tracker")
00548 {
00549 mitk::ClaronTrackingDevice::Pointer trackerMT = mitk::ClaronTrackingDevice::New();
00550 out->append("creating Micron Tracker");
00551 QStringList::iterator it;
00552 unsigned int index = 0;
00553 for (it = m_ToolList.begin(); it != m_ToolList.end(); ++it )
00554 {
00555 trackerMT->AddTool(QString("MyInstrument %1").arg(index++).toLatin1(), (*it).toLatin1());
00556 out->append(QString("adding tool 'MyInstrument' with tool definition file '") + (*it) + QString("'"));
00557 }
00558 tracker = trackerMT;
00559 }
00560 else if (selectedDevice == "MicroBird")
00561 {
00562 #ifdef MITK_USE_MICROBIRD_TRACKER
00563 mitk::MicroBirdTrackingDevice::Pointer trackerMB = mitk::MicroBirdTrackingDevice::New();
00564 mitk::InternalTrackingTool::Pointer toolMB = mitk::InternalTrackingTool::New();
00565 trackerMB->AddTool(toolMB);
00566 out->append("creating MicroBird tracking device with one tool");
00567 #else
00568 out->append("MicroBird support not available in this version. Please select a different tracking device");
00569 #endif // MITK_USE_MICROBIRD_TRACKER
00570 }
00571 else if (selectedDevice == "VirtualTrackingDevice")
00572 {
00573 mitk::VirtualTrackingDevice::Pointer trackerVirtual = mitk::VirtualTrackingDevice::New();
00574 trackerVirtual->AddTool("toolRandom1");
00575 trackerVirtual->AddTool("toolRandom2");
00576 tracker = trackerVirtual;
00577 out->append("creating virtual tracking device with two tools");
00578 }
00579 else
00580 {
00581 tracker = NULL;
00582 }
00583 return tracker;
00584 }
00585
00586
00587 void QmitkIGTExampleView::OnRecordingToggle(bool toggled)
00588 {
00589 try
00590 {
00591
00592 mitk::TrackingDevice::Pointer tracker = this->ConfigureTrackingDevice();
00593
00594 if (tracker.IsNull())
00595 {
00596 out->append("Error creating tracking device. Did you provide all parameters?");
00597 return;
00598 }
00599
00600 else if(!toggled)
00601 {
00602
00603
00604 m_RecordingTimer->stop();
00605 m_Recorder->StopRecording();
00606 out->append(QString("Stopped recording"));
00607 m_Controls->m_RecordingButtonToggle->setText(QString("Start Recording Test"));
00608 m_Controls->m_PlayingButtonToggle->setEnabled(true);
00609 }
00610
00611 else
00612 {
00613
00614 m_Controls->m_PlayingButtonToggle->setEnabled(false);
00615 m_Source = mitk::TrackingDeviceSource::New();
00616 m_Source->SetTrackingDevice(tracker);
00617
00618 m_Source->Connect();
00619
00620
00621 std::stringstream filename;
00622
00623
00624 filename << itksys::SystemTools::GetCurrentWorkingDirectory() << "/Test Output";
00625
00626 m_Recorder = mitk::NavigationDataRecorder::New();
00627 m_Recorder->SetFileName(filename.str());
00628
00629
00630 for (unsigned int i = 0; i < m_Source->GetNumberOfOutputs(); i++)
00631 {
00632 m_Recorder->AddNavigationData(m_Source->GetOutput(i));
00633 }
00634
00635 m_Source->StartTracking();
00636 m_Recorder->StartRecording();
00637
00638 out->append(QString("Starting Recording from ") + QString(m_Controls->m_TrackingDevice->currentText().toLatin1())
00639 + QString(" to file ") + QString(m_Recorder->GetFileName()) + QString(" now."));
00640
00641
00642
00643 m_RecordingTimer->start(100);
00644
00645
00646 m_Controls->m_RecordingButtonToggle->setText(QString("Stop Recording Test"));
00647
00648
00649 }
00650
00651 }
00652 catch (std::exception& e)
00653 {
00654 out->append(QString("An error occured: ") + QString(e.what()));
00655 m_Controls->m_PlayingButtonToggle->setEnabled(false);
00656
00657
00658 }
00659
00660
00661 }
00662
00663
00664 void QmitkIGTExampleView::OnRecording()
00665 {
00666 m_Recorder->Update();
00667 mitk::StatusBar::GetInstance()->DisplayText("Recording tracking data now", 75);
00668 }
00669
00670
00671 void QmitkIGTExampleView::OnPlayingToggle(bool toggled)
00672 {
00673 if(m_Recorder->GetRecording())
00674 {
00675
00676 m_RecordingTimer->stop();
00677 m_Recorder->StopRecording();
00678 out->append("Stopped recording");
00679 }
00680
00681
00682 if(!toggled)
00683 {
00684 out->append(QString("stopping replay"));
00685 m_Player->StopPlaying();
00686 m_PlayingTimer->stop();
00687 m_Controls->m_RecordingButtonToggle->setEnabled(true);
00688 m_Controls->m_PlayingButtonToggle->setText(QString("Start Replaying Test"));
00689 }
00690
00691 else
00692 {
00693
00694 m_Controls->m_RecordingButtonToggle->setEnabled(false);
00695
00696 std::stringstream filename;
00697
00698 filename << itksys::SystemTools::GetCurrentWorkingDirectory() << "/Test Output-0.xml";
00699
00700 m_Player = mitk::NavigationDataPlayer::New();
00701
00702 m_Player->SetFileName(filename.str());
00703 m_Player->StartPlaying();
00704
00705
00706 out->append(QString("Starting replay from ") + QString(m_Player->GetFileName()));
00707
00708
00709 m_PointSetFilter = mitk::NavigationDataToPointSetFilter::New();
00710 m_PointSetFilter->SetOperationMode(mitk::NavigationDataToPointSetFilter::Mode3D);
00711 for (unsigned int i = 0; i < m_Player->GetNumberOfOutputs(); i++)
00712 m_PointSetFilter->SetInput(i, m_Player->GetOutput(i));
00713
00714 for (unsigned int i = 0; i < m_PointSetFilter->GetNumberOfOutputs(); i++)
00715 {
00716 mitk::PointSet::Pointer p = m_PointSetFilter->GetOutput(i);
00717 assert(p);
00718
00719 mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New();
00720 pointSetNode->SetData(p);
00721 pointSetNode->SetName(QString("Trajectory of Output %1").arg(i).toLatin1());
00722 mitk::Color color;
00723 color.Set(0.25 * i, 1 - 0.25 * i, 0.5);
00724 pointSetNode->SetColor(color);
00725 pointSetNode->SetProperty("contourcolor", mitk::ColorProperty::New(color));
00726 pointSetNode->SetProperty("pointsize", mitk::FloatProperty::New(10.0));
00727 pointSetNode->SetProperty("contoursize", mitk::FloatProperty::New(5.0));
00728 pointSetNode->SetBoolProperty("show contour", true);
00729
00730 this->GetDefaultDataStorage()->Add(pointSetNode);
00731 out->append(QString("Creating Pointset %1 for replay visualization").arg(i));
00732 }
00733
00734 m_PlayingTimer->start(100);
00735 out->append("starting replay");
00736 m_Controls->m_PlayingButtonToggle->setText(QString("Stop Replaying Test"));
00737
00738 }
00739 }
00740
00741
00742 void QmitkIGTExampleView::OnPlaying()
00743 {
00744 m_PointSetFilter->Update();
00745 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget4->GetRenderWindow())->RequestUpdate();
00746 mitk::StatusBar::GetInstance()->DisplayText("Replaying tracking data now", 75);
00747 }
00748
00749
00750 void QmitkIGTExampleView::OnShowErrorPlot()
00751 {
00752 if (m_Displacer.IsNull())
00753 {
00754 out->append("You have to click on 'Start MITK-IGT-Navigation Test' first");
00755 return;
00756 }
00757
00758 m_Controls->m_ErrorPlot->SetPlotTitle("Error Values of tool 1");
00759 m_Controls->m_ErrorPlot->SetAxisTitle( QwtPlot::xBottom, "Timestamp" );
00760 m_Controls->m_ErrorPlot->SetAxisTitle( QwtPlot::yLeft, "Error" );
00761 int curveId = m_Controls->m_ErrorPlot->InsertCurve( "Error value of tool 1" );
00762 m_Controls->m_ErrorPlot->SetCurvePen( curveId, QPen( Qt::red ) );
00763 m_XValues.clear();
00764 m_YValues.clear();
00765 m_Controls->m_ErrorPlot->setEnabled(true);
00766 m_Controls->m_ErrorPlot->show();
00767
00768 m_Controls->m_ErrorBar->setMinimum(0);
00769 m_Controls->m_ErrorBar->setMaximum(100);
00770 m_Controls->m_ErrorBar->setTextVisible (false);
00771
00772 m_Controls->m_ErrorBar->reset();
00773
00774
00775 m_MessageFilter = mitk::NavigationDataToMessageFilter::New();
00776 m_MessageFilter->SetInput(m_Displacer->GetOutput());
00777
00778
00779 m_MessageFilter->AddErrorChangedListener(mitk::MessageDelegate2<QmitkIGTExampleView, mitk::NavigationData::CovarianceMatrixType, unsigned int>(this, &QmitkIGTExampleView::OnErrorValueChanged));
00780 }
00781
00782
00783 void QmitkIGTExampleView::OnErrorValueChanged(mitk::NavigationData::CovarianceMatrixType v, unsigned int )
00784 {
00785
00786 mitk::ScalarType errorValue = 0.0;
00787 for (unsigned int i = 0; i < v.ColumnDimensions; ++i)
00788 for (unsigned int j = 0; j < v.RowDimensions; ++j)
00789 errorValue += v(i, j);
00790
00791 if ((m_MessageFilter.IsNotNull()) && (m_MessageFilter->GetOutput() != NULL))
00792 {
00793 mitk::ScalarType timeValue = m_MessageFilter->GetOutput()->GetTimeStamp();
00794 m_XValues.push_back(timeValue);
00795 m_YValues.push_back(errorValue);
00796
00797 m_Controls->m_ErrorPlot->SetCurveData( 0, m_XValues, m_YValues );
00798 m_Controls->m_ErrorPlot->Replot();
00799 }
00800
00801 mitk::ScalarType progressClampError = (errorValue < 1.0) ? errorValue* 100 : 100;
00802 m_Controls->m_ErrorBar->setValue(progressClampError);
00803
00804 }
00805
00806
00807 void QmitkIGTExampleView::OnTrackingDeviceTextChanged( const QString & )
00808 {
00809 if (m_Controls->m_TrackingDevice->currentText() == "NDI Polaris")
00810 {
00811 m_Controls->m_LoadToolBtn->setEnabled(true);
00812 m_Controls->m_ToolFileName->setEnabled(true);
00813 m_Controls->m_PortLabel->setEnabled(true);
00814 m_Controls->m_Port->setEnabled(true);
00815 }
00816 else if (m_Controls->m_TrackingDevice->currentText() == "NDI Aurora")
00817 {
00818 m_Controls->m_LoadToolBtn->setEnabled(false);
00819 m_Controls->m_ToolFileName->setEnabled(false);
00820 m_Controls->m_PortLabel->setEnabled(true);
00821 m_Controls->m_Port->setEnabled(true);
00822 }
00823 else if (m_Controls->m_TrackingDevice->currentText() == "Micron Tracker")
00824 {
00825 m_Controls->m_LoadToolBtn->setEnabled(true);
00826 m_Controls->m_ToolFileName->setEnabled(true);
00827 m_Controls->m_PortLabel->setEnabled(false);
00828 m_Controls->m_Port->setEnabled(false);
00829 }
00830 else
00831 {
00832 m_Controls->m_LoadToolBtn->setEnabled(false);
00833 m_Controls->m_ToolFileName->setEnabled(false);
00834 m_Controls->m_PortLabel->setEnabled(false);
00835 m_Controls->m_Port->setEnabled(false);
00836 }
00837 }