00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkNavigationToolManagementWidget.h"
00019
00020
00021 #include "mitkTrackingTypes.h"
00022 #include <mitkSTLFileReader.h>
00023 #include <mitkSurface.h>
00024 #include <mitkNavigationToolReader.h>
00025 #include <mitkNavigationToolWriter.h>
00026 #include <mitkNavigationToolStorage.h>
00027 #include <mitkNavigationToolStorageDeserializer.h>
00028 #include <mitkNavigationToolStorageSerializer.h>
00029
00030
00031 #include <qfiledialog.h>
00032 #include <qmessagebox.h>
00033
00034 const std::string QmitkNavigationToolManagementWidget::VIEW_ID = "org.mitk.views.navigationtoolmanagementwidget";
00035
00036 QmitkNavigationToolManagementWidget::QmitkNavigationToolManagementWidget(QWidget* parent, Qt::WindowFlags f)
00037 : QWidget(parent, f)
00038 {
00039 m_Controls = NULL;
00040 CreateQtPartControl(this);
00041 CreateConnections();
00042 m_NavigationToolStorage = mitk::NavigationToolStorage::New();
00043 m_Controls->m_SurfaceChooser->SetAutoSelectNewItems(true);
00044 }
00045
00046
00047 QmitkNavigationToolManagementWidget::~QmitkNavigationToolManagementWidget()
00048 {
00049 }
00050
00051 void QmitkNavigationToolManagementWidget::CreateQtPartControl(QWidget *parent)
00052 {
00053 if (!m_Controls)
00054 {
00055
00056 m_Controls = new Ui::QmitkNavigationToolManagementWidgetControls;
00057 m_Controls->setupUi(parent);
00058 }
00059 }
00060
00061 void QmitkNavigationToolManagementWidget::CreateConnections()
00062 {
00063 if ( m_Controls )
00064 {
00065
00066 connect( (QObject*)(m_Controls->m_AddTool), SIGNAL(clicked()), this, SLOT(OnAddTool()) );
00067 connect( (QObject*)(m_Controls->m_DeleteTool), SIGNAL(clicked()), this, SLOT(OnDeleteTool()) );
00068 connect( (QObject*)(m_Controls->m_EditTool), SIGNAL(clicked()), this, SLOT(OnEditTool()) );
00069 connect( (QObject*)(m_Controls->m_LoadSingleTool), SIGNAL(clicked()), this, SLOT(OnLoadSingleTool()) );
00070 connect( (QObject*)(m_Controls->m_SaveSingleTool), SIGNAL(clicked()), this, SLOT(OnSaveSingleTool()) );
00071 connect( (QObject*)(m_Controls->m_LoadStorage), SIGNAL(clicked()), this, SLOT(OnLoadStorage()) );
00072 connect( (QObject*)(m_Controls->m_SaveStorage), SIGNAL(clicked()), this, SLOT(OnSaveStorage()) );
00073
00074
00075 connect( (QObject*)(m_Controls->m_AddToolCancel), SIGNAL(clicked()), this, SLOT(OnAddToolCancel()) );
00076 connect( (QObject*)(m_Controls->m_AddToolSave), SIGNAL(clicked()), this, SLOT(OnAddToolSave()) );
00077 connect( (QObject*)(m_Controls->m_LoadSurface), SIGNAL(clicked()), this, SLOT(OnLoadSurface()) );
00078 connect( (QObject*)(m_Controls->m_LoadCalibrationFile), SIGNAL(clicked()), this, SLOT(OnLoadCalibrationFile()) );
00079 }
00080 }
00081
00082 void QmitkNavigationToolManagementWidget::Initialize(mitk::DataStorage* dataStorage)
00083 {
00084 m_DataStorage = dataStorage;
00085 }
00086
00087
00088
00089
00090
00091 void QmitkNavigationToolManagementWidget::OnAddTool()
00092 {
00093
00094 m_Controls->m_SurfaceChooser->SetDataStorage(m_DataStorage);
00095 m_Controls->AddToolLabel->setText("<b>Add Tool:</b>");
00096 m_Controls->m_MainWidgets->setCurrentIndex(1);
00097
00098
00099 m_Controls->m_ToolNameEdit->setText("");
00100 m_Controls->m_IdentifierEdit->setText("NavigationTool#"+QString::number(m_NavigationToolStorage->GetToolCount()));
00101 m_Controls->m_SerialNumberEdit->setText("");
00102 m_Controls->m_CalibrationFileName->setText("");
00103
00104 m_edit = false;
00105 }
00106
00107 void QmitkNavigationToolManagementWidget::OnDeleteTool()
00108 {
00109
00110 if (m_Controls->m_ToolList->currentItem() == NULL) {MessageBox("Error: Please select tool first!");return;}
00111
00112 m_DataStorage->Remove(m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row())->GetDataNode());
00113 m_NavigationToolStorage->DeleteTool(m_Controls->m_ToolList->currentIndex().row());
00114 UpdateToolTable();
00115
00116 }
00117
00118 void QmitkNavigationToolManagementWidget::OnEditTool()
00119 {
00120
00121 if (m_Controls->m_ToolList->currentItem() == NULL) {MessageBox("Error: Please select tool first!");return;}
00122
00123
00124 m_Controls->m_SurfaceChooser->SetDataStorage(m_DataStorage);
00125 m_Controls->AddToolLabel->setText("<b>Edit Tool:</b>");
00126 m_Controls->m_MainWidgets->setCurrentIndex(1);
00127
00128
00129 mitk::NavigationTool::Pointer selectedTool = m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row());
00130 m_Controls->m_ToolNameEdit->setText(QString(selectedTool->GetDataNode()->GetName().c_str()));
00131 m_Controls->m_IdentifierEdit->setText(QString(selectedTool->GetIdentifier().c_str()));
00132 m_Controls->m_SerialNumberEdit->setText(QString(selectedTool->GetSerialNumber().c_str()));
00133 switch(selectedTool->GetTrackingDeviceType())
00134 {
00135 case mitk::NDIAurora:
00136 m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(0);break;
00137 case mitk::NDIPolaris:
00138 m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(1);break;
00139 case mitk::ClaronMicron:
00140 m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(2);break;
00141 default:
00142 m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(0);
00143 }
00144 m_Controls->m_CalibrationFileName->setText(QString(selectedTool->GetCalibrationFile().c_str()));
00145 switch(selectedTool->GetType())
00146 {
00147 case mitk::NavigationTool::Instrument:
00148 m_Controls->m_ToolTypeChooser->setCurrentIndex(0); break;
00149 case mitk::NavigationTool::Fiducial:
00150 m_Controls->m_ToolTypeChooser->setCurrentIndex(1); break;
00151 case mitk::NavigationTool::Skinmarker:
00152 m_Controls->m_ToolTypeChooser->setCurrentIndex(2); break;
00153 case mitk::NavigationTool::Unknown:
00154 m_Controls->m_ToolTypeChooser->setCurrentIndex(3); break;
00155 }
00156
00157 m_Controls->m_SurfaceChooser->SetSelectedNode(selectedTool->GetDataNode());
00158 m_edit = true;
00159 }
00160
00161 void QmitkNavigationToolManagementWidget::OnLoadSingleTool()
00162 {
00163 mitk::NavigationToolReader::Pointer myReader = mitk::NavigationToolReader::New(m_DataStorage);
00164 mitk::NavigationTool::Pointer readTool = myReader->DoRead(QFileDialog::getOpenFileName(NULL,tr("Open Navigation Tool"), "/", "*.*").toAscii().data());
00165 if (readTool.IsNull()) MessageBox("Error: " + myReader->GetErrorMessage());
00166 else
00167 {
00168 if (!m_NavigationToolStorage->AddTool(readTool))
00169 {
00170 MessageBox("Error: Can't add tool!");
00171 m_DataStorage->Remove(readTool->GetDataNode());
00172 }
00173 UpdateToolTable();
00174 }
00175 }
00176
00177 void QmitkNavigationToolManagementWidget::OnSaveSingleTool()
00178 {
00179
00180 if (m_Controls->m_ToolList->currentItem() == NULL) {MessageBox("Error: Please select tool first!");return;}
00181
00182 mitk::NavigationToolWriter::Pointer myWriter = mitk::NavigationToolWriter::New();
00183 if (!myWriter->DoWrite(QFileDialog::getSaveFileName(NULL,tr("Save Navigation Tool"), "/", "*.*").toAscii().data(),m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row())))
00184 MessageBox("Error: "+ myWriter->GetErrorMessage());
00185 }
00186
00187 void QmitkNavigationToolManagementWidget::OnLoadStorage()
00188 {
00189 mitk::NavigationToolStorageDeserializer::Pointer myDeserializer = mitk::NavigationToolStorageDeserializer::New(m_DataStorage);
00190 std::string filename = QFileDialog::getOpenFileName(NULL,tr("Open Navigation Tool"), "/", "*.*").toAscii().data();
00191 mitk::NavigationToolStorage::Pointer tempStorage = myDeserializer->Deserialize(filename);
00192 if (tempStorage.IsNull()) MessageBox("Error" + myDeserializer->GetErrorMessage());
00193 else
00194 {
00195 m_NavigationToolStorage = tempStorage;
00196 m_Controls->m_StorageName->setText(filename.c_str());
00197 }
00198 UpdateToolTable();
00199 }
00200
00201 void QmitkNavigationToolManagementWidget::OnSaveStorage()
00202 {
00203 mitk::NavigationToolStorageSerializer::Pointer mySerializer = mitk::NavigationToolStorageSerializer::New();
00204 std::string filename = QFileDialog::getSaveFileName(NULL,tr("Save Navigation Tool"), "/", "*.*").toAscii().data();
00205 if (!mySerializer->Serialize(filename,m_NavigationToolStorage)) MessageBox("Error: " + mySerializer->GetErrorMessage());
00206 else m_Controls->m_StorageName->setText(QString(filename.c_str()));
00207 }
00208
00209
00210
00211
00212
00213
00214 void QmitkNavigationToolManagementWidget::OnAddToolSave()
00215 {
00216 mitk::NavigationTool::Pointer workTool;
00217
00218 if (m_edit)
00219 {
00220 workTool = m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row());
00221
00222
00223 workTool->GetDataNode()->SetName(m_Controls->m_ToolNameEdit->text().toLatin1());
00224 workTool->GetDataNode()->SetData(m_Controls->m_SurfaceChooser->GetSelectedNode()->GetData());
00225 }
00226 else
00227 {
00228 workTool = mitk::NavigationTool::New();
00229
00230
00231 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
00232 newNode->SetName(m_Controls->m_ToolNameEdit->text().toLatin1());
00233 newNode->SetData(m_Controls->m_SurfaceChooser->GetSelectedNode()->GetData());
00234 m_DataStorage->Add(newNode);
00235 workTool->SetDataNode(newNode);
00236 }
00237
00238
00239 workTool->SetCalibrationFile(m_Controls->m_CalibrationFileName->text().toAscii().data());
00240 workTool->SetIdentifier(m_Controls->m_IdentifierEdit->text().toAscii().data());
00241 workTool->SetSerialNumber(m_Controls->m_SerialNumberEdit->text().toAscii().data());
00242
00243 if (m_Controls->m_TrackingDeviceTypeChooser->currentText()=="NDI Aurora") workTool->SetTrackingDeviceType(mitk::NDIAurora);
00244 else if (m_Controls->m_TrackingDeviceTypeChooser->currentText()=="NDI Polaris") workTool->SetTrackingDeviceType(mitk::NDIPolaris);
00245 else if (m_Controls->m_TrackingDeviceTypeChooser->currentText()=="Claron Technology Micron Tracker") workTool->SetTrackingDeviceType(mitk::ClaronMicron);
00246 else workTool->SetTrackingDeviceType(mitk::TrackingSystemNotSpecified);
00247
00248 if (m_Controls->m_ToolTypeChooser->currentText()=="Instrument") workTool->SetType(mitk::NavigationTool::Instrument);
00249 else if (m_Controls->m_ToolTypeChooser->currentText()=="Fiducial") workTool->SetType(mitk::NavigationTool::Fiducial);
00250 else if (m_Controls->m_ToolTypeChooser->currentText()=="Skinmarker") workTool->SetType(mitk::NavigationTool::Skinmarker);
00251 else workTool->SetType(mitk::NavigationTool::Unknown);
00252
00253 if (!m_edit) m_NavigationToolStorage->AddTool(workTool);
00254
00255 UpdateToolTable();
00256
00257 m_Controls->m_MainWidgets->setCurrentIndex(0);
00258 }
00259
00260 void QmitkNavigationToolManagementWidget::OnAddToolCancel()
00261 {
00262 m_Controls->m_MainWidgets->setCurrentIndex(0);
00263 }
00264
00265 void QmitkNavigationToolManagementWidget::OnLoadSurface()
00266 {
00267 std::string filename = QFileDialog::getOpenFileName(NULL,tr("Open Surface"), "/", "*.stl").toLatin1().data();
00268 mitk::STLFileReader::Pointer stlReader = mitk::STLFileReader::New();
00269 try
00270 {
00271 stlReader->SetFileName( filename.c_str() );
00272 stlReader->Update();
00273 }
00274 catch (...)
00275 {
00276 }
00277
00278 if ( stlReader->GetOutput() == NULL );
00279 else
00280 {
00281 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
00282 newNode->SetName(filename);
00283 newNode->SetData(stlReader->GetOutput());
00284 m_DataStorage->Add(newNode);
00285 }
00286 }
00287
00288 void QmitkNavigationToolManagementWidget::OnLoadCalibrationFile()
00289 {
00290 m_Controls->m_CalibrationFileName->setText(QFileDialog::getOpenFileName(NULL,tr("Open Calibration File"), "/", "*.*"));
00291 }
00292
00293
00294
00295
00296
00297
00298 void QmitkNavigationToolManagementWidget::UpdateToolTable()
00299 {
00300 m_Controls->m_ToolList->clear();
00301 for(int i=0; i<m_NavigationToolStorage->GetToolCount(); i++)
00302 {
00303 QString currentTool = "Tool" + QString::number(i) + ": " + QString(m_NavigationToolStorage->GetTool(i)->GetDataNode()->GetName().c_str())+ " ";
00304 switch (m_NavigationToolStorage->GetTool(i)->GetTrackingDeviceType())
00305 {
00306 case mitk::ClaronMicron:
00307 currentTool += "(MicronTracker/"; break;
00308 case mitk::NDIAurora:
00309 currentTool += "(NDI Aurora/"; break;
00310 case mitk::NDIPolaris:
00311 currentTool += "(NDI Polaris/"; break;
00312 default:
00313 currentTool += "(unknown tracking system/"; break;
00314 }
00315 switch (m_NavigationToolStorage->GetTool(i)->GetType())
00316 {
00317 case mitk::NavigationTool::Instrument:
00318 currentTool += "Instrument)"; break;
00319 case mitk::NavigationTool::Fiducial:
00320 currentTool += "Fiducial)"; break;
00321 case mitk::NavigationTool::Skinmarker:
00322 currentTool += "Skinmarker)"; break;
00323 default:
00324 currentTool += "Unknown)";
00325 }
00326 m_Controls->m_ToolList->addItem(currentTool);
00327 }
00328
00329 }
00330
00331 void QmitkNavigationToolManagementWidget::MessageBox(std::string s)
00332 {
00333 QMessageBox msgBox;
00334 msgBox.setText(s.c_str());
00335 msgBox.exec();
00336 }