00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkToolPairNavigationView.h"
00019 #include "QmitkNDIConfigurationWidget.h"
00020 #include "QmitkUpdateTimerWidget.h"
00021 #include "QmitkToolDistanceWidget.h"
00022 #include "mitkNodePredicateDataType.h"
00023 #include <mitkTrackingVolume.h>
00024 #include "QmitkDataStorageComboBox.h"
00025 #include "QmitkStdMultiWidget.h"
00026 #include <mitkCone.h>
00027 #include <vtkConeSource.h>
00028 #include <mitkEllipsoid.h>
00029 #include <vtkSphereSource.h>
00030 #include <mitkProperties.h>
00031 #include <mitkNodePredicateProperty.h>
00032 #include <mitkStatusBar.h>
00033
00034
00035 #include <QMessageBox>
00036 #include <qtimer.h>
00037
00038
00039 #define WARN LOG_WARN("ToolPairNavigation")
00040
00041 const std::string QmitkToolPairNavigationView::VIEW_ID = "org.mitk.views.toolpairnavigation";
00042
00043 QmitkToolPairNavigationView::QmitkToolPairNavigationView()
00044 : QmitkFunctionality(), m_MultiWidget(NULL)
00045 {
00046 }
00047
00048 QmitkToolPairNavigationView::~QmitkToolPairNavigationView()
00049 {
00050
00051 delete m_NDIConfigWidget;
00052 delete m_DistanceWidget;
00053 m_NDIConfigWidget = NULL;
00054 m_DistanceWidget = NULL;
00055 m_Source = NULL;
00056 m_Visualizer = NULL;
00057 m_CameraVisualizer = NULL;
00058
00059 }
00060
00061 void QmitkToolPairNavigationView::CreateQtPartControl(QWidget *parent)
00062 {
00063
00064 m_Controls.setupUi(parent);
00065 this->CreateBundleWidgets(parent);
00066 this->CreateConnections();
00067 }
00068
00069 void QmitkToolPairNavigationView::CreateBundleWidgets(QWidget* parent)
00070 {
00071
00072
00073
00074
00075 m_NDIConfigWidget = new QmitkNDIConfigurationWidget(parent);
00076 m_DistanceWidget = new QmitkToolDistanceWidget(parent);
00077
00078
00079
00080 int tabnr = this->m_Controls.m_ToolBox->count();
00081 for(int i=0; i < tabnr ;i++)
00082 {
00083 this->m_Controls.m_ToolBox->removeItem(0);
00084 }
00085
00086
00087 this->m_Controls.m_ToolBox->insertItem(0,m_NDIConfigWidget,QString("Configuration"));
00088 this->m_Controls.m_ToolBox->insertItem(1,m_DistanceWidget,QString("Distances"));
00089
00090
00091
00092 }
00093
00094 void QmitkToolPairNavigationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
00095 {
00096 m_MultiWidget = &stdMultiWidget;
00097 }
00098
00099 void QmitkToolPairNavigationView::StdMultiWidgetNotAvailable()
00100 {
00101 m_MultiWidget = NULL;
00102 }
00103
00104 void QmitkToolPairNavigationView::CreateConnections()
00105 {
00106 connect( m_NDIConfigWidget, SIGNAL(Connected()), this, SLOT(SetNavigationUp()));
00107 connect( m_NDIConfigWidget, SIGNAL(Connected()), this->m_Controls.m_RenderingTimerWidget, SLOT(EnableWidget()));
00108 connect( m_NDIConfigWidget, SIGNAL(Disconnected()), this, SLOT(Disconnected()));
00109 connect( m_NDIConfigWidget, SIGNAL(Disconnected()), this->m_Controls.m_RenderingTimerWidget, SLOT(DisableWidget()));
00110
00111
00112
00113
00114 }
00115
00116 void QmitkToolPairNavigationView::Activated()
00117 {
00118 QmitkFunctionality::Activated();
00119
00120
00121 m_LastMapperIDWidget3 = mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->GetMapperID();
00122 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->SetMapperID(2);
00123 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget2->GetRenderWindow())->SetMapperID(2);
00124 }
00125
00126 void QmitkToolPairNavigationView::Deactivated()
00127 {
00128 QmitkFunctionality::Deactivated();
00129
00130
00131 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow())->SetMapperID(m_LastMapperIDWidget3);
00132 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget2->GetRenderWindow())->SetMapperID(1);
00133 }
00134
00135 void QmitkToolPairNavigationView::Disconnected()
00136 {
00137 if(m_Controls.m_RenderingTimerWidget != NULL)
00138 {
00139 this->m_Controls.m_RenderingTimerWidget->StopTimer();
00140 }
00141 if(m_Source.IsNotNull() && m_Source->IsTracking())
00142 {
00143 this->m_Source->StopTracking();
00144 }
00145 this->DestroyIGTPipeline();
00146 this->RemoveVisualizationObjects(this->GetDefaultDataStorage());
00147
00148 if(this->m_DistanceWidget != NULL)
00149 this->m_DistanceWidget->ClearDistanceMatrix();
00150 }
00151
00152 void QmitkToolPairNavigationView::ToolsAdded( QStringList )
00153 {
00154
00155 }
00156
00157
00158 void QmitkToolPairNavigationView::SetNavigationUp()
00159 {
00160 if (m_Source.IsNotNull())
00161 if (m_Source->IsTracking())
00162 return;
00163
00164 mitk::DataStorage* ds = this->GetDefaultDataStorage();
00165 if (ds == NULL)
00166 {
00167 QMessageBox::warning(NULL, "ToolPairNavigation: Error", "can not access DataStorage. Navigation not possible");
00168 return;
00169 }
00170
00171
00172 try
00173 {
00174 this->SetupIGTPipeline();
00175 }
00176 catch(std::exception& e)
00177 {
00178 QMessageBox::warning(NULL, "ToolPairNavigation: Error", QString("Error while building the IGT-Pipeline: %1").arg(e.what()));
00179 this->DestroyIGTPipeline();
00180 return;
00181 }
00182 catch (...)
00183 {
00184 QMessageBox::warning(NULL, "ToolPairNavigation: Error", QString("Error while building the IGT-Pipeline."));
00185 this->DestroyIGTPipeline();
00186 return;
00187 }
00188
00189
00190 try
00191 {
00192
00193 m_Controls.m_RenderingTimerWidget->SetPurposeLabelText(QString("Navigation"));
00194 m_Controls.m_RenderingTimerWidget->SetTimerInterval( 50 );
00195
00196 connect( m_Controls.m_RenderingTimerWidget->GetUpdateTimer() , SIGNAL(timeout()) , this, SLOT (RenderScene()) );
00197 connect( m_Controls.m_RenderingTimerWidget, SIGNAL(Started()), this, SLOT(StartNavigation()));
00198 connect( m_Controls.m_RenderingTimerWidget, SIGNAL(Stopped()) , this, SLOT (StopNavigation()));
00199 connect( m_Controls.m_RenderingTimerWidget, SIGNAL(Stopped()) , m_DistanceWidget, SLOT (SetDistanceLabelValuesInvalid()));
00200
00201 }
00202 catch(std::exception& e)
00203 {
00204 QMessageBox::warning(NULL, "ToolPairNavigation: Error", QString("Error while starting the IGT-Pipeline: %1").arg(e.what()));
00205 this->m_Controls.m_RenderingTimerWidget->StopTimer();
00206 this->DestroyIGTPipeline();
00207 return;
00208 }
00209 }
00210
00211 void QmitkToolPairNavigationView::StartNavigation()
00212 {
00213 if(m_Source.IsNotNull() && !m_Source->IsTracking())
00214 {
00215 m_Source->StartTracking();
00216
00217 m_DistanceWidget->CreateToolDistanceMatrix(m_Source->GetOutputs());
00218 }
00219 }
00220
00221
00222
00223 void QmitkToolPairNavigationView::ToolsChanged()
00224 {
00225
00226 }
00227
00228 void QmitkToolPairNavigationView::StopNavigation()
00229 {
00230 if(m_Source.IsNotNull() && m_Source->IsTracking())
00231 {
00232 m_Source->StopTracking();
00233 }
00234 }
00235
00236
00237 void QmitkToolPairNavigationView::SetupIGTPipeline()
00238 {
00239 mitk::DataStorage* ds = this->GetDefaultDataStorage();
00240 if (ds == NULL)
00241 throw std::invalid_argument("DataStorage not available");
00242
00243 mitk::TrackingDevice::Pointer tracker = m_NDIConfigWidget->GetTracker();
00244 if (tracker.IsNull())
00245 throw std::invalid_argument("tracking device is NULL.");
00246
00247 m_Source = mitk::TrackingDeviceSource::New();
00248 m_Source->SetTrackingDevice(tracker);
00249
00250 m_Visualizer = mitk::NavigationDataObjectVisualizationFilter::New();
00251 m_CameraVisualizer = mitk::CameraVisualization::New();
00252
00253 m_CameraVisualizer->SetRenderer(mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow()));
00254
00255
00256 mitk::Vector3D viewVector;
00257 mitk::FillVector3D( viewVector, 0.0, 0.0, 1.0 );
00258 m_CameraVisualizer->SetDirectionOfProjectionInToolCoordinates(viewVector);
00259
00260
00261 for (unsigned int i = 0; i < m_Source->GetNumberOfOutputs(); ++i)
00262 {
00263 m_Visualizer->SetInput(i, m_Source->GetOutput(i));
00264
00265 const char* toolName = tracker->GetTool(i)->GetToolName();
00266 mitk::DataNode::Pointer toolrepresentationNode = ds->GetNamedNode(toolName);
00267 if (toolrepresentationNode.IsNull())
00268 {
00269
00270
00271 if (i<1)
00272 {
00273 toolrepresentationNode = this->CreateConeAsInstrumentVisualization(toolName);
00274 m_CameraVisualizer->SetInput(m_Source->GetOutput(i));
00275 }
00276 else
00277 toolrepresentationNode = this->CreateSphereAsInstrumentVisualization(toolName);
00278 ds->Add(toolrepresentationNode);
00279 }
00280
00281 m_Visualizer->SetRepresentationObject(i, toolrepresentationNode->GetData());
00282 }
00283
00284
00285 }
00286
00287 void QmitkToolPairNavigationView::DestroyIGTPipeline()
00288 {
00289 if (m_Source.IsNotNull())
00290 {
00291 m_Source->StopTracking();
00292 m_Source->Disconnect();
00293 m_Source = NULL;
00294 }
00295
00296 m_Visualizer = NULL;
00297 m_CameraVisualizer = NULL;
00298 }
00299
00300
00301
00302 mitk::DataNode::Pointer QmitkToolPairNavigationView::CreateConeAsInstrumentVisualization(const char* label)
00303 {
00304
00305 mitk::Cone::Pointer activeToolData = mitk::Cone::New();
00306 vtkConeSource* vtkData = vtkConeSource::New();
00307 vtkData->SetRadius(3.0);
00308 vtkData->SetHeight(6.0);
00309 vtkData->SetDirection(0.0, 0.0, 1.0);
00310 vtkData->SetCenter(0.0, 0.0, 0.0);
00311 vtkData->SetResolution(20);
00312 vtkData->CappingOn();
00313 vtkData->Update();
00314 activeToolData->SetVtkPolyData(vtkData->GetOutput());
00315 vtkData->Delete();
00316
00317
00318 mitk::DataNode::Pointer coneNode = mitk::DataNode::New();
00319 coneNode->SetData(activeToolData);
00320 coneNode->GetPropertyList()->SetProperty("name", mitk::StringProperty::New ( label ) );
00321 coneNode->GetPropertyList()->SetProperty("layer", mitk::IntProperty::New(0));
00322 coneNode->GetPropertyList()->SetProperty("visible",mitk::BoolProperty::New(true));
00323
00324 coneNode->SetVisibility(false, mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget3->GetRenderWindow()));
00325 coneNode->SetColor(1.0,0.0,0.0);
00326 coneNode->SetOpacity(0.7);
00327 coneNode->Modified();
00328
00329 return coneNode;
00330 }
00331
00332 mitk::DataNode::Pointer QmitkToolPairNavigationView::CreateSphereAsInstrumentVisualization(const char* label)
00333 {
00334
00335 mitk::Ellipsoid::Pointer activeToolData = mitk::Ellipsoid::New();
00336 vtkSphereSource *vtkData = vtkSphereSource::New();
00337 vtkData->SetRadius(1.0f);
00338 vtkData->SetCenter(0.0, 0.0, 0.0);
00339 vtkData->Update();
00340 activeToolData->SetVtkPolyData(vtkData->GetOutput());
00341 vtkData->Delete();
00342
00343
00344 mitk::DataNode::Pointer sphereNode = mitk::DataNode::New();
00345 sphereNode->SetData(activeToolData);
00346 sphereNode->GetPropertyList()->SetProperty("name", mitk::StringProperty::New ( label ) );
00347 sphereNode->GetPropertyList()->SetProperty("layer", mitk::IntProperty::New(0));
00348 sphereNode->GetPropertyList()->SetProperty("visible",mitk::BoolProperty::New(true));
00349 sphereNode->SetColor(0.0,1.0,0.0);
00350 sphereNode->SetOpacity(1.0);
00351 sphereNode->Modified();
00352
00353 return sphereNode;
00354 }
00355
00356
00357 void QmitkToolPairNavigationView::RenderScene()
00358 {
00359 try
00360 {
00361 if (m_Visualizer.IsNull() || m_CameraVisualizer.IsNull() || this->GetActiveStdMultiWidget() == NULL)
00362 return;
00363 try
00364 {
00365 m_Visualizer->Update();
00366 m_CameraVisualizer->Update();
00367
00368
00369 static int counter = 0;
00370 if (counter > 9)
00371 {
00372 this->m_DistanceWidget->ShowDistanceValues(m_Source->GetOutputs());
00373 counter = 0;
00374 }
00375 else
00376 counter++;
00377 }
00378 catch(std::exception& e)
00379 {
00380 std::cout << "Exception during QmitkToolPairNavigationView::RenderScene():" << e.what() << "\n";
00381 }
00382
00383
00384 mitk::RenderingManager::GetInstance()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_3DWINDOWS);
00385 }
00386 catch (std::exception& e)
00387 {
00388 std::cout << "RenderAll exception: " << e.what() << "\n";
00389 }
00390 catch (...)
00391 {
00392 std::cout << "RenderAll unknown exception\n";
00393 }
00394 }
00395
00396 void QmitkToolPairNavigationView::RemoveVisualizationObjects( mitk::DataStorage* ds )
00397 {
00398 if (ds != NULL)
00399 ds->Remove(ds->GetSubset(mitk::NodePredicateProperty::New("ToolPairNavigation", mitk::BoolProperty::New(true))));
00400 }
00401