Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkNavigationToolCreationWidget.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 //mitk headers
16 #include <mitkTrackingTypes.h>
17 #include <mitkSurface.h>
18 #include <mitkNavigationData.h>
19 #include <mitkRenderingManager.h>
21 
22 //qt headers
23 #include <qfiledialog.h>
24 #include <qmessagebox.h>
25 #include <mitkIOUtil.h>
26 #include <QmitkIGTCommonHelper.h>
27 #include <QDialogButtonBox>
28 
29 //poco headers
30 #include <Poco/Path.h>
31 
32 const std::string QmitkNavigationToolCreationWidget::VIEW_ID = "org.mitk.views.navigationtoolcreationwizardwidget";
33 
35  : QWidget(parent, f)
36 {
37  m_Controls = nullptr;
41  m_Controls = nullptr;
42 
43  CreateQtPartControl(this);
45 
46  this->InitializeUIToolLandmarkLists();
47  Initialize(nullptr, "");
48 
49  //Default values, which are not stored in tool
50  m_Controls->m_CalibrationFileName->setText("none");
51  m_Controls->m_Surface_Use_Sphere->setChecked(true);
52 
53  m_Controls->m_CalibrationLandmarksList->EnableEditButton(false);
54  m_Controls->m_RegistrationLandmarksList->EnableEditButton(false);
55 
56  RefreshTrackingDeviceCollection();
57 
59 }
60 
62 {
63  m_Controls->m_CalibrationLandmarksList->SetPointSetNode(nullptr);
64  m_Controls->m_RegistrationLandmarksList->SetPointSetNode(nullptr);
66 }
67 
69 {
70  if (!m_Controls)
71  {
72  // create GUI widgets
73  m_Controls = new Ui::QmitkNavigationToolCreationWidgetControls;
74  m_Controls->setupUi(parent);
75  }
76 }
77 
79 {
80  if (m_Controls)
81  {
82  connect((QObject*)(m_Controls->m_TrackingDeviceTypeChooser), SIGNAL(currentIndexChanged(int)), this, SLOT(GetValuesFromGuiElements()));
83  connect((QObject*)(m_Controls->m_ToolNameEdit), SIGNAL(textChanged(const QString)), this, SLOT(GetValuesFromGuiElements()));
84  connect((QObject*)(m_Controls->m_ToolTypeChooser), SIGNAL(currentIndexChanged(int)), this, SLOT(GetValuesFromGuiElements()));
85  connect((QObject*)(m_Controls->m_IdentifierEdit), SIGNAL(textChanged(const QString)), this, SLOT(GetValuesFromGuiElements()));
86  connect((QObject*)(m_Controls->m_SerialNumberEdit), SIGNAL(textChanged(const QString)), this, SLOT(GetValuesFromGuiElements()));
87  connect((QObject*)(m_Controls->m_ToolAxisX), SIGNAL(valueChanged(int)), this, SLOT(GetValuesFromGuiElements()));
88  connect((QObject*)(m_Controls->m_ToolAxisY), SIGNAL(valueChanged(int)), this, SLOT(GetValuesFromGuiElements()));
89  connect((QObject*)(m_Controls->m_ToolAxisZ), SIGNAL(valueChanged(int)), this, SLOT(GetValuesFromGuiElements()));
90 
91  //Buttons
92  connect((QObject*)(m_Controls->m_LoadCalibrationFile), SIGNAL(clicked()), this, SLOT(OnLoadCalibrationFile()));
93  connect(m_Controls->m_Surface_Use_Other, SIGNAL(toggled(bool)), this, SLOT(OnSurfaceUseToggled()));
94  connect(m_Controls->m_Surface_Load_File, SIGNAL(toggled(bool)), this, SLOT(OnSurfaceUseToggled()));
95  connect((QObject*)(m_Controls->m_LoadSurface), SIGNAL(clicked()), this, SLOT(OnLoadSurface()));
96  connect((QObject*)(m_Controls->m_EditToolTip), SIGNAL(clicked()), this, SLOT(OnEditToolTip()));
97 
98  connect((QObject*)(m_ToolTransformationWidget), SIGNAL(EditToolTipFinished(mitk::AffineTransform3D::Pointer)), this,
99  SLOT(OnEditToolTipFinished(mitk::AffineTransform3D::Pointer)));
100 
101  connect((QObject*)(m_Controls->m_cancel), SIGNAL(clicked()), this, SLOT(OnCancel()));
102  connect((QObject*)(m_Controls->m_finished), SIGNAL(clicked()), this, SLOT(OnFinished()));
103  }
104 }
105 
106 void QmitkNavigationToolCreationWidget::Initialize(mitk::DataStorage* dataStorage, const std::string& supposedIdentifier, const std::string& supposedName)
107 {
108  m_DataStorage = dataStorage;
109  //initialize UI components
110  m_Controls->m_SurfaceChooser->SetDataStorage(m_DataStorage);
111  m_Controls->m_SurfaceChooser->SetAutoSelectNewItems(true);
112  m_Controls->m_SurfaceChooser->SetPredicate(mitk::NodePredicateDataType::New("Surface"));
113 
114  //Create new tool, which should be edited/created
115  m_ToolToBeEdited = nullptr;//Reset
117  m_ToolToBeEdited->SetIdentifier(supposedIdentifier);
118 
119  m_ToolToBeEdited->GetDataNode()->SetName(supposedName);
120 
122 }
123 
125 {
126  m_DataStorage->Add(m_ToolToBeEdited->GetDataNode());
127  m_ToolToBeEdited->GetDataNode()->SetName(_name);
128 
129  //change color to blue
130  m_ToolToBeEdited->GetDataNode()->SetProperty("color", mitk::ColorProperty::New(0, 0, 1));
131 
132  //Global Reinit to show new tool
134 }
135 
136 void QmitkNavigationToolCreationWidget::SetDefaultData(mitk::NavigationTool::Pointer DefaultTool)
137 {
138  //Set Members. This can either be the new initialized tool from call of Initialize() or a tool which already exists in the toolStorage
139  m_ToolToBeEdited = DefaultTool->Clone();
140 
141  //Set all gui variables
142  SetGuiElements();
143 }
144 
145 void QmitkNavigationToolCreationWidget::SetGuiElements()
146 {
147  //Block signals, so that we don't call SetGuiElements again. This is undone at the end of this function!
148  m_Controls->m_TrackingDeviceTypeChooser->blockSignals(true);
149  m_Controls->m_ToolNameEdit->blockSignals(true);
150  m_Controls->m_ToolTypeChooser->blockSignals(true);
151  m_Controls->m_IdentifierEdit->blockSignals(true);
152  m_Controls->m_SerialNumberEdit->blockSignals(true);
153  m_Controls->m_ToolAxisX->blockSignals(true);
154  m_Controls->m_ToolAxisY->blockSignals(true);
155  m_Controls->m_ToolAxisZ->blockSignals(true);
156 
157  //DeviceType
158  int index = m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(m_ToolToBeEdited->GetTrackingDeviceType()));
159  if (index >= 0)
160  {
161  m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(index);
162  }
163 
164  m_Controls->m_ToolNameEdit->setText(QString(m_ToolToBeEdited->GetToolName().c_str()));
165  m_Controls->m_CalibrationFileName->setText(QString(m_ToolToBeEdited->GetCalibrationFile().c_str()));
166 
167  FillUIToolLandmarkLists(m_ToolToBeEdited->GetToolControlPoints(), m_ToolToBeEdited->GetToolLandmarks());
168 
169  switch (m_ToolToBeEdited->GetType())
170  {
172  m_Controls->m_ToolTypeChooser->setCurrentIndex(0); break;
174  m_Controls->m_ToolTypeChooser->setCurrentIndex(1); break;
176  m_Controls->m_ToolTypeChooser->setCurrentIndex(2); break;
178  m_Controls->m_ToolTypeChooser->setCurrentIndex(3); break;
179  }
180 
181  m_Controls->m_IdentifierEdit->setText(QString(m_ToolToBeEdited->GetIdentifier().c_str()));
182  m_Controls->m_SerialNumberEdit->setText(QString(m_ToolToBeEdited->GetSerialNumber().c_str()));
183 
184  QString _label = "(" +
185  QString::number(m_ToolToBeEdited->GetToolTipPosition()[0], 'f', 1) + ", " +
186  QString::number(m_ToolToBeEdited->GetToolTipPosition()[1], 'f', 1) + ", " +
187  QString::number(m_ToolToBeEdited->GetToolTipPosition()[2], 'f', 1) + "), quat: [" +
188  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[0], 'f', 2) + ", " +
189  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[1], 'f', 2) + ", " +
190  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[2], 'f', 2) + ", " +
191  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[3], 'f', 2) + "]";
192  m_Controls->m_ToolTipLabel->setText(_label);
193 
194  //Undo block signals. Don't remove it, if signals are still blocked at the beginning of this function!
195  m_Controls->m_TrackingDeviceTypeChooser->blockSignals(false);
196  m_Controls->m_ToolNameEdit->blockSignals(false);
197  m_Controls->m_ToolTypeChooser->blockSignals(false);
198  m_Controls->m_IdentifierEdit->blockSignals(false);
199  m_Controls->m_SerialNumberEdit->blockSignals(false);
200  m_Controls->m_ToolAxisX->blockSignals(false);
201  m_Controls->m_ToolAxisY->blockSignals(false);
202  m_Controls->m_ToolAxisZ->blockSignals(false);
203 }
204 
206 {
207  if (m_Controls->m_Surface_Use_Sphere->isChecked()) m_ToolToBeEdited->SetDefaultSurface();
208  m_Controls->m_SurfaceChooser->setEnabled(m_Controls->m_Surface_Use_Other->isChecked());
209  m_Controls->m_LoadSurface->setEnabled(m_Controls->m_Surface_Load_File->isChecked());
210 
211  //Global Reinit to show tool surface preview
213 }
214 
216 {
217  std::string filename = QFileDialog::getOpenFileName(nullptr, tr("Open Surface"), QmitkIGTCommonHelper::GetLastFileLoadPath(), tr("STL (*.stl)")).toLatin1().data();
218  QmitkIGTCommonHelper::SetLastFileLoadPathByFileName(QString::fromStdString(filename));
219  mitk::Surface::Pointer surface;
220  try
221  {
222  surface = mitk::IOUtil::Load<mitk::Surface>(filename.c_str());
223  }
224  catch (mitk::Exception &e)
225  {
226  MITK_ERROR << "Exception occured: " << e.what();
227  return;
228  }
229 
230  m_ToolToBeEdited->GetDataNode()->SetData(surface);
231 
232  //Global Reinit to show tool surface or preview
234 }
235 
237 {
238  QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open Calibration File"), QmitkIGTCommonHelper::GetLastFileLoadPath(), "*.*");
240  m_Controls->m_CalibrationFileName->setText(fileName);
241  m_ToolToBeEdited->SetCalibrationFile(fileName.toStdString());
242 }
244 {
245  //Tracking Device
246  m_ToolToBeEdited->SetTrackingDeviceType(m_Controls->m_TrackingDeviceTypeChooser->currentText().toStdString());
247  //m_ToolToBeEdited->GetDataNode()->SetName(m_Controls->m_ToolNameEdit->text().toStdString());
248 
249  //Tool Landmarks
250  mitk::PointSet::Pointer toolCalLandmarks, toolRegLandmarks;
251  GetUIToolLandmarksLists(toolCalLandmarks, toolRegLandmarks);
252  m_ToolToBeEdited->SetToolControlPoints(toolCalLandmarks);
253  m_ToolToBeEdited->SetToolLandmarks(toolRegLandmarks);
254 
255  //Advanced
256  if (m_Controls->m_ToolTypeChooser->currentText() == "Instrument") m_ToolToBeEdited->SetType(mitk::NavigationTool::Instrument);
257  else if (m_Controls->m_ToolTypeChooser->currentText() == "Fiducial") m_ToolToBeEdited->SetType(mitk::NavigationTool::Fiducial);
258  else if (m_Controls->m_ToolTypeChooser->currentText() == "Skinmarker") m_ToolToBeEdited->SetType(mitk::NavigationTool::Skinmarker);
260 
261  m_ToolToBeEdited->SetIdentifier(m_Controls->m_IdentifierEdit->text().toLatin1().data());
262  m_ToolToBeEdited->SetSerialNumber(m_Controls->m_SerialNumberEdit->text().toLatin1().data());
263 
265  //mitk::Point3D toolAxis;
266  //toolAxis.SetElement(0, (m_Controls->m_ToolAxisX->value()));
267  //toolAxis.SetElement(1, (m_Controls->m_ToolAxisY->value()));
268  //toolAxis.SetElement(2, (m_Controls->m_ToolAxisZ->value()));
269  //m_ToolToBeEdited->SetToolAxis(toolAxis);
270 }
271 
273 {
274  return m_FinalTool;
275 }
276 
278 {
279  if (m_Controls->m_Surface_Use_Other->isChecked())
280  m_ToolToBeEdited->GetDataNode()->SetData(m_Controls->m_SurfaceChooser->GetSelectedNode()->GetData());
281 
282  //here we create a new tool
283  m_FinalTool = m_ToolToBeEdited->Clone();
284  //Set the correct name of data node, cause the m_ToolToBeEdited was called "Tool preview"
285  m_FinalTool->GetDataNode()->SetName(m_Controls->m_ToolNameEdit->text().toStdString());
286 
287  emit NavigationToolFinished();
288 }
289 
291 {
292  Initialize(nullptr, "");//Reset everything to a fresh tool, like it was done in the constructor
293  emit Canceled();
294 }
295 
297 {
298  //Adapt Gui
299  int index = m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(type));
300 
301  if (index >= 0)
302  {
303  m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(index);
304  }
305 
306  m_Controls->m_TrackingDeviceTypeChooser->setEditable(changeable);
307 
308  //Set data to member
309  m_ToolToBeEdited->SetTrackingDeviceType(type);
310 }
311 
312 //##################################################################################
313 //############################## internal help methods #############################
314 //##################################################################################
315 void QmitkNavigationToolCreationWidget::MessageBox(std::string s)
316 {
317  QMessageBox msgBox;
318  msgBox.setText(s.c_str());
319  msgBox.exec();
320 }
321 
323 {
327 
329 }
330 
331 void QmitkNavigationToolCreationWidget::OnEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip)
332 {
333  //if user pressed cancle, nullptr is returned. Do nothing. Else, set values.
334  if (toolTip)
335  {
336  m_ToolToBeEdited->SetToolTipPosition(toolTip->GetOffset());
337  mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(toolTip);//Convert to Navigation data for simple transversion to quaternion
338  m_ToolToBeEdited->SetToolAxisOrientation(tempND->GetOrientation());
339 
340  //Update Label
341  QString _label = "(" +
342  QString::number(m_ToolToBeEdited->GetToolTipPosition()[0], 'f', 1) + ", " +
343  QString::number(m_ToolToBeEdited->GetToolTipPosition()[1], 'f', 1) + ", " +
344  QString::number(m_ToolToBeEdited->GetToolTipPosition()[2], 'f', 1) + "), quat: [" +
345  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[0], 'f', 2) + ", " +
346  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[1], 'f', 2) + ", " +
347  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[2], 'f', 2) + ", " +
348  QString::number(m_ToolToBeEdited->GetToolAxisOrientation()[3], 'f', 2) + "]";
349  m_Controls->m_ToolTipLabel->setText(_label);
350  }
351 }
352 
353 void QmitkNavigationToolCreationWidget::FillUIToolLandmarkLists(mitk::PointSet::Pointer calLandmarks, mitk::PointSet::Pointer regLandmarks)
354 {
355  m_calLandmarkNode->SetData(calLandmarks);
356  m_regLandmarkNode->SetData(regLandmarks);
357  m_Controls->m_CalibrationLandmarksList->SetPointSetNode(m_calLandmarkNode);
358  m_Controls->m_RegistrationLandmarksList->SetPointSetNode(m_regLandmarkNode);
359 }
360 
361 void QmitkNavigationToolCreationWidget::GetUIToolLandmarksLists(mitk::PointSet::Pointer& calLandmarks, mitk::PointSet::Pointer& regLandmarks)
362 {
363  calLandmarks = dynamic_cast<mitk::PointSet*>(m_calLandmarkNode->GetData());
364  regLandmarks = dynamic_cast<mitk::PointSet*>(m_regLandmarkNode->GetData());
365 }
366 
367 void QmitkNavigationToolCreationWidget::InitializeUIToolLandmarkLists()
368 {
371  FillUIToolLandmarkLists(mitk::PointSet::New(), mitk::PointSet::New());
372 }
373 
374 void QmitkNavigationToolCreationWidget::RefreshTrackingDeviceCollection()
375 {
376  us::ModuleContext* context = us::GetModuleContext();
377  std::vector<us::ServiceReference<mitk::TrackingDeviceTypeCollection> > refs = context->GetServiceReferences<mitk::TrackingDeviceTypeCollection>();
378  if (refs.empty())
379  {
380  MITK_WARN << "No tracking device service found!";
381  return;
382  }
383  mitk::TrackingDeviceTypeCollection* _DeviceTypeCollection = context->GetService<mitk::TrackingDeviceTypeCollection>(refs.front());
384 
385  for (auto name : _DeviceTypeCollection->GetTrackingDeviceTypeNames())
386  {
387  //if the device is not included yet, add name to comboBox and widget to stackedWidget
388  if (m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(name)) == -1)
389  {
390  m_Controls->m_TrackingDeviceTypeChooser->addItem(QString::fromStdString(name));
391  }
392  }
393 }
static Pointer New()
static const QString GetLastFileLoadPath()
Data management class that handles &#39;was created by&#39; relations.
QmitkNavigationToolCreationWidget(QWidget *parent=nullptr, Qt::WindowFlags f=nullptr)
void SetTrackingDeviceType(mitk::TrackingDeviceType type, bool changeable=true)
Sets the default tracking device type. You may also define if it is changeable or not...
mitk::NavigationTool::Pointer m_ToolToBeEdited
this pointer holds the tool which is edited. If finished is clicked, it will be copied to the final t...
mitk::NavigationTool::Pointer m_FinalTool
this pointer holds the tool which is created and returned
void SetDefaultOffset(const mitk::Point3D _defaultValues)
#define MITK_ERROR
Definition: mitkLogMacros.h:20
static void SetLastFileLoadPathByFileName(const QString &str)
static Pointer New()
static Pointer New()
void SetDefaultRotation(const mitk::Quaternion _defaultValues)
This class is a collection for information of all Tracking Device Types (derived from abstract Tracki...
void SetDefaultData(mitk::NavigationTool::Pointer DefaultTool)
Sets the default data of all input fields. The default data is used from the default tool which is gi...
virtual void Add(DataNode *node, const DataStorage::SetOfObjects *parents=nullptr)=0
Adds a DataNode containing a data object to its internal storage.
#define MITK_WARN
Definition: mitkLogMacros.h:19
Data structure which stores a set of points. Superclass of mitk::Mesh.
Definition: mitkPointSet.h:75
static Pointer New()
An object of this class represents an exception of MITK. Please don&#39;t instantiate exceptions manually...
Definition: mitkException.h:45
static RenderingManager * GetInstance()
mitk::DataStorage * m_DataStorage
holds the DataStorage
void Initialize(mitk::DataStorage *dataStorage, const std::string &supposedIdentifier, const std::string &supposedName="NewTool")
Initializes the widget.
void SetToolToEdit(const mitk::NavigationTool::Pointer _tool)
An object of this class offers an UI to create a widget to access the advanced tool creation options...
static Pointer New()
static Pointer New(const char *_arg)
std::string TrackingDeviceType
void OnEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip)
void Canceled()
This signal is emitted if the user canceled the creation of the tool.
QmitkInteractiveTransformationWidget * m_ToolTransformationWidget
Ui::QmitkNavigationToolCreationWidgetControls * m_Controls
void ShowToolPreview(std::string _name)
This Function will add a new node to the Data Manager with given name to enable a preview of the m_To...
void NavigationToolFinished()
This signal is emitted if the user finished the creation of the tool.
virtual void InitializeViewsByBoundingObjects(const DataStorage *)
Initializes the renderwindows by the aggregated geometry of all objects that are held in the data sto...
virtual void CreateConnections()
Creation of the connections.
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.