13#define MITK_NO_DEPRECATED_WARNINGS
16#include <QTableWidget>
19#include <QInputDialog>
25#include <mitkIGTException.h>
26#include <mitkIOUtil.h>
29#include "QmitkCustomVariants.h"
39: QWidget(parent), m_Controls(nullptr), m_Tracker(nullptr), m_Source(nullptr),
40m_Delegate(nullptr), m_SROMCellDefaultText(
"<click to load SROM file>"), m_RepresentatonCellDefaultText(
"<click to select representation>")
59 m_Controls =
new Ui::QmitkNDIConfigurationWidget;
63 comPorts <<
"COM1" <<
"COM2" <<
"COM3" <<
"COM4" <<
"COM5" <<
"COM6" <<
"COM7" <<
"COM8" <<
"COM9";
65 comPorts <<
"/dev/ttyS1" <<
"/dev/ttyS2" <<
"/dev/ttyS3" <<
"/dev/ttyS4" <<
"/dev/ttyS5" <<
"/dev/ttyUSB0" <<
"/dev/ttyUSB1" <<
"/dev/ttyUSB2" <<
"/dev/ttyUSB3";
67 m_Controls->m_ComPortSelector->addItems(comPorts);
86 connect(
m_Controls->m_ToolTable->model(), SIGNAL(dataChanged(
const QModelIndex &,
const QModelIndex &)),
this, SLOT(
UpdateTrackerFromToolTable(
const QModelIndex &,
const QModelIndex &)));
112 QMessageBox::warning(
nullptr,
"Error", QString(
"Connection failed, error message: ") + e.GetDescription());
141 QMessageBox::warning(
nullptr,
"Error", QString(
"Connection failed due to an unknown reason!"));
174 m_Controls->m_lConnection->setText(
"III. Enable connection to device ");
178 m_Controls->m_DiscoverToolsBtn->setDisabled(
true);
186 m_Controls->m_lConnection->setText(
"III. Enable connection to device ");
189 m_Controls->m_DiscoverToolsBtn->setDisabled(
true);
196 m_Controls->m_lConnection->setText(
"III. Disable connection to device ");
199 m_Controls->m_DiscoverToolsBtn->setEnabled(
true);
208 return QString(
"Not connected");
210 QString devName = QString::fromStdString(
m_Tracker->GetType());
213 return QString(
"Connected to %1 on %2. Device is ready.").arg(devName).arg(
m_Tracker->GetDeviceName());
215 return QString(
"%1 is tracking.").arg(devName);
224 QMessageBox::warning(
nullptr,
"Error", QString(
"Connection failed. No tracking device found."));
239 if (filenames.isEmpty())
247 foreach(QString fileName, filenames)
252 m_Tracker->AddTool(QFileInfo(fileName).baseName().toLatin1(), fileName.toLatin1());
262 m_Tracker = mitk::NDITrackingDevice::New();
270 m_Tracker->SetDeviceName(this->GetDeviceName());
275std::string QmitkNDIConfigurationWidget::GetDeviceName()
const
279 QString deviceName =
m_Controls->m_ComPortSelector->currentText();
281 deviceName.prepend(
"\\\\.\\");
283 return deviceName.toStdString();
298 disconnect(
m_Controls->m_ToolTable->model(), SIGNAL(dataChanged(
const QModelIndex &,
const QModelIndex &)),
this, SLOT(
UpdateTrackerFromToolTable(
const QModelIndex &,
const QModelIndex &)));
309 for (
unsigned int i = 0; i <
m_Tracker->GetToolCount(); ++i)
346 m_Controls->m_ToolTable->resizeColumnsToContents();
348 connect(
m_Controls->m_ToolTable->model(), SIGNAL(dataChanged(
const QModelIndex &,
const QModelIndex &)),
this, SLOT(
UpdateTrackerFromToolTable(
const QModelIndex &,
const QModelIndex &)));
357 QString status =
"Scanning ";
360 for (
unsigned int i = 1; i < 40; ++i)
363 devName = QString(
"COM%1").arg(i);
365 devName = QString(
"\\\\.\\COM%1").arg(i);
366 portsAndDevices[devName];
367 status += QString(
"COM%1").arg(i) +
", ";
370 for(
unsigned int i = 1; i < 6; ++i)
372 QString devName = QString(
"/dev/ttyS%1").arg(i);
373 portsAndDevices[devName];
374 status += devName +
", ";
376 for(
unsigned int i = 0; i <7; ++i)
378 QString devName = QString(
"/dev/ttyUSB%1").arg(i);
379 portsAndDevices[devName];
380 status += devName +
", ";
385 status +=
" for NDI tracking devices...";
389 QString result =
"The following tracking devices were found:<BR/>\n";
390 for (PortDeviceMap::const_iterator it = portsAndDevices.begin(); it != portsAndDevices.end(); ++it)
392 QString tmpComPort = it.key();
393 if (tmpComPort.startsWith(
"\\"))
395 tmpComPort.remove(0,4);
397 result += tmpComPort +
": ";
401 result += QString::fromStdString(it.value());
403 m_Controls->m_ComPortSelector->addItem(tmpComPort);
407 result +=
"No NDI tracking device found<BR/>\n";
417 mitk::NDITrackingDevice::Pointer tracker = mitk::NDITrackingDevice::New();
418 tracker->SetDeviceName(port.toStdString());
419 return tracker->TestConnection();
426 for (PortDeviceMap::iterator it = portsAndDevices.begin(); it != portsAndDevices.end(); ++it)
427 it.value() = this->
ScanPort(it.key());
437 QStringList toolNames;
440 for (
unsigned int i = 0; i <
m_Tracker->GetToolCount(); ++i)
457void QmitkNDIConfigurationWidget::SetToolTypes(
const QStringList& types)
463void QmitkNDIConfigurationWidget::SetDataStorage(mitk::DataStorage* ds)
469void QmitkNDIConfigurationWidget::SetPredicate(mitk::NodePredicateBase::Pointer p)
475void QmitkNDIConfigurationWidget::SetTagPropertyName(
const std::string& name )
481void QmitkNDIConfigurationWidget::SetTagProperty( mitk::BaseProperty::Pointer prop )
490 QTableWidgetItem* filenameItem;
492 switch (topLeft.column())
499 filenameItem =
new QTableWidgetItem(filename);
500 m_Controls->m_ToolTable->setItem( topLeft.row(), topLeft.column(), filenameItem );
502 if(QFileInfo(filename).exists())
506 if(surface.IsNotNull())
519 if (topLeft.column()<1)
525 if (topLeft.row() >= (
int)
m_Tracker->GetToolCount())
528 QAbstractItemModel* model =
m_Controls->m_ToolTable->model();
536 switch (topLeft.column())
541 tool->
SetToolName(model->data(model->index(topLeft.row(), 1)).toString().toLatin1());
547 if (QFileInfo(romfile).exists())
561const QString QmitkNDIConfigurationWidget::GetToolType(
unsigned int index )
const
566 QAbstractItemModel* model =
m_Controls->m_ToolTable->model();
568 if (modelIndex.isValid() ==
false)
571 return model->data(modelIndex).toString();
575const QString QmitkNDIConfigurationWidget::GetToolName(
unsigned int index )
const
580 QAbstractItemModel* model =
m_Controls->m_ToolTable->model();
582 if (modelIndex.isValid() ==
false)
585 return model->data(modelIndex).toString();
591 QMap<QString, unsigned int> map;
594 QAbstractItemModel* model =
m_Controls->m_ToolTable->model();
595 for (
int i = 0; i < model->rowCount(); ++i)
599 if ((indexIndex.isValid() ==
false) || (typeIndex.isValid() ==
false))
601 map.insert(model->data(typeIndex).toString(), model->data(indexIndex).toUInt());
607QList<unsigned int> QmitkNDIConfigurationWidget::GetToolsByToolType( QString toolType )
const
609 QList<unsigned int> list;
612 QAbstractItemModel* model =
m_Controls->m_ToolTable->model();
613 for (
int i = 0; i < model->rowCount(); ++i)
617 if ((indexIndex.isValid() ==
false) || (typeIndex.isValid() ==
false))
619 if (model->data(typeIndex).toString() == toolType)
620 list.append(model->data(indexIndex).toUInt());
626mitk::DataNode* QmitkNDIConfigurationWidget::GetNode(
unsigned int index )
const
631 QAbstractItemModel* model =
m_Controls->m_ToolTable->model();
633 return data.value<mitk::DataNode*>();
638 m_Controls->m_gbPolarisOptions->setHidden(on);
648 int cols =
m_Controls->m_ToolTable->columnCount();
664 int rows =
m_Controls->m_ToolTable->rowCount();
667 for(
int i=0; i < rows; ++i)
679 QMessageBox *infoBox =
new QMessageBox(
this);
680 infoBox->setText(
"Click \"Scan Ports\" to get a list of all connected NDI tracking devices. This will clear the selection menu below and add the ports for discovered NDI tracking devices. Use this function, if a port is not listed.");
697 toolName =
m_Controls->m_ToolTable->item(row,column)->text();
698 m_Controls->m_ToolSelectionComboBox->setItemText(row, toolName);
716 int currId =
m_Controls->m_ToolSelectionComboBox->currentIndex();
717 QString filename = QFileDialog::getSaveFileName(
nullptr,
"Save NDI-Tool", QString(QString(
m_Tracker->GetTool(currId)->GetToolName())),
"NDI Tracking Tool file(*.ntf)");
721 if(filename.isEmpty())
724 mitk::NavigationTool::Pointer navTool = mitk::NavigationTool::New();
727 mitk::NavigationToolWriter::Pointer toolWriter = mitk::NavigationToolWriter::New();
729 toolWriter->DoWrite(filename.toStdString(), this->GenerateNavigationTool(selectedTool));
733 QMessageBox::warning(
nullptr,
"Saving Tool Error", QString(
"An error occured! Could not save tool!\n\n"));
734 MITK_ERROR<<
"Could not save tool surface!";
735 MITK_ERROR<< toolWriter->GetErrorMessage();
737 QFile maybeCorruptFile(filename);
739 if(maybeCorruptFile.exists())
740 maybeCorruptFile.remove();
753 int currId =
m_Controls->m_ToolSelectionComboBox->currentIndex();
755 if(filename.isEmpty())
760 mitk::DataNode::Pointer toolNode;
761 mitk::NavigationToolReader::Pointer toolReader = mitk::NavigationToolReader::New();
762 mitk::NavigationTool::Pointer navTool;
765 navTool = toolReader->DoRead(filename.toStdString());
769 QMessageBox::warning(
nullptr,
"Loading Tool Error", QString(
"An error occured! Could not load tool!\n\n"));
770 MITK_ERROR<<
"Could not load tool surface!";
771 MITK_ERROR<< toolReader->GetErrorMessage();
774 int currSelectedToolID =
m_Controls->m_ToolSelectionComboBox->currentIndex();
803 mitk::NavigationTool::Pointer navTool = mitk::NavigationTool::New();
806 if(passiveTool.IsNull())
807 throw std::runtime_error(
"Could not cast TrackingTool to PassiveTool");
809 int currSelectedToolID =
m_Controls->m_ToolSelectionComboBox->currentIndex();
815 QFile sromFile(sromFileName);
816 if(sromFile.exists())
817 navTool->SetCalibrationFile(sromFileName.toStdString());
820 navTool->SetSerialNumber(passiveTool->GetSerialNumber());
823 mitk::DataNode::Pointer node = mitk::DataNode::New();
825 mitk::Surface::Pointer toolSurface;
832 QMessageBox::warning(
nullptr,
"Loading Surface Error", QString(
"An error occured! Could not load surface from .stl file!\n\n"));
833 MITK_ERROR<<
"Could not load .stl tool surface!";
837 if(toolSurface.IsNotNull())
839 node->SetData(toolSurface);
843 navTool->SetDataNode(node);
849 if(currentToolType.compare(
"Instrument") == 0)
851 else if(currentToolType.compare(
"Fiducial") == 0)
853 else if(currentToolType.compare(
"Skinmarker") == 0)
858 navTool->SetType(type);
866 mitk::Surface::Pointer toolSurface;
868 QFile surfaceFile(surfaceFilename);
869 if(surfaceFile.exists())
872 toolSurface = mitk::IOUtil::Load<mitk::Surface>(surfaceFilename.toStdString().c_str());
874 catch(std::exception& e )
876 MITK_ERROR<<
"Could not load surface for tool!";
877 MITK_ERROR<< e.what();
890 m_Controls->m_DiscoverToolsBtn->setEnabled(enable);
static void SetLastFileLoadPathByFileName(const QString &str)
static const QString GetLastFileLoadPath()
An object of this class represents an exception of the MITK-IGT module.
superclass for specific NDI tracking Devices that use serial communication.
std::string TrackingDeviceType