diff --git a/Modules/Bundles/org.mitk.gui.qt.igttoolpairnavigation/src/internal/QmitkToolPairNavigationView.cpp b/Modules/Bundles/org.mitk.gui.qt.igttoolpairnavigation/src/internal/QmitkToolPairNavigationView.cpp index d388fe4318..beef1cf981 100644 --- a/Modules/Bundles/org.mitk.gui.qt.igttoolpairnavigation/src/internal/QmitkToolPairNavigationView.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.igttoolpairnavigation/src/internal/QmitkToolPairNavigationView.cpp @@ -1,400 +1,398 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date: 2009-05-28 17:19:30 +0200 (Do, 28 Mai 2009) $ Version: $Revision: 17495 $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkToolPairNavigationView.h" #include "QmitkNDIConfigurationWidget.h" #include "QmitkUpdateTimerWidget.h" #include "QmitkToolDistanceWidget.h" #include "mitkNodePredicateDataType.h" #include "QmitkDataStorageComboBox.h" #include "QmitkStdMultiWidget.h" #include #include #include #include #include #include #include #include #include #define WARN LOG_WARN("ToolPairNavigation") const std::string QmitkToolPairNavigationView::VIEW_ID = "org.mitk.views.toolpairnavigation"; QmitkToolPairNavigationView::QmitkToolPairNavigationView() : QmitkFunctionality(), m_MultiWidget(NULL) { } QmitkToolPairNavigationView::~QmitkToolPairNavigationView() { delete m_NDIConfigWidget; delete m_DistanceWidget; m_NDIConfigWidget = NULL; m_DistanceWidget = NULL; m_Source = NULL; m_Visualizer = NULL; m_CameraVisualizer = NULL; } void QmitkToolPairNavigationView::CreateQtPartControl(QWidget *parent) { // create GUI widgets m_Controls.setupUi(parent); this->CreateBundleWidgets(parent); this->CreateConnections(); } void QmitkToolPairNavigationView::CreateBundleWidgets(QWidget* parent) { //get default data storage //mitk::DataStorage* ds = this->GetDefaultDataStorage(); //instanciate widget m_NDIConfigWidget = new QmitkNDIConfigurationWidget(parent); m_DistanceWidget = new QmitkToolDistanceWidget(parent); // removes all placeholder tabs from the toolbox that where created in the qt designer before int tabnr = this->m_Controls.m_ToolBox->count(); for(int i=0; i < tabnr ;i++) { this->m_Controls.m_ToolBox->removeItem(0); } // inserts this bundle's widgets into the toolbox this->m_Controls.m_ToolBox->insertItem(0,m_NDIConfigWidget,QString("Configuration")); this->m_Controls.m_ToolBox->insertItem(1,m_DistanceWidget,QString("Distances")); - - } void QmitkToolPairNavigationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) { m_MultiWidget = &stdMultiWidget; } void QmitkToolPairNavigationView::StdMultiWidgetNotAvailable() { m_MultiWidget = NULL; } void QmitkToolPairNavigationView::CreateConnections() { connect( m_NDIConfigWidget, SIGNAL(Connected()), this, SLOT(SetNavigationUp())); connect( m_NDIConfigWidget, SIGNAL(Connected()), this->m_Controls.m_RenderingTimerWidget, SLOT(EnableWidget())); connect( m_NDIConfigWidget, SIGNAL(Disconnected()), this, SLOT(Disconnected())); connect( m_NDIConfigWidget, SIGNAL(Disconnected()), this->m_Controls.m_RenderingTimerWidget, SLOT(DisableWidget())); //to be implemented for tool name changig e.g. // connect(m_NDIConfigWidget, SIGNAL(ToolsChanged()), this, SLOT(ToolsChanged())); } void QmitkToolPairNavigationView::Activated() { QmitkFunctionality::Activated(); //switch to 3D rendering mode in Widget3 m_LastMapperIDWidget3 = mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->GetMapperID(); mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->SetMapperID(2); mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget2->GetRenderWindow())->SetMapperID(2); } void QmitkToolPairNavigationView::Deactivated() { QmitkFunctionality::Deactivated(); //switch back cameravisualization view in Widget3 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->SetMapperID(m_LastMapperIDWidget3); mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget2->GetRenderWindow())->SetMapperID(1); } void QmitkToolPairNavigationView::Disconnected() { if(m_Controls.m_RenderingTimerWidget != NULL) { this->m_Controls.m_RenderingTimerWidget->StopTimer(); } if(m_Source.IsNotNull() && m_Source->IsTracking()) { this->m_Source->StopTracking(); } this->DestroyIGTPipeline(); this->RemoveVisualizationObjects(this->GetDefaultDataStorage()); if(this->m_DistanceWidget != NULL) this->m_DistanceWidget->ClearDistanceMatrix(); } void QmitkToolPairNavigationView::ToolsAdded( QStringList /*tools*/ ) { } void QmitkToolPairNavigationView::SetNavigationUp() { if (m_Source.IsNotNull()) if (m_Source->IsTracking()) return; mitk::DataStorage* ds = this->GetDefaultDataStorage(); if (ds == NULL) { QMessageBox::warning(NULL, "ToolPairNavigation: Error", "can not access DataStorage. Navigation not possible"); return; } //1. build up the filter pipeline try { this->SetupIGTPipeline(); } catch(std::exception& e) { QMessageBox::warning(NULL, "ToolPairNavigation: Error", QString("Error while building the IGT-Pipeline: %1").arg(e.what())); this->DestroyIGTPipeline(); return; } catch (...) { QMessageBox::warning(NULL, "ToolPairNavigation: Error", QString("Error while building the IGT-Pipeline.")); this->DestroyIGTPipeline(); return; } //2. start IGT pipeline to display tracking devices (20 Hz update rate -> 50 msec timeout) try { // setup for the bundle's update timer widget m_Controls.m_RenderingTimerWidget->SetPurposeLabelText(QString("Navigation")); m_Controls.m_RenderingTimerWidget->SetTimerInterval( 50 ); connect( m_Controls.m_RenderingTimerWidget->GetUpdateTimer() , SIGNAL(timeout()) , this, SLOT (RenderScene()) ); connect( m_Controls.m_RenderingTimerWidget, SIGNAL(Started()), this, SLOT(StartNavigation())); connect( m_Controls.m_RenderingTimerWidget, SIGNAL(Stopped()) , this, SLOT (StopNavigation())); connect( m_Controls.m_RenderingTimerWidget, SIGNAL(Stopped()) , m_DistanceWidget, SLOT (SetDistanceLabelValuesInvalid())); } catch(std::exception& e) { QMessageBox::warning(NULL, "ToolPairNavigation: Error", QString("Error while starting the IGT-Pipeline: %1").arg(e.what())); this->m_Controls.m_RenderingTimerWidget->StopTimer(); this->DestroyIGTPipeline(); return; } } void QmitkToolPairNavigationView::StartNavigation() { if(m_Source.IsNotNull() && !m_Source->IsTracking()) { m_Source->StartTracking(); // creates the matrix with distances from the tracking source's outputs m_DistanceWidget->CreateToolDistanceMatrix(m_Source->GetOutputs()); } } // is for tool changing events, like name changes void QmitkToolPairNavigationView::ToolsChanged() { } void QmitkToolPairNavigationView::StopNavigation() { if(m_Source.IsNotNull() && m_Source->IsTracking()) { m_Source->StopTracking(); } } void QmitkToolPairNavigationView::SetupIGTPipeline() { mitk::DataStorage* ds = this->GetDefaultDataStorage(); // check if dataStorage is available if (ds == NULL) throw std::invalid_argument("DataStorage not available"); mitk::TrackingDevice::Pointer tracker = m_NDIConfigWidget->GetTracker(); // get current tracker from the configuration widget if (tracker.IsNull()) // check if tracker is valid throw std::invalid_argument("tracking device is NULL."); m_Source = mitk::TrackingDeviceSource::New(); // create a new source for the IGT filter pipeline m_Source->SetTrackingDevice(tracker); // set the found tracker to the source m_Visualizer = mitk::NavigationDataObjectVisualizationFilter::New(); // filter to display NDs m_CameraVisualizer = mitk::CameraVisualization::New(); //set widget 3 m_CameraVisualizer->SetRenderer(mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())); //set viewing direction mitk::Vector3D viewVector; mitk::FillVector3D( viewVector, 0.0, 0.0, 1.0 ); m_CameraVisualizer->SetDirectionOfProjectionInToolCoordinates(viewVector); /* prepare visualization objects and filter */ for (unsigned int i = 0; i < m_Source->GetNumberOfOutputs(); ++i) //for each connected tool { m_Visualizer->SetInput(i, m_Source->GetOutput(i)); // set input for visualization filter const char* toolName = tracker->GetTool(i)->GetToolName(); mitk::DataNode::Pointer toolrepresentationNode = ds->GetNamedNode(toolName); if (toolrepresentationNode.IsNull()) { //the first tool represents the tool to guide //it will be represented as cone wheras the target tools will be represented by a sphere if (i<1) //tool to guide { toolrepresentationNode = this->CreateConeAsInstrumentVisualization(toolName); m_CameraVisualizer->SetInput(m_Source->GetOutput(i)); } else toolrepresentationNode = this->CreateSphereAsInstrumentVisualization(toolName); ds->Add(toolrepresentationNode); } m_Visualizer->SetRepresentationObject(i, toolrepresentationNode->GetData()); // set instrument nodes as baseData for visualisation filter } } void QmitkToolPairNavigationView::DestroyIGTPipeline() { if (m_Source.IsNotNull()) { m_Source->StopTracking(); m_Source->Disconnect(); m_Source = NULL; } m_Visualizer = NULL; m_CameraVisualizer = NULL; } mitk::DataNode::Pointer QmitkToolPairNavigationView::CreateConeAsInstrumentVisualization(const char* label) { //new data mitk::Cone::Pointer activeToolData = mitk::Cone::New(); vtkConeSource* vtkData = vtkConeSource::New(); vtkData->SetRadius(3.0); vtkData->SetHeight(6.0); vtkData->SetDirection(0.0, 0.0, 1.0); //(0.0, 0.0, -1.0) for 5DoF vtkData->SetCenter(0.0, 0.0, 0.0); vtkData->SetResolution(20); vtkData->CappingOn(); vtkData->Update(); activeToolData->SetVtkPolyData(vtkData->GetOutput()); vtkData->Delete(); //new node mitk::DataNode::Pointer coneNode = mitk::DataNode::New(); coneNode->SetData(activeToolData); coneNode->GetPropertyList()->SetProperty("name", mitk::StringProperty::New ( label ) ); coneNode->GetPropertyList()->SetProperty("layer", mitk::IntProperty::New(0)); coneNode->GetPropertyList()->SetProperty("visible",mitk::BoolProperty::New(true)); //don't display in widget 3 (3D camera view) coneNode->SetVisibility(false, mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())); coneNode->SetColor(1.0,0.0,0.0);//red coneNode->SetOpacity(0.7); coneNode->Modified(); return coneNode; } mitk::DataNode::Pointer QmitkToolPairNavigationView::CreateSphereAsInstrumentVisualization(const char* label) { //new data mitk::Ellipsoid::Pointer activeToolData = mitk::Ellipsoid::New(); vtkSphereSource *vtkData = vtkSphereSource::New(); vtkData->SetRadius(1.0f); vtkData->SetCenter(0.0, 0.0, 0.0); vtkData->Update(); activeToolData->SetVtkPolyData(vtkData->GetOutput()); vtkData->Delete(); //new node mitk::DataNode::Pointer sphereNode = mitk::DataNode::New(); sphereNode->SetData(activeToolData); sphereNode->GetPropertyList()->SetProperty("name", mitk::StringProperty::New ( label ) ); sphereNode->GetPropertyList()->SetProperty("layer", mitk::IntProperty::New(0)); sphereNode->GetPropertyList()->SetProperty("visible",mitk::BoolProperty::New(true)); sphereNode->SetColor(0.0,1.0,0.0);//green sphereNode->SetOpacity(1.0); sphereNode->Modified(); return sphereNode; } void QmitkToolPairNavigationView::RenderScene() { try { if (m_Visualizer.IsNull() || m_CameraVisualizer.IsNull() || this->GetActiveStdMultiWidget() == NULL) return; try { m_Visualizer->Update(); m_CameraVisualizer->Update(); //every tenth update static int counter = 0; if (counter > 9) { this->m_DistanceWidget->ShowDistanceValues(m_Source->GetOutputs()); counter = 0; } else counter++; } catch(std::exception& e) { std::cout << "Exception during QmitkToolPairNavigationView::RenderScene():" << e.what() << "\n"; } //update all Widgets mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_3DWINDOWS); } catch (std::exception& e) { std::cout << "RenderAll exception: " << e.what() << "\n"; } catch (...) { std::cout << "RenderAll unknown exception\n"; } } void QmitkToolPairNavigationView::RemoveVisualizationObjects( mitk::DataStorage* ds ) { if (ds != NULL) ds->Remove(ds->GetSubset(mitk::NodePredicateProperty::New("ToolPairNavigation", mitk::BoolProperty::New(true)))); // remove all objects that have the ToolPairNavigation tag } diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/files.cmake b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/files.cmake index f03425dbf4..d7b3204340 100644 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/files.cmake +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/files.cmake @@ -1,43 +1,45 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES mitkPluginActivator.cpp - IGTTrackingLabView.cpp + QmitkIGTTrackingLabView.cpp ) set(UI_FILES - src/internal/IGTTrackingLabViewControls.ui + src/internal/QmitkIGTTrackingLabViewControls.ui ) set(MOC_H_FILES src/internal/mitkPluginActivator.h - src/internal/IGTTrackingLabView.h + src/internal/QmitkIGTTrackingLabView.h ) # list of resource files which can be used by the plug-in # system without loading the plug-ins shared library, # for example the icon used in the menu and tabs for the # plug-in views in the workbench set(CACHED_RESOURCE_FILES - resources/icon.xpm + resources/icon.png + resources/start_rec.png + resources/stop_rec.png plugin.xml ) # list of Qt .qrc files which contain additional resources # specific to this plugin set(QRC_FILES - + resources/QmitkIGTTrackingLabView.qrc ) set(CPP_FILES ) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/plugin.xml b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/plugin.xml index b3f429d8bf..7d8e134a7a 100644 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/plugin.xml +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/plugin.xml @@ -1,11 +1,11 @@ + class="QmitkIGTTrackingLabView" + icon="resources/icon.png" /> diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/QmitkIGTTrackingLabView.qrc b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/QmitkIGTTrackingLabView.qrc new file mode 100644 index 0000000000..006e0870fd --- /dev/null +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/QmitkIGTTrackingLabView.qrc @@ -0,0 +1,6 @@ + + + start_rec.png + stop_rec.png + + diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.png b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.png index 96251cf563..20a4b28b8f 100644 Binary files a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.png and b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.png differ diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.xpm b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.xpm deleted file mode 100644 index 9057c20bc6..0000000000 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/icon.xpm +++ /dev/null @@ -1,21 +0,0 @@ -/* XPM */ -static const char * icon_xpm[] = { -"16 16 2 1", -" c #FF0000", -". c #000000", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/start_rec.png b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/start_rec.png new file mode 100644 index 0000000000..ab4fcb18ed Binary files /dev/null and b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/start_rec.png differ diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/stop_rec.png b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/stop_rec.png new file mode 100644 index 0000000000..f127ab20b2 Binary files /dev/null and b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/resources/stop_rec.png differ diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabView.cpp b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabView.cpp deleted file mode 100644 index 810e924240..0000000000 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabView.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/*========================================================================= - -Program: Medical Imaging & Interaction Toolkit -Language: C++ -Date: $Date$ -Version: $Revision$ - -Copyright (c) German Cancer Research Center, Division of Medical and -Biological Informatics. All rights reserved. -See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - - -// Blueberry -#include -#include - -// Qmitk -#include "IGTTrackingLabView.h" -#include "QmitkStdMultiWidget.h" - -#include -#include -#include -#include - - -#include - -#include -#include -#include -#include - -// Qt -#include - - -const std::string IGTTrackingLabView::VIEW_ID = "org.mitk.views.igttrackinglab"; - -IGTTrackingLabView::IGTTrackingLabView() -: QmitkFunctionality() -,m_Source(NULL) -,m_FiducialRegistrationFilter(NULL) -,m_Visualizer(NULL) -,m_RegistrationTrackingFiducialsFilter(NULL) -,m_RegistrationTrackingFiducialsName("Tracking Fiducials") -,m_RegistrationImageFiducialsName("Image Fiducials") -{ -} - -IGTTrackingLabView::~IGTTrackingLabView() -{ -} - -void IGTTrackingLabView::CreateQtPartControl( QWidget *parent ) -{ - // create GUI widgets from the Qt Designer's .ui file - m_Controls.setupUi( parent ); - - m_ToolBox = new QToolBox(parent); - m_Controls.m_VBoxLayout->addWidget(m_ToolBox); - - - this->CreateBundleWidgets( parent ); - - -} - - -void IGTTrackingLabView::CreateBundleWidgets( QWidget* parent ) -{ - // configuration widget - m_NDIConfigWidget = new QmitkNDIConfigurationWidget(parent); - m_NDIConfigWidget->SetToolTypes(QStringList () << "Instrument" << "Fiducial" << "Skinmarker" << "Unknown" ); - - m_ToolBox->addItem(m_NDIConfigWidget, "Configuration"); - - // registration widget - m_RegistrationWidget = new QmitkFiducialRegistrationWidget(parent); - m_RegistrationWidget->HideStaticRegistrationRadioButton(true); - m_RegistrationWidget->HideContinousRegistrationRadioButton(true); - //m_RegistrationWidget->HideUseICPRegistrationCheckbox(true); - m_RegistrationWidget->SetQualityDisplayText("FRE"); - - m_ToolBox->addItem(m_RegistrationWidget, "Registration"); - - - - // tracking status - m_ToolStatusWidget = new QmitkToolTrackingStatusWidget( parent ); - - m_Controls.m_VBoxLayout->addWidget(m_ToolStatusWidget); - - // update timer - m_RenderingTimerWidget = new QmitkUpdateTimerWidget( parent ); - m_RenderingTimerWidget->SetPurposeLabelText(QString("Navigation")); - m_RenderingTimerWidget->SetTimerInterval( 50 ); // set rendering timer at 20Hz (updating every 50msec) - - m_Controls.m_VBoxLayout->addWidget(m_RenderingTimerWidget); - -} - - -void IGTTrackingLabView::CreateConnections() -{ - connect( m_NDIConfigWidget, SIGNAL(Connected()), m_RenderingTimerWidget, SLOT(EnableWidget()) ); - connect( m_NDIConfigWidget, SIGNAL(Disconnected()), this, SLOT(OnTrackerDisconnected()) ); - connect( m_NDIConfigWidget, SIGNAL(Connected()), this, SLOT(OnSetupNavigation()) ); - connect( m_NDIConfigWidget, SIGNAL(SignalToolNameChanged(int, QString)), this, SLOT(OnChangeToolName(int, QString)) ); - connect( m_NDIConfigWidget, SIGNAL(SignalLoadTool(int, mitk::DataNode::Pointer)), this, SLOT(OnToolLoaded(int, mitk::DataNode::Pointer)) ); - - connect( m_RegistrationWidget, SIGNAL(AddedTrackingFiducial()), this, SLOT(OnAddRegistrationTrackingFiducial()) ); - connect( m_RegistrationWidget, SIGNAL(PerformFiducialRegistration()), this, SLOT(OnRegisterFiducials()) ); - - connect( m_RenderingTimerWidget, SIGNAL(Started()), this, SLOT(OnStartNavigation()) ); - connect( m_RenderingTimerWidget, SIGNAL(Stopped()), this, SLOT(OnStopNavigation()) ); - - -} - - -void IGTTrackingLabView::OnAddRegistrationTrackingFiducial() -{ - if (m_RegistrationTrackingFiducialsFilter.IsNull()) - { - std::string message( "IGT Pipeline is not ready. Please 'Start Navigation' before adding points"); - QMessageBox::warning(NULL, "Adding Fiducials not possible", message.c_str()); - return; - } - if (m_RegistrationTrackingFiducialsFilter->GetInput()->IsDataValid() == false) - { - std::string message("instrument can currently not be tracked. Please make sure that the instrument is visible to the tracker"); - QMessageBox::warning(NULL, "Adding Fiducials not possible", message.c_str()); - return; - } - m_RegistrationTrackingFiducialsFilter->Update(); -} - -void IGTTrackingLabView::OnSetupNavigation() -{ - if(m_Source.IsNotNull()) - if(m_Source->IsTracking()) - return; - - mitk::DataStorage* ds = this->GetDefaultDataStorage(); - if(ds == NULL) - { - QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "can not access DataStorage. Navigation not possible"); - return; - } - - // Building up the filter pipeline - try - { - this->SetupIGTPipeline(); - - } - catch(std::exception& e) - { - QMessageBox::warning(NULL, QString("IGTSurfaceTracker: Error"), QString("Error while building the IGT-Pipeline: %1").arg(e.what())); - this->DestroyIGTPipeline(); // destroy the pipeline if building is incomplete - return; - } - catch(...) - { - QMessageBox::warning(NULL, QString("IGTSurfaceTracker: Error"), QString("Error while building the IGT-Pipeline")); - this->DestroyIGTPipeline(); - return; - } -} - -void IGTTrackingLabView::SetupIGTPipeline() -{ - mitk::DataStorage* ds = this->GetDefaultDataStorage(); // check if DataStorage is available - if(ds == NULL) - throw std::invalid_argument("DataStorage is not available"); - - mitk::TrackingDevice::Pointer tracker = m_NDIConfigWidget->GetTracker(); // get current tracker from configuration widget - if(tracker.IsNull()) // check if tracker is valid - throw std::invalid_argument("tracking device is NULL!"); - - m_Source = mitk::TrackingDeviceSource::New(); // create new source for the IGT-Pipeline - m_Source->SetTrackingDevice(tracker); // set the found tracker from the configuration widget to the source - - this->InitializeFilters(); // initialize all needed filters - - for (unsigned int i=0; i < m_Source->GetNumberOfOutputs(); ++i) - { - m_FiducialRegistrationFilter->SetInput(i, m_Source->GetOutput(i)); // set input for registration filter - m_Visualizer->SetInput(i, m_FiducialRegistrationFilter->GetOutput(i)); // set input for visualization filter - } - - for(unsigned int i= 0; i < m_Visualizer->GetNumberOfOutputs(); ++i) - { - const char* toolName = tracker->GetTool(i)->GetToolName(); - - mitk::DataNode::Pointer representation = this->CreateInstrumentVisualization(this->GetDefaultDataStorage(), toolName); - m_Visualizer->SetRepresentationObject(i, representation->GetData()); - } - - // this->CreateInstrumentVisualization(ds, tracker);//create for each single connected ND a corresponding 3D representation -} - -void IGTTrackingLabView::InitializeFilters() -{ - //1. Fiducial Registration Filters - m_FiducialRegistrationFilter = mitk::NavigationDataLandmarkTransformFilter::New(); // filter used for initial fiducial registration - - //2. Visualization Filter - m_Visualizer = mitk::NavigationDataObjectVisualizationFilter::New(); // filter to display NavigationData -} - -void IGTTrackingLabView::OnRegisterFiducials( ) -{ - /* filter pipeline can only be build, if source and visualization filters exist */ - if (m_Source.IsNull() || m_Visualizer.IsNull() || m_FiducialRegistrationFilter.IsNull()) - { - QMessageBox::warning(NULL, "Registration not possible", "Navigation pipeline is not ready. Please (re)start the navigation"); - return; - } - if (m_Source->IsTracking() == false) - { - QMessageBox::warning(NULL, "Registration not possible", "Registration only possible if navigation is running"); - return; - } - - /* retrieve fiducials from data storage */ - mitk::DataStorage* ds = this->GetDefaultDataStorage(); - mitk::PointSet::Pointer imageFiducials = ds->GetNamedObject(m_RegistrationImageFiducialsName.c_str()); - mitk::PointSet::Pointer trackerFiducials = ds->GetNamedObject(m_RegistrationTrackingFiducialsName.c_str()); - if (imageFiducials.IsNull() || trackerFiducials.IsNull()) - { - QMessageBox::warning(NULL, "Registration not possible", "Fiducial data objects not found. \n" - "Please set 3 or more fiducials in the image and with the tracking system.\n\n" - "Registration is not possible"); - return; - } - - unsigned int minFiducialCount = 3; // \Todo: move to view option - if ((imageFiducials->GetSize() < minFiducialCount) || (trackerFiducials->GetSize() < minFiducialCount) - || (imageFiducials->GetSize() != trackerFiducials->GetSize())) - { - QMessageBox::warning(NULL, "Registration not possible", QString("Not enough fiducial pairs found. At least %1 fiducial must " - "exist for the image and the tracking system respectively.\n" - "Currently, %2 fiducials exist for the image, %3 fiducials exist for the tracking system").arg(minFiducialCount).arg(imageFiducials->GetSize()).arg(trackerFiducials->GetSize())); - return; - } - - /* now we have two PointSets with enough points to perform a landmark based transform */ - if ( m_RegistrationWidget->UseICPIsChecked() ) - m_FiducialRegistrationFilter->UseICPInitializationOn(); - else - m_FiducialRegistrationFilter->UseICPInitializationOff(); - - m_FiducialRegistrationFilter->SetSourceLandmarks(trackerFiducials); - m_FiducialRegistrationFilter->SetTargetLandmarks(imageFiducials); - -} - - -void IGTTrackingLabView::OnTrackerDisconnected() -{ - m_RenderingTimerWidget->DisableWidget(); - //this->DestroyInstrumentVisualization(this->GetDefaultDataStorage(), m_NDIConfigWidget->GetTracker()); -} - - -mitk::DataNode::Pointer IGTTrackingLabView::CreateInstrumentVisualization(mitk::DataStorage* ds, const char* toolName) -{ - //const char* toolName = tracker->GetTool(i)->GetToolName(); - mitk::DataNode::Pointer toolRepresentationNode; - toolRepresentationNode = ds->GetNamedNode(toolName); // check if node with same name already exists - - if(toolRepresentationNode.IsNotNull()) - ds->Remove(toolRepresentationNode); // remove old node with same name - - toolRepresentationNode = this->CreateConeRepresentation( toolName ); - // m_Visualizer->SetRepresentationObject(i, toolRepresentationNode->GetData()); - - ds->Add(toolRepresentationNode); // adds node to data storage - - return toolRepresentationNode; -} - - -mitk::DataNode::Pointer IGTTrackingLabView::CreateConeRepresentation( const char* label ) -{ - - //new data - mitk::Cone::Pointer activeToolData = mitk::Cone::New(); - vtkConeSource* vtkData = vtkConeSource::New(); - - vtkData->SetRadius(7.5); - vtkData->SetHeight(15.0); - vtkData->SetDirection(0.0, 0.0, 1.0); - vtkData->SetCenter(0.0, 0.0, 0.0); - vtkData->SetResolution(20); - vtkData->CappingOn(); - vtkData->Update(); - activeToolData->SetVtkPolyData(vtkData->GetOutput()); - vtkData->Delete(); - - //new node - mitk::DataNode::Pointer coneNode = mitk::DataNode::New(); - coneNode->SetData(activeToolData); - coneNode->GetPropertyList()->SetProperty("name", mitk::StringProperty::New( label )); - coneNode->GetPropertyList()->SetProperty("layer", mitk::IntProperty::New(0)); - coneNode->GetPropertyList()->SetProperty("visible", mitk::BoolProperty::New(true)); - coneNode->SetColor(1.0,0.0,0.0); - coneNode->SetOpacity(0.85); - coneNode->Modified(); - - return coneNode; -} - -void IGTTrackingLabView::DestroyIGTPipeline() -{ - if(m_Source.IsNotNull()) - { - m_Source->StopTracking(); - m_Source->Disconnect(); - m_Source = NULL; - } -} - -void IGTTrackingLabView::OnChangeToolName(int index, QString name) -{ - if(m_Source.IsNull()) - return; - - mitk::DataStorage* ds = this->GetDefaultDataStorage(); - if(ds == NULL) - { - QMessageBox::warning(NULL,"DataStorage Access Error", "Could not access DataStorage. Tool Name can not be changed!"); - return; - } - - mitk::NavigationData::Pointer tempND = m_Source->GetOutput(index); - if(tempND.IsNull()) - return; - - const char* oldName = tempND->GetName(); - - mitk::DataNode::Pointer tempNode = ds->GetNamedNode(oldName); - - if(tempNode.IsNotNull()) - { - tempNode->SetName(name.toStdString().c_str()); - tempND->SetName(name.toStdString().c_str()); - } - else - QMessageBox::warning(NULL, "Rename Tool Error", "Couldn't find the corresponding tool for changing it's name!"); -} - -void IGTTrackingLabView::OnToolLoaded(int index, mitk::DataNode::Pointer toolNode) -{ - if(m_Source.IsNull() || m_Visualizer.IsNull()) - return; - - mitk::DataStorage* ds = this->GetDefaultDataStorage(); - if(ds == NULL) - { - QMessageBox::warning(NULL,"DataStorage Access Error", "Could not access DataStorage. Loaded tool representation can not be shown!"); - return; - } - - mitk::NavigationData::Pointer tempND = m_Source->GetOutput(index); - if(tempND.IsNull()) - return; - - // try to find DataNode for tool in DataStorage - const char* toolName = tempND->GetName(); - mitk::DataNode::Pointer tempNode = ds->GetNamedNode(toolName); - - if(tempNode.IsNull()) - { - tempNode = mitk::DataNode::New(); // create new node, if none was found - ds->Add(tempNode); - } - - tempNode->SetData(toolNode->GetData()); - tempNode->SetName(toolNode->GetName()); - - m_Visualizer->SetRepresentationObject(index, tempNode->GetData()); - m_Visualizer->Update(); - //this->GlobalReinit(); -} - -void IGTTrackingLabView::OnStartNavigation() -{ - if(m_Source.IsNull()) - { - QMessageBox::warning(NULL, "IGTTrackingLab: Error", "can not access tracking source. Navigation not possible"); - return; - } - - if(!m_Source->IsTracking()) - { - m_Source->StartTracking(); - - try - { - m_RenderingTimerWidget->GetTimerInterval(); - this->StartContinuousUpdate(); // start tracker with set interval - - for(unsigned int i = 0; i < m_Source->GetNumberOfOutputs(); i++) // add navigation data to bundle widgets - { - m_ToolStatusWidget->AddNavigationData(dynamic_cast(m_Source->GetOutputs().at(i).GetPointer())); - } - - m_ToolStatusWidget->ShowStatusLabels(); // show status for every tool if ND is valid or not - //m_IGTPlayerWidget->setEnabled(true); - } - catch(...) - { - //m_IGTPlayerWidget->setDisabled(true); - this->StopContinuousUpdate(); - this->DestroyIGTPipeline(); - return; - } - - - } -} - - -void IGTTrackingLabView::StopContinuousUpdate() -{ - if (this->m_RenderingTimerWidget->GetUpdateTimer() != NULL) - { - m_RenderingTimerWidget->StopTimer(); - disconnect( (QTimer*) m_RenderingTimerWidget->GetUpdateTimer(), SIGNAL(timeout()), this, SLOT(RenderScene()) ); // disconnect timer from RenderScene() method - } -} - -void IGTTrackingLabView::RenderScene( ) -{ - try - { - if (m_Visualizer.IsNull() || this->GetActiveStdMultiWidget() == NULL) - return; - try - { - if(m_Source.IsNotNull() && m_Source->IsTracking()) - m_ToolStatusWidget->Refresh(); - - m_Visualizer->Update(); - } - catch(std::exception& e) - { - MITK_WARN << "Exception during QmitkIGTTrackingLab::RenderScene():" << e.what() << "\n"; - } - - //update all Widgets - mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_3DWINDOWS); - } - catch (std::exception& e) - { - MITK_WARN << "RenderAll exception: " << e.what() << "\n"; - } - catch (...) - { - MITK_WARN << "RenderAll unknown exception\n"; - } -} - -void IGTTrackingLabView::StartContinuousUpdate( ) -{ - if (m_Source.IsNull() || m_Visualizer.IsNull() ) - throw std::invalid_argument("Pipeline is not set up correctly"); - - if (m_RenderingTimerWidget->GetUpdateTimer() == NULL) - return; - - else - { - connect( (QTimer*) m_RenderingTimerWidget->GetUpdateTimer(), SIGNAL(timeout()), this, SLOT(RenderScene()) ); // connect update timer to RenderScene() method - } -} - - - -void IGTTrackingLabView::OnStopNavigation() -{ - if(m_Source.IsNull()) - { - QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "can not access tracking source. Navigation not possible"); - return; - } - if(m_Source->IsTracking()) - { - m_Source->StopTracking(); - this->StopContinuousUpdate(); - m_ToolStatusWidget->RemoveStatusLabels(); - } -} - - - - - - - - - - - - - - - -//void IGTTrackingLabView::OnSelectionChanged( std::vector nodes ) -//{ -// // iterate all selected objects, adjust warning visibility -// for( std::vector::iterator it = nodes.begin(); -// it != nodes.end(); -// ++it ) -// { -// mitk::DataNode::Pointer node = *it; -// -// if( node.IsNotNull() && dynamic_cast(node->GetData()) ) -// { -// m_Controls.labelWarning->setVisible( false ); -// m_Controls.buttonPerformImageProcessing->setEnabled( true ); -// return; -// } -// } -// -// m_Controls.labelWarning->setVisible( true ); -// m_Controls.buttonPerformImageProcessing->setEnabled( false ); -//} - - diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabView.cpp b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabView.cpp new file mode 100644 index 0000000000..17ca31307c --- /dev/null +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabView.cpp @@ -0,0 +1,915 @@ +/*========================================================================= + +Program: Medical Imaging & Interaction Toolkit +Language: C++ +Date: $Date$ +Version: $Revision$ + +Copyright (c) German Cancer Research Center, Division of Medical and +Biological Informatics. All rights reserved. +See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. + +This software is distributed WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + + +// Blueberry +#include +#include + +// Qmitk +#include "QmitkIGTTrackingLabView.h" +#include "QmitkStdMultiWidget.h" + +#include +#include +#include +#include + + +#include +#include +#include + +#include +#include +#include +#include + +// Qt +#include +#include + + +const std::string QmitkIGTTrackingLabView::VIEW_ID = "org.mitk.views.igttrackinglab"; + +QmitkIGTTrackingLabView::QmitkIGTTrackingLabView() +: QmitkFunctionality() +,m_Source(NULL) +,m_FiducialRegistrationFilter(NULL) +,m_Visualizer(NULL) +,m_VirtualView(NULL) +,m_PSRecordingPointSet(NULL) +,m_RegistrationTrackingFiducialsName("Tracking Fiducials") +,m_RegistrationImageFiducialsName("Image Fiducials") +,m_PointSetRecordingDataNodeName("Recorded Points") +,m_PointSetRecording(false) +{ + + //[-1;0;0] for WOLF_6D bronchoscope + m_DirectionOfProjectionVector[0]=0; + m_DirectionOfProjectionVector[1]=0; + m_DirectionOfProjectionVector[2]=-1; +} + +QmitkIGTTrackingLabView::~QmitkIGTTrackingLabView() +{ +} + +void QmitkIGTTrackingLabView::CreateQtPartControl( QWidget *parent ) +{ + // create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi( parent ); + + m_ToolBox = new QToolBox(parent); + m_Controls.m_VBoxLayout->addWidget(m_ToolBox); + + + this->CreateBundleWidgets( parent ); + this->CreateConnections(); +} + + +void QmitkIGTTrackingLabView::CreateBundleWidgets( QWidget* parent ) +{ + // configuration widget + m_NDIConfigWidget = new QmitkNDIConfigurationWidget(parent); + m_NDIConfigWidget->SetToolTypes(QStringList () << "Instrument" << "Fiducial" << "Skinmarker" << "Unknown" ); + + m_ToolBox->addItem(m_NDIConfigWidget, "Configuration"); + + + // registration widget + m_RegistrationWidget = new QmitkFiducialRegistrationWidget(parent); + m_RegistrationWidget->HideStaticRegistrationRadioButton(true); + m_RegistrationWidget->HideContinousRegistrationRadioButton(true); + m_RegistrationWidget->HideUseICPRegistrationCheckbox(true); + + m_ToolBox->addItem(m_RegistrationWidget, "Registration"); + + // pointset recording + m_ToolBox->addItem(this->CreatePointSetRecordingWidget(parent), "PointSet Recording"); + + // virtual view + m_ToolBox->addItem(this->CreateVirtualViewWidget(parent), "Virtual Camera"); + + // tracking status + m_ToolStatusWidget = new QmitkToolTrackingStatusWidget( parent ); + + m_Controls.m_VBoxLayout->addWidget(m_ToolStatusWidget); + + // update timer + m_RenderingTimerWidget = new QmitkUpdateTimerWidget( parent ); + m_RenderingTimerWidget->SetPurposeLabelText(QString("Navigation")); + m_RenderingTimerWidget->SetTimerInterval( 50 ); // set rendering timer at 20Hz (updating every 50msec) + + m_Controls.m_VBoxLayout->addWidget(m_RenderingTimerWidget); + +} + + +void QmitkIGTTrackingLabView::CreateConnections() +{ + connect( m_ToolBox, SIGNAL(currentChanged(int)), this, SLOT(OnToolBoxCurrentChanged(int)) ); + + connect( m_NDIConfigWidget, SIGNAL(Connected()), m_RenderingTimerWidget, SLOT(EnableWidget()) ); + connect( m_NDIConfigWidget, SIGNAL(Disconnected()), this, SLOT(OnTrackerDisconnected()) ); + connect( m_NDIConfigWidget, SIGNAL(Connected()), this, SLOT(OnSetupNavigation()) ); + connect( m_NDIConfigWidget, SIGNAL(SignalToolNameChanged(int, QString)), this, SLOT(OnChangeToolName(int, QString)) ); + connect( m_NDIConfigWidget, SIGNAL(SignalLoadTool(int, mitk::DataNode::Pointer)), this, SLOT(OnToolLoaded(int, mitk::DataNode::Pointer)) ); + connect( m_NDIConfigWidget, SIGNAL(ToolsAdded(QStringList)), this, SLOT(OnToolsAdded(QStringList)) ); + connect( m_NDIConfigWidget, SIGNAL(RepresentationChanged( int ,mitk::Surface::Pointer )), this, SLOT(ChangeToolRepresentation( int, mitk::Surface::Pointer ))); + + connect( m_RegistrationWidget, SIGNAL(AddedTrackingFiducial()), this, SLOT(OnAddRegistrationTrackingFiducial()) ); + connect( m_RegistrationWidget, SIGNAL(PerformFiducialRegistration()), this, SLOT(OnRegisterFiducials()) ); + + connect( m_RenderingTimerWidget, SIGNAL(Started()), this, SLOT(OnStartNavigation()) ); + connect( m_RenderingTimerWidget, SIGNAL(Stopped()), this, SLOT(OnStopNavigation()) ); +} + + +void QmitkIGTTrackingLabView::OnAddRegistrationTrackingFiducial() +{ + + mitk::DataStorage* ds = this->GetDefaultDataStorage(); // check if DataStorage available + if(ds == NULL) + throw std::invalid_argument("DataStorage is not available"); + + if (m_FiducialRegistrationFilter.IsNull()) + { + std::string message( "IGT Pipeline is not ready. Please 'Start Navigation' before adding points"); + QMessageBox::warning(NULL, "Adding Fiducials not possible", message.c_str()); + return; + } + if (m_FiducialRegistrationFilter->GetInput()->IsDataValid() == false) + { + std::string message("instrument can currently not be tracked. Please make sure that the instrument is visible to the tracker"); + QMessageBox::warning(NULL, "Adding Fiducials not possible", message.c_str()); + return; + } + + mitk::NavigationData::Pointer nd = m_FiducialRegistrationFilter->GetOutput(0); + + if( nd.IsNull() || !nd->IsDataValid()) + QMessageBox::warning( 0, "Invalid tracking data", "Navigation data is not available or invalid!", QMessageBox::Ok ); + + mitk::PointSet::Pointer trackerFiducialsPS = ds->GetNamedObject(m_RegistrationTrackingFiducialsName); + + // in case the tracker fiducials datanode has been renamed or removed + if(trackerFiducialsPS.IsNull()) + { + mitk::DataNode::Pointer trackerFiducialsDN = mitk::DataNode::New(); + trackerFiducialsDN->SetName(m_RegistrationTrackingFiducialsName); + trackerFiducialsPS = mitk::PointSet::New(); + trackerFiducialsDN->SetData(trackerFiducialsPS); + m_RegistrationWidget->SetTrackerFiducialsNode(trackerFiducialsDN); + } + + trackerFiducialsPS->InsertPoint(trackerFiducialsPS->GetSize(), nd->GetPosition()); + +} + +void QmitkIGTTrackingLabView::OnSetupNavigation() +{ + if(m_Source.IsNotNull()) + if(m_Source->IsTracking()) + return; + + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + if(ds == NULL) + { + QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "can not access DataStorage. Navigation not possible"); + return; + } + + // Building up the filter pipeline + try + { + this->SetupIGTPipeline(); + + } + catch(std::exception& e) + { + QMessageBox::warning(NULL, QString("IGTSurfaceTracker: Error"), QString("Error while building the IGT-Pipeline: %1").arg(e.what())); + this->DestroyIGTPipeline(); // destroy the pipeline if building is incomplete + return; + } + catch(...) + { + QMessageBox::warning(NULL, QString("IGTSurfaceTracker: Error"), QString("Error while building the IGT-Pipeline")); + this->DestroyIGTPipeline(); + return; + } +} + +void QmitkIGTTrackingLabView::SetupIGTPipeline() +{ + mitk::DataStorage* ds = this->GetDefaultDataStorage(); // check if DataStorage is available + if(ds == NULL) + throw std::invalid_argument("DataStorage is not available"); + + mitk::TrackingDevice::Pointer tracker = m_NDIConfigWidget->GetTracker(); // get current tracker from configuration widget + if(tracker.IsNull()) // check if tracker is valid + throw std::invalid_argument("tracking device is NULL!"); + + m_Source = mitk::TrackingDeviceSource::New(); // create new source for the IGT-Pipeline + m_Source->SetTrackingDevice(tracker); // set the found tracker from the configuration widget to the source + + this->InitializeFilters(); // initialize all needed filters + + if(m_NDIConfigWidget->GetTracker()->GetType() == mitk::NDIAurora) + { + + for (unsigned int i=0; i < m_Source->GetNumberOfOutputs(); ++i) + { + m_FiducialRegistrationFilter->SetInput(i, m_Source->GetOutput(i)); // set input for registration filter + m_Visualizer->SetInput(i, m_FiducialRegistrationFilter->GetOutput(i)); // set input for visualization filter + } + + for(unsigned int i= 0; i < m_Visualizer->GetNumberOfOutputs(); ++i) + { + const char* toolName = tracker->GetTool(i)->GetToolName(); + + mitk::DataNode::Pointer representation = this->CreateInstrumentVisualization(this->GetDefaultDataStorage(), toolName); + m_PSRecToolSelectionComboBox->addItem(QString(toolName)); + m_VirtualViewToolSelectionComboBox->addItem(QString(toolName)); + m_Visualizer->SetRepresentationObject(i, representation->GetData()); + + } + + mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_ALL); + this->GlobalReinit(); + } + + // this->CreateInstrumentVisualization(ds, tracker);//create for each single connected ND a corresponding 3D representation +} + +void QmitkIGTTrackingLabView::InitializeFilters() +{ + //1. Fiducial Registration Filters + m_FiducialRegistrationFilter = mitk::NavigationDataLandmarkTransformFilter::New(); // filter used for initial fiducial registration + + //2. Visualization Filter + m_Visualizer = mitk::NavigationDataObjectVisualizationFilter::New(); // filter to display NavigationData + + //3. Virtual Camera + m_VirtualView = mitk::CameraVisualization::New(); // filter to update the vtk camera according to the reference navigation data +} + +void QmitkIGTTrackingLabView::OnRegisterFiducials( ) +{ + /* filter pipeline can only be build, if source and visualization filters exist */ + if (m_Source.IsNull() || m_Visualizer.IsNull() || m_FiducialRegistrationFilter.IsNull()) + { + QMessageBox::warning(NULL, "Registration not possible", "Navigation pipeline is not ready. Please (re)start the navigation"); + return; + } + if (m_Source->IsTracking() == false) + { + QMessageBox::warning(NULL, "Registration not possible", "Registration only possible if navigation is running"); + return; + } + + /* retrieve fiducials from data storage */ + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + + mitk::PointSet::Pointer imageFiducials = ds->GetNamedObject(m_RegistrationImageFiducialsName.c_str()); + mitk::PointSet::Pointer trackerFiducials = ds->GetNamedObject(m_RegistrationTrackingFiducialsName.c_str()); + if (imageFiducials.IsNull() || trackerFiducials.IsNull()) + { + QMessageBox::warning(NULL, "Registration not possible", "Fiducial data objects not found. \n" + "Please set 3 or more fiducials in the image and with the tracking system.\n\n" + "Registration is not possible"); + return; + } + + unsigned int minFiducialCount = 3; // \Todo: move to view option + if ((imageFiducials->GetSize() < minFiducialCount) || (trackerFiducials->GetSize() < minFiducialCount) + || (imageFiducials->GetSize() != trackerFiducials->GetSize())) + { + QMessageBox::warning(NULL, "Registration not possible", QString("Not enough fiducial pairs found. At least %1 fiducial must " + "exist for the image and the tracking system respectively.\n" + "Currently, %2 fiducials exist for the image, %3 fiducials exist for the tracking system").arg(minFiducialCount).arg(imageFiducials->GetSize()).arg(trackerFiducials->GetSize())); + return; + } + + /* now we have two PointSets with enough points to perform a landmark based transform */ + if ( m_RegistrationWidget->UseICPIsChecked() ) + m_FiducialRegistrationFilter->UseICPInitializationOn(); + else + m_FiducialRegistrationFilter->UseICPInitializationOff(); + + m_FiducialRegistrationFilter->SetSourceLandmarks(trackerFiducials); + m_FiducialRegistrationFilter->SetTargetLandmarks(imageFiducials); + + + if (m_FiducialRegistrationFilter.IsNotNull() && m_FiducialRegistrationFilter->IsInitialized()) // update registration quality display + { + QString registrationQuality = QString("%0: FRE is %1mm (Std.Dev. %2), \n" + "RMS error is %3mm,\n" + "Minimum registration error (best fitting landmark) is %4mm,\n" + "Maximum registration error (worst fitting landmark) is %5mm.") + .arg("Fiducial Registration") + .arg(m_FiducialRegistrationFilter->GetFRE(), 3, 'f', 3) + .arg(m_FiducialRegistrationFilter->GetFREStdDev(), 3, 'f', 3) + .arg(m_FiducialRegistrationFilter->GetRMSError(), 3, 'f', 3) + .arg(m_FiducialRegistrationFilter->GetMinError(), 3, 'f', 3) + .arg(m_FiducialRegistrationFilter->GetMaxError(), 3, 'f', 3); + m_RegistrationWidget->SetQualityDisplayText(registrationQuality); + } + + trackerFiducials->Clear(); + //this->GlobalReinit(); +} + + +void QmitkIGTTrackingLabView::OnTrackerDisconnected() +{ + m_RenderingTimerWidget->DisableWidget(); + this->DestroyInstrumentVisualization(this->GetDefaultDataStorage(), m_NDIConfigWidget->GetTracker()); +} + + +mitk::DataNode::Pointer QmitkIGTTrackingLabView::CreateInstrumentVisualization(mitk::DataStorage* ds, const char* toolName) +{ + //const char* toolName = tracker->GetTool(i)->GetToolName(); + mitk::DataNode::Pointer toolRepresentationNode; + toolRepresentationNode = ds->GetNamedNode(toolName); // check if node with same name already exists + + if(toolRepresentationNode.IsNotNull()) + ds->Remove(toolRepresentationNode); // remove old node with same name + + toolRepresentationNode = this->CreateConeRepresentation( toolName ); + // m_Visualizer->SetRepresentationObject(i, toolRepresentationNode->GetData()); + + ds->Add(toolRepresentationNode); // adds node to data storage + + return toolRepresentationNode; +} + + +mitk::DataNode::Pointer QmitkIGTTrackingLabView::CreateConeRepresentation( const char* label ) +{ + + //new data + mitk::Cone::Pointer activeToolData = mitk::Cone::New(); + vtkConeSource* vtkData = vtkConeSource::New(); + + vtkData->SetRadius(7.5); + vtkData->SetHeight(15.0); + vtkData->SetDirection(0.0, 0.0, 1.0); + vtkData->SetCenter(0.0, 0.0, 0.0); + vtkData->SetResolution(20); + vtkData->CappingOn(); + vtkData->Update(); + activeToolData->SetVtkPolyData(vtkData->GetOutput()); + vtkData->Delete(); + + //new node + mitk::DataNode::Pointer coneNode = mitk::DataNode::New(); + coneNode->SetData(activeToolData); + coneNode->GetPropertyList()->SetProperty("name", mitk::StringProperty::New( label )); + coneNode->GetPropertyList()->SetProperty("layer", mitk::IntProperty::New(0)); + coneNode->GetPropertyList()->SetProperty("visible", mitk::BoolProperty::New(true)); + coneNode->SetColor(1.0,0.0,0.0); + coneNode->SetOpacity(0.85); + coneNode->Modified(); + + return coneNode; +} + +void QmitkIGTTrackingLabView::DestroyIGTPipeline() +{ + if(m_Source.IsNotNull()) + { + m_Source->StopTracking(); + m_Source->Disconnect(); + m_Source = NULL; + } + m_FiducialRegistrationFilter = NULL; + m_Visualizer = NULL; + m_VirtualView = NULL; +} + +void QmitkIGTTrackingLabView::OnChangeToolName(int index, QString name) +{ + if(m_Source.IsNull()) + return; + + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + if(ds == NULL) + { + QMessageBox::warning(NULL,"DataStorage Access Error", "Could not access DataStorage. Tool Name can not be changed!"); + return; + } + + mitk::NavigationData::Pointer tempND = m_Source->GetOutput(index); + if(tempND.IsNull()) + return; + + const char* oldName = tempND->GetName(); + + mitk::DataNode::Pointer tempNode = ds->GetNamedNode(oldName); + + if(tempNode.IsNotNull()) + { + tempNode->SetName(name.toStdString().c_str()); + tempND->SetName(name.toStdString().c_str()); + } + else + QMessageBox::warning(NULL, "Rename Tool Error", "Couldn't find the corresponding tool for changing it's name!"); +} + +void QmitkIGTTrackingLabView::OnToolLoaded(int index, mitk::DataNode::Pointer toolNode) +{ + if(m_Source.IsNull() || m_Visualizer.IsNull()) + return; + + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + if(ds == NULL) + { + QMessageBox::warning(NULL,"DataStorage Access Error", "Could not access DataStorage. Loaded tool representation can not be shown!"); + return; + } + + mitk::NavigationData::Pointer tempND = m_Source->GetOutput(index); + if(tempND.IsNull()) + return; + + // try to find DataNode for tool in DataStorage + const char* toolName = tempND->GetName(); + mitk::DataNode::Pointer tempNode = ds->GetNamedNode(toolName); + + if(tempNode.IsNull()) + { + tempNode = mitk::DataNode::New(); // create new node, if none was found + ds->Add(tempNode); + } + + tempNode->SetData(toolNode->GetData()); + tempNode->SetName(toolNode->GetName()); + + m_PSRecToolSelectionComboBox->setItemText(index,toolNode->GetName().c_str()); + m_VirtualViewToolSelectionComboBox->setItemText(index,toolNode->GetName().c_str()); + m_Visualizer->SetRepresentationObject(index, tempNode->GetData()); + m_Visualizer->Update(); + + tempNode->Modified(); + this->GlobalReinit(); +} + +void QmitkIGTTrackingLabView::OnStartNavigation() +{ + + if(m_Source.IsNull()) + { + QMessageBox::warning(NULL, "IGTTrackingLab: Error", "can not access tracking source. Navigation not possible"); + return; + } + + if(!m_Source->IsTracking()) + { + m_Source->StartTracking(); + + try + { + m_RenderingTimerWidget->GetTimerInterval(); + this->StartContinuousUpdate(); // start tracker with set interval + + for(unsigned int i = 0; i < m_Source->GetNumberOfOutputs(); i++) // add navigation data to bundle widgets + { + m_ToolStatusWidget->AddNavigationData(dynamic_cast(m_Source->GetOutputs().at(i).GetPointer())); + } + + m_ToolStatusWidget->ShowStatusLabels(); // show status for every tool if ND is valid or not + //m_IGTPlayerWidget->setEnabled(true); + } + catch(...) + { + //m_IGTPlayerWidget->setDisabled(true); + this->StopContinuousUpdate(); + this->DestroyIGTPipeline(); + return; + } + + + } +} + + +void QmitkIGTTrackingLabView::StopContinuousUpdate() +{ + if (this->m_RenderingTimerWidget->GetUpdateTimer() != NULL) + { + m_RenderingTimerWidget->StopTimer(); + disconnect( (QTimer*) m_RenderingTimerWidget->GetUpdateTimer(), SIGNAL(timeout()), this, SLOT(RenderScene()) ); // disconnect timer from RenderScene() method + } + + if(m_PointSetRecordPushButton) + m_PointSetRecordPushButton->setDisabled(true); +} + +void QmitkIGTTrackingLabView::RenderScene( ) +{ + try + { + if (m_Visualizer.IsNull() || this->GetActiveStdMultiWidget() == NULL) + return; + try + { + if(m_Source.IsNotNull() && m_Source->IsTracking()) + m_ToolStatusWidget->Refresh(); + + m_Visualizer->Update(); + + + if(m_VirtualViewCheckBox->isChecked()) + m_VirtualView->Update(); + + if(m_PointSetRecording && m_PSRecordingPointSet.IsNotNull()) + { + int size = m_PSRecordingPointSet->GetSize(); + mitk::NavigationData::Pointer nd= m_Visualizer->GetOutput(m_PSRecToolSelectionComboBox->currentIndex()); + m_PSRecordingPointSet->InsertPoint(size, nd->GetPosition()); + + if(size >= 200) + { + this->OnPointSetRecording(false); + m_PointSetRecordPushButton->setChecked(false); + } + } + } + catch(std::exception& e) + { + MITK_WARN << "Exception during QmitkIGTTrackingLab::RenderScene():" << e.what() << "\n"; + } + + if(m_VirtualViewCheckBox->isChecked()) + mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_ALL); + //update all Widgets + else + mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_3DWINDOWS); + + + } + catch (std::exception& e) + { + MITK_WARN << "RenderAll exception: " << e.what() << "\n"; + } + catch (...) + { + MITK_WARN << "RenderAll unknown exception\n"; + } +} + +void QmitkIGTTrackingLabView::StartContinuousUpdate( ) +{ + if (m_Source.IsNull() || m_Visualizer.IsNull() ) + throw std::invalid_argument("Pipeline is not set up correctly"); + + if (m_RenderingTimerWidget->GetUpdateTimer() == NULL) + return; + + else + { + connect( (QTimer*) m_RenderingTimerWidget->GetUpdateTimer(), SIGNAL(timeout()), this, SLOT(RenderScene()) ); // connect update timer to RenderScene() method + } + + if(m_PointSetRecordPushButton) + m_PointSetRecordPushButton->setEnabled(true); +} + + + +void QmitkIGTTrackingLabView::OnStopNavigation() +{ + if(m_Source.IsNull()) + { + QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "can not access tracking source. Navigation not possible"); + return; + } + if(m_Source->IsTracking()) + { + m_Source->StopTracking(); + this->StopContinuousUpdate(); + m_ToolStatusWidget->RemoveStatusLabels(); + } +} + + +void QmitkIGTTrackingLabView::OnToolsAdded(QStringList toolsList) +{ + + if(m_Source.IsNull() || m_FiducialRegistrationFilter.IsNull() || m_Visualizer.IsNull()) + return; + + m_Source->UpdateOutputInformation(); + + unsigned int nrOfOldOutputs = m_Visualizer->GetNumberOfOutputs(); + + for(unsigned int i = nrOfOldOutputs; i < m_Source->GetNumberOfOutputs(); ++i) + { + m_FiducialRegistrationFilter->SetInput(i, m_Source->GetOutput(i)); + m_Visualizer->SetInput(i, m_FiducialRegistrationFilter->GetOutput(i)); + } + + m_VirtualView->SetInput(m_FiducialRegistrationFilter->GetOutput(0)); // initialize with input from 0 + m_VirtualView->SetRenderer(mitk::BaseRenderer::GetInstance(this->GetActiveStdMultiWidget()->mitkWidget4->GetRenderWindow())); + + mitk::Vector3D viewUpInToolCoordinatesVector; + viewUpInToolCoordinatesVector[0]=1; + viewUpInToolCoordinatesVector[1]=0; + viewUpInToolCoordinatesVector[2]=0; + + m_VirtualView->SetDirectionOfProjectionInToolCoordinates(m_DirectionOfProjectionVector); + m_VirtualView->SetFocalLength(5000.0); + m_VirtualView->SetViewUpInToolCoordinates(viewUpInToolCoordinatesVector); + + + for(unsigned int j = nrOfOldOutputs; j < m_Visualizer->GetNumberOfOutputs(); ++j) + { + mitk::DataNode::Pointer representation = this->CreateInstrumentVisualization(this->GetDefaultDataStorage(), m_Source->GetTrackingDevice()->GetTool(j)->GetToolName()); + m_PSRecToolSelectionComboBox->addItem(QString(m_Source->GetTrackingDevice()->GetTool(j)->GetToolName())); + m_VirtualViewToolSelectionComboBox->addItem(QString(m_Source->GetTrackingDevice()->GetTool(j)->GetToolName())); + m_Visualizer->SetRepresentationObject(j, representation->GetData()); + } + + mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_ALL); + this->GlobalReinit(); + + //mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_ALL); + +} + +void QmitkIGTTrackingLabView::VisualizeAllTools() +{ + + + //for (unsigned int i=0; i < m_Source->GetNumberOfOutputs(); ++i) + //{ + // m_FiducialRegistrationFilter->SetInput(i, m_Source->GetOutput(i)); // set input for registration filter + // m_Visualizer->SetInput(i, m_FiducialRegistrationFilter->GetOutput(i)); // set input for visualization filter + //} + + //for(unsigned int i= 0; i < m_Visualizer->GetNumberOfOutputs(); ++i) + //{ + // //const char* toolName = tracker->GetTool(i)->GetToolName(); + + // mitk::DataNode::Pointer representation = this->CreateInstrumentVisualization(this->GetDefaultDataStorage(), m_Source->GetTrackingDevice()->GetTool(i)->GetToolName()); + // m_Visualizer->SetRepresentationObject(i, representation->GetData()); + + // //m_VisualizedTools.append(representation->GetName().c_str()); + //} + +} + + +void QmitkIGTTrackingLabView::InitializeRegistration() +{ + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + if( ds == NULL ) + return; + + + mitk::DataNode::Pointer targetFiducials = ds->GetNamedNode(m_RegistrationImageFiducialsName); + + if(targetFiducials.IsNull()) // create a point set for the target fiducials + { + mitk::Color color; + color.Set(1.0f, 0.0f, 0.0f); + targetFiducials = this->CreateRegistrationFiducialsNode(m_RegistrationImageFiducialsName, color); + targetFiducials = mitk::DataNode::New(); + mitk::PointSet::Pointer ps = mitk::PointSet::New(); + targetFiducials->SetData(ps); + targetFiducials->SetName(m_RegistrationImageFiducialsName); + + ds->Add(targetFiducials); + } + + m_RegistrationWidget->SetMultiWidget(this->GetActiveStdMultiWidget()); // passing multiwidget to pointsetwidget + m_RegistrationWidget->SetImageFiducialsNode(targetFiducials); // passing pointsetnode to the pointsetwidget + + + mitk::DataNode::Pointer sourceFiducials = ds->GetNamedNode( m_RegistrationTrackingFiducialsName ); + + if(sourceFiducials.IsNull()) + { + mitk::Color color; + color.Set(0.0f, 0.0f, 1.0f); + sourceFiducials = this->CreateRegistrationFiducialsNode( m_RegistrationTrackingFiducialsName, color ); + ds->Add(sourceFiducials); + } + + m_RegistrationWidget->SetTrackerFiducialsNode(sourceFiducials); +} + + +void QmitkIGTTrackingLabView::OnToolBoxCurrentChanged(const int index) +{ + switch (index) + { + case RegistrationWidget: + this->InitializeRegistration(); + break; + + default: + break; + } +} + + +mitk::DataNode::Pointer QmitkIGTTrackingLabView::CreateRegistrationFiducialsNode( const std::string& label, const mitk::Color& color) +{ + mitk::DataNode::Pointer fiducialsNode = mitk::DataNode::New(); + mitk::PointSet::Pointer fiducialsPointSet = mitk::PointSet::New(); + + fiducialsNode->SetData(fiducialsPointSet); + fiducialsNode->SetName( label ); + fiducialsNode->SetColor( color ); + fiducialsNode->SetBoolProperty( "updateDataOnRender", false ); + + return fiducialsNode; +} + + +void QmitkIGTTrackingLabView::ChangeToolRepresentation( int toolID , mitk::Surface::Pointer surface ) +{ + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + if(ds == NULL) + { + QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "Can not access DataStorage. Changing tool representation not possible!"); + return; + } + + mitk::TrackingDevice::Pointer tracker = m_NDIConfigWidget->GetTracker(); + if(tracker.IsNull()) + { + QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "Can not access Tracker. Changing tool representation not possible!"); + return; + } + + try + { + const char* name = tracker->GetTool(toolID)->GetToolName(); // get tool name by id + + mitk::DataNode::Pointer toolNode = ds->GetNamedNode(name); + + if(toolNode.IsNull()) + return; + + toolNode->SetData(surface); // change surface representation of node + toolNode->SetColor(0.45,0.70,0.85); //light blue like old 5D sensors + toolNode->Modified(); + + m_Visualizer->SetRepresentationObject( toolID, toolNode->GetData()); // updating node with changed surface back in visualizer + + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + } + catch(std::exception& e) + { + QMessageBox::warning(NULL, QString("IGTSurfaceTracker: Error"), QString("Can not change tool representation!").arg(e.what())); + return; + } +} + + +QWidget* QmitkIGTTrackingLabView::CreatePointSetRecordingWidget(QWidget* parent) +{ + QWidget* pointSetRecordingWidget = new QWidget(parent); + m_PSRecToolSelectionComboBox = new QComboBox(pointSetRecordingWidget); + + // the recording button + m_PointSetRecordPushButton = new QPushButton("Start PointSet Recording", pointSetRecordingWidget); + m_PointSetRecordPushButton->setDisabled(true); + m_PointSetRecordPushButton->setIcon(QIcon(":/QmitkQmitkIGTTrackingLabView/start_rec.png")); + m_PointSetRecordPushButton->setCheckable(true); + connect( m_PointSetRecordPushButton, SIGNAL(toggled(bool)), this, SLOT(OnPointSetRecording(bool)) ); + + + QLabel* toolSelectLabel = new QLabel("Select tool for recording:", pointSetRecordingWidget); + QGridLayout* layout = new QGridLayout(pointSetRecordingWidget); + + int row = 0; + int col = 0; + + layout->addWidget(toolSelectLabel,row,col++,1,1,Qt::AlignRight); + layout->addWidget(m_PSRecToolSelectionComboBox,row,col++,1,1,Qt::AlignLeft); + layout->addWidget(m_PointSetRecordPushButton,row,col++,1,2,Qt::AlignRight); + + return pointSetRecordingWidget; +} + +QWidget* QmitkIGTTrackingLabView::CreateVirtualViewWidget(QWidget* parent) +{ + QWidget* virtualViewWidget = new QWidget(parent); + m_VirtualViewToolSelectionComboBox = new QComboBox(virtualViewWidget); + connect(m_VirtualViewToolSelectionComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(OnVirtualCameraChanged(int))); + + + QLabel* toolSelectLabel = new QLabel("Select tool for virtual camera:", virtualViewWidget); + + // the virtual view checkbox + m_VirtualViewCheckBox = new QCheckBox("Enable Virtual Camera", virtualViewWidget); + + QGridLayout* layout = new QGridLayout(virtualViewWidget); + + int row = 0; + int col = 0; + + layout->addWidget(toolSelectLabel,row,col++,1,1,Qt::AlignRight); + layout->addWidget(m_VirtualViewToolSelectionComboBox,row,col++,1,1,Qt::AlignLeft); + layout->addWidget(m_VirtualViewCheckBox,row,col++,1,2,Qt::AlignRight); + + return virtualViewWidget; +} + + +void QmitkIGTTrackingLabView::OnPointSetRecording(bool record) +{ + mitk::DataStorage* ds = this->GetDefaultDataStorage(); + + if(ds == NULL) + return; + + if(record) + { + mitk::DataNode::Pointer psRecND = ds->GetNamedNode(m_PointSetRecordingDataNodeName); + if(m_PSRecordingPointSet.IsNull() || psRecND.IsNull()) + { + m_PSRecordingPointSet = NULL; + m_PSRecordingPointSet = mitk::PointSet::New(); + mitk::DataNode::Pointer dn = mitk::DataNode::New(); + dn->SetName(m_PointSetRecordingDataNodeName); + dn->SetColor(0.,1.,0.); + dn->SetData(m_PSRecordingPointSet); + ds->Add(dn); + } + else + m_PSRecordingPointSet->Clear(); + + m_PointSetRecording = true; + m_PointSetRecordPushButton->setText("Stop PointSet Recording"); + m_PSRecToolSelectionComboBox->setDisabled(true); + m_VirtualViewToolSelectionComboBox->setDisabled(true); + } + + else + { + m_PointSetRecording = false; + m_PointSetRecordPushButton->setText("Start PointSet Recording"); + m_PSRecToolSelectionComboBox->setEnabled(true); + m_VirtualViewToolSelectionComboBox->setEnabled(true); + } +} + +void QmitkIGTTrackingLabView::DestroyInstrumentVisualization(mitk::DataStorage* ds, mitk::TrackingDevice::Pointer tracker) +{ + if(ds == NULL || tracker.IsNull()) + return; + + for(int i=0; i < tracker->GetToolCount(); ++i) + { + mitk::DataNode::Pointer dn = ds->GetNamedNode(tracker->GetTool(i)->GetToolName()); + + if(dn.IsNotNull()) + ds->Remove(dn); + } +} + + +void QmitkIGTTrackingLabView::GlobalReinit() +{ + // request global reiinit + mitk::NodePredicateNot::Pointer pred = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("includeInBoundingBox", mitk::BoolProperty::New(false))); + mitk::DataStorage::SetOfObjects::ConstPointer rs = this->GetDataStorage()->GetSubset(pred); + + // calculate bounding geometry of these nodes + mitk::TimeSlicedGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(rs, "visible"); + + // initialize the views to the bounding geometry + mitk::RenderingManager::GetInstance()->InitializeViews(bounds); + + //global reinit end +} + +void QmitkIGTTrackingLabView::OnVirtualCameraChanged(int toolNr) +{ + if(m_VirtualView.IsNull() || m_FiducialRegistrationFilter.IsNull()) + return; + + m_VirtualView->SetInput(m_FiducialRegistrationFilter->GetOutput(toolNr)); +} + diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabView.h b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabView.h similarity index 66% rename from Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabView.h rename to Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabView.h index 5961b23738..bf5db64215 100644 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabView.h +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabView.h @@ -1,134 +1,169 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ -#ifndef IGTTrackingLabView_h -#define IGTTrackingLabView_h +#ifndef QmitkIGTTrackingLabView_h +#define QmitkIGTTrackingLabView_h #include #include -#include "ui_IGTTrackingLabViewControls.h" +#include "ui_QmitkIGTTrackingLabViewControls.h" #include #include #include #include #include +#include +#include #include #include +#include +#include +#include class QmitkNDIConfigurationWidget; class QmitkFiducialRegistrationWidget; class QmitkUpdateTimerWidget; class QmitkToolTrackingStatusWidget; /*! - \brief IGTTrackingLabView + \brief QmitkIGTTrackingLabView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \sa QmitkFunctionality \ingroup ${plugin_target}_internal */ -class IGTTrackingLabView : public QmitkFunctionality +class QmitkIGTTrackingLabView : public QmitkFunctionality { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; - IGTTrackingLabView(); - virtual ~IGTTrackingLabView(); + QmitkIGTTrackingLabView(); + virtual ~QmitkIGTTrackingLabView(); virtual void CreateQtPartControl(QWidget *parent); protected slots: void OnAddRegistrationTrackingFiducial(); void OnRegisterFiducials(); void OnTrackerDisconnected(); void OnSetupNavigation(); void OnChangeToolName(int index, QString name); void OnToolLoaded(int index, mitk::DataNode::Pointer toolNode); void OnStartNavigation(); void OnStopNavigation(); + void RenderScene(); + void OnToolsAdded(QStringList toolsList); + + void OnToolBoxCurrentChanged(int index); + void InitializeRegistration(); + void ChangeToolRepresentation( int toolID , mitk::Surface::Pointer surface ); + + void OnPointSetRecording(bool record); + void OnVirtualCameraChanged(int toolNr); + //void OnVirtualViewToggled(bool toggled); /// \brief Called when the user clicks the GUI button // void DoImageProcessing(); protected: + enum ToolBoxElement + { + NDIConfigurationWidget = 0, + RegistrationWidget = 1 + }; + /// \brief called by QmitkFunctionality when DataManager's selection has changed // virtual void OnSelectionChanged( std::vector nodes ); - Ui::IGTTrackingLabViewControls m_Controls; + Ui::QmitkIGTTrackingLabViewControls m_Controls; void CreateBundleWidgets( QWidget* parent ); void CreateConnections(); void SetupIGTPipeline(); void InitializeFilters(); void DestroyIGTPipeline(); void StartContinuousUpdate(); void StopContinuousUpdate(); - void RenderScene(); + mitk::DataNode::Pointer CreateRegistrationFiducialsNode( const std::string& label, const mitk::Color& color); + + void VisualizeAllTools(); mitk::DataNode::Pointer CreateInstrumentVisualization(mitk::DataStorage* ds, const char* toolName); // create 3D models for all connected tools mitk::DataNode::Pointer CreateConeRepresentation(const char* label = ""); // create a 3D cone as representation for a tool - - - //void DestroyInstrumentVisualization(mitk::DataStorage* ds, mitk::TrackingDevice::Pointer tracker); - - - + void DestroyInstrumentVisualization(mitk::DataStorage* ds, mitk::TrackingDevice::Pointer tracker); mitk::TrackingDeviceSource::Pointer m_Source; ///< source that connects to the tracking device mitk::NavigationDataLandmarkTransformFilter::Pointer m_FiducialRegistrationFilter; ///< this filter transforms from tracking coordinates into mitk world coordinates mitk::NavigationDataObjectVisualizationFilter::Pointer m_Visualizer; ///< visualization filter - mitk::NavigationDataToPointSetFilter::Pointer m_RegistrationTrackingFiducialsFilter; ///< fill the Registration Tracking Fiducials with instrument position in tracking space - + mitk::CameraVisualization::Pointer m_VirtualView; ///< filter to update the vtk camera according to the reference navigation data + + QWidget* CreatePointSetRecordingWidget(QWidget* parent); + QWidget* CreateVirtualViewWidget(QWidget* parent); + + mitk::Vector3D m_DirectionOfProjectionVector; private: QToolBox* m_ToolBox; - QCheckBox* m_TrackingVolumeCheckbox; + QComboBox* m_PSRecToolSelectionComboBox; + QComboBox* m_VirtualViewToolSelectionComboBox; + QPushButton* m_PointSetRecordPushButton; + QCheckBox* m_VirtualViewCheckBox; + + mitk::PointSet::Pointer m_PSRecordingPointSet; QmitkNDIConfigurationWidget* m_NDIConfigWidget; // tracking device configuration widget QmitkFiducialRegistrationWidget* m_RegistrationWidget; // landmark registration widget QmitkUpdateTimerWidget* m_RenderingTimerWidget; // update timer widget for rendering and updating QmitkToolTrackingStatusWidget* m_ToolStatusWidget; // tracking status visualizer widget std::string m_RegistrationTrackingFiducialsName; std::string m_RegistrationImageFiducialsName; + + //QVector m_VisualizedTools; + + std::string m_PointSetRecordingDataNodeName; + bool m_PointSetRecording; + + void GlobalReinit(); + }; -#endif // IGTTrackingLabView_h +#endif // QmitkIGTTrackingLabView_h diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabViewControls.ui b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabViewControls.ui similarity index 85% rename from Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabViewControls.ui rename to Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabViewControls.ui index d39cbbc12d..f945916514 100644 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/IGTTrackingLabViewControls.ui +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/QmitkIGTTrackingLabViewControls.ui @@ -1,47 +1,47 @@ - IGTTrackingLabViewControls - + QmitkIGTTrackingLabViewControls + 0 0 - 222 - 161 + 436 + 374 0 0 QmitkTemplate Qt::Vertical QSizePolicy::Expanding 20 220 diff --git a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/mitkPluginActivator.cpp b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/mitkPluginActivator.cpp index e45c3f652f..9351de17e7 100644 --- a/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/mitkPluginActivator.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.igttrackinglab/src/internal/mitkPluginActivator.cpp @@ -1,39 +1,39 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "mitkPluginActivator.h" #include -#include "IGTTrackingLabView.h" +#include "QmitkIGTTrackingLabView.h" namespace mitk { void PluginActivator::start(ctkPluginContext* context) { - BERRY_REGISTER_EXTENSION_CLASS(IGTTrackingLabView, context) + BERRY_REGISTER_EXTENSION_CLASS(QmitkIGTTrackingLabView, context) } void PluginActivator::stop(ctkPluginContext* context) { Q_UNUSED(context) } } Q_EXPORT_PLUGIN2(org_mitk_gui_qt_igttrackinglab, mitk::PluginActivator)