MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
QmitkNavigationToolCreationWidget.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found 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>
27#include <QDialogButtonBox>
28
29//poco headers
30#include <Poco/Path.h>
31
32const std::string QmitkNavigationToolCreationWidget::VIEW_ID = "org.mitk.views.navigationtoolcreationwizardwidget";
33
35 : QWidget(parent, f)
36{
37 m_Controls = nullptr;
38 m_ToolToBeEdited = mitk::NavigationTool::New();
39 m_FinalTool = mitk::NavigationTool::New();
41 m_Controls = nullptr;
42
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
106void 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
116 m_ToolToBeEdited = mitk::NavigationTool::New();//Reinitialize
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
133 mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage);
134}
135
136void 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
145void 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
212 mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage);
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
233 mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage);
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
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//##################################################################################
315void QmitkNavigationToolCreationWidget::MessageBox(std::string s)
316{
317 QMessageBox msgBox;
318 msgBox.setText(s.c_str());
319 msgBox.exec();
320}
321
330
331void 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(mitk::Point3D(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
353void 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
361void 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
367void QmitkNavigationToolCreationWidget::InitializeUIToolLandmarkLists()
368{
369 m_calLandmarkNode = mitk::DataNode::New();
370 m_regLandmarkNode = mitk::DataNode::New();
371 FillUIToolLandmarkLists(mitk::PointSet::New(), mitk::PointSet::New());
372}
373
374void 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 void SetLastFileLoadPathByFileName(const QString &str)
static const QString GetLastFileLoadPath()
An object of this class offers an UI to create a widget to access the advanced tool creation options.
void SetDefaultRotation(const mitk::Quaternion _defaultValues)
void SetDefaultOffset(const mitk::Point3D _defaultValues)
void SetToolToEdit(const mitk::NavigationTool::Pointer _tool)
Ui::QmitkNavigationToolCreationWidgetControls * m_Controls
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 NavigationToolFinished()
This signal is emitted if the user finished the creation of the tool.
virtual void CreateConnections()
Creation of the connections.
void OnEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip)
void Canceled()
This signal is emitted if the user canceled the creation of the tool.
void SetTrackingDeviceType(mitk::TrackingDeviceType type, bool changeable=true)
Sets the default tracking device type. You may also define if it is changeable or not.
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...
mitk::DataStorage * m_DataStorage
holds the DataStorage
QmitkInteractiveTransformationWidget * m_ToolTransformationWidget
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 Initialize(mitk::DataStorage *dataStorage, const std::string &supposedIdentifier, const std::string &supposedName="NewTool")
Initializes the widget.
QmitkNavigationToolCreationWidget(QWidget *parent=nullptr, Qt::WindowFlags f={})
This class is a collection for information of all Tracking Device Types (derived from abstract Tracki...
std::string TrackingDeviceType