diff --git a/Modules/IGT/DataManagement/mitkNavigationTool.cpp b/Modules/IGT/DataManagement/mitkNavigationTool.cpp index 02e48810a0..14bd49e8b1 100644 --- a/Modules/IGT/DataManagement/mitkNavigationTool.cpp +++ b/Modules/IGT/DataManagement/mitkNavigationTool.cpp @@ -1,134 +1,183 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkNavigationTool.h" #include "mitkIGTException.h" #include "mitkNavigationData.h" #include "Poco/File.h" #include "mitkUnspecifiedTrackingTypeInformation.h" +#include "mitkInternalTrackingTool.h" mitk::NavigationTool::NavigationTool() : m_Identifier("None"), - m_Type(mitk::NavigationTool::Unknown), - m_CalibrationFile("none"), - m_SerialNumber(""), - m_TrackingDeviceType(mitk::UnspecifiedTrackingTypeInformation::GetTrackingDeviceName()), - m_ToolRegistrationLandmarks(mitk::PointSet::New()), - m_ToolCalibrationLandmarks(mitk::PointSet::New()), - m_ToolTipOrientation(mitk::Quaternion(0,0,0,1)) - { - m_ToolTipPosition[0] = 0; - m_ToolTipPosition[1] = 0; - m_ToolTipPosition[2] = 0; +m_Type(mitk::NavigationTool::Unknown), +m_CalibrationFile("none"), +m_SerialNumber(""), +m_TrackingDeviceType(mitk::UnspecifiedTrackingTypeInformation::GetTrackingDeviceName()), +m_ToolRegistrationLandmarks(mitk::PointSet::New()), +m_ToolCalibrationLandmarks(mitk::PointSet::New()), +m_ToolTipOrientation(mitk::Quaternion(0, 0, 0, 1)) +{ + m_ToolTipPosition[0] = 0; + m_ToolTipPosition[1] = 0; + m_ToolTipPosition[2] = 0; - m_ToolAxis[0] = 1; - m_ToolAxis[1] = 0; - m_ToolAxis[2] = 0; - } + m_ToolAxis[0] = 1; + m_ToolAxis[1] = 0; + m_ToolAxis[2] = 0; +} -mitk::NavigationTool::~NavigationTool() - { +itk::LightObject::Pointer mitk::NavigationTool::InternalClone() const +{ + Self::Pointer tool = new Self(*this); + tool->UnRegister(); + return tool.GetPointer(); +} +mitk::NavigationTool::NavigationTool(const NavigationTool &other) + : Superclass() +{ + this->m_Identifier = other.m_Identifier; + this->m_Type = other.m_Type; + if (other.m_DataNode.IsNotNull()) + { + this->m_DataNode = other.m_DataNode->Clone(); + this->m_DataNode->SetName(other.m_DataNode->GetName()); + if (other.m_DataNode->GetData()) + { + this->m_DataNode->SetData(dynamic_cast<mitk::BaseData*>(other.m_DataNode->GetData()->Clone().GetPointer())); + } } + if (other.m_SpatialObject.IsNotNull()) + this->m_SpatialObject = other.m_SpatialObject->Clone(); + this->m_CalibrationFile = other.m_CalibrationFile; + this->m_SerialNumber = other.m_SerialNumber; + this->m_TrackingDeviceType = other.m_TrackingDeviceType; + if (other.m_ToolRegistrationLandmarks.IsNotNull()) + this->m_ToolRegistrationLandmarks = other.m_ToolRegistrationLandmarks->Clone(); + if (other.m_ToolCalibrationLandmarks.IsNotNull()) + this->m_ToolCalibrationLandmarks = other.m_ToolCalibrationLandmarks->Clone(); + this->m_ToolTipPosition = other.m_ToolTipPosition; + this->m_ToolTipOrientation = other.m_ToolTipOrientation; + this->m_ToolAxis = other.m_ToolAxis; +} + +mitk::NavigationTool::~NavigationTool() +{ +} + mitk::AffineTransform3D::Pointer mitk::NavigationTool::GetToolTipTransform() - { - mitk::NavigationData::Pointer returnValue = mitk::NavigationData::New(); - returnValue->SetPosition(this->m_ToolTipPosition); - returnValue->SetOrientation(this->m_ToolTipOrientation); - return returnValue->GetAffineTransform3D(); - } - -void mitk::NavigationTool::Graft( const DataObject *data ) +{ + mitk::NavigationData::Pointer returnValue = mitk::NavigationData::New(); + returnValue->SetPosition(this->m_ToolTipPosition); + returnValue->SetOrientation(this->m_ToolTipOrientation); + return returnValue->GetAffineTransform3D(); +} + +void mitk::NavigationTool::Graft(const DataObject *data) { // Attempt to cast data to an NavigationData const Self* nd; try { - nd = dynamic_cast<const Self *>( data ); + nd = dynamic_cast<const Self *>(data); } - catch( ... ) + catch (...) { mitkThrowException(mitk::IGTException) << "mitk::NavigationData::Graft cannot cast " << typeid(data).name() << " to " - << typeid(const Self *).name() ; + << typeid(const Self *).name(); } if (!nd) { // pointer could not be cast back down mitkThrowException(mitk::IGTException) << "mitk::NavigationData::Graft cannot cast " << typeid(data).name() << " to " - << typeid(const Self *).name() ; + << typeid(const Self *).name(); } // Now copy anything that is needed m_Identifier = nd->GetIdentifier(); m_Type = nd->GetType(); m_DataNode->SetName(nd->GetDataNode()->GetName()); m_DataNode->SetData(nd->GetDataNode()->GetData()); m_SpatialObject = nd->GetSpatialObject(); - m_TrackingTool = nd->GetTrackingTool(); m_CalibrationFile = nd->GetCalibrationFile(); m_SerialNumber = nd->GetSerialNumber(); m_TrackingDeviceType = nd->GetTrackingDeviceType(); m_ToolRegistrationLandmarks = nd->GetToolRegistrationLandmarks(); m_ToolCalibrationLandmarks = nd->GetToolCalibrationLandmarks(); m_ToolTipPosition = nd->GetToolTipPosition(); m_ToolTipOrientation = nd->GetToolTipOrientation(); m_ToolAxis = nd->GetToolAxis(); - } bool mitk::NavigationTool::IsToolTipSet() - { - if( (m_ToolTipPosition[0] == 0) && +{ + if ((m_ToolTipPosition[0] == 0) && (m_ToolTipPosition[1] == 0) && (m_ToolTipPosition[2] == 0) && (m_ToolTipOrientation.x() == 0) && (m_ToolTipOrientation.y() == 0) && (m_ToolTipOrientation.z() == 0) && (m_ToolTipOrientation.r() == 1)) - return false; + return false; else return true; - } +} void mitk::NavigationTool::SetCalibrationFile(const std::string filename) - { +{ //check if file does exist: - if (filename=="") - { + if (filename == "") + { m_CalibrationFile = "none"; - } + } else - { + { Poco::File myFile(filename); if (myFile.exists()) m_CalibrationFile = filename; else m_CalibrationFile = "none"; - } } +} std::string mitk::NavigationTool::GetToolName() - { - if (this->m_DataNode.IsNull()) {return "";} - else {return m_DataNode->GetName();} - } +{ + if (this->m_DataNode.IsNull()) { return ""; } + else { return m_DataNode->GetName(); } +} mitk::Surface::Pointer mitk::NavigationTool::GetToolSurface() - { - if (this->m_DataNode.IsNull()) {return nullptr;} - else if (this->m_DataNode->GetData() == nullptr) {return nullptr;} - else {return dynamic_cast<mitk::Surface*>(m_DataNode->GetData());} - } +{ + if (this->m_DataNode.IsNull()) { return nullptr; } + else if (this->m_DataNode->GetData() == nullptr) { return nullptr; } + else { return dynamic_cast<mitk::Surface*>(m_DataNode->GetData()); } +} + +std::string mitk::NavigationTool::GetStringWithAllToolInformation() const +{ + std::stringstream _info; + _info << " Identifier: " << this->m_Identifier << "\n" + << " NavigationToolType: " << m_Type << "\n" + << " Calibration file: " << m_CalibrationFile << "\n" + << " Serial number: " << m_SerialNumber << "\n" + << " TrackingDeviceType: " << m_TrackingDeviceType << "\n" + << " ToolTip Position: " << m_ToolTipPosition << "\n" + << " ToolTip Orientation: " << m_ToolTipOrientation << "\n" + << " ToolTip Axis: " << m_ToolAxis; + + return _info.str(); +} \ No newline at end of file diff --git a/Modules/IGT/DataManagement/mitkNavigationTool.h b/Modules/IGT/DataManagement/mitkNavigationTool.h index 7280a317c9..0cc12c29fb 100644 --- a/Modules/IGT/DataManagement/mitkNavigationTool.h +++ b/Modules/IGT/DataManagement/mitkNavigationTool.h @@ -1,206 +1,209 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef NAVIGATIONTOOL_H_INCLUDED #define NAVIGATIONTOOL_H_INCLUDED //itk headers #include <itkObjectFactory.h> #include <itkSpatialObject.h> #include <itkDataObject.h> //mitk headers #include <mitkCommon.h> #include <mitkDataNode.h> #include <mitkPointSet.h> #include <mitkTrackingTool.h> #include <mitkTrackingTypes.h> #include <mitkSurface.h> #include <MitkIGTExports.h> namespace mitk { /**Documentation * \brief An object of this class represents a navigation tool in the view of the software. * A few informations like an identifier, a toolname, a surface and a itk spatial * object are stored in such an object. The classes NavigationToolReader and * are availiable to write/read tools to/from the harddisc. If you need a collection * of navigation tools the class NavigationToolStorage could be used. * * \ingroup IGT */ class MITKIGT_EXPORT NavigationTool : public itk::DataObject { public: mitkClassMacroItkParent(NavigationTool,itk::DataObject); itkFactorylessNewMacro(Self) itkCloneMacro(Self) enum NavigationToolType {Instrument, Fiducial, Skinmarker, Unknown}; //## getter and setter ## //NavigationToolType: itkGetConstMacro(Type,NavigationToolType); itkSetMacro(Type,NavigationToolType); //Identifier: itkGetConstMacro(Identifier,std::string); itkSetMacro(Identifier,std::string); //Datatreenode: itkGetConstMacro(DataNode,mitk::DataNode::Pointer); itkSetMacro(DataNode,mitk::DataNode::Pointer); //SpatialObject: itkGetConstMacro(SpatialObject,itk::SpatialObject<3>::Pointer); itkSetMacro(SpatialObject,itk::SpatialObject<3>::Pointer); - //TrackingTool: - itkGetConstMacro(TrackingTool,mitk::TrackingTool::Pointer); - itkSetMacro(TrackingTool,mitk::TrackingTool::Pointer); - //CalibrationFile: itkGetConstMacro(CalibrationFile,std::string); void SetCalibrationFile(const std::string filename); //Tool tip definition: itkGetConstMacro(ToolTipPosition,mitk::Point3D); itkSetMacro(ToolTipPosition,mitk::Point3D); itkGetConstMacro(ToolTipOrientation,mitk::Quaternion); itkSetMacro(ToolTipOrientation,mitk::Quaternion); //Tool Axis definition: //default tool axis is along x axis, the tool axis must be normalized itkGetConstMacro(ToolAxis, mitk::Point3D); itkSetMacro(ToolAxis, mitk::Point3D); /** @return Returns the tooltip as transform object. */ mitk::AffineTransform3D::Pointer GetToolTipTransform(); /** @return Returns true if a tooltip is set, false if not. */ bool IsToolTipSet(); //Tool Landmarks: /** For overview, here are descriptons of the two types of tool landmarks: * * tool calibration landmarks: These landmarks may be used clearly define the tools pose only by * using landmarks in the tool coordinate system. E.g., two landmarks for a 5DoF tool and three * landmarks for a 6DoF tool. These landmarks may be used, e.g., for a point based registration * of a tool from image space to tracking space. * * tool registration landmarks: These landmarks are designed for representing defined landmarks * on a tools surface. The number of these landmarks might exeed the number of tool calibration * landmarks for reasons of redundancy and averaging. They are used for, e.g., manually registering * the pose of a tool by visual markers in a CT scan. If you would use these landmarks to do a * point based registration from image space to tracking space later, you might overweight the * tool because of two many landmarks compared to other markers. * * @return Returns the tool registration landmarks which represent markers / special points on a * tool that can be used for registration. The landmarks should be given in tool coordinates. * If there are no landmarks defined for this tool the method returns an empty point set. */ itkGetConstMacro(ToolRegistrationLandmarks,mitk::PointSet::Pointer); /** @brief Sets the tool registration landmarks which represent markers / special points on a * tool that can be used for registration. The landmarks should be given in tool coordinates. */ itkSetMacro(ToolRegistrationLandmarks,mitk::PointSet::Pointer); /** @return Returns the tool calibration landmarks for calibration of the defined points in the * tool coordinate system, e.g. 2 landmarks for a 5DoF tool and 3 landmarks for a 6DoF tool. */ itkGetConstMacro(ToolCalibrationLandmarks,mitk::PointSet::Pointer); /** @brief Sets the tool calibration landmarks for calibration of defined points in the * tool coordinate system, e.g. 2 landmarks for a 5DoF tool and 3 landmarks for a 6DoF tool. */ itkSetMacro(ToolCalibrationLandmarks,mitk::PointSet::Pointer); //SerialNumber: itkGetConstMacro(SerialNumber,std::string); itkSetMacro(SerialNumber,std::string); //TrackingDeviceType: itkGetConstMacro(TrackingDeviceType,mitk::TrackingDeviceType); itkSetMacro(TrackingDeviceType,mitk::TrackingDeviceType); //ToolName (only getter): /** @return Returns the name of this navigation tool. Returns an empty string if there is * no name (for example because the data node has not been set yet). * * Note: There is no setter for the name, * because the name of the corresponding data node is used as tool name. So if you * want to modify the name of this navigation tool only get the data node and modify * its name. */ std::string GetToolName(); //ToolSurface (only getter): /** @return Returns the surface of this navigation tool. Returns NULL if there is * no surface (for example because the data node has not been set yet). * * Note: There is no setter for the surface, * because the surface is the data of the corresponding data node. So if you * want to set a new surface only get the data node and modify its data. */ mitk::Surface::Pointer GetToolSurface(); /** * \brief Graft the data and information from one NavigationTool to another. * * Copies the content of data into this object. * This is a convenience method to setup a second NavigationTool object with all the meta * information of another NavigationTool object. * Note that this method is different than just using two * SmartPointers to the same NavigationTool object since separate DataObjects are * still maintained. */ virtual void Graft(const DataObject *data) override; + + + /** + * Return all relevant information as string, e.g. to display all tool information + */ + std::string GetStringWithAllToolInformation() const; + //####################### protected: NavigationTool(); + NavigationTool(const NavigationTool &other); ~NavigationTool(); + virtual itk::LightObject::Pointer InternalClone() const override; //## data structure of a navigation tool object ## std::string m_Identifier; NavigationToolType m_Type; /** @brief This DataNode holds a toolname and a tool surface */ mitk::DataNode::Pointer m_DataNode; /** @brief This member variable holds a mathamatical description of the tool */ itk::SpatialObject<3>::Pointer m_SpatialObject; - /** @brief This member variable holds a pointer to the corresponding tracking tool in the hardware. */ - mitk::TrackingTool::Pointer m_TrackingTool; /** @brief The path to the calibration file of the tool. */ std::string m_CalibrationFile; /** @brief A unique serial number of the tool which is needed to identify the tool correctly. This is very important * in case of the NDI Aurora System. */ std::string m_SerialNumber; /** @brief This member holds the tracking device type of the tool. */ mitk::TrackingDeviceType m_TrackingDeviceType; /** @brief Holds landmarks for tool registration. */ mitk::PointSet::Pointer m_ToolRegistrationLandmarks; /** @brief Holds landmarks for calibration of the defined points in the tool coordinate system, * e.g. 2 landmarks for a 5DoF tool and 3 landmarks for a 6DoF tool. */ mitk::PointSet::Pointer m_ToolCalibrationLandmarks; /** @brief Holds the position of the tool tip. */ mitk::Point3D m_ToolTipPosition; /** @brief Holds the orientation of the tool tip. */ mitk::Quaternion m_ToolTipOrientation; /** @brief Holds the axis of the tool. */ mitk::Point3D m_ToolAxis; //################################################# }; } // namespace mitk #endif //NAVIGATIONTOOL diff --git a/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.cpp b/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.cpp index b5b2f80f1f..622d866814 100644 --- a/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.cpp +++ b/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.cpp @@ -1,268 +1,289 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkInteractiveTransformationWidget.h" // mitk includes #include "mitkRenderingManager.h" +#include "mitkBaseRenderer.h" #include "mitkNavigationData.h" // vtk includes #include "vtkMatrix4x4.h" #include "vtkLinearTransform.h" const std::string QmitkInteractiveTransformationWidget::VIEW_ID = "org.mitk.views.interactivetransformationwidget"; QmitkInteractiveTransformationWidget::QmitkInteractiveTransformationWidget(QWidget* parent, Qt::WindowFlags f) -: QWidget(parent, f), m_Controls(nullptr), m_Geometry(nullptr), m_ResetGeometry(nullptr) + : QWidget(parent, f), m_Controls(nullptr), m_Geometry(nullptr) { CreateQtPartControl(this); CreateConnections(); - m_TranslationVector.Fill(0.0f); - m_RotateSliderPos.Fill(0.0f); + + m_ResetGeometry = mitk::Geometry3D::New(); } QmitkInteractiveTransformationWidget::~QmitkInteractiveTransformationWidget() { } void QmitkInteractiveTransformationWidget::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkInteractiveTransformationWidgetControls; m_Controls->setupUi(parent); } } void QmitkInteractiveTransformationWidget::CreateConnections() { - if ( m_Controls ) + if (m_Controls) { // translations - connect(m_Controls->m_XTransSlider, &QSlider::valueChanged, m_Controls->m_XTransSpinBox, &QSpinBox::setValue); - connect(m_Controls->m_XTransSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_Controls->m_XTransSlider, &QSlider::setValue); + connect(m_Controls->m_XTransSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &QmitkInteractiveTransformationWidget::OnXTranslationValueChanged); connect(m_Controls->m_XTransSlider, &QSlider::valueChanged, this, &QmitkInteractiveTransformationWidget::OnXTranslationValueChanged); - connect(m_Controls->m_YTransSlider, &QSlider::valueChanged, m_Controls->m_YTransSpinBox, &QSpinBox::setValue); - connect(m_Controls->m_YTransSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_Controls->m_YTransSlider, &QSlider::setValue); + connect(m_Controls->m_YTransSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &QmitkInteractiveTransformationWidget::OnYTranslationValueChanged); connect(m_Controls->m_YTransSlider, &QSlider::valueChanged, this, &QmitkInteractiveTransformationWidget::OnYTranslationValueChanged); - connect(m_Controls->m_ZTransSlider, &QSlider::valueChanged, m_Controls->m_ZTransSpinBox, &QSpinBox::setValue); - connect(m_Controls->m_ZTransSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_Controls->m_ZTransSlider, &QSlider::setValue); + connect(m_Controls->m_ZTransSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &QmitkInteractiveTransformationWidget::OnZTranslationValueChanged); connect(m_Controls->m_ZTransSlider, &QSlider::valueChanged, this, &QmitkInteractiveTransformationWidget::OnZTranslationValueChanged); // rotations - connect(m_Controls->m_XRotSlider, &QSlider::valueChanged, m_Controls->m_XRotSpinBox, &QSpinBox::setValue); - connect(m_Controls->m_XRotSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_Controls->m_XRotSlider, &QSlider::setValue); + connect(m_Controls->m_XRotSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &QmitkInteractiveTransformationWidget::OnXRotationValueChanged); connect(m_Controls->m_XRotSlider, &QSlider::valueChanged, this, &QmitkInteractiveTransformationWidget::OnXRotationValueChanged); - connect(m_Controls->m_YRotSlider, &QSlider::valueChanged, m_Controls->m_YRotSpinBox, &QSpinBox::setValue); - connect(m_Controls->m_YRotSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_Controls->m_YRotSlider, &QSlider::setValue); + connect(m_Controls->m_YRotSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &QmitkInteractiveTransformationWidget::OnYRotationValueChanged); connect(m_Controls->m_YRotSlider, &QSlider::valueChanged, this, &QmitkInteractiveTransformationWidget::OnYRotationValueChanged); - connect(m_Controls->m_ZRotSlider, &QSlider::valueChanged, m_Controls->m_ZRotSpinBox, &QSpinBox::setValue); - connect(m_Controls->m_ZRotSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), m_Controls->m_ZRotSlider, &QSlider::setValue); + connect(m_Controls->m_ZRotSpinBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &QmitkInteractiveTransformationWidget::OnZRotationValueChanged); connect(m_Controls->m_ZRotSlider, &QSlider::valueChanged, this, &QmitkInteractiveTransformationWidget::OnZRotationValueChanged); - connect( (QObject*)(m_Controls->m_ResetPB), SIGNAL(clicked()), this, SLOT(OnResetGeometry()) ); - connect( (QObject*)(m_Controls->m_UseManipulatedToolTipPB), SIGNAL(clicked()), this, SLOT(OnApplyManipulatedToolTip()) ); + connect((QObject*)(m_Controls->m_ResetPB), SIGNAL(clicked()), this, SLOT(OnResetGeometryToIdentity())); + connect((QObject*)(m_Controls->m_RevertChanges), SIGNAL(clicked()), this, SLOT(OnRevertChanges())); + connect((QObject*)(m_Controls->m_UseManipulatedToolTipPB), SIGNAL(clicked()), this, SLOT(OnApplyManipulatedToolTip())); + connect((QObject*)(m_Controls->m_Cancel), SIGNAL(clicked()), this, SLOT(OnCancel())); } } -void QmitkInteractiveTransformationWidget::SetGeometry( mitk::BaseGeometry::Pointer geometry, mitk::BaseGeometry::Pointer defaultValues ) +void QmitkInteractiveTransformationWidget::SetToolToEdit(const mitk::NavigationTool::Pointer _tool) { - m_Geometry = geometry; - m_ResetGeometry = geometry->Clone(); - - //set default values - if (defaultValues.IsNotNull()) - { - //first: some conversion - mitk::NavigationData::Pointer transformConversionHelper = mitk::NavigationData::New(defaultValues->GetIndexToWorldTransform()); - double eulerAlphaDegrees = transformConversionHelper->GetOrientation().rotation_euler_angles()[0] / vnl_math::pi * 180; - double eulerBetaDegrees = transformConversionHelper->GetOrientation().rotation_euler_angles()[1] / vnl_math::pi * 180; - double eulerGammaDegrees = transformConversionHelper->GetOrientation().rotation_euler_angles()[2] / vnl_math::pi * 180; - - //set translation - OnXTranslationValueChanged(defaultValues->GetIndexToWorldTransform()->GetOffset()[0]); - OnYTranslationValueChanged(defaultValues->GetIndexToWorldTransform()->GetOffset()[1]); - OnZTranslationValueChanged(defaultValues->GetIndexToWorldTransform()->GetOffset()[2]); - - //set rotation - OnXRotationValueChanged(eulerAlphaDegrees); - OnYRotationValueChanged(eulerBetaDegrees); - OnZRotationValueChanged(eulerGammaDegrees); - } - else - { - //reset everything - OnXTranslationValueChanged(0); - OnYTranslationValueChanged(0); - OnZTranslationValueChanged(0); - OnXRotationValueChanged(0); - OnYRotationValueChanged(0); - OnZRotationValueChanged(0); - } + //If there is already a tool, remove it's node first. + if (m_ToolToEdit) + mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget4"))->GetDataStorage() + ->Remove(m_ToolToEdit->GetDataNode()); + + m_ToolToEdit = _tool->Clone(); + mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget4"))->GetDataStorage() + ->Add(m_ToolToEdit->GetDataNode()); + m_ToolToEdit->GetDataNode()->SetName("Tool Tip to be edited"); + + //change color to red + m_ToolToEdit->GetDataNode()->SetProperty("color", mitk::ColorProperty::New(1, 0, 0)); + + //use the set-fuction via vtk matrix, 'cause this garantees a deep copy and not just sharing a pointer. + m_Geometry = m_ToolToEdit->GetDataNode()->GetData()->GetGeometry(); + m_ResetGeometry->SetIndexToWorldTransformByVtkMatrix(m_Geometry->GetVtkMatrix()); //Remember the original values to be able to reset and abort everything } -mitk::BaseGeometry::Pointer QmitkInteractiveTransformationWidget::GetGeometry() +void QmitkInteractiveTransformationWidget::SetDefaultOffset(const mitk::Point3D _defaultValues) { - return m_Geometry; + m_Geometry->SetOrigin(_defaultValues); + m_ResetGeometry->SetOrigin(_defaultValues); //Remember the original values to be able to reset and abort everything + SetValuesToGUI(m_Geometry->GetIndexToWorldTransform()); } +void QmitkInteractiveTransformationWidget::SetDefaultRotation(const mitk::Quaternion _defaultValues) +{ + // Conversion to navigation data / transform + mitk::NavigationData::Pointer rotationTransform = mitk::NavigationData::New(m_Geometry->GetIndexToWorldTransform()); + rotationTransform->SetOrientation(_defaultValues); + m_Geometry->SetIndexToWorldTransform(rotationTransform->GetAffineTransform3D()); + + //For ResetGeometry, use the set-fuction via vtk matrix, 'cause this garantees a deep copy and not just sharing a pointer. + m_ResetGeometry->SetIndexToWorldTransformByVtkMatrix(m_Geometry->GetVtkMatrix()); //Remember the original values to be able to reset and abort everything + SetValuesToGUI(m_Geometry->GetIndexToWorldTransform()); +} +void QmitkInteractiveTransformationWidget::SetValuesToGUI(const mitk::AffineTransform3D::Pointer _defaultValues) +{ + //Set toolTip values in gui + m_Controls->m_XTransSlider->setValue(_defaultValues->GetOffset()[0]); + m_Controls->m_YTransSlider->setValue(_defaultValues->GetOffset()[1]); + m_Controls->m_ZTransSlider->setValue(_defaultValues->GetOffset()[2]); + //first: some conversion + mitk::NavigationData::Pointer transformConversionHelper = mitk::NavigationData::New(_defaultValues); + double eulerAlphaDegrees = transformConversionHelper->GetOrientation().rotation_euler_angles()[0] / vnl_math::pi * 180; + double eulerBetaDegrees = transformConversionHelper->GetOrientation().rotation_euler_angles()[1] / vnl_math::pi * 180; + double eulerGammaDegrees = transformConversionHelper->GetOrientation().rotation_euler_angles()[2] / vnl_math::pi * 180; -///////////////////////////////////////////////////////////////////////////////////////////// -// Section to allow interactive positioning of the moving surface -///////////////////////////////////////////////////////////////////////////////////////////// + m_Controls->m_XRotSpinBox->setValue(eulerAlphaDegrees); + m_Controls->m_YRotSpinBox->setValue(eulerBetaDegrees); + m_Controls->m_ZRotSpinBox->setValue(eulerGammaDegrees); -void QmitkInteractiveTransformationWidget::OnXTranslationValueChanged( int v ) -{ - mitk::Vector3D translationParams; - translationParams[0] = v; - translationParams[1] = m_Controls->m_YTransSlider->value(); - translationParams[2] = m_Controls->m_ZTransSlider->value(); - this->Translate(translationParams); + //Update view + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } -void QmitkInteractiveTransformationWidget::OnYTranslationValueChanged( int v ) +void QmitkInteractiveTransformationWidget::SetSynchronizedVauesToSliderAndSpinbox(QDoubleSpinBox* _spinbox, QSlider* _slider, double _value) { - mitk::Vector3D translationParams; - translationParams[0] = m_Controls->m_XTransSlider->value(); - translationParams[1] = v; - translationParams[2] = m_Controls->m_ZTransSlider->value(); - this->Translate(translationParams); +//block signals to avoid loop between slider and spinbox. Unblock at the end of the function! + _spinbox->blockSignals(true); + _slider->blockSignals(true); + _spinbox->setValue(_value); + _slider->setValue(_value); +//unblock signals. See above, don't remove this line. Unblock at the end of the function! + _spinbox->blockSignals(false);// + _slider->blockSignals(false);// } -void QmitkInteractiveTransformationWidget::OnZTranslationValueChanged( int v ) +void QmitkInteractiveTransformationWidget::OnXTranslationValueChanged(double v) { - mitk::Vector3D translationParams; - translationParams[0] = m_Controls->m_XTransSlider->value(); - translationParams[1] = m_Controls->m_YTransSlider->value(); - translationParams[2] = v; - this->Translate(translationParams); + //Set values to member variable + mitk::Point3D translationParams = m_Geometry->GetOrigin(); + translationParams[0] = v; + m_Geometry->SetOrigin(translationParams); + + SetSynchronizedVauesToSliderAndSpinbox(m_Controls->m_XTransSpinBox, m_Controls->m_XTransSlider, v); + + //Update view + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + } -void QmitkInteractiveTransformationWidget::Translate( mitk::Vector3D translateVector) +void QmitkInteractiveTransformationWidget::OnYTranslationValueChanged(double v) { - mitk::Vector3D translateVec; + //Set values to member variable + mitk::Point3D translationParams = m_Geometry->GetOrigin(); + translationParams[1] = v; + m_Geometry->SetOrigin(translationParams); + + SetSynchronizedVauesToSliderAndSpinbox(m_Controls->m_YTransSpinBox, m_Controls->m_YTransSlider, v); + + //Update view + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); +} - // transform the translation vector - translateVec[0] = translateVector[0] - m_TranslationVector[0]; - translateVec[1] = translateVector[1] - m_TranslationVector[1]; - translateVec[2] = translateVector[2] - m_TranslationVector[2]; +void QmitkInteractiveTransformationWidget::OnZTranslationValueChanged(double v) +{ + //Set values to member variable + mitk::Point3D translationParams = m_Geometry->GetOrigin(); + translationParams[2] = v; + m_Geometry->SetOrigin(translationParams); - // set the new translation vector to member variable - m_TranslationVector[0] = translateVector[0]; - m_TranslationVector[1] = translateVector[1]; - m_TranslationVector[2] = translateVector[2]; + SetSynchronizedVauesToSliderAndSpinbox(m_Controls->m_ZTransSpinBox, m_Controls->m_ZTransSlider, v); - m_Geometry->Translate( translateVec ); - qApp->processEvents(); + //Update view mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } -void QmitkInteractiveTransformationWidget::OnXRotationValueChanged( int v ) +void QmitkInteractiveTransformationWidget::OnXRotationValueChanged(double v) { mitk::Vector3D rotationParams; rotationParams[0] = v; - rotationParams[1] = m_Controls->m_YRotSlider->value(); - rotationParams[2] = m_Controls->m_ZRotSlider->value(); + rotationParams[1] = m_Controls->m_YRotSpinBox->value(); + rotationParams[2] = m_Controls->m_ZRotSpinBox->value(); + + SetSynchronizedVauesToSliderAndSpinbox(m_Controls->m_XRotSpinBox, m_Controls->m_XRotSlider, v); this->Rotate(rotationParams); } -void QmitkInteractiveTransformationWidget::OnYRotationValueChanged( int v ) +void QmitkInteractiveTransformationWidget::OnYRotationValueChanged(double v) { mitk::Vector3D rotationParams; - rotationParams[0] = m_Controls->m_XRotSlider->value(); + rotationParams[0] = m_Controls->m_XRotSpinBox->value(); rotationParams[1] = v; - rotationParams[2] = m_Controls->m_ZRotSlider->value(); + rotationParams[2] = m_Controls->m_ZRotSpinBox->value(); + + SetSynchronizedVauesToSliderAndSpinbox(m_Controls->m_YRotSpinBox, m_Controls->m_YRotSlider, v); this->Rotate(rotationParams); } -void QmitkInteractiveTransformationWidget::OnZRotationValueChanged( int v ) +void QmitkInteractiveTransformationWidget::OnZRotationValueChanged(double v) { mitk::Vector3D rotationParams; - rotationParams[0]=m_Controls->m_XRotSlider->value(); - rotationParams[1]=m_Controls->m_YRotSlider->value(); - rotationParams[2]=v; + rotationParams[0] = m_Controls->m_XRotSpinBox->value(); + rotationParams[1] = m_Controls->m_YRotSpinBox->value(); + rotationParams[2] = v; + + SetSynchronizedVauesToSliderAndSpinbox(m_Controls->m_ZRotSpinBox, m_Controls->m_ZRotSlider, v); this->Rotate(rotationParams); } void QmitkInteractiveTransformationWidget::Rotate(mitk::Vector3D rotateVector) { //0: from degrees to radians double radianX = rotateVector[0] * vnl_math::pi / 180; double radianY = rotateVector[1] * vnl_math::pi / 180; double radianZ = rotateVector[2] * vnl_math::pi / 180; //1: from euler angles to quaternion - mitk::Quaternion rotation(radianX,radianY,radianZ); + mitk::Quaternion rotation(radianX, radianY, radianZ); //2: Conversion to navigation data / transform - mitk::NavigationData::Pointer rotationTransform = mitk::NavigationData::New(); + mitk::NavigationData::Pointer rotationTransform = mitk::NavigationData::New(m_Geometry->GetIndexToWorldTransform()); rotationTransform->SetOrientation(rotation); - //3: Apply transform + m_Geometry->SetIndexToWorldTransform(rotationTransform->GetAffineTransform3D()); - //also remember old transform, but without rotation, because rotation is completely stored in the sliders - mitk::NavigationData::Pointer oldTransform = mitk::NavigationData::New(m_Geometry->GetIndexToWorldTransform()); - mitk::Quaternion identity(0,0,0,1); - oldTransform->SetOrientation(identity); + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); +} - //compose old transform with the new one - rotationTransform->Compose(oldTransform); +void QmitkInteractiveTransformationWidget::OnResetGeometryToIdentity() +{ + // reset the input to its initial state. + m_Geometry->SetIdentity(); - //and apply it... - m_Geometry->SetIndexToWorldTransform(rotationTransform->GetAffineTransform3D()); - qApp->processEvents(); + //Update Sliders + this->SetValuesToGUI(m_Geometry->GetIndexToWorldTransform()); + //Refresh view mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } -void QmitkInteractiveTransformationWidget::OnResetGeometry() +void QmitkInteractiveTransformationWidget::OnRevertChanges() { - m_Controls->m_XRotSlider->setValue(0); - m_Controls->m_YRotSlider->setValue(0); - m_Controls->m_ZRotSlider->setValue(0); - m_Controls->m_XRotSpinBox->setValue(0); - m_Controls->m_YRotSpinBox->setValue(0); - m_Controls->m_ZRotSpinBox->setValue(0); - - m_Controls->m_XTransSlider->setValue(0); - m_Controls->m_YTransSlider->setValue(0); - m_Controls->m_ZTransSlider->setValue(0); - m_Controls->m_XTransSpinBox->setValue(0); - m_Controls->m_YTransSpinBox->setValue(0); - m_Controls->m_ZTransSpinBox->setValue(0); - qApp->processEvents(); - // reset the input to its initial state. - m_Geometry->SetIdentity(); - m_Geometry->Compose(m_ResetGeometry->GetVtkTransform()->GetMatrix()); + m_Geometry->SetIndexToWorldTransformByVtkMatrix(m_ResetGeometry->GetVtkMatrix()); + + //Update Sliders + this->SetValuesToGUI(m_Geometry->GetIndexToWorldTransform()); + //Refresh view mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkInteractiveTransformationWidget::OnApplyManipulatedToolTip() { - emit ApplyManipulatedToolTip(); + mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget4"))->GetDataStorage() + ->Remove(m_ToolToEdit->GetDataNode()); + + mitk::AffineTransform3D::Pointer toolTip = m_Geometry->GetIndexToWorldTransform(); + emit EditToolTipFinished(toolTip); } + +void QmitkInteractiveTransformationWidget::OnCancel() +{ + mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget4"))->GetDataStorage() + ->Remove(m_ToolToEdit->GetDataNode()); + + emit EditToolTipFinished(nullptr); +} \ No newline at end of file diff --git a/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.h b/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.h index 8a650f783c..869f3bacec 100644 --- a/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.h +++ b/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidget.h @@ -1,90 +1,100 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkInteractiveTransformationWidget_H #define QmitkInteractiveTransformationWidget_H //QT headers #include <QWidget> //Mitk headers #include "MitkIGTUIExports.h" #include "mitkVector.h" #include "mitkGeometry3D.h" +#include "mitkNavigationTool.h" //ui header #include "ui_QmitkInteractiveTransformationWidgetControls.h" /** Documentation: * \brief An object of this class offers an UI to create a widget to access the advance tool creation options. * * * \ingroup IGTUI */ class MITKIGTUI_EXPORT QmitkInteractiveTransformationWidget : public QWidget { Q_OBJECT public: static const std::string VIEW_ID; QmitkInteractiveTransformationWidget(QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); ~QmitkInteractiveTransformationWidget(); - /** Sets the geometry which will be modified by this widget. Default values may be - * provided by the second variable. These values will be applied to the geometry - * in the beginning and the UI will also hold these values. + /** This tool will be copied to m_ToolToEdit. It will not be changed. + To apply any changes made by this widget, you will need to connect to the signal + EditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip) and set this transfrom + as calibrated tool tip. + We do not directly modify the tool to allow to cancel/exit this widget without doing + any harm. */ - void SetGeometry(mitk::BaseGeometry::Pointer geometry, mitk::BaseGeometry::Pointer defaultValues = nullptr); + void SetToolToEdit(const mitk::NavigationTool::Pointer _tool); - mitk::BaseGeometry::Pointer GetGeometry(); + /** The sliders and spinboxes will be set to these values. + When clicking "Revert Changes", sliders will be reseted to these values. + */ + void SetDefaultOffset(const mitk::Point3D _defaultValues); + void SetDefaultRotation(const mitk::Quaternion _defaultValues); protected slots: - void OnZTranslationValueChanged( int v ); - void OnYTranslationValueChanged( int v ); - void OnXTranslationValueChanged( int v ); - void OnZRotationValueChanged( int v ); - void OnYRotationValueChanged( int v ); - void OnXRotationValueChanged( int v ); - void OnResetGeometry(); + void OnZTranslationValueChanged( double v ); + void OnYTranslationValueChanged(double v); + void OnXTranslationValueChanged(double v); + void OnZRotationValueChanged(double v); + void OnYRotationValueChanged(double v); + void OnXRotationValueChanged(double v); + void OnResetGeometryToIdentity(); + void OnRevertChanges(); void OnApplyManipulatedToolTip(); + void OnCancel(); signals: - void ApplyManipulatedToolTip(); + void EditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip); protected: virtual void CreateConnections(); virtual void CreateQtPartControl(QWidget *parent); - /*! \brief Method performs the translation. - \params translateVector New translation to be combine with geometry. */ - void Translate( mitk::Vector3D translateVector); - /*! \brief Method performs the rotation. \params rotateVector New rotation to be combined with geometry. */ void Rotate(mitk::Vector3D rotateVector); // Member variables Ui::QmitkInteractiveTransformationWidgetControls* m_Controls; - mitk::BaseGeometry::Pointer m_Geometry; ///< \brief Initial geometry that is manipulated - mitk::BaseGeometry::Pointer m_ResetGeometry; ///< \brief Lifeline to reset to the initial geometry - mitk::Vector3D m_TranslationVector; ///< \brief Accumulated translation vector - mitk::Vector3D m_RotateSliderPos; ///< \brief Accumulated rotation vector (holds degree around x,y,z direction) + mitk::NavigationTool::Pointer m_ToolToEdit; ///< \brief this mamber holds a copy of the tool that should be edited for visualization + mitk::BaseGeometry::Pointer m_Geometry; ///< \brief The geometry that is manipulated + mitk::BaseGeometry::Pointer m_ResetGeometry; ///< \brief Lifeline to reset to the original geometry + +private: + void SetValuesToGUI(const mitk::AffineTransform3D::Pointer _defaultValues); + void SetSynchronizedVauesToSliderAndSpinbox(QDoubleSpinBox* _spinbox, QSlider* _slider, double _value); + }; #endif // QmitkInteractiveTransformationWidget_H diff --git a/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidgetControls.ui b/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidgetControls.ui index 62f0938a91..6daf485458 100644 --- a/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidgetControls.ui +++ b/Modules/IGTUI/Qmitk/QmitkInteractiveTransformationWidgetControls.ui @@ -1,433 +1,463 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>QmitkInteractiveTransformationWidgetControls</class> <widget class="QWidget" name="QmitkInteractiveTransformationWidgetControls"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>374</width> - <height>380</height> + <width>435</width> + <height>381</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0" colspan="2"> + <item row="0" column="0" colspan="5"> <widget class="QGroupBox" name="interactiveTranslationBox"> <property name="title"> <string>Interactive Translation</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout" name="horizontalLayout_7"> <item> <widget class="QLabel" name="xTranslationLabel_2"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>x-Direction (Frontal): </string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QSlider" name="m_XTransSlider"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="cursor"> <cursorShape>ArrowCursor</cursorShape> </property> <property name="toolTip"> <string/> </property> <property name="minimum"> <number>-500</number> </property> <property name="maximum"> <number>500</number> </property> <property name="singleStep"> <number>1</number> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="invertedAppearance"> - <bool>true</bool> + <bool>false</bool> </property> <property name="invertedControls"> <bool>false</bool> </property> <property name="tickPosition"> <enum>QSlider::TicksAbove</enum> </property> <property name="tickInterval"> <number>100</number> </property> </widget> </item> <item> - <widget class="QSpinBox" name="m_XTransSpinBox"> + <widget class="QDoubleSpinBox" name="m_XTransSpinBox"> + <property name="decimals"> + <number>1</number> + </property> <property name="minimum"> - <number>-500</number> + <double>-500.000000000000000</double> </property> <property name="maximum"> - <number>500</number> + <double>500.000000000000000</double> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_8"> <item> <widget class="QLabel" name="yTranslationLabel_2"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>y-Direction (Sagittal): </string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QSlider" name="m_YTransSlider"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimum"> <number>-500</number> </property> <property name="maximum"> <number>500</number> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="invertedAppearance"> - <bool>true</bool> + <bool>false</bool> </property> <property name="tickPosition"> <enum>QSlider::TicksAbove</enum> </property> <property name="tickInterval"> <number>100</number> </property> </widget> </item> <item> - <widget class="QSpinBox" name="m_YTransSpinBox"> + <widget class="QDoubleSpinBox" name="m_YTransSpinBox"> + <property name="decimals"> + <number>1</number> + </property> <property name="minimum"> - <number>-500</number> + <double>-500.000000000000000</double> </property> <property name="maximum"> - <number>500</number> - </property> - <property name="value"> - <number>0</number> + <double>500.000000000000000</double> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_9"> <item> <widget class="QLabel" name="zTranslationLabel_2"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>z-Direction (Transversal):</string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QSlider" name="m_ZTransSlider"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimum"> <number>-500</number> </property> <property name="maximum"> <number>500</number> </property> <property name="sliderPosition"> <number>0</number> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="invertedAppearance"> - <bool>true</bool> + <bool>false</bool> </property> <property name="tickPosition"> <enum>QSlider::TicksAbove</enum> </property> <property name="tickInterval"> <number>100</number> </property> </widget> </item> <item> - <widget class="QSpinBox" name="m_ZTransSpinBox"> + <widget class="QDoubleSpinBox" name="m_ZTransSpinBox"> + <property name="decimals"> + <number>1</number> + </property> <property name="minimum"> - <number>-500</number> + <double>-500.000000000000000</double> </property> <property name="maximum"> - <number>500</number> - </property> - <property name="singleStep"> - <number>1</number> + <double>500.000000000000000</double> </property> </widget> </item> </layout> </item> </layout> </item> </layout> </widget> </item> - <item row="1" column="0" colspan="2"> + <item row="1" column="0" colspan="5"> <widget class="QGroupBox" name="interactiveRotationBox"> <property name="title"> <string>Interactive Rotation</string> </property> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <layout class="QHBoxLayout" name="horizontalLayout_11"> <item> <widget class="QLabel" name="xRotationLabel"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>x-Axis (Frontal): </string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QSlider" name="m_XRotSlider"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="cursor"> <cursorShape>ArrowCursor</cursorShape> </property> <property name="toolTip"> <string/> </property> <property name="minimum"> <number>-180</number> </property> <property name="maximum"> <number>180</number> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="tickPosition"> <enum>QSlider::TicksAbove</enum> </property> <property name="tickInterval"> <number>45</number> </property> </widget> </item> <item> - <widget class="QSpinBox" name="m_XRotSpinBox"> + <widget class="QDoubleSpinBox" name="m_XRotSpinBox"> + <property name="decimals"> + <number>1</number> + </property> <property name="minimum"> - <number>-180</number> + <double>-180.000000000000000</double> </property> <property name="maximum"> - <number>180</number> + <double>180.000000000000000</double> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_12"> <item> <widget class="QLabel" name="yRotationLabel"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>y-Axis (Sagittal): </string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QSlider" name="m_YRotSlider"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimum"> <number>-180</number> </property> <property name="maximum"> <number>180</number> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="tickPosition"> <enum>QSlider::TicksAbove</enum> </property> <property name="tickInterval"> <number>45</number> </property> </widget> </item> <item> - <widget class="QSpinBox" name="m_YRotSpinBox"> + <widget class="QDoubleSpinBox" name="m_YRotSpinBox"> + <property name="decimals"> + <number>1</number> + </property> <property name="minimum"> - <number>-180</number> + <double>-180.000000000000000</double> </property> <property name="maximum"> - <number>180</number> + <double>180.000000000000000</double> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_10"> <item> <widget class="QLabel" name="zRotationLabel"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>z-Axis (Transversal):</string> </property> <property name="wordWrap"> <bool>false</bool> </property> </widget> </item> <item> <widget class="QSlider" name="m_ZRotSlider"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimum"> <number>-180</number> </property> <property name="maximum"> <number>180</number> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="tickPosition"> <enum>QSlider::TicksAbove</enum> </property> <property name="tickInterval"> <number>45</number> </property> </widget> </item> <item> - <widget class="QSpinBox" name="m_ZRotSpinBox"> + <widget class="QDoubleSpinBox" name="m_ZRotSpinBox"> + <property name="decimals"> + <number>1</number> + </property> <property name="minimum"> - <number>-180</number> + <double>-180.000000000000000</double> </property> <property name="maximum"> - <number>180</number> + <double>180.000000000000000</double> </property> </widget> </item> </layout> </item> </layout> </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="m_UseManipulatedToolTipPB"> + <property name="text"> + <string>Use Manipulated ToolTip</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="m_ResetPB"> + <property name="text"> + <string>Reset To Identity</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="m_RevertChanges"> + <property name="text"> + <string>Revert Changes</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="m_Cancel"> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> </item> - <item row="2" column="0"> - <widget class="QPushButton" name="m_ResetPB"> - <property name="text"> - <string>Reset To Identity</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QPushButton" name="m_UseManipulatedToolTipPB"> - <property name="text"> - <string>Use Manipulated ToolTip</string> - </property> - </widget> - </item> </layout> </widget> <resources/> <connections/> </ui> diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidget.cpp b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidget.cpp deleted file mode 100644 index f50e087b10..0000000000 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidget.cpp +++ /dev/null @@ -1,205 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkNavigationToolCreationAdvancedWidget.h" -#include "QmitkNavigationToolCreationWidget.h" - -// mitk includes -#include <mitkRenderingManager.h> -#include <mitkNodePredicateNot.h> -#include <mitkNodePredicateProperty.h> - -// vtk includes -#include <vtkSphereSource.h> -#include <vtkConeSource.h> - -const std::string QmitkNavigationToolCreationAdvancedWidget::VIEW_ID = "org.mitk.views.navigationtoolcreationadvancedwidget"; - -QmitkNavigationToolCreationAdvancedWidget::QmitkNavigationToolCreationAdvancedWidget(QWidget* parent, Qt::WindowFlags f) - : QDialog(parent, f), m_Controls(NULL), m_DataStorage(NULL), m_ToolTipSurface(NULL), m_ManipulatedToolTip(NULL), - m_SurfaceNodeName("") -{ - CreateQtPartControl(this); - CreateConnections(); -} - -QmitkNavigationToolCreationAdvancedWidget::~QmitkNavigationToolCreationAdvancedWidget() -{ -} - -void QmitkNavigationToolCreationAdvancedWidget::CreateQtPartControl(QWidget *parent) - { - if (!m_Controls) - { - // create GUI widgets - m_Controls = new Ui::QmitkNavigationToolCreationAdvancedWidgetControls; - m_Controls->setupUi(parent); - } - } - -void QmitkNavigationToolCreationAdvancedWidget::CreateConnections() - { - if ( m_Controls ) - { - connect( (QObject*)(this), SIGNAL(finished(int)), this, SLOT(OnClose())); - connect( (QObject*)(m_Controls->m_InteractiveTransformation), SIGNAL(ApplyManipulatedToolTip()), this, SLOT(OnApplyManipulatedToolTip())); - } - } - -void QmitkNavigationToolCreationAdvancedWidget::OnClose() -{ - //clean the data storage - if(m_DataStorage->Exists(m_DataStorage->GetNamedNode("StandardToolTip"))) - { - m_DataStorage->Remove(m_DataStorage->GetNamedNode("StandardToolTip")); - } - - if(m_DataStorage.IsNotNull() && m_DataStorage->Exists(m_DataStorage->GetNamedNode("ManipulatedToolTip"))) - { - m_DataStorage->Remove(m_DataStorage->GetNamedNode("ManipulatedToolTip")); - } - - emit DialogCloseRequested(); -} - -void QmitkNavigationToolCreationAdvancedWidget::SetDataStorage( mitk::DataStorage::Pointer dataStorage ) -{ - m_DataStorage = dataStorage; -} - -void QmitkNavigationToolCreationAdvancedWidget::ReInitialize() -{ - if (m_DataStorage.IsNull()) return; - - //reset some variables - m_ManipulatedToolTip = NULL; - m_ToolTipSurface = NULL; - m_SurfaceNodeName = ""; - mitk::Geometry3D::Pointer geo3d = mitk::Geometry3D::New(); - mitk::BaseGeometry::Pointer emptyGeo = dynamic_cast<mitk::BaseGeometry*>(geo3d.GetPointer()); - m_Controls->m_InteractiveTransformation->SetGeometry(emptyGeo,emptyGeo); - - //call initialization method - this->RetrieveAndInitializeDataForTooltipManipulation(); - - //care for new data nodes - mitk::DataNode::Pointer manipulatedTipNode = NULL; - if(!m_DataStorage->Exists(m_DataStorage->GetNamedNode("ManipulatedToolTip"))) - { - manipulatedTipNode = mitk::DataNode::New(); - manipulatedTipNode->SetData(m_ManipulatedToolTip); - manipulatedTipNode->SetName("ManipulatedToolTip"); - manipulatedTipNode->SetColor(1.0, 0.0, 0.0); - manipulatedTipNode->SetOpacity(0.5); - m_DataStorage->Add(manipulatedTipNode); - } - else - { - manipulatedTipNode = m_DataStorage->GetNamedNode("ManipulatedToolTip"); - manipulatedTipNode->SetData(m_ManipulatedToolTip); - } - - // reinit the views with the new nodes - mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage); -} - -void QmitkNavigationToolCreationAdvancedWidget::RetrieveAndInitializeDataForTooltipManipulation() -{ - // we need the tooltip surface (point or stl) - emit RetrieveDataForManualToolTipManipulation(); - - if(m_ToolTipSurface.IsNotNull()) - { - mitk::DataNode::Pointer toolTipNode = NULL; - - if(m_SurfaceNodeName.empty()) - { - m_SurfaceNodeName = "StandardToolTip"; - } - - if(!m_DataStorage->Exists(m_DataStorage->GetNamedNode(m_SurfaceNodeName))) - { - toolTipNode = mitk::DataNode::New(); - toolTipNode->SetName(m_SurfaceNodeName); - toolTipNode->SetData(m_ToolTipSurface); - m_DataStorage->Add(toolTipNode); - - } - else - { - toolTipNode = m_DataStorage->GetNamedNode(m_SurfaceNodeName); - toolTipNode->SetData(m_ToolTipSurface); - } - - m_ManipulatedToolTip = m_ToolTipSurface->Clone(); - - mitk::BaseGeometry::Pointer defaultGeo = dynamic_cast<mitk::BaseGeometry*> (mitk::Geometry3D::New().GetPointer()); - defaultGeo->SetIndexToWorldTransform(m_DefaultToolTip); - - m_Controls->m_InteractiveTransformation->SetGeometry(m_ManipulatedToolTip->GetGeometry(),defaultGeo); - } - else - { - mitkThrow() << "No tooltip surface specified, operation aborted"; - } -} - -void QmitkNavigationToolCreationAdvancedWidget::SetDefaultTooltip(mitk::AffineTransform3D::Pointer defaultToolTip) -{ - m_DefaultToolTip = defaultToolTip; -} - -void QmitkNavigationToolCreationAdvancedWidget::SetToolTipSurface( bool cone, mitk::DataNode::Pointer node /*= NULL*/ ) -{ - m_ToolTipSurface = NULL; - if(cone) - { - m_ToolTipSurface = mitk::Surface::New(); - vtkConeSource *vtkData = vtkConeSource::New(); - vtkData->SetAngle(5.0); - vtkData->SetResolution(50); - vtkData->SetHeight(6.0f); - vtkData->SetRadius(2.0f); - vtkData->SetCenter(0.0, 0.0, 0.0); - - vtkData->Update(); - m_ToolTipSurface->SetVtkPolyData(vtkData->GetOutput()); - - vtkData->Delete(); - m_SurfaceNodeName =""; - } - else if(!cone && node.IsNotNull()) - { - m_ToolTipSurface = dynamic_cast<mitk::Surface*>(node->GetData()); - m_SurfaceNodeName = node->GetName(); - } -} - -void QmitkNavigationToolCreationAdvancedWidget::OnApplyManipulatedToolTip() -{ - //save manipulated surface object, which holds the tooltip as geometry - m_ManipulatedToolTip = dynamic_cast<mitk::Surface*>(m_DataStorage->GetNamedNode("ManipulatedToolTip")->GetData()->Clone().GetPointer()); - //then close the window - OnClose(); -} - -mitk::AffineTransform3D::Pointer QmitkNavigationToolCreationAdvancedWidget::GetManipulatedToolTip() -{ - mitk::AffineTransform3D::Pointer returnValue = mitk::AffineTransform3D::New(); - if (m_ManipulatedToolTip.IsNotNull()) returnValue = m_ManipulatedToolTip->GetGeometry()->GetIndexToWorldTransform(); - else returnValue->SetIdentity(); - return returnValue; -} diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidget.h b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidget.h deleted file mode 100644 index 878847215d..0000000000 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidget.h +++ /dev/null @@ -1,109 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkNavigationToolCreationAdvancedWidget_H -#define QmitkNavigationToolCreationAdvancedWidget_H - -//QT headers -#include <QDialog> - -//Mitk headers -#include "MitkIGTUIExports.h" -#include "mitkDataStorage.h" -#include "mitkSurface.h" - -// Qmitk headers -#include "QmitkInteractiveTransformationWidget.h" - -//ui header -#include "ui_QmitkNavigationToolCreationAdvancedWidgetControls.h" - - /** Documentation: - * \brief An object of this class offers an UI to modify a tooltip of an IGT navigation tool. - * - * The user can modify translation and orientation of the tooltip. The current tooltip - * might be provided as default data, then the widget starts with the given values for - * translation and orientation. - * - * As long as the UI is open, there will also be a (temporary) preview data node, so - * the user can see the effect of his manipulations. - * - * Please call the method SetDataStorage to initialize the UI with the data storage - * of the current application. - * - * \ingroup IGTUI - */ -class MITKIGTUI_EXPORT QmitkNavigationToolCreationAdvancedWidget : public QDialog -{ - Q_OBJECT - - public: - static const std::string VIEW_ID; - - QmitkNavigationToolCreationAdvancedWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); - ~QmitkNavigationToolCreationAdvancedWidget(); - - /** Initializes the view with the a data storage. This data storage is needed for the - * preview node during tooltip manipulation. - */ - void SetDataStorage(mitk::DataStorage::Pointer dataStorage); - - /** Sets the current tooltip surface, also for preview purposes (the preview node - * will be a clone of this surface). If there is no surface, a simple cone can be used. - * Please set cone to true in this case. - */ - void SetToolTipSurface(bool cone, mitk::DataNode::Pointer node = NULL); - - /** Sets a default tooltip transform, which will shown in the beginning. - * If the windows is already open, the transform will be set to default - * immediately. - */ - void SetDefaultTooltip(mitk::AffineTransform3D::Pointer defaultToolTip); - - /** @return Returns the manipulated tip transform. Returns an identity transform if - * nothing was manipulated. - */ - mitk::AffineTransform3D::Pointer GetManipulatedToolTip(); - - /** Reinitializes the view, e.g. after it was closed. - */ - void ReInitialize(); - -signals: - void DialogCloseRequested(); - void RetrieveDataForManualToolTipManipulation(); - - protected slots: - void OnClose(); - void OnApplyManipulatedToolTip(); - - protected: - - virtual void CreateConnections(); - - virtual void CreateQtPartControl(QWidget *parent); - void RetrieveAndInitializeDataForTooltipManipulation(); - // Member variables - Ui::QmitkNavigationToolCreationAdvancedWidgetControls* m_Controls; - - mitk::AffineTransform3D::Pointer m_DefaultToolTip; - - mitk::DataStorage::Pointer m_DataStorage; - mitk::Surface::Pointer m_ToolTipSurface; - mitk::Surface::Pointer m_ManipulatedToolTip; ///< manipulated surface object, which holds the tooltip as geometry - std::string m_SurfaceNodeName; -}; -#endif // QmitkNavigationToolCreationAdvancedWidget_H diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidgetControls.ui b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidgetControls.ui deleted file mode 100644 index d3db69929f..0000000000 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationAdvancedWidgetControls.ui +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>QmitkNavigationToolCreationAdvancedWidgetControls</class> - <widget class="QWidget" name="QmitkNavigationToolCreationAdvancedWidgetControls"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>462</width> - <height>429</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="2" column="0"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item row="0" column="0"> - <widget class="QmitkInteractiveTransformationWidget" name="m_InteractiveTransformation" native="true"> - <property name="minimumSize"> - <size> - <width>0</width> - <height>400</height> - </size> - </property> - </widget> - </item> - </layout> - </widget> - <customwidgets> - <customwidget> - <class>QmitkInteractiveTransformationWidget</class> - <extends>QWidget</extends> - <header>QmitkInteractiveTransformationWidget.h</header> - <container>1</container> - </customwidget> - </customwidgets> - <resources/> - <connections/> -</ui> diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.cpp b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.cpp index b2a4239c53..91bd5adfb7 100644 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.cpp +++ b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.cpp @@ -1,347 +1,428 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkNavigationToolCreationWidget.h" //mitk headers #include <mitkTrackingTypes.h> #include <mitkSurface.h> #include <mitkNavigationData.h> #include <mitkRenderingManager.h> #include "mitkTrackingDeviceTypeCollection.h" //qt headers #include <qfiledialog.h> #include <qmessagebox.h> -#include <QDialog> #include <mitkIOUtil.h> #include <QmitkIGTCommonHelper.h> +#include <QDialogButtonBox> //poco headers #include <Poco/Path.h> // vtk #include <vtkSphereSource.h> #include <vtkConeSource.h> const std::string QmitkNavigationToolCreationWidget::VIEW_ID = "org.mitk.views.navigationtoolcreationwizardwidget"; QmitkNavigationToolCreationWidget::QmitkNavigationToolCreationWidget(QWidget* parent, Qt::WindowFlags f) : QWidget(parent, f) { + m_ToolToBeEdited = mitk::NavigationTool::New(); + m_FinalTool = mitk::NavigationTool::New(); + m_ToolTransformationWidget = new QmitkInteractiveTransformationWidget(); + m_Controls = NULL; - m_AdvancedWidget = new QmitkNavigationToolCreationAdvancedWidget(this); - m_AdvancedWidget->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); - m_AdvancedWidget->setWindowTitle("Tool Creation Advanced Options"); - m_AdvancedWidget->setModal(false); CreateQtPartControl(this); CreateConnections(); -RefreshTrackingDeviceCollection(); + this->InitializeUIToolLandmarkLists(); + Initialize(nullptr, ""); + + //Default values, which are not stored in tool + m_Controls->m_CalibrationFileName->setText("none"); + m_Controls->m_Surface_Use_Sphere->setChecked(true); + + m_Controls->m_CalibrationLandmarksList->EnableEditButton(false); + m_Controls->m_RegistrationLandmarksList->EnableEditButton(false); + + RefreshTrackingDeviceCollection(); } QmitkNavigationToolCreationWidget::~QmitkNavigationToolCreationWidget() { m_Controls->m_CalibrationLandmarksList->SetPointSetNode(NULL); m_Controls->m_RegistrationLandmarksList->SetPointSetNode(NULL); - delete m_AdvancedWidget; + delete m_ToolTransformationWidget; } void QmitkNavigationToolCreationWidget::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkNavigationToolCreationWidgetControls; m_Controls->setupUi(parent); } } void QmitkNavigationToolCreationWidget::CreateConnections() { - if ( m_Controls ) + if (m_Controls) { - connect( (QObject*)(m_Controls->m_cancel), SIGNAL(clicked()), this, SLOT(OnCancel()) ); - connect( (QObject*)(m_Controls->m_finished), SIGNAL(clicked()), this, SLOT(OnFinished()) ); - connect( (QObject*)(m_Controls->m_LoadSurface), SIGNAL(clicked()), this, SLOT(OnLoadSurface()) ); - connect( (QObject*)(m_Controls->m_LoadCalibrationFile), SIGNAL(clicked()), this, SLOT(OnLoadCalibrationFile()) ); - connect( (QObject*)(m_Controls->m_ShowAdvancedOptionsPB), SIGNAL(toggled(bool)), this, SLOT(OnShowAdvancedOptions(bool)) ); - connect( (QObject*)(m_AdvancedWidget), SIGNAL(DialogCloseRequested()), this, SLOT(OnProcessDialogCloseRequest()) ); - connect( (QObject*)(m_AdvancedWidget), SIGNAL(RetrieveDataForManualToolTipManipulation()), this, SLOT(OnRetrieveDataForManualTooltipManipulation()) ); - - connect( m_Controls->m_Surface_Use_Other, SIGNAL(toggled(bool)), this, SLOT(OnSurfaceUseOtherToggled(bool))); + connect((QObject*)(m_Controls->m_TrackingDeviceTypeChooser), SIGNAL(currentIndexChanged(int)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_ToolNameEdit), SIGNAL(textChanged(const QString)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_ToolTypeChooser), SIGNAL(currentIndexChanged(int)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_IdentifierEdit), SIGNAL(textChanged(const QString)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_SerialNumberEdit), SIGNAL(textChanged(const QString)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_ToolAxisX), SIGNAL(valueChanged(int)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_ToolAxisY), SIGNAL(valueChanged(int)), this, SLOT(GetValuesFromGuiElements())); + connect((QObject*)(m_Controls->m_ToolAxisZ), SIGNAL(valueChanged(int)), this, SLOT(GetValuesFromGuiElements())); + + //Buttons + connect((QObject*)(m_Controls->m_LoadCalibrationFile), SIGNAL(clicked()), this, SLOT(OnLoadCalibrationFile())); + connect(m_Controls->m_Surface_Use_Other, SIGNAL(toggled(bool)), this, SLOT(OnSurfaceUseOtherToggled())); + connect((QObject*)(m_Controls->m_LoadSurface), SIGNAL(clicked()), this, SLOT(OnLoadSurface())); + connect((QObject*)(m_Controls->m_EditToolTip), SIGNAL(clicked()), this, SLOT(OnEditToolTip())); + + connect((QObject*)(m_ToolTransformationWidget), SIGNAL(EditToolTipFinished(mitk::AffineTransform3D::Pointer)), this, + SLOT(OnEditToolTipFinished(mitk::AffineTransform3D::Pointer))); + + connect((QObject*)(m_Controls->m_cancel), SIGNAL(clicked()), this, SLOT(OnCancel())); + connect((QObject*)(m_Controls->m_finished), SIGNAL(clicked()), this, SLOT(OnFinished())); } } void QmitkNavigationToolCreationWidget::Initialize(mitk::DataStorage* dataStorage, const std::string& supposedIdentifier, const std::string& supposedName) { m_DataStorage = dataStorage; - //initialize UI components m_Controls->m_SurfaceChooser->SetDataStorage(m_DataStorage); m_Controls->m_SurfaceChooser->SetAutoSelectNewItems(true); m_Controls->m_SurfaceChooser->SetPredicate(mitk::NodePredicateDataType::New("Surface")); - //set default data - m_Controls->m_ToolNameEdit->setText(supposedName.c_str()); - m_Controls->m_CalibrationFileName->setText("none"); - m_Controls->m_Surface_Use_Sphere->setChecked(true); - m_AdvancedWidget->SetDataStorage(m_DataStorage); - m_Controls->m_IdentifierEdit->setText(supposedIdentifier.c_str()); - this->InitializeUIToolLandmarkLists(); - m_Controls->m_CalibrationLandmarksList->EnableEditButton(false); - m_Controls->m_RegistrationLandmarksList->EnableEditButton(false); + //Create new tool, which should be edited/created + m_ToolToBeEdited = nullptr;//Reset + m_ToolToBeEdited = mitk::NavigationTool::New();//Reinitialize + m_ToolToBeEdited->SetIdentifier(supposedIdentifier); + + //Create the default cone surface. Can be changed later on... + //create DataNode... + mitk::DataNode::Pointer newNode = mitk::DataNode::New(); + newNode->SetName(supposedName); + m_ToolToBeEdited->SetDataNode(newNode); + + SetConeAsToolSurface(); + + this->SetDefaultData(m_ToolToBeEdited); } -void QmitkNavigationToolCreationWidget::SetTrackingDeviceType(mitk::TrackingDeviceType type, bool changeable) +void QmitkNavigationToolCreationWidget::ShowToolPreview(std::string _name) { - int index = m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(type)); + m_DataStorage->Add(m_ToolToBeEdited->GetDataNode()); + m_ToolToBeEdited->GetDataNode()->SetName(_name); - if (index >= 0) - { - m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(index); - } -} + //change color to blue + m_ToolToBeEdited->GetDataNode()->SetProperty("color", mitk::ColorProperty::New(0, 0, 1)); + //Global Reinit to show new tool + mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage); +} -mitk::NavigationTool::Pointer QmitkNavigationToolCreationWidget::GetCreatedTool() +void QmitkNavigationToolCreationWidget::SetConeAsToolSurface() { - return m_CreatedTool; + //create small cone and use it as surface + mitk::Surface::Pointer mySphere = mitk::Surface::New(); + vtkConeSource *vtkData = vtkConeSource::New(); + vtkData->SetAngle(5.0); + vtkData->SetResolution(50); + vtkData->SetHeight(6.0f); + vtkData->SetRadius(2.0f); + vtkData->SetCenter(0.0, 0.0, 0.0); + vtkData->Update(); + mySphere->SetVtkPolyData(vtkData->GetOutput()); + vtkData->Delete(); + m_ToolToBeEdited->GetDataNode()->SetData(mySphere); } -//################################################################################## -//############################## slots ############################ -//################################################################################## - -void QmitkNavigationToolCreationWidget::OnFinished() +void QmitkNavigationToolCreationWidget::SetDefaultData(mitk::NavigationTool::Pointer DefaultTool) { - //here we create a new tool - m_CreatedTool = mitk::NavigationTool::New(); + //Set Members. This can either be the new initialized tool from call of Initialize() or a tool which already exists in the toolStorage + m_ToolToBeEdited = DefaultTool->Clone(); - //create DataNode... - mitk::DataNode::Pointer newNode = mitk::DataNode::New(); - if(m_Controls->m_Surface_Use_Sphere->isChecked()) - { - //create small sphere and use it as surface - mitk::Surface::Pointer mySphere = mitk::Surface::New(); - vtkConeSource *vtkData = vtkConeSource::New(); - vtkData->SetAngle(5.0); - vtkData->SetResolution(50); - vtkData->SetHeight(6.0f); - vtkData->SetRadius(2.0f); - vtkData->SetCenter(0.0, 0.0, 0.0); - vtkData->Update(); - mySphere->SetVtkPolyData(vtkData->GetOutput()); - vtkData->Delete(); - newNode->SetData(mySphere); - } - else + //Set all gui variables + SetGuiElements(); +} + +void QmitkNavigationToolCreationWidget::SetGuiElements() +{ + //Block signals, so that we don't call SetGuiElements again. This is undone at the end of this function! + m_Controls->m_TrackingDeviceTypeChooser->blockSignals(true); + m_Controls->m_ToolNameEdit->blockSignals(true); + m_Controls->m_ToolTypeChooser->blockSignals(true); + m_Controls->m_IdentifierEdit->blockSignals(true); + m_Controls->m_SerialNumberEdit->blockSignals(true); + m_Controls->m_ToolAxisX->blockSignals(true); + m_Controls->m_ToolAxisY->blockSignals(true); + m_Controls->m_ToolAxisZ->blockSignals(true); + + //DeviceType + int index = m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(m_ToolToBeEdited->GetTrackingDeviceType())); + if (index >= 0) { - newNode->SetData(m_Controls->m_SurfaceChooser->GetSelectedNode()->GetData()); + m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(index); } - newNode->SetName(m_Controls->m_ToolNameEdit->text().toLatin1()); - - m_CreatedTool->SetDataNode(newNode); - //fill NavigationTool object - m_CreatedTool->SetCalibrationFile(m_Controls->m_CalibrationFileName->text().toLatin1().data()); - m_CreatedTool->SetIdentifier(m_Controls->m_IdentifierEdit->text().toLatin1().data()); - m_CreatedTool->SetSerialNumber(m_Controls->m_SerialNumberEdit->text().toLatin1().data()); + m_Controls->m_ToolNameEdit->setText(QString(m_ToolToBeEdited->GetToolName().c_str())); + m_Controls->m_CalibrationFileName->setText(QString(m_ToolToBeEdited->GetCalibrationFile().c_str())); -//Tracking Device -m_CreatedTool->SetTrackingDeviceType(m_Controls->m_TrackingDeviceTypeChooser->currentText().toStdString()); + m_Controls->m_SurfaceChooser->SetSelectedNode(m_ToolToBeEdited->GetDataNode()); + FillUIToolLandmarkLists(m_ToolToBeEdited->GetToolCalibrationLandmarks(), m_ToolToBeEdited->GetToolRegistrationLandmarks()); - //ToolType - if (m_Controls->m_ToolTypeChooser->currentText()=="Instrument") m_CreatedTool->SetType(mitk::NavigationTool::Instrument); - else if (m_Controls->m_ToolTypeChooser->currentText()=="Fiducial") m_CreatedTool->SetType(mitk::NavigationTool::Fiducial); - else if (m_Controls->m_ToolTypeChooser->currentText()=="Skinmarker") m_CreatedTool->SetType(mitk::NavigationTool::Skinmarker); - else m_CreatedTool->SetType(mitk::NavigationTool::Unknown); - - //Tool Tip - mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(m_AdvancedWidget->GetManipulatedToolTip()); - m_CreatedTool->SetToolTipOrientation(tempND->GetOrientation()); - m_CreatedTool->SetToolTipPosition(tempND->GetPosition()); - - //Tool Landmarks - mitk::PointSet::Pointer toolCalLandmarks, toolRegLandmarks; - GetUIToolLandmarksLists(toolCalLandmarks,toolRegLandmarks); - m_CreatedTool->SetToolCalibrationLandmarks(toolCalLandmarks); - m_CreatedTool->SetToolRegistrationLandmarks(toolRegLandmarks); - - //Tool Axis - mitk::Point3D toolAxis; - toolAxis.SetElement(0, (m_Controls->m_ToolAxisX->value())); - toolAxis.SetElement(1, (m_Controls->m_ToolAxisY->value())); - toolAxis.SetElement(2, (m_Controls->m_ToolAxisZ->value())); - m_CreatedTool->SetToolAxis(toolAxis); + switch (m_ToolToBeEdited->GetType()) + { + case mitk::NavigationTool::Instrument: + m_Controls->m_ToolTypeChooser->setCurrentIndex(0); break; + case mitk::NavigationTool::Fiducial: + m_Controls->m_ToolTypeChooser->setCurrentIndex(1); break; + case mitk::NavigationTool::Skinmarker: + m_Controls->m_ToolTypeChooser->setCurrentIndex(2); break; + case mitk::NavigationTool::Unknown: + m_Controls->m_ToolTypeChooser->setCurrentIndex(3); break; + } - emit NavigationToolFinished(); + m_Controls->m_IdentifierEdit->setText(QString(m_ToolToBeEdited->GetIdentifier().c_str())); + m_Controls->m_SerialNumberEdit->setText(QString(m_ToolToBeEdited->GetSerialNumber().c_str())); + + m_Controls->m_ToolAxisX->setValue(m_ToolToBeEdited->GetToolAxis()[0]); + m_Controls->m_ToolAxisY->setValue(m_ToolToBeEdited->GetToolAxis()[1]); + m_Controls->m_ToolAxisZ->setValue(m_ToolToBeEdited->GetToolAxis()[2]); + QString _label = "(" + + QString::number(m_ToolToBeEdited->GetToolTipPosition()[0], 'f', 1) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipPosition()[1], 'f', 1) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipPosition()[2], 'f', 1) + "), quat: [" + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[0], 'f', 2) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[1], 'f', 2) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[2], 'f', 2) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[3], 'f', 2) + "]"; + m_Controls->m_ToolTipLabel->setText(_label); + + //Undo block signals. Don't remove it, if signals are still blocked at the beginning of this function! + m_Controls->m_TrackingDeviceTypeChooser->blockSignals(false); + m_Controls->m_ToolNameEdit->blockSignals(false); + m_Controls->m_ToolTypeChooser->blockSignals(false); + m_Controls->m_IdentifierEdit->blockSignals(false); + m_Controls->m_SerialNumberEdit->blockSignals(false); + m_Controls->m_ToolAxisX->blockSignals(false); + m_Controls->m_ToolAxisY->blockSignals(false); + m_Controls->m_ToolAxisZ->blockSignals(false); } -void QmitkNavigationToolCreationWidget::OnCancel() +void QmitkNavigationToolCreationWidget::OnSurfaceUseOtherToggled() { - m_CreatedTool = NULL; + m_Controls->m_LoadSurface->setEnabled(m_Controls->m_Surface_Use_Other->isChecked()); + if (m_Controls->m_Surface_Use_Sphere->isChecked()) + SetConeAsToolSurface(); - emit Canceled(); + //Global Reinit to show tool surface preview + mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage); } void QmitkNavigationToolCreationWidget::OnLoadSurface() { - std::string filename = QFileDialog::getOpenFileName(NULL,tr("Open Surface"), QmitkIGTCommonHelper::GetLastFileLoadPath(), tr("STL (*.stl)")).toLatin1().data(); + std::string filename = QFileDialog::getOpenFileName(NULL, tr("Open Surface"), QmitkIGTCommonHelper::GetLastFileLoadPath(), tr("STL (*.stl)")).toLatin1().data(); QmitkIGTCommonHelper::SetLastFileLoadPathByFileName(QString::fromStdString(filename)); + mitk::Surface::Pointer surface; try { - mitk::IOUtil::Load(filename.c_str(), *m_DataStorage); + surface = mitk::IOUtil::LoadSurface(filename.c_str()); } catch (mitk::Exception &e) { MITK_ERROR << "Exception occured: " << e.what(); + return; } + + m_ToolToBeEdited->GetDataNode()->SetData(surface); + + //Global Reinit to show tool surface or preview + mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(m_DataStorage); } void QmitkNavigationToolCreationWidget::OnLoadCalibrationFile() { - QString fileName = QFileDialog::getOpenFileName(NULL,tr("Open Calibration File"), QmitkIGTCommonHelper::GetLastFileLoadPath(), "*.*"); + QString fileName = QFileDialog::getOpenFileName(NULL, tr("Open Calibration File"), QmitkIGTCommonHelper::GetLastFileLoadPath(), "*.*"); QmitkIGTCommonHelper::SetLastFileLoadPathByFileName(fileName); m_Controls->m_CalibrationFileName->setText(fileName); + m_ToolToBeEdited->SetCalibrationFile(fileName.toStdString()); } - -void QmitkNavigationToolCreationWidget::SetDefaultData(mitk::NavigationTool::Pointer DefaultTool) +void QmitkNavigationToolCreationWidget::GetValuesFromGuiElements() { -m_Controls->m_ToolNameEdit->setText(QString(DefaultTool->GetDataNode()->GetName().c_str())); -m_Controls->m_IdentifierEdit->setText(QString(DefaultTool->GetIdentifier().c_str())); -m_Controls->m_SerialNumberEdit->setText(QString(DefaultTool->GetSerialNumber().c_str())); -m_AdvancedWidget->SetDefaultTooltip( DefaultTool->GetToolTipTransform() ); -int index = m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(DefaultTool->GetTrackingDeviceType())); + //Tracking Device + m_ToolToBeEdited->SetTrackingDeviceType(m_Controls->m_TrackingDeviceTypeChooser->currentText().toStdString()); + m_ToolToBeEdited->GetDataNode()->SetName(m_Controls->m_ToolNameEdit->text().toStdString()); + + //Tool Landmarks + mitk::PointSet::Pointer toolCalLandmarks, toolRegLandmarks; + GetUIToolLandmarksLists(toolCalLandmarks, toolRegLandmarks); + m_ToolToBeEdited->SetToolCalibrationLandmarks(toolCalLandmarks); + m_ToolToBeEdited->SetToolRegistrationLandmarks(toolRegLandmarks); -if (index >= 0) + //Advanced + if (m_Controls->m_ToolTypeChooser->currentText() == "Instrument") m_ToolToBeEdited->SetType(mitk::NavigationTool::Instrument); + else if (m_Controls->m_ToolTypeChooser->currentText() == "Fiducial") m_ToolToBeEdited->SetType(mitk::NavigationTool::Fiducial); + else if (m_Controls->m_ToolTypeChooser->currentText() == "Skinmarker") m_ToolToBeEdited->SetType(mitk::NavigationTool::Skinmarker); + else m_FinalTool->SetType(mitk::NavigationTool::Unknown); + + m_ToolToBeEdited->SetIdentifier(m_Controls->m_IdentifierEdit->text().toLatin1().data()); + m_ToolToBeEdited->SetSerialNumber(m_Controls->m_SerialNumberEdit->text().toLatin1().data()); + + //Tool Axis + mitk::Point3D toolAxis; + toolAxis.SetElement(0, (m_Controls->m_ToolAxisX->value())); + toolAxis.SetElement(1, (m_Controls->m_ToolAxisY->value())); + toolAxis.SetElement(2, (m_Controls->m_ToolAxisZ->value())); + m_ToolToBeEdited->SetToolAxis(toolAxis); +} + +mitk::NavigationTool::Pointer QmitkNavigationToolCreationWidget::GetCreatedTool() { - m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(index); + return m_FinalTool; } -m_Controls->m_CalibrationFileName->setText(QString(DefaultTool->GetCalibrationFile().c_str())); -m_Controls->m_Surface_Use_Other->setChecked(true); -switch(DefaultTool->GetType()) +void QmitkNavigationToolCreationWidget::OnFinished() { -case mitk::NavigationTool::Instrument: -m_Controls->m_ToolTypeChooser->setCurrentIndex(0); break; -case mitk::NavigationTool::Fiducial: -m_Controls->m_ToolTypeChooser->setCurrentIndex(1); break; -case mitk::NavigationTool::Skinmarker: -m_Controls->m_ToolTypeChooser->setCurrentIndex(2); break; -case mitk::NavigationTool::Unknown: -m_Controls->m_ToolTypeChooser->setCurrentIndex(3); break; + //here we create a new tool + m_FinalTool = m_ToolToBeEdited->Clone(); + //Set the correct name of data node, cause the m_ToolToBeEdited was called "Tool preview" + m_FinalTool->GetDataNode()->SetName(m_Controls->m_ToolNameEdit->text().toStdString()); + + emit NavigationToolFinished(); } - m_Controls->m_SurfaceChooser->SetSelectedNode(DefaultTool->GetDataNode()); - FillUIToolLandmarkLists(DefaultTool->GetToolCalibrationLandmarks(),DefaultTool->GetToolRegistrationLandmarks()); +void QmitkNavigationToolCreationWidget::OnCancel() +{ + Initialize(nullptr, "");//Reset everything to a fresh tool, like it was done in the constructor + emit Canceled(); } +void QmitkNavigationToolCreationWidget::SetTrackingDeviceType(mitk::TrackingDeviceType type, bool changeable /*= true*/) +{ + //Adapt Gui + int index = m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(type)); + + if (index >= 0) + { + m_Controls->m_TrackingDeviceTypeChooser->setCurrentIndex(index); + } + + m_Controls->m_TrackingDeviceTypeChooser->setEditable(changeable); + + //Set data to member + m_ToolToBeEdited->SetTrackingDeviceType(type); +} //################################################################################## //############################## internal help methods ############################# //################################################################################## void QmitkNavigationToolCreationWidget::MessageBox(std::string s) { QMessageBox msgBox; msgBox.setText(s.c_str()); msgBox.exec(); } -void QmitkNavigationToolCreationWidget::OnShowAdvancedOptions(bool state) +void QmitkNavigationToolCreationWidget::OnEditToolTip() { - if(state) - { - m_AdvancedWidget->show(); - m_AdvancedWidget->SetDefaultTooltip(m_AdvancedWidget->GetManipulatedToolTip()); //use the last one, if there is one - m_AdvancedWidget->ReInitialize(); - - // reinit the views with the new nodes - mitk::DataStorage::SetOfObjects::ConstPointer rs = m_DataStorage->GetAll(); - mitk::TimeGeometry::Pointer bounds = m_DataStorage->ComputeBoundingGeometry3D(rs, "visible"); // initialize the views to the bounding geometry - mitk::RenderingManager::GetInstance()->InitializeViews(bounds); - } - else - { - m_AdvancedWidget->hide(); - } + m_ToolTransformationWidget->SetToolToEdit(m_ToolToBeEdited); + m_ToolTransformationWidget->SetDefaultRotation(m_ToolToBeEdited->GetToolTipOrientation()); + m_ToolTransformationWidget->SetDefaultOffset(m_ToolToBeEdited->GetToolTipPosition()); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(m_ToolTransformationWidget); + m_ToolEditDialog.setLayout(mainLayout); + m_ToolEditDialog.setWindowTitle("Edit Tool Tip and Tool Orientation"); + m_ToolEditDialog.setProperty("minimumSizeHint", m_ToolTransformationWidget->size()); + m_ToolEditDialog.open(); } -void QmitkNavigationToolCreationWidget::OnProcessDialogCloseRequest() +void QmitkNavigationToolCreationWidget::OnEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip) { - m_AdvancedWidget->hide(); - m_Controls->m_ShowAdvancedOptionsPB->setChecked(false); -} + //This function is called, when the toolTipEdit view is closed. + m_ToolEditDialog.close(); -void QmitkNavigationToolCreationWidget::OnRetrieveDataForManualTooltipManipulation() -{ - if(m_Controls->m_Surface_Use_Sphere->isChecked()) + //if user pressed cancle, nullptr is returned. Do nothing. Else, set values. + if (toolTip) { - m_AdvancedWidget->SetToolTipSurface(true); + m_ToolToBeEdited->SetToolTipPosition(toolTip->GetOffset()); + mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(toolTip);//Convert to Navigation data for simple transversion to quaternion + m_ToolToBeEdited->SetToolTipOrientation(tempND->GetOrientation()); + + //Update Label + QString _label = "(" + + QString::number(m_ToolToBeEdited->GetToolTipPosition()[0], 'f', 1) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipPosition()[1], 'f', 1) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipPosition()[2], 'f', 1) + "), quat: [" + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[0], 'f', 2) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[1], 'f', 2) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[2], 'f', 2) + ", " + + QString::number(m_ToolToBeEdited->GetToolTipOrientation()[3], 'f', 2) + "]"; + m_Controls->m_ToolTipLabel->setText(_label); } - else - { - m_AdvancedWidget->SetToolTipSurface(false, - dynamic_cast<mitk::DataNode*>(m_Controls->m_SurfaceChooser->GetSelectedNode().GetPointer())); - } -} - -void QmitkNavigationToolCreationWidget::OnSurfaceUseOtherToggled(bool checked) -{ - m_Controls->m_LoadSurface->setEnabled(checked); } void QmitkNavigationToolCreationWidget::FillUIToolLandmarkLists(mitk::PointSet::Pointer calLandmarks, mitk::PointSet::Pointer regLandmarks) { m_calLandmarkNode->SetData(calLandmarks); m_regLandmarkNode->SetData(regLandmarks); m_Controls->m_CalibrationLandmarksList->SetPointSetNode(m_calLandmarkNode); m_Controls->m_RegistrationLandmarksList->SetPointSetNode(m_regLandmarkNode); } void QmitkNavigationToolCreationWidget::GetUIToolLandmarksLists(mitk::PointSet::Pointer& calLandmarks, mitk::PointSet::Pointer& regLandmarks) { calLandmarks = dynamic_cast<mitk::PointSet*>(m_calLandmarkNode->GetData()); regLandmarks = dynamic_cast<mitk::PointSet*>(m_regLandmarkNode->GetData()); } void QmitkNavigationToolCreationWidget::InitializeUIToolLandmarkLists() { m_calLandmarkNode = mitk::DataNode::New(); m_regLandmarkNode = mitk::DataNode::New(); - FillUIToolLandmarkLists(mitk::PointSet::New(),mitk::PointSet::New()); + FillUIToolLandmarkLists(mitk::PointSet::New(), mitk::PointSet::New()); } void QmitkNavigationToolCreationWidget::RefreshTrackingDeviceCollection() { us::ModuleContext* context = us::GetModuleContext(); std::vector<us::ServiceReference<mitk::TrackingDeviceTypeCollection> > refs = context->GetServiceReferences<mitk::TrackingDeviceTypeCollection>(); if (refs.empty()) { MITK_WARN << "No tracking device service found!"; return; } mitk::TrackingDeviceTypeCollection* _DeviceTypeCollection = context->GetService<mitk::TrackingDeviceTypeCollection>(refs.front()); for (auto name : _DeviceTypeCollection->GetTrackingDeviceTypeNames()) { //if the device is not included yet, add name to comboBox and widget to stackedWidget if (m_Controls->m_TrackingDeviceTypeChooser->findText(QString::fromStdString(name)) == -1) { m_Controls->m_TrackingDeviceTypeChooser->addItem(QString::fromStdString(name)); } } -} +} \ No newline at end of file diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.h b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.h index d83994800f..bad1ab2cb6 100644 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.h +++ b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.h @@ -1,132 +1,148 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkNavigationToolCreationWidget_H #define QmitkNavigationToolCreationWidget_H //QT headers #include <QWidget> //mitk headers #include "MitkIGTUIExports.h" #include <mitkNavigationTool.h> #include <mitkNavigationToolStorage.h> #include <mitkNodePredicateDataType.h> +#include "QmitkInteractiveTransformationWidget.h" + +#include <QDialog> //Microservices #include <usGetModuleContext.h> #include <usModule.h> #include <usServiceProperties.h> #include <usModuleContext.h> -// Qmitk headers -#include "QmitkNavigationToolCreationAdvancedWidget.h" - //ui header #include "ui_QmitkNavigationToolCreationWidget.h" - /** Documentation: - * \brief An object of this class offers an UI to create or modify NavigationTools. - * - * Be sure to call the initialize method before you start the widget - * otherwise some errors might occure. - * - * \ingroup IGTUI - */ +/** Documentation: + * \brief An object of this class offers an UI to create or modify NavigationTools. + * + * Be sure to call the initialize method before you start the widget + * otherwise some errors might occure. + * + * \ingroup IGTUI + */ class MITKIGTUI_EXPORT QmitkNavigationToolCreationWidget : public QWidget { Q_OBJECT - public: - static const std::string VIEW_ID; +public: + static const std::string VIEW_ID; - /** @brief Initializes the widget. - * @param dataStorage The data storage is needed to offer the possibility to choose surfaces from the data storage for tool visualization. - * @param supposedIdentifier This Identifier is supposed for the user. It is needed because every identifier in a navigation tool storage must be unique and we don't know the others. - */ - void Initialize(mitk::DataStorage* dataStorage, const std::string &supposedIdentifier, const std::string &supposedName = "NewTool"); + /** @brief Initializes the widget. + * @param dataStorage The data storage is needed to offer the possibility to choose surfaces from the data storage for tool visualization. + * @param supposedIdentifier This Identifier is supposed for the user. It is needed because every identifier in a navigation tool storage must be unique and we don't know the others. + */ + void Initialize(mitk::DataStorage* dataStorage, const std::string &supposedIdentifier, const std::string &supposedName = "NewTool"); - /** @brief Sets the default tracking device type. You may also define if it is changeable or not.*/ - void SetTrackingDeviceType(mitk::TrackingDeviceType type, bool changeable = true); + /** @brief This Function will add a new node to the Data Manager with given name to enable a preview of the m_ToolToBeEdited + */ + void ShowToolPreview(std::string _name); - /** @brief Sets the default data of all input fields. The default data is used from the default tool which is given as parameter. */ - void SetDefaultData(mitk::NavigationTool::Pointer DefaultTool); + /** @brief Sets the default tracking device type. You may also define if it is changeable or not.*/ + void SetTrackingDeviceType(mitk::TrackingDeviceType type, bool changeable = true); - QmitkNavigationToolCreationWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); - ~QmitkNavigationToolCreationWidget(); + /** @brief Sets the default data of all input fields. The default data is used from the default tool which is given as parameter. */ + void SetDefaultData(mitk::NavigationTool::Pointer DefaultTool); - /** @return Returns the created tool. Returns NULL if no tool was created yet. */ - mitk::NavigationTool::Pointer GetCreatedTool(); + QmitkNavigationToolCreationWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); + ~QmitkNavigationToolCreationWidget(); + /** @return Returns the created tool. Returns NULL if no tool was created yet. */ + mitk::NavigationTool::Pointer GetCreatedTool(); - signals: +signals: - /** @brief This signal is emitted if the user finished the creation of the tool. */ - void NavigationToolFinished(); + /** @brief This signal is emitted if the user finished the creation of the tool. */ + void NavigationToolFinished(); - /** @brief This signal is emitted if the user canceled the creation of the tool. */ - void Canceled(); + /** @brief This signal is emitted if the user canceled the creation of the tool. */ + void Canceled(); protected slots: - void OnCancel(); - void OnFinished(); - void OnLoadSurface(); - void OnLoadCalibrationFile(); - void OnShowAdvancedOptions(bool state); - void OnProcessDialogCloseRequest(); - void OnRetrieveDataForManualTooltipManipulation(); - void OnSurfaceUseOtherToggled(bool checked); - protected: + void OnLoadCalibrationFile(); + void OnSurfaceUseOtherToggled(); + void OnLoadSurface(); + void OnEditToolTip(); + void OnEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip); + + void OnCancel(); + void OnFinished(); + + void GetValuesFromGuiElements(); + +private: + + //############## private help methods ####################### + /** Shows a message box with the given message s. */ + void MessageBox(std::string s); + + /** Set the tool landmark lists in the UI.*/ + void FillUIToolLandmarkLists(mitk::PointSet::Pointer calLandmarks, mitk::PointSet::Pointer regLandmarks); + + /** Returns the tool landmark lists from the UI. + * @param[out] calLandmarks Returns a pointer to the calibration landmarks point set. + * @param[out] regLandmarks Returns a pointer to the registration landmarks point set. + */ + void GetUIToolLandmarksLists(mitk::PointSet::Pointer& calLandmarks, mitk::PointSet::Pointer& regLandmarks); - /// \brief Creation of the connections - virtual void CreateConnections(); + /** Initializes the tool landmark lists in the UI. */ + void InitializeUIToolLandmarkLists(); + void RefreshTrackingDeviceCollection(); - virtual void CreateQtPartControl(QWidget *parent); + void SetGuiElements(); - Ui::QmitkNavigationToolCreationWidgetControls* m_Controls; + void SetConeAsToolSurface(); - QmitkNavigationToolCreationAdvancedWidget* m_AdvancedWidget; +protected: + /// \brief Creation of the connections + virtual void CreateConnections(); - /** @brief holds the DataStorage */ - mitk::DataStorage* m_DataStorage; + virtual void CreateQtPartControl(QWidget *parent); - /** @brief this pointer holds the tool which is created */ - mitk::NavigationTool::Pointer m_CreatedTool; + Ui::QmitkNavigationToolCreationWidgetControls* m_Controls; - //############## private help methods ####################### - /** Shows a message box with the given message s. */ - void MessageBox(std::string s); + /** @brief this pointer holds the tool which is edited. If finished is clicked, it will be copied to the final tool, if it is cancled, it is reseted and not used. + This can be regarded as the clipboard for all changes. */ + mitk::NavigationTool::Pointer m_ToolToBeEdited; - /** Hold the data nodes which are needed for the landmark widgets. */ - mitk::DataNode::Pointer m_calLandmarkNode, m_regLandmarkNode; + /** @brief this pointer holds the tool which is created and returned */ + mitk::NavigationTool::Pointer m_FinalTool; - /** Set the tool landmark lists in the UI.*/ - void FillUIToolLandmarkLists(mitk::PointSet::Pointer calLandmarks, mitk::PointSet::Pointer regLandmarks); + QDialog m_ToolEditDialog; + QmitkInteractiveTransformationWidget* m_ToolTransformationWidget; - /** Returns the tool landmark lists from the UI. - * @param[out] calLandmarks Returns a pointer to the calibration landmarks point set. - * @param[out] regLandmarks Returns a pointer to the registration landmarks point set. - */ - void GetUIToolLandmarksLists(mitk::PointSet::Pointer& calLandmarks, mitk::PointSet::Pointer& regLandmarks); + /** @brief holds the DataStorage */ + mitk::DataStorage* m_DataStorage; - /** Initializes the tool landmark lists in the UI. */ - void InitializeUIToolLandmarkLists(); - void RefreshTrackingDeviceCollection(); + /** Hold the data nodes which are needed for the landmark widgets. */ + mitk::DataNode::Pointer m_calLandmarkNode, m_regLandmarkNode; }; #endif diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.ui b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.ui index d65184df95..2e65bfc0e7 100644 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.ui +++ b/Modules/IGTUI/Qmitk/QmitkNavigationToolCreationWidget.ui @@ -1,571 +1,578 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>QmitkNavigationToolCreationWidgetControls</class> <widget class="QWidget" name="QmitkNavigationToolCreationWidgetControls"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>255</width> - <height>309</height> + <width>415</width> + <height>351</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="label"> <property name="text"> <string>Device Type:</string> </property> </widget> </item> <item> <widget class="QComboBox" name="m_TrackingDeviceTypeChooser"> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>150</width> <height>16777215</height> </size> </property> </widget> </item> </layout> </item> <item> <widget class="QToolBox" name="toolBox"> <property name="currentIndex"> - <number>0</number> + <number>3</number> </property> <widget class="QWidget" name="page"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>236</width> - <height>90</height> + <width>397</width> + <height>157</height> </rect> </property> <attribute name="label"> <string>Basic Information</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QHBoxLayout" name="horizontalLayout_11"> <item> <widget class="QLabel" name="label_3"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Name:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_ToolNameEdit"> <property name="text"> <string>NewTool</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_6"> <item> <widget class="QLabel" name="label_8"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Calibration File:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_CalibrationFileName"> <property name="text"> <string>none</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_LoadCalibrationFile"> <property name="maximumSize"> <size> <width>40</width> <height>16777215</height> </size> </property> <property name="text"> <string>Load</string> </property> </widget> </item> </layout> </item> <item> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="page_2"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>310</width> - <height>113</height> + <width>397</width> + <height>157</height> </rect> </property> <attribute name="label"> <string>Tool Visualization</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QRadioButton" name="m_Surface_Use_Sphere"> <property name="text"> <string>Use Simple Cone</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_Surface_Use_Other"> <property name="text"> <string>Use Surface:</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Fixed</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>25</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QmitkDataStorageComboBox" name="m_SurfaceChooser"> <property name="minimumSize"> <size> <width>200</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>150</width> <height>16777215</height> </size> </property> </widget> </item> <item> <widget class="QPushButton" name="m_LoadSurface"> <property name="enabled"> <bool>false</bool> </property> <property name="maximumSize"> <size> <width>40</width> <height>16777215</height> </size> </property> <property name="text"> <string>Load</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>8</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="page_4"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>157</width> - <height>84</height> + <width>397</width> + <height>157</height> </rect> </property> <attribute name="label"> <string>Tool Landmarks</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> <widget class="QTabWidget" name="m_RegistrationLandmarksTab"> <property name="currentIndex"> <number>1</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> <string>Calibration Landmarks</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_7"> <item> <widget class="QmitkPointListWidget" name="m_CalibrationLandmarksList" native="true"/> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Registration Landmarks</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <widget class="QmitkPointListWidget" name="m_RegistrationLandmarksList" native="true"/> </item> </layout> </widget> </widget> </item> </layout> </widget> <widget class="QWidget" name="page_3"> <property name="geometry"> <rect> <x>0</x> - <y>0</y> - <width>286</width> - <height>183</height> + <y>-3</y> + <width>380</width> + <height>161</height> </rect> </property> <attribute name="label"> <string>Advanced</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <widget class="QLabel" name="label_7"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Tool Type:</string> </property> </widget> </item> <item> <widget class="QComboBox" name="m_ToolTypeChooser"> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>150</width> <height>16777215</height> </size> </property> <item> <property name="text"> <string>Instrument</string> </property> </item> <item> <property name="text"> <string>Fiducial</string> </property> </item> <item> <property name="text"> <string>Skinmarker</string> </property> </item> <item> <property name="text"> <string>Unkown</string> </property> </item> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> <widget class="QLabel" name="label_4"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Identifier:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_IdentifierEdit"> <property name="text"> <string><not given></string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_8"> <item> <widget class="QLabel" name="label_5"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Serial Number:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_SerialNumberEdit"> <property name="text"> <string><not given></string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string>Tooltip:</string> </property> </widget> </item> + <item> + <widget class="QLabel" name="m_ToolTipLabel"> + <property name="text"> + <string/> + </property> + </widget> + </item> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> - <widget class="QPushButton" name="m_ShowAdvancedOptionsPB"> + <widget class="QPushButton" name="m_EditToolTip"> <property name="text"> <string>Edit Tooltip</string> </property> <property name="checkable"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_10"> <item> <widget class="QLabel" name="label_6"> <property name="text"> <string>Tool Axis:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QSpinBox" name="m_ToolAxisX"> <property name="correctionMode"> <enum>QAbstractSpinBox::CorrectToPreviousValue</enum> </property> <property name="minimum"> <number>-9999</number> </property> <property name="maximum"> <number>9999</number> </property> <property name="value"> <number>1</number> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_ToolAxisY"> <property name="minimum"> <number>-9999</number> </property> <property name="maximum"> <number>9999</number> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_ToolAxisZ"> <property name="minimum"> <number>-9999</number> </property> <property name="maximum"> <number>9999</number> </property> </widget> </item> </layout> </item> </layout> </widget> </widget> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_7"> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_cancel"> <property name="text"> <string>Cancel</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_finished"> <property name="text"> <string>Finished</string> </property> </widget> </item> </layout> </item> </layout> </widget> <customwidgets> <customwidget> <class>QmitkDataStorageComboBox</class> <extends>QComboBox</extends> <header>QmitkDataStorageComboBox.h</header> <container>1</container> </customwidget> <customwidget> <class>QmitkPointListWidget</class> <extends>QWidget</extends> <header>QmitkPointListWidget.h</header> <container>1</container> </customwidget> </customwidgets> <resources/> <connections/> </ui> diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.cpp b/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.cpp index 70d30f388b..599588d1d5 100644 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.cpp +++ b/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.cpp @@ -1,400 +1,417 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkNavigationToolManagementWidget.h" //mitk headers #include "mitkTrackingTypes.h" #include <mitkSurface.h> #include <mitkNavigationToolReader.h> #include <mitkNavigationToolWriter.h> #include <mitkNavigationToolStorage.h> #include <mitkNavigationToolStorageDeserializer.h> #include <mitkNavigationToolStorageSerializer.h> #include <QmitkIGTCommonHelper.h> //qt headers #include <qfiledialog.h> #include <qinputdialog.h> #include <qmessagebox.h> #include <qsettings.h> //poco headers #include <Poco/Path.h> const std::string QmitkNavigationToolManagementWidget::VIEW_ID = "org.mitk.views.navigationtoolmanagementwidget"; QmitkNavigationToolManagementWidget::QmitkNavigationToolManagementWidget(QWidget* parent, Qt::WindowFlags f) : QWidget(parent, f) { m_Controls = NULL; CreateQtPartControl(this); CreateConnections(); } QmitkNavigationToolManagementWidget::~QmitkNavigationToolManagementWidget() { } void QmitkNavigationToolManagementWidget::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkNavigationToolManagementWidgetControls; m_Controls->setupUi(parent); } //Disable StorageControls in the beginning, because there is no storage to edit DisableStorageControls(); } void QmitkNavigationToolManagementWidget::OnLoadTool() { if (m_NavigationToolStorage->isLocked()) { MessageBox("Storage is locked, cannot modify it. Maybe the tracking device which uses this storage is connected. If you want to modify the storage please disconnect the device first."); return; } mitk::NavigationToolReader::Pointer myReader = mitk::NavigationToolReader::New(); std::string filename = QFileDialog::getOpenFileName(NULL,tr("Add Navigation Tool"), QmitkIGTCommonHelper::GetLastFileLoadPath(), "*.IGTTool").toLatin1().data(); QmitkIGTCommonHelper::SetLastFileLoadPathByFileName(QString::fromStdString(filename)); if (filename == "") return; mitk::NavigationTool::Pointer readTool = myReader->DoRead(filename); if (readTool.IsNull()) MessageBox("Error: " + myReader->GetErrorMessage()); else { if (!m_NavigationToolStorage->AddTool(readTool)) { MessageBox("Error: Can't add tool!"); m_DataStorage->Remove(readTool->GetDataNode()); } UpdateToolTable(); } } void QmitkNavigationToolManagementWidget::OnSaveTool() { //if no item is selected, show error message: if (m_Controls->m_ToolList->currentItem() == NULL) { MessageBox("Error: Please select tool first!"); return; } mitk::NavigationToolWriter::Pointer myWriter = mitk::NavigationToolWriter::New(); std::string filename = QFileDialog::getSaveFileName(NULL,tr("Save Navigation Tool"), QmitkIGTCommonHelper::GetLastFileSavePath(), "*.IGTTool").toLatin1().data(); QmitkIGTCommonHelper::SetLastFileSavePathByFileName(QString::fromStdString(filename)); if (filename == "") return; std::string fileExt = Poco::Path(filename).getExtension(); if (fileExt == "") { filename.append(".IGTTool"); } if (!myWriter->DoWrite(filename,m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row()))) MessageBox("Error: "+ myWriter->GetErrorMessage()); } void QmitkNavigationToolManagementWidget::CreateConnections() { if (m_Controls) { //main widget page: connect((QObject*)(m_Controls->m_AddTool), SIGNAL(clicked()), this, SLOT(OnAddTool())); connect((QObject*)(m_Controls->m_DeleteTool), SIGNAL(clicked()), this, SLOT(OnDeleteTool())); connect((QObject*)(m_Controls->m_EditTool), SIGNAL(clicked()), this, SLOT(OnEditTool())); connect((QObject*)(m_Controls->m_MoveToolUp), SIGNAL(clicked()), this, SLOT(OnMoveToolUp())); connect((QObject*)(m_Controls->m_MoveToolDown), SIGNAL(clicked()), this, SLOT(OnMoveToolDown())); connect((QObject*)(m_Controls->m_LoadStorage), SIGNAL(clicked()), this, SLOT(OnLoadStorage())); connect((QObject*)(m_Controls->m_SaveStorage), SIGNAL(clicked()), this, SLOT(OnSaveStorage())); connect((QObject*)(m_Controls->m_LoadTool), SIGNAL(clicked()), this, SLOT(OnLoadTool())); connect((QObject*)(m_Controls->m_SaveTool), SIGNAL(clicked()), this, SLOT(OnSaveTool())); connect((QObject*)(m_Controls->m_CreateNewStorage), SIGNAL(clicked()), this, SLOT(OnCreateStorage())); + connect((QObject*)(m_Controls->m_ToolList), SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(OnToolSelected())); + //widget page "add tool": connect((QObject*)(m_Controls->m_ToolCreationWidget), SIGNAL(Canceled()), this, SLOT(OnAddToolCancel())); connect((QObject*)(m_Controls->m_ToolCreationWidget), SIGNAL(NavigationToolFinished()), this, SLOT(OnAddToolSave())); } } void QmitkNavigationToolManagementWidget::Initialize(mitk::DataStorage* dataStorage) { m_DataStorage = dataStorage; m_Controls->m_ToolCreationWidget->Initialize(m_DataStorage, "Tool0"); } void QmitkNavigationToolManagementWidget::LoadStorage(mitk::NavigationToolStorage::Pointer storageToLoad) { if (storageToLoad.IsNotNull()) { m_NavigationToolStorage = storageToLoad; m_Controls->m_StorageName->setText(m_NavigationToolStorage->GetName().c_str()); EnableStorageControls(); } else { m_NavigationToolStorage = NULL; DisableStorageControls(); } UpdateToolTable(); } //################################################################################## //############################## slots: main widget ################################ //################################################################################## void QmitkNavigationToolManagementWidget::OnMoveToolUp() { if (m_NavigationToolStorage.IsNotNull()) { int toolIndex = m_Controls->m_ToolList->currentIndex().row(); if (toolIndex >= 0) { mitk::NavigationTool::Pointer currentNavigationTool = m_NavigationToolStorage->GetTool(toolIndex); if (currentNavigationTool.IsNotNull()) { std::string currentIdentifier = currentNavigationTool->GetIdentifier(); int NewNumber = m_Controls->m_ToolList->currentIndex().row() - 1; if (NewNumber < 0) { MITK_WARN << "Cannot move tool up because it is on the top!"; } else { m_NavigationToolStorage->AssignToolNumber(currentIdentifier, NewNumber); } UpdateToolTable(); } } } } void QmitkNavigationToolManagementWidget::OnMoveToolDown() { if (m_NavigationToolStorage.IsNotNull()) { int toolIndex = m_Controls->m_ToolList->currentIndex().row(); if (toolIndex >= 0) { mitk::NavigationTool::Pointer currentNavigationTool = m_NavigationToolStorage->GetTool(toolIndex); if (currentNavigationTool.IsNotNull()) { std::string currentIdentifier = currentNavigationTool->GetIdentifier(); int NewNumber = m_Controls->m_ToolList->currentIndex().row() + 1; if (NewNumber >= m_NavigationToolStorage->GetToolCount()) { MITK_WARN << "Cannot move tool down because it is the last tool in this storage!"; } else { m_NavigationToolStorage->AssignToolNumber(currentIdentifier, NewNumber); } UpdateToolTable(); } } } } void QmitkNavigationToolManagementWidget::OnAddTool() { if (m_NavigationToolStorage->isLocked()) { MessageBox("Storage is locked, cannot modify it. Maybe the tracking device which uses this storage is connected. If you want to modify the storage please disconnect the device first."); return; } QString defaultIdentifier = "NavigationTool#" + QString::number(m_NavigationToolStorage->GetToolCount()); QString defaultName = "NavigationTool" + QString::number(m_NavigationToolStorage->GetToolCount()); m_Controls->m_ToolCreationWidget->Initialize(m_DataStorage, defaultIdentifier.toStdString(), defaultName.toStdString()); + m_Controls->m_ToolCreationWidget->ShowToolPreview("Tool preview"); m_edit = false; m_Controls->m_MainWidgets->setCurrentIndex(1); } void QmitkNavigationToolManagementWidget::OnDeleteTool() { //first: some checks if (m_NavigationToolStorage->isLocked()) { MessageBox("Storage is locked, cannot modify it. Maybe the tracking device which uses this storage is connected. If you want to modify the storage please disconnect the device first."); return; } else if (m_Controls->m_ToolList->currentItem() == NULL) //if no item is selected, show error message: { MessageBox("Error: Please select tool first!"); return; } m_DataStorage->Remove(m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row())->GetDataNode()); m_NavigationToolStorage->DeleteTool(m_Controls->m_ToolList->currentIndex().row()); UpdateToolTable(); } void QmitkNavigationToolManagementWidget::OnEditTool() { if (m_NavigationToolStorage->isLocked()) { MessageBox("Storage is locked, cannot modify it. Maybe the tracking device which uses this storage is connected. If you want to modify the storage please disconnect the device first."); return; } else if (m_Controls->m_ToolList->currentItem() == NULL) //if no item is selected, show error message: { MessageBox("Error: Please select tool first!"); return; } mitk::NavigationTool::Pointer selectedTool = m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row()); + m_Controls->m_ToolCreationWidget->Initialize(m_DataStorage, "", ""); //Initialize once again, might be called here for the first time after autodetection m_Controls->m_ToolCreationWidget->SetDefaultData(selectedTool); - m_NavigationToolStorage->SetName("test"); + m_Controls->m_ToolCreationWidget->ShowToolPreview("Tool preview"); m_edit = true; m_Controls->m_MainWidgets->setCurrentIndex(1); } void QmitkNavigationToolManagementWidget::OnCreateStorage() { QString storageName = QInputDialog::getText(NULL, "Storage Name", "Name of the new tool storage:"); if (storageName.isNull()) return; m_NavigationToolStorage = mitk::NavigationToolStorage::New(this->m_DataStorage); m_NavigationToolStorage->SetName(storageName.toStdString()); m_Controls->m_StorageName->setText(m_NavigationToolStorage->GetName().c_str()); EnableStorageControls(); emit NewStorageAdded(m_NavigationToolStorage, storageName.toStdString()); } void QmitkNavigationToolManagementWidget::OnLoadStorage() { mitk::NavigationToolStorageDeserializer::Pointer myDeserializer = mitk::NavigationToolStorageDeserializer::New(m_DataStorage); std::string filename = QFileDialog::getOpenFileName(NULL, tr("Open Navigation Tool Storage"), QmitkIGTCommonHelper::GetLastFileLoadPath(), tr("IGT Tool Storage (*.IGTToolStorage)")).toStdString(); if (filename == "") return; QmitkIGTCommonHelper::SetLastFileLoadPathByFileName(QString::fromStdString(filename)); try { mitk::NavigationToolStorage::Pointer tempStorage = myDeserializer->Deserialize(filename); if (tempStorage.IsNull()) MessageBox("Error" + myDeserializer->GetErrorMessage()); else { Poco::Path myPath = Poco::Path(filename.c_str()); tempStorage->SetName(myPath.getFileName()); //set the filename as name for the storage, so the user can identify it this->LoadStorage(tempStorage); emit NewStorageAdded(m_NavigationToolStorage,myPath.getFileName()); } } catch (const mitk::Exception& exception) { MessageBox(exception.GetDescription()); } } void QmitkNavigationToolManagementWidget::OnSaveStorage() { QFileDialog *fileDialog = new QFileDialog; fileDialog->setDefaultSuffix("IGTToolStorage"); QString suffix = "IGT Tool Storage (*.IGTToolStorage)"; QString filename = fileDialog->getSaveFileName(NULL, tr("Save Navigation Tool Storage"), QmitkIGTCommonHelper::GetLastFileSavePath(), suffix, &suffix); if (filename.isEmpty()) return; //canceled by the user // check file suffix QFileInfo file(filename); if(file.suffix().isEmpty()) filename += ".IGTToolStorage"; //serialize tool storage mitk::NavigationToolStorageSerializer::Pointer mySerializer = mitk::NavigationToolStorageSerializer::New(); if (!mySerializer->Serialize(filename.toStdString(), m_NavigationToolStorage)) { MessageBox("Error: " + mySerializer->GetErrorMessage()); return; QmitkIGTCommonHelper::SetLastFileSavePath(file.absolutePath()); } Poco::Path myPath = Poco::Path(filename.toStdString()); m_Controls->m_StorageName->setText(QString::fromStdString(myPath.getFileName())); } //################################################################################## //############################## slots: add tool widget ############################ //################################################################################## void QmitkNavigationToolManagementWidget::OnAddToolSave() { mitk::NavigationTool::Pointer newTool = m_Controls->m_ToolCreationWidget->GetCreatedTool(); if (m_edit) //here we edit a existing tool { mitk::NavigationTool::Pointer editedTool = m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row()); editedTool->Graft(newTool); //Keep this line, 'cause otherwise, the NavigationToolStorage wouldn't notice, that the toolStorage changed. m_NavigationToolStorage->UpdateMicroservice(); } else //here we create a new tool { m_NavigationToolStorage->AddTool(newTool); } + //Remove tool preview + m_DataStorage->Remove(m_DataStorage->GetNamedNode("Tool preview")); + UpdateToolTable(); m_Controls->m_MainWidgets->setCurrentIndex(0); + m_Controls->m_ToolInformation->setText(""); } void QmitkNavigationToolManagementWidget::OnAddToolCancel() { m_Controls->m_MainWidgets->setCurrentIndex(0); + //Remove tool preview + m_DataStorage->Remove(m_DataStorage->GetNamedNode("Tool preview")); +} + +void QmitkNavigationToolManagementWidget::OnToolSelected() +{ + QString _label = "Information for tool " + m_Controls->m_ToolList->currentItem()->text() + "\n"; + _label.append(QString(m_NavigationToolStorage->GetTool(m_Controls->m_ToolList->currentIndex().row())->GetStringWithAllToolInformation().c_str())); + m_Controls->m_ToolInformation->setText(_label); } //################################################################################## //############################## private help methods ############################## //################################################################################## void QmitkNavigationToolManagementWidget::UpdateToolTable() { m_Controls->m_ToolList->clear(); if (m_NavigationToolStorage.IsNull()) return; for (int i = 0; i < m_NavigationToolStorage->GetToolCount(); i++) { - QString currentTool = "Tool" + QString::number(i) + ": " + QString(m_NavigationToolStorage->GetTool(i)->GetDataNode()->GetName().c_str()) + " "; + QString currentTool = "Tool" + QString::number(i) + ": " + QString(m_NavigationToolStorage->GetTool(i)->GetToolName().c_str()) + " "; currentTool += "(" + QString::fromStdString(m_NavigationToolStorage->GetTool(i)->GetTrackingDeviceType()) + "/"; switch (m_NavigationToolStorage->GetTool(i)->GetType()) { case mitk::NavigationTool::Instrument: currentTool += "Instrument)"; break; case mitk::NavigationTool::Fiducial: currentTool += "Fiducial)"; break; case mitk::NavigationTool::Skinmarker: currentTool += "Skinmarker)"; break; default: currentTool += "Unknown)"; } m_Controls->m_ToolList->addItem(currentTool); } } void QmitkNavigationToolManagementWidget::MessageBox(std::string s) { QMessageBox msgBox; msgBox.setText(s.c_str()); msgBox.exec(); } void QmitkNavigationToolManagementWidget::DisableStorageControls() { m_Controls->m_StorageName->setText("<none>"); m_Controls->m_AddTool->setEnabled(false); m_Controls->m_LoadTool->setEnabled(false); m_Controls->m_MoveToolUp->setEnabled(false); m_Controls->m_MoveToolDown->setEnabled(false); m_Controls->m_selectedLabel->setEnabled(false); m_Controls->m_DeleteTool->setEnabled(false); m_Controls->m_EditTool->setEnabled(false); m_Controls->m_SaveTool->setEnabled(false); m_Controls->m_ToolList->setEnabled(false); m_Controls->m_SaveStorage->setEnabled(false); m_Controls->m_ToolLabel->setEnabled(false); } void QmitkNavigationToolManagementWidget::EnableStorageControls() { m_Controls->m_AddTool->setEnabled(true); m_Controls->m_LoadTool->setEnabled(true); m_Controls->m_MoveToolUp->setEnabled(true); m_Controls->m_MoveToolDown->setEnabled(true); m_Controls->m_selectedLabel->setEnabled(true); m_Controls->m_DeleteTool->setEnabled(true); m_Controls->m_EditTool->setEnabled(true); m_Controls->m_SaveTool->setEnabled(true); m_Controls->m_ToolList->setEnabled(true); m_Controls->m_SaveStorage->setEnabled(true); m_Controls->m_ToolLabel->setEnabled(true); } \ No newline at end of file diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.h b/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.h index afe0874bcb..f7df781dab 100644 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.h +++ b/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidget.h @@ -1,112 +1,113 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKNAVIGATIONTOOLMANAGEMENTWIDGET_H #define QMITKNAVIGATIONTOOLMANAGEMENTWIDGET_H //QT headers #include <QWidget> //mitk headers #include "MitkIGTUIExports.h" #include "mitkNavigationTool.h" #include <mitkNavigationToolStorage.h> //ui header #include "ui_QmitkNavigationToolManagementWidgetControls.h" /** Documentation: * \brief An object of this class offers an UI to manage NavigationTools and * NavigationToolStorages. This means a user may create, save and load * single NavigationTools and/or NavigationToolStorages with this widget. * * Be sure to call the Initialize-methode before you start the widget * otherwise some errors might occure. * * \ingroup IGTUI */ class MITKIGTUI_EXPORT QmitkNavigationToolManagementWidget : public QWidget { Q_OBJECT public: static const std::string VIEW_ID; /** Initializes the widget. Has to be called before any action, otherwise errors might occur. */ void Initialize(mitk::DataStorage* dataStorage); /** Loads a storage to the widget. The old storage storage is dropped, so be careful, if the * storage is not saved somewhere else it might be lost. You might want to ask the user if he * wants to save the storage to the harddisk before calling this method. * @param storageToLoad This storage will be loaded and might be modified by the user. */ void LoadStorage(mitk::NavigationToolStorage::Pointer storageToLoad); QmitkNavigationToolManagementWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); ~QmitkNavigationToolManagementWidget(); signals: /** This signal is emmited if a new storage was added by the widget itself, e.g. because * a storage was loaded from the harddisk. * @param newStorage Holds the new storage which was added. * @param storageName Name of the new storage (e.g. filename) */ void NewStorageAdded(mitk::NavigationToolStorage::Pointer newStorage, std::string storageName); protected slots: //main widget page: void OnAddTool(); void OnDeleteTool(); void OnEditTool(); void OnLoadTool(); void OnSaveTool(); void OnMoveToolUp(); void OnMoveToolDown(); void OnLoadStorage(); void OnSaveStorage(); void OnCreateStorage(); + void OnToolSelected(); //widget page "add tool": void OnAddToolCancel(); void OnAddToolSave(); protected: /// \brief Creation of the connections virtual void CreateConnections(); virtual void CreateQtPartControl(QWidget *parent); Ui::QmitkNavigationToolManagementWidgetControls* m_Controls; /** @brief holds the DataStorage */ mitk::DataStorage* m_DataStorage; /** @brief holds the NavigationToolStorage we are working with. */ mitk::NavigationToolStorage::Pointer m_NavigationToolStorage; /** @brief shows if we are in edit mode, if not we create new navigation tool objects. */ bool m_edit; //############## private help methods ####################### void MessageBox(std::string s); void UpdateToolTable(); void DisableStorageControls(); void EnableStorageControls(); }; #endif diff --git a/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidgetControls.ui b/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidgetControls.ui index a80055349a..b246da95c5 100644 --- a/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidgetControls.ui +++ b/Modules/IGTUI/Qmitk/QmitkNavigationToolManagementWidgetControls.ui @@ -1,308 +1,315 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>QmitkNavigationToolManagementWidgetControls</class> <widget class="QWidget" name="QmitkNavigationToolManagementWidgetControls"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>443</width> <height>781</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string>Whole Storage:</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_CreateNewStorage"> <property name="text"> <string>Create New</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_LoadStorage"> <property name="text"> <string>Load</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_SaveStorage"> <property name="text"> <string>Save</string> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QStackedWidget" name="m_MainWidgets"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="main_page"> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="label_10"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Storage Name:</span></p></body></html></string> </property> </widget> </item> <item> <widget class="QLabel" name="m_StorageName"> <property name="text"> <string><none></string> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <widget class="QLabel" name="m_ToolLabel"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Tools:</span></p></body></html></string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QListWidget" name="m_ToolList"/> </item> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="m_AddTool"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Add</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_LoadTool"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Load</string> </property> </widget> </item> <item> <widget class="QLabel" name="m_selectedLabel"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Selected:</span></p></body></html></string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_MoveToolUp"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Up</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_MoveToolDown"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Down</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_DeleteTool"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Delete</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_EditTool"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Edit</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_SaveTool"> <property name="maximumSize"> <size> <width>50</width> <height>16777215</height> </size> </property> <property name="text"> <string>Save</string> </property> </widget> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </item> </layout> </item> </layout> </widget> <widget class="QWidget" name="new_tool_page"> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QmitkNavigationToolCreationWidget" name="m_ToolCreationWidget" native="true"> <property name="minimumSize"> <size> <width>0</width> <height>150</height> </size> </property> </widget> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> </widget> </item> + <item> + <widget class="QLabel" name="m_ToolInformation"> + <property name="text"> + <string/> + </property> + </widget> + </item> </layout> </widget> <customwidgets> <customwidget> <class>QmitkNavigationToolCreationWidget</class> <extends>QWidget</extends> <header>QmitkNavigationToolCreationWidget.h</header> <container>1</container> </customwidget> </customwidgets> <resources/> <connections/> </ui> diff --git a/Modules/IGTUI/files.cmake b/Modules/IGTUI/files.cmake index df2e5e6088..5773331a13 100644 --- a/Modules/IGTUI/files.cmake +++ b/Modules/IGTUI/files.cmake @@ -1,116 +1,113 @@ set(CPP_FILES Qmitk/QmitkTrackingDeviceWidget.cpp Qmitk/QmitkTrackingDeviceConfigurationWidget.cpp Qmitk/QmitkNDIConfigurationWidget.cpp Qmitk/QmitkFiducialRegistrationWidget.cpp Qmitk/QmitkNDIToolDelegate.cpp Qmitk/QmitkNavigationToolManagementWidget.cpp Qmitk/QmitkIGTLoggerWidget.cpp Qmitk/QmitkUpdateTimerWidget.cpp Qmitk/QmitkToolDistanceWidget.cpp Qmitk/QmitkToolTrackingStatusWidget.cpp Qmitk/QmitkTrackingSourcesCheckBoxPanelWidget.cpp Qmitk/QmitkIGTPlayerWidget.cpp Qmitk/QmitkIGTConnectionWidget.cpp Qmitk/QmitkToolSelectionWidget.cpp Qmitk/QmitkNavigationToolCreationWidget.cpp - Qmitk/QmitkNavigationToolCreationAdvancedWidget.cpp Qmitk/QmitkNavigationDataSourceSelectionWidget.cpp Qmitk/QmitkInteractiveTransformationWidget.cpp Qmitk/QmitkNavigationToolStorageSelectionWidget.cpp Qmitk/QmitkNavigationDataPlayerControlWidget.cpp Qmitk/QmitkNavigationDataSequentialPlayerControlWidget.cpp Qmitk/QmitkNDIAuroraWidget.cpp Qmitk/QmitkNDIPolarisWidget.cpp Qmitk/QmitkMicronTrackerWidget.cpp Qmitk/QmitkNPOptitrackWidget.cpp Qmitk/QmitkVirtualTrackerWidget.cpp Qmitk/QmitkOpenIGTLinkWidget.cpp Qmitk/mitkTrackingDeviceWidgetCollection.cpp Qmitk/QmitkTrackingDeviceConfigurationWidgetScanPortsWorker.cpp Qmitk/QmitkTrackingDeviceConfigurationWidgetConnectionWorker.cpp Qmitk/QmitkNDIAbstractDeviceWidget.cpp Qmitk/QmitkAbstractTrackingDeviceWidget.cpp Qmitk/QmitkIGTCommonHelper.cpp ) set(UI_FILES Qmitk/QmitkNavigationToolManagementWidgetControls.ui Qmitk/QmitkTrackingDeviceConfigurationWidgetControls.ui Qmitk/QmitkNDIConfigurationWidget.ui Qmitk/QmitkFiducialRegistrationWidget.ui Qmitk/QmitkIGTLoggerWidgetControls.ui Qmitk/QmitkUpdateTimerWidgetControls.ui Qmitk/QmitkToolDistanceWidgetControls.ui Qmitk/QmitkToolTrackingStatusWidgetControls.ui Qmitk/QmitkTrackingSourcesCheckBoxPanelWidgetControls.ui Qmitk/QmitkIGTPlayerWidgetControls.ui Qmitk/QmitkIGTConnectionWidgetControls.ui Qmitk/QmitkToolSelectionWidgetControls.ui Qmitk/QmitkNavigationToolCreationWidget.ui - Qmitk/QmitkNavigationToolCreationAdvancedWidgetControls.ui Qmitk/QmitkNavigationDataSourceSelectionWidgetControls.ui Qmitk/QmitkInteractiveTransformationWidgetControls.ui Qmitk/QmitkNavigationToolStorageSelectionWidgetControls.ui Qmitk/QmitkNavigationDataPlayerControlWidget.ui Qmitk/QmitkNavigationDataSequentialPlayerControlWidget.ui Qmitk/QmitkNDIAuroraWidget.ui Qmitk/QmitkNDIPolarisWidget.ui Qmitk/QmitkMicronTrackerWidget.ui Qmitk/QmitkNPOptitrackWidget.ui Qmitk/QmitkVirtualTrackerWidget.ui Qmitk/QmitkOpenIGTLinkWidget.ui ) set(MOC_H_FILES Qmitk/QmitkNavigationToolManagementWidget.h Qmitk/QmitkTrackingDeviceWidget.h Qmitk/QmitkTrackingDeviceConfigurationWidget.h Qmitk/QmitkNDIConfigurationWidget.h Qmitk/QmitkFiducialRegistrationWidget.h Qmitk/QmitkNDIToolDelegate.h Qmitk/QmitkIGTLoggerWidget.h Qmitk/QmitkUpdateTimerWidget.h Qmitk/QmitkToolDistanceWidget.h Qmitk/QmitkToolTrackingStatusWidget.h Qmitk/QmitkTrackingSourcesCheckBoxPanelWidget.h Qmitk/QmitkIGTPlayerWidget.h Qmitk/QmitkIGTConnectionWidget.h Qmitk/QmitkToolSelectionWidget.h Qmitk/QmitkNavigationToolCreationWidget.h - Qmitk/QmitkNavigationToolCreationAdvancedWidget.h Qmitk/QmitkNavigationDataSourceSelectionWidget.h Qmitk/QmitkInteractiveTransformationWidget.h Qmitk/QmitkNavigationToolStorageSelectionWidget.h Qmitk/QmitkNavigationDataPlayerControlWidget.h Qmitk/QmitkNavigationDataSequentialPlayerControlWidget.h Qmitk/QmitkNDIAuroraWidget.h Qmitk/QmitkNDIPolarisWidget.h Qmitk/QmitkMicronTrackerWidget.h Qmitk/QmitkNPOptitrackWidget.h Qmitk/QmitkVirtualTrackerWidget.h Qmitk/QmitkOpenIGTLinkWidget.h Qmitk/QmitkTrackingDeviceConfigurationWidgetScanPortsWorker.h Qmitk/QmitkTrackingDeviceConfigurationWidgetConnectionWorker.h Qmitk/QmitkNDIAbstractDeviceWidget.h Qmitk/QmitkAbstractTrackingDeviceWidget.h Qmitk/QmitkIGTCommonHelper.h ) if(MITK_USE_POLHEMUS_TRACKER) set(CPP_FILES ${CPP_FILES} Qmitk/QmitkPolhemusTrackerWidget.cpp) set(UI_FILES ${UI_FILES} Qmitk/QmitkPolhemusTrackerWidget.ui) set(MOC_H_FILES ${MOC_H_FILES} Qmitk/QmitkPolhemusTrackerWidget.h) endif(MITK_USE_POLHEMUS_TRACKER) set(QRC_FILES resources/IGTUI.qrc ) diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/UltrasoundCalibrationControls.ui b/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/UltrasoundCalibrationControls.ui index 55ea3f8943..59289dd670 100644 --- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/UltrasoundCalibrationControls.ui +++ b/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/UltrasoundCalibrationControls.ui @@ -1,1162 +1,1163 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>UltrasoundCalibrationControls</class> <widget class="QWidget" name="UltrasoundCalibrationControls"> <property name="enabled"> <bool>true</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>374</width> <height>923</height> </rect> </property> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="windowTitle"> <string>QmitkTemplate</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QToolBox" name="m_ToolBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="currentIndex"> <number>1</number> </property> <widget class="QWidget" name="m_Config"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>356</width> - <height>824</height> + <width>200</width> + <height>57</height> </rect> </property> <attribute name="label"> <string>Config</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QmitkUSNavigationStepCombinedModality" name="m_CombinedModalityManagerWidget" native="true"/> </item> <item> <widget class="QPushButton" name="m_StartCalibrationButton"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Start Calibration for Selected Device</string> </property> </widget> </item> </layout> </widget> <widget class="QWidget" name="m_SpatialCalibration"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>356</width> <height>824</height> </rect> </property> <attribute name="label"> <string>Spatial Calibration</string> </attribute> <widget class="QTabWidget" name="tabWidget"> <property name="geometry"> <rect> <x>0</x> <y>10</y> <width>351</width> <height>831</height> </rect> </property> <property name="currentIndex"> - <number>2</number> + <number>1</number> </property> <widget class="QWidget" name="m_Spacing"> <attribute name="title"> <string>Spacing</string> </attribute> <widget class="QWidget" name="gridLayoutWidget"> <property name="geometry"> <rect> <x>10</x> <y>150</y> <width>281</width> <height>41</height> </rect> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="2"> <widget class="QPushButton" name="m_SpacingAddPoint"> <property name="text"> <string>Add Point</string> </property> </widget> </item> <item row="0" column="1"> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item row="0" column="0"> <widget class="QPushButton" name="m_SpacingBtnFreeze"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Freeze</string> </property> </widget> </item> </layout> </widget> <widget class="QLabel" name="label_49"> <property name="geometry"> <rect> <x>10</x> <y>10</y> <width>281</width> <height>131</height> </rect> </property> <property name="text"> <string><html><head/><body><p>1. Freeze the US-Image.</p><p>2. Mark two points in the US-Image of which you know <br/>they are exactly 30mm apart in horizontal direction.</p><p>3. Marktwo more points in the US-Image of which you <br/>know they are exactly 20mm apart vertical direction.</p><p>4. Now you can click the &quot;Calculate Spacing&quot;-Button. <br/>The spacing is calculated and applied to the US-Image.</p></body></html></string> </property> <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> </property> </widget> <widget class="QListWidget" name="m_SpacingPointsList"> <property name="geometry"> <rect> <x>10</x> <y>200</y> <width>281</width> <height>192</height> </rect> </property> </widget> <widget class="QPushButton" name="m_CalculateSpacing"> <property name="geometry"> <rect> <x>20</x> <y>400</y> <width>261</width> <height>23</height> </rect> </property> <property name="text"> <string>Calculate Spacing</string> </property> </widget> </widget> <widget class="QWidget" name="m_PointBased"> <attribute name="title"> <string>Point Based</string> </attribute> <widget class="QLabel" name="label"> <property name="geometry"> <rect> <x>10</x> <y>10</y> <width>221</width> <height>16</height> </rect> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600; text-decoration: underline;">Step 1: Collect Points</span></p></body></html></string> </property> </widget> <widget class="QLabel" name="label_5"> <property name="geometry"> <rect> <x>10</x> <y>30</y> - <width>231</width> + <width>261</width> <height>91</height> </rect> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Slowly move a tracking tool into the image plane of the ultrasound. As soon as it becomes visible, click &quot;freeze&quot; and mark the point on the screen. Do this with as many points as necessary, then click calibrate to perform calibration.</span></p></body></html></string> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Slowly move a tracking tool into the image plane of the ultrasound. As soon as it becomes visible, click &quot;freeze&quot; and mark the point on the screen by moving the Crosshair to the pont in the US image (best: click in 2D Axial view).</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do this with as many points as necessary, then click calibrate to perform calibration.</p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> <widget class="QLabel" name="label_6"> <property name="geometry"> <rect> <x>10</x> <y>120</y> <width>291</width> <height>31</height> </rect> </property> <property name="font"> <font> <weight>75</weight> <bold>true</bold> </font> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Tracking Status:</span></p></body></html></string> </property> </widget> <widget class="QPushButton" name="m_CalibBtnSaveCalibration"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>10</x> <y>620</y> <width>301</width> <height>23</height> </rect> </property> <property name="text"> <string>Save Calibration</string> </property> </widget> <widget class="Line" name="line_2"> <property name="geometry"> <rect> <x>10</x> <y>550</y> <width>291</width> <height>16</height> </rect> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> <widget class="QListWidget" name="m_CalibPointList"> <property name="geometry"> <rect> <x>10</x> <y>200</y> <width>301</width> <height>225</height> </rect> </property> </widget> <widget class="QLabel" name="label_2"> <property name="geometry"> <rect> <x>10</x> <y>450</y> <width>571</width> <height>16</height> </rect> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600; text-decoration: underline;">Step 2: Calibrate (perform landmark transformation)</span></p></body></html></string> </property> </widget> <widget class="QWidget" name="layoutWidget"> <property name="geometry"> <rect> <x>10</x> <y>160</y> <width>301</width> <height>25</height> </rect> </property> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QPushButton" name="m_CalibBtnFreeze"> <property name="text"> <string>Freeze</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_CalibBtnAddPoint"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Add Point</string> </property> </widget> </item> </layout> </widget> <widget class="Line" name="line"> <property name="geometry"> <rect> <x>10</x> <y>430</y> <width>301</width> <height>21</height> </rect> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> <widget class="QPushButton" name="m_CalibBtnCalibrate"> <property name="geometry"> <rect> <x>10</x> <y>510</y> <width>301</width> <height>23</height> </rect> </property> <property name="text"> <string>Calibrate</string> </property> </widget> <widget class="QCheckBox" name="m_saveAdditionalCalibrationLog"> <property name="geometry"> <rect> <x>10</x> <y>590</y> <width>584</width> <height>17</height> </rect> </property> <property name="text"> <string>Save additional logging information (MITK scene, etc.)</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> <widget class="QCheckBox" name="m_ScaleTransform"> <property name="geometry"> <rect> <x>10</x> <y>480</y> <width>584</width> <height>17</height> </rect> </property> <property name="text"> <string>Activate Scaling during Calibration Transform</string> </property> </widget> <widget class="QLabel" name="label_4"> <property name="geometry"> <rect> <x>10</x> <y>570</y> <width>291</width> <height>16</height> </rect> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600; text-decoration: underline;">Step 3: Save calibration to hard disc</span></p></body></html></string> </property> </widget> <widget class="QPushButton" name="m_CalibBtnStopCalibration"> <property name="geometry"> <rect> <x>10</x> <y>680</y> <width>301</width> <height>23</height> </rect> </property> <property name="text"> <string>Stop Calibration Process</string> </property> </widget> <widget class="QPushButton" name="m_CalibBtnRestartCalibration"> <property name="geometry"> <rect> <x>10</x> <y>710</y> <width>301</width> <height>23</height> </rect> </property> <property name="text"> <string>Restart Current Calibration</string> </property> </widget> <widget class="QmitkToolTrackingStatusWidget" name="m_CalibTrackingStatus" native="true"> <property name="geometry"> <rect> <x>100</x> <y>120</y> <width>211</width> <height>31</height> </rect> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>40</verstretch> </sizepolicy> </property> </widget> <widget class="Line" name="line_3"> <property name="geometry"> <rect> <x>10</x> <y>650</y> <width>301</width> <height>20</height> </rect> </property> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </widget> <widget class="QWidget" name="m_Plus"> <attribute name="title"> <string>PLUS Connection</string> </attribute> <widget class="QWidget" name="verticalLayoutWidget"> <property name="geometry"> <rect> <x>10</x> <y>10</y> <width>301</width> <height>241</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_8"> <item> <widget class="QLabel" name="label_19"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Step 1: Calibrate using fCal</span></p></body></html></string> </property> <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> </property> </widget> </item> <item> <widget class="QLabel" name="label_22"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. Setup the Connection to PLUS</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Start fCal with the EchoTrackCalibration Config file</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. Connect fcal to MITK, once it connected successfully you can click the &quot;Start Streaming&quot; Button below</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4. Now follow the steps in fCal and don't forget to save the Calibration in the end</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">5. Finish fCal</p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QLabel" name="label_23"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Step 2: Get the calibration back from PLUS</span></p></body></html></string> </property> </widget> </item> <item> <widget class="QLabel" name="label_24"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. Start a PLUS Server with the configfile you saved in the final step of fCal</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Once the Server connected to MITK click the &quot;Start Streaming&quot; Button below</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. Now Click the &quot;Get Calibration from PLUS&quot;Button below</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4. You can now save the calibration</p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> </item> </layout> </widget> <widget class="QGroupBox" name="groupBox_3"> <property name="geometry"> <rect> <x>10</x> <y>270</y> <width>301</width> <height>281</height> </rect> </property> <property name="title"> <string/> </property> <widget class="QPushButton" name="m_StartStreaming"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>90</y> <width>299</width> <height>23</height> </rect> </property> <property name="text"> <string>Start Streaming</string> </property> </widget> <widget class="QPushButton" name="m_GetCalibrationFromPLUS"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>140</y> <width>299</width> <height>23</height> </rect> </property> <property name="text"> <string>Get Calibration from PLUS</string> </property> </widget> <widget class="QPushButton" name="m_SavePlusCalibration"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>180</y> <width>299</width> <height>23</height> </rect> </property> <property name="text"> <string>Save PLUS Calibration</string> </property> </widget> <widget class="QPushButton" name="m_StopPlusCalibration"> <property name="geometry"> <rect> <x>0</x> <y>220</y> <width>299</width> <height>23</height> </rect> </property> <property name="text"> <string>Stop Calibration with PLUS</string> </property> </widget> <widget class="QLabel" name="m_ConnectionStatus"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>60</y> <width>291</width> <height>21</height> </rect> </property> <property name="text"> <string/> </property> </widget> <widget class="QLabel" name="m_GotCalibrationLabel"> <property name="geometry"> <rect> <x>0</x> <y>120</y> <width>281</width> <height>16</height> </rect> </property> <property name="text"> <string/> </property> </widget> <widget class="QPushButton" name="m_StartPlusCalibrationButton"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>30</y> <width>301</width> <height>23</height> </rect> </property> <property name="text"> <string>Setup PLUS Connection</string> </property> </widget> <widget class="QLabel" name="m_SetupStatus"> <property name="enabled"> <bool>false</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>10</y> <width>291</width> <height>21</height> </rect> </property> <property name="text"> <string/> </property> </widget> </widget> </widget> </widget> </widget> <widget class="QWidget" name="m_Evaluation"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>356</width> - <height>824</height> + <width>100</width> + <height>30</height> </rect> </property> <attribute name="label"> <string>Evaluation</string> </attribute> <widget class="QTabWidget" name="tabWidget_2"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>311</width> <height>821</height> </rect> </property> <property name="currentIndex"> <number>1</number> </property> <widget class="QWidget" name="m_PointBasedEval"> <attribute name="title"> <string>Point Based Evaluation</string> </attribute> <widget class="QLabel" name="label_9"> <property name="geometry"> <rect> <x>10</x> <y>130</y> <width>301</width> <height>16</height> </rect> </property> <property name="text"> <string>Mark the visible needle tip with the crosshair</string> </property> </widget> <widget class="QLabel" name="label_7"> <property name="geometry"> <rect> <x>10</x> <y>10</y> <width>301</width> <height>31</height> </rect> </property> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Bring the needle into the tracking volume, so the projection can be calculated</span></p></body></html></string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> <widget class="QLabel" name="label_8"> <property name="geometry"> <rect> <x>10</x> <y>70</y> <width>291</width> <height>31</height> </rect> </property> <property name="text"> <string>Push the needle forward until it becomes visible in the Image</string> </property> <property name="wordWrap"> <bool>true</bool> </property> </widget> <widget class="QPushButton" name="m_EvalBtnStep3"> <property name="geometry"> <rect> <x>10</x> <y>150</y> <width>291</width> <height>23</height> </rect> </property> <property name="text"> <string>Step 3: Add Target Points</string> </property> </widget> <widget class="QPushButton" name="m_EvalBtnStep2"> <property name="geometry"> <rect> <x>10</x> <y>100</y> <width>291</width> <height>23</height> </rect> </property> <property name="text"> <string>Step 2: Freeze Image</string> </property> </widget> <widget class="QGroupBox" name="groupBox"> <property name="geometry"> <rect> <x>10</x> <y>440</y> <width>291</width> <height>108</height> </rect> </property> <property name="title"> <string>When done, save results</string> </property> <layout class="QGridLayout" name="gridLayout_2"> <item row="2" column="2"> <widget class="QPushButton" name="m_BtnReset"> <property name="text"> <string>Run Next Round</string> </property> </widget> </item> <item row="0" column="1" colspan="2"> <widget class="QLineEdit" name="m_EvalFilePath"/> </item> <item row="1" column="0"> <widget class="QLabel" name="label_11"> <property name="text"> <string>Prefix:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> <item row="2" column="1"> <widget class="QPushButton" name="m_EvalBtnSave"> <property name="text"> <string>Save Results</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="label_10"> <property name="text"> <string>Path:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> <item row="1" column="1" colspan="2"> <widget class="QLineEdit" name="m_EvalFilePrefix"/> </item> </layout> </widget> <widget class="QGroupBox" name="groupBox_2"> <property name="geometry"> <rect> <x>10</x> <y>180</y> <width>291</width> <height>247</height> </rect> </property> <property name="title"> <string>Control</string> </property> <layout class="QFormLayout" name="formLayout"> <property name="fieldGrowthPolicy"> <enum>QFormLayout::AllNonFixedFieldsGrow</enum> </property> <item row="0" column="0"> <widget class="QLabel" name="label_13"> <property name="text"> <string>Tracking Status:</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QmitkToolTrackingStatusWidget" name="m_EvalTrackingStatus" native="true"/> </item> <item row="1" column="0"> <widget class="QLabel" name="label_14"> <property name="text"> <string># Projection Points:</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_12"> <property name="text"> <string># Target Points:</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QLabel" name="m_EvalLblNumTargetPoints"> <property name="text"> <string>0</string> </property> </widget> </item> <item row="4" column="0"> <widget class="QLabel" name="label_15"> <property name="text"> <string>Evaluation TRE:</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QLabel" name="m_EvalLblEvaluationFRE"> <property name="text"> <string>0</string> </property> </widget> </item> <item row="5" column="0"> <widget class="QLabel" name="label_17"> <property name="text"> <string>Projection TRE:</string> </property> </widget> </item> <item row="5" column="1"> <widget class="QLabel" name="m_EvalLblProjectionFRE"> <property name="text"> <string>0</string> </property> </widget> </item> <item row="6" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Calibration FRE:</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QLabel" name="m_EvalLblNumProjectionPoints"> <property name="text"> <string>0</string> </property> </widget> </item> <item row="6" column="1"> <widget class="QLabel" name="m_EvalLblCalibrationFRE"> <property name="text"> <string>0</string> </property> </widget> </item> </layout> </widget> <widget class="QPushButton" name="m_EvalBtnStep1"> <property name="geometry"> <rect> <x>10</x> <y>50</y> <width>291</width> <height>23</height> </rect> </property> <property name="text"> <string>Step 1: Save Needle Projection</string> </property> </widget> </widget> <widget class="QWidget" name="m_ReferenceDevice"> <attribute name="title"> <string>Reference Device</string> </attribute> <widget class="QLabel" name="label_21"> <property name="geometry"> <rect> <x>10</x> <y>10</y> <width>281</width> <height>16</height> </rect> </property> <property name="text"> <string>Choose pointer:</string> </property> </widget> <widget class="QmitkNavigationDataSourceSelectionWidget" name="m_VerificationPointerChoser" native="true"> <property name="geometry"> <rect> <x>10</x> <y>30</y> <width>281</width> <height>50</height> </rect> </property> <property name="minimumSize"> <size> <width>0</width> <height>50</height> </size> </property> </widget> <widget class="QToolBox" name="toolBox"> <property name="geometry"> <rect> <x>10</x> <y>90</y> <width>281</width> <height>366</height> </rect> </property> <property name="currentIndex"> <number>1</number> </property> <widget class="QWidget" name="page"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>179</width> <height>82</height> </rect> </property> <attribute name="label"> <string>Create Reference</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> <widget class="QLabel" name="label_16"> <property name="text"> <string>Current reference points:</string> </property> </widget> </item> <item> <widget class="QmitkPointListWidget" name="m_ReferencePointsPointListWidget" native="true"/> </item> <item> <widget class="QPushButton" name="m_AddReferencePoints"> <property name="text"> <string>Add Current Pointer Tip Position</string> </property> </widget> </item> <item> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>111</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="page_2"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>281</width> <height>312</height> </rect> </property> <attribute name="label"> <string>Quick Verification</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_7"> <item> <widget class="QmitkDataStorageComboBox" name="m_ReferencePointsComboBox"/> </item> <item> <widget class="QPushButton" name="m_StartVerification"> <property name="text"> <string>Start Verification</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QLabel" name="label_18"> <property name="text"> <string>Current Point:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="m_CurrentPointLabel"> <property name="text"> <string><none></string> </property> </widget> </item> </layout> </item> <item> <widget class="QPushButton" name="m_AddCurrentPointerTipForVerification"> <property name="text"> <string>Add current pointer tip</string> </property> </widget> </item> <item> <widget class="QLabel" name="label_20"> <property name="text"> <string>Result:</string> </property> </widget> </item> <item> <widget class="QTextEdit" name="m_ResultsTextEdit"/> </item> </layout> </widget> </widget> </widget> </widget> </widget> </widget> </item> </layout> </widget> <layoutdefault spacing="6" margin="11"/> <customwidgets> <customwidget> <class>QmitkToolTrackingStatusWidget</class> <extends>QWidget</extends> <header location="global">QmitkToolTrackingStatusWidget.h</header> <container>1</container> </customwidget> <customwidget> <class>QmitkUSNavigationStepCombinedModality</class> <extends>QWidget</extends> <header>src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.h</header> <container>1</container> </customwidget> <customwidget> <class>QmitkPointListWidget</class> <extends>QWidget</extends> <header>QmitkPointListWidget.h</header> <container>1</container> </customwidget> <customwidget> <class>QmitkDataStorageComboBox</class> <extends>QComboBox</extends> <header>QmitkDataStorageComboBox.h</header> </customwidget> <customwidget> <class>QmitkNavigationDataSourceSelectionWidget</class> <extends>QWidget</extends> <header>QmitkNavigationDataSourceSelectionWidget.h</header> <container>1</container> </customwidget> </customwidgets> <resources/> <connections/> <slots> <slot>OnStartCalibrationProcess()</slot> <slot>OnReset()</slot> <slot>OnStopCalibrationProcess()</slot> </slots> </ui> diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.cpp b/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.cpp index f4fbaa3fc4..a37a21f0bc 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.cpp +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.cpp @@ -1,687 +1,728 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include <numeric> // Blueberry #include <berryISelectionService.h> #include <berryIWorkbenchWindow.h> // Qmitk #include "IGTNavigationToolCalibration.h" // mitk #include <mitkNavigationToolWriter.h> #include <mitkTrackingDeviceSource.h> #include <mitkTrackingDevice.h> #include <mitkTrackingTool.h> #include <mitkQuaternionAveraging.h> #include <mitkPivotCalibration.h> #include <mitkNavigationData.h> // Qt #include <QMessageBox> #include <qfiledialog.h> //vtk #include <vtkSphereSource.h> const std::string IGTNavigationToolCalibration::VIEW_ID = "org.mitk.views.igtnavigationtoolcalibration"; IGTNavigationToolCalibration::IGTNavigationToolCalibration() -{} +{ + m_ToolTransformationWidget = new QmitkInteractiveTransformationWidget(); +} IGTNavigationToolCalibration::~IGTNavigationToolCalibration() { //The following code is required due to a bug in the point list widget. //If this is removed, MITK crashes when closing the view: m_Controls.m_RegistrationLandmarkWidget->SetPointSetNode(NULL); m_Controls.m_CalibrationLandmarkWidget->SetPointSetNode(NULL); + delete m_ToolTransformationWidget; } void IGTNavigationToolCalibration::SetFocus() { } void IGTNavigationToolCalibration::OnToolCalibrationMethodChanged(int index) { //if pivot calibration (3) or manual(0) is chosen only calibration pointer is needed if (index == 0 || index == 3) { if (!CheckInitialization(false)) { return; } } else{ if (!CheckInitialization()) { return; } } UpdateManualToolTipCalibrationView(); m_Controls.m_CalibrationMethodsWidget->setCurrentIndex(index); m_IndexCurrentCalibrationMethod = index; } void IGTNavigationToolCalibration::CreateQtPartControl(QWidget *parent) { - //initialize manual tool editing widget - m_ManualToolTipEditWidget = new QmitkNavigationToolCreationAdvancedWidget(parent); - m_ManualToolTipEditWidget->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); - m_ManualToolTipEditWidget->setWindowTitle("Edit Tool Tip Manually"); - m_ManualToolTipEditWidget->setModal(false); - m_ManualToolTipEditWidget->SetDataStorage(this->GetDataStorage()); - m_TrackingTimer = new QTimer(this); // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); connect(m_Controls.m_SetToolToCalibrate, SIGNAL(clicked()), this, SLOT(SetToolToCalibrate())); connect(m_Controls.m_SetPointer, SIGNAL(clicked()), this, SLOT(SetCalibrationPointer())); connect(m_TrackingTimer, SIGNAL(timeout()), this, SLOT(UpdateTrackingTimer())); connect(m_Controls.m_AddLandmark, SIGNAL(clicked()), this, SLOT(AddLandmark())); connect(m_Controls.m_SaveCalibratedTool, SIGNAL(clicked()), this, SLOT(SaveCalibratedTool())); connect(m_Controls.m_AddPivotPose, SIGNAL(clicked()), this, SLOT(OnAddPivotPose())); connect(m_Controls.m_ComputePivot, SIGNAL(clicked()), this, SLOT(OnComputePivot())); connect(m_Controls.m_UseComputedPivotPoint, SIGNAL(clicked()), this, SLOT(OnUseComputedPivotPoint())); connect(m_Controls.m_StartEditTooltipManually, SIGNAL(clicked()), this, SLOT(OnStartManualToolTipCalibration())); connect(m_Controls.m_GetPositions, SIGNAL(clicked()), this, SLOT(OnGetPositions())); + connect(m_Controls.m_ToolAxis_X, SIGNAL(valueChanged(double)), this, SLOT(OnToolAxisSpinboxChanged())); + connect(m_Controls.m_ToolAxis_Y, SIGNAL(valueChanged(double)), this, SLOT(OnToolAxisSpinboxChanged())); + connect(m_Controls.m_ToolAxis_Z, SIGNAL(valueChanged(double)), this, SLOT(OnToolAxisSpinboxChanged())); connect(m_Controls.m_CalibrateToolAxis, SIGNAL(clicked()), this, SLOT(OnCalibrateToolAxis())); - connect((QObject*)(m_ManualToolTipEditWidget), SIGNAL(RetrieveDataForManualToolTipManipulation()), this, SLOT(OnRetrieveDataForManualTooltipManipulation())); - connect((QObject*)(m_ManualToolTipEditWidget), SIGNAL(DialogCloseRequested()), this, SLOT(OnProcessManualTooltipEditDialogCloseRequest())); + connect((QObject*)(m_ToolTransformationWidget), SIGNAL(EditToolTipFinished(mitk::AffineTransform3D::Pointer)), this, + SLOT(OnManualEditToolTipFinished(mitk::AffineTransform3D::Pointer))); connect(m_Controls.m_CalibrationMethodComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(OnToolCalibrationMethodChanged(int))); connect((QObject*)(m_Controls.m_RunCalibrationButton), SIGNAL(clicked()), (QObject*) this, SLOT(OnRunSingleRefToolCalibrationClicked())); connect((QObject*)(m_Controls.m_CollectNavigationDataButton), SIGNAL(clicked()), (QObject*) this, SLOT(OnLoginSingleRefToolNavigationDataClicked())); connect((QObject*)(m_Controls.m_SetNewToolTipPosButton), SIGNAL(clicked()), (QObject*) this, SLOT(OnSetNewToolTipPosButtonClicked())); m_IDToolToCalibrate = -1; m_IDCalibrationPointer = -1; m_IndexCurrentCalibrationMethod = -1; m_OnLoginSingleRefToolNavigationDataClicked = false; m_NumberOfNavigationDataCounter = 0; m_NumberOfNavigationData = -1; //for pivot calibration m_OnAddPivotPoseClicked = false; PivotCount = 0; m_PivotPoses = std::vector<mitk::NavigationData::Pointer>(); m_CalibrationLandmarks = mitk::PointSet::New(); m_CalibrationLandmarksNode = mitk::DataNode::New(); m_CalibrationLandmarksNode->SetData(m_CalibrationLandmarks); m_Controls.m_CalibrationLandmarkWidget->SetPointSetNode(m_CalibrationLandmarksNode); m_RegistrationLandmarks = mitk::PointSet::New(); m_RegistrationLandmarksNode = mitk::DataNode::New(); m_RegistrationLandmarksNode->SetData(m_RegistrationLandmarks); m_Controls.m_RegistrationLandmarkWidget->SetPointSetNode(m_RegistrationLandmarksNode); m_ToolSurfaceInToolCoordinatesDataNode = mitk::DataNode::New(); m_ToolSurfaceInToolCoordinatesDataNode->SetName("ToolSurface(ToolCoordinates)"); m_LoggedNavigationDataDifferences = std::vector< mitk::NavigationData::Pointer >(); } void IGTNavigationToolCalibration::OnRunSingleRefToolCalibrationClicked() { if (!CheckInitialization()) { return; } mitk::NavigationData::Pointer ToolTipTransform = mitk::NavigationData::New(); if (m_Controls.m_CalibratePosition->isChecked()) { //1: Compute mean translational offset vector m_ResultOffsetVector.Fill(0); for (std::vector<mitk::Point3D>::iterator vecIter = m_LoggedNavigationDataOffsets.begin(); vecIter != m_LoggedNavigationDataOffsets.end(); vecIter++) { m_ResultOffsetVector[0] = m_ResultOffsetVector[0] + (*vecIter)[0]; m_ResultOffsetVector[1] = m_ResultOffsetVector[1] + (*vecIter)[1]; m_ResultOffsetVector[2] = m_ResultOffsetVector[2] + (*vecIter)[2]; } m_ResultOffsetVector[0] = m_ResultOffsetVector[0] / m_LoggedNavigationDataOffsets.size(); m_ResultOffsetVector[1] = m_ResultOffsetVector[1] / m_LoggedNavigationDataOffsets.size(); m_ResultOffsetVector[2] = m_ResultOffsetVector[2] / m_LoggedNavigationDataOffsets.size(); this->m_Controls.m_ResultOfCalibration->setText( QString("x: ") + QString(QString::number(m_ResultOffsetVector[0], 103, 3)) + QString("; y: ") + (QString::number(m_ResultOffsetVector[1], 103, 3)) + QString("; z: ") + (QString::number(m_ResultOffsetVector[2], 103, 3))); ToolTipTransform->SetPosition(m_ResultOffsetVector); } if (m_Controls.m_CalibrateOrientation->isChecked()) { //2: Compute mean orientation mitk::Quaternion meanOrientation; std::vector <mitk::Quaternion> allOrientations = std::vector <mitk::Quaternion>(); for (int i = 0; i < m_LoggedNavigationDataDifferences.size(); i++) { allOrientations.push_back(m_LoggedNavigationDataDifferences.at(i)->GetOrientation()); } meanOrientation = mitk::QuaternionAveraging::CalcAverage(allOrientations); this->m_Controls.m_ResultOfCalibrationOrientation->setText( QString("qx: ") + QString(QString::number(meanOrientation.x(), 103, 3)) + QString("; qy: ") + (QString::number(meanOrientation.y(), 103, 3)) + QString("; qz: ") + (QString::number(meanOrientation.z(), 103, 3)) + QString("; qr: ") + (QString::number(meanOrientation.r(), 103, 3))); ToolTipTransform->SetOrientation(meanOrientation); } MITK_INFO << "Computed calibration: "; MITK_INFO << "Translation Vector: " << ToolTipTransform->GetPosition(); MITK_INFO << "Quaternion: (" << ToolTipTransform->GetOrientation() << ")"; MITK_INFO << "Euler Angles [rad]: (" << ToolTipTransform->GetOrientation().rotation_euler_angles() << ")"; MITK_INFO << "Matrix:"; vnl_matrix_fixed<double, 3, 3> rotMatrix = ToolTipTransform->GetOrientation().rotation_matrix_transpose(); MITK_INFO << rotMatrix[0][0] << " " << rotMatrix[0][1] << " " << rotMatrix[0][2] << std::endl; MITK_INFO << rotMatrix[1][0] << " " << rotMatrix[1][1] << " " << rotMatrix[1][2] << std::endl; MITK_INFO << rotMatrix[2][0] << " " << rotMatrix[2][1] << " " << rotMatrix[2][2] << std::endl; //3: write everything into the final tool tip transform and save it as member (it will be written to the tool later on) mitk::NavigationData::Pointer ToolTipInTrackingCoordinates = mitk::NavigationData::New(); ToolTipInTrackingCoordinates->Compose(ToolTipTransform); ToolTipInTrackingCoordinates->Compose(m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate)); ShowToolTipPreview(ToolTipInTrackingCoordinates); m_Controls.m_SetNewToolTipPosButton->setEnabled(true); m_ComputedToolTipTransformation = ToolTipTransform; } void IGTNavigationToolCalibration::OnLoginSingleRefToolNavigationDataClicked() { if (!CheckInitialization()) { return; } m_OnLoginSingleRefToolNavigationDataClicked = true; m_Controls.m_CollectNavigationDataButton->setEnabled(false); m_NumberOfNavigationData = m_Controls.m_NumberOfNavigationDataToCollect->value(); MITK_INFO << "Collecting " << m_NumberOfNavigationData << " NavigationData ... " << endl; } void IGTNavigationToolCalibration::LoginSingleRefToolNavigationData() { if (!CheckInitialization()) { return; } if (m_NumberOfNavigationDataCounter < m_NumberOfNavigationData) { //update label text QString labelText = "Collecting Data: " + QString::number(m_NumberOfNavigationDataCounter); m_Controls.m_CollectionStatus->setText(labelText); mitk::NavigationData::Pointer referenceTool = m_NavigationDataSourceOfCalibrationPointer->GetOutput(m_IDCalibrationPointer); mitk::NavigationData::Pointer toolToCalibrate = m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate); //compute difference: // differenceND = toolToCalibrate^-1 * referenceTool mitk::NavigationData::Pointer differenceND = mitk::NavigationData::New(); differenceND->Compose(referenceTool); differenceND->Compose(toolToCalibrate->GetInverse()); //inverse mode... if (m_Controls.m_InvertQuaternions->isChecked()) { // negate identity matrix to directly show parameters that will set up in NDI 6D Software Architect differenceND = differenceND->GetInverse(); } //save difference in member m_LoggedNavigationDataOffsets.push_back(differenceND->GetPosition()); m_LoggedNavigationDataDifferences.push_back(differenceND); m_NumberOfNavigationDataCounter++; } if (m_NumberOfNavigationDataCounter == m_NumberOfNavigationData) { m_NumberOfNavigationDataCounter = 0; m_OnLoginSingleRefToolNavigationDataClicked = false; m_Controls.m_CollectNavigationDataButton->setEnabled(true); m_Controls.m_RunCalibrationButton->setEnabled(true); MITK_INFO << "Collecting " << m_NumberOfNavigationData << " NavigationData ... Finished" << endl; QString labelText = "Collected " + QString::number(m_NumberOfNavigationData) + " data samples!"; m_Controls.m_CollectionStatus->setText(labelText); } } void IGTNavigationToolCalibration::OnSetNewToolTipPosButtonClicked() { ApplyToolTipTransform(m_ComputedToolTipTransformation); RemoveToolTipPreview(); } void IGTNavigationToolCalibration::ClearOldPivot() { mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(); this->ApplyToolTipTransform(tempND); UpdateManualToolTipCalibrationView(); - m_ManualToolTipEditWidget->hide(); + //m_ManualToolTipEditWidget->hide(); //TODO this->GetDataStorage()->Remove(m_ToolSurfaceInToolCoordinatesDataNode); } void IGTNavigationToolCalibration::OnAddPivotPose() { ClearOldPivot(); //When the collect Poses Button is Clicked m_OnAddPivotPoseClicked = true; m_NumberOfNavigationData = m_Controls.m_PosesToCollect->value(); } void IGTNavigationToolCalibration::AddPivotPose() { //Save the poses to be used in computation if (PivotCount < m_NumberOfNavigationData) { mitk::NavigationData::Pointer currentPose = mitk::NavigationData::New(); currentPose->Graft(m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_IDToolToCalibrate)); m_PivotPoses.push_back(currentPose); m_Controls.m_PoseNumber->setText(QString::number(m_PivotPoses.size())); PivotCount++; } if (PivotCount == m_NumberOfNavigationData) { m_OnAddPivotPoseClicked = false; } } void IGTNavigationToolCalibration::OnComputePivot() { mitk::PivotCalibration::Pointer myPivotCalibration = mitk::PivotCalibration::New(); for (int i = 0; i < this->m_PivotPoses.size(); i++) { myPivotCalibration->AddNavigationData(m_PivotPoses.at(i)); } QString resultString; if (myPivotCalibration->ComputePivotResult()) { mitk::NavigationData::Pointer markerTransformationTrackingCoordinates = m_PivotPoses.at(0); //Get computed pivot transfromation in tool coordinates mitk::NavigationData::Pointer ToolTipToTool = mitk::NavigationData::New(); ToolTipToTool->SetPosition(myPivotCalibration->GetResultPivotPoint()); ToolTipToTool->SetOrientation(myPivotCalibration->GetResultPivotRotation()); mitk::NavigationData::Pointer TrackerToTool = mitk::NavigationData::New(); TrackerToTool->SetOrientation(markerTransformationTrackingCoordinates->GetOrientation()); TrackerToTool->SetPosition(markerTransformationTrackingCoordinates->GetPosition()); TrackerToTool->Compose(ToolTipToTool); // Compute pivot point in relation to marker transformation for preview mitk::NavigationData::Pointer ToolTipToTracker = mitk::NavigationData::New(); ToolTipToTracker->Compose(ToolTipToTool); ToolTipToTracker->Compose(markerTransformationTrackingCoordinates); //add the preview node to the data storage ShowToolTipPreview(ToolTipToTracker); //parse result string resultString = QString("Pivot computation succeeded!\n") + QString("RMS Error: ") + QString::number(myPivotCalibration->GetResultRMSError()) + QString("\n") + QString("Pivot Point: ") + QString::number(myPivotCalibration->GetResultPivotPoint()[0]) + ";" + QString::number(myPivotCalibration->GetResultPivotPoint()[1]) + ";" + QString::number(myPivotCalibration->GetResultPivotPoint()[2]) + QString("\n") + QString("Pivot Rotation: ") + QString::number(myPivotCalibration->GetResultPivotRotation()[0]) + ";" + QString::number(myPivotCalibration->GetResultPivotRotation()[1]) + ";" + QString::number(myPivotCalibration->GetResultPivotRotation()[2]) + ";" + QString::number(myPivotCalibration->GetResultPivotRotation()[3]) + QString("\n"); //finally: save results to member variable m_ComputedToolTipTransformation = ToolTipToTool; //enable button to use the computed point with the tool m_Controls.m_UseComputedPivotPoint->setEnabled(true); } else { resultString = "Pivot computation failed!"; } MITK_INFO << resultString.toStdString().c_str(); m_Controls.m_ResultText->setText(resultString); } void IGTNavigationToolCalibration::UpdatePivotCount() { PivotCount = 0; while (!m_PivotPoses.empty()) { m_PivotPoses.pop_back(); } m_Controls.m_PoseNumber->setText(QString::number(PivotCount)); } void IGTNavigationToolCalibration::OnUseComputedPivotPoint() { RemoveToolTipPreview(); QString resultString = QString("Pivoted tool tip transformation was written to the tool ") + m_ToolToCalibrate->GetToolName().c_str(); ApplyToolTipTransform(m_ComputedToolTipTransformation, resultString.toStdString()); m_Controls.m_ResultText->setText(resultString); UpdatePivotCount(); } void IGTNavigationToolCalibration::ApplyToolTipTransform(mitk::NavigationData::Pointer ToolTipTransformInToolCoordinates, std::string message) { if (!CheckInitialization(false)) { return; } //Update tool in tool storage m_ToolToCalibrate->SetToolTipPosition(ToolTipTransformInToolCoordinates->GetPosition()); m_ToolToCalibrate->SetToolTipOrientation(ToolTipTransformInToolCoordinates->GetOrientation()); //And also update tracking device, so the transform is directly used mitk::TrackingDeviceSource::Pointer trackingDeviceSource; try { trackingDeviceSource = dynamic_cast<mitk::TrackingDeviceSource*>(m_NavigationDataSourceOfToolToCalibrate.GetPointer()); mitk::TrackingTool::Pointer TrackingToolToCalibrate = trackingDeviceSource->GetTrackingDevice()->GetTool(m_IDToolToCalibrate); TrackingToolToCalibrate->SetToolTip(ToolTipTransformInToolCoordinates->GetPosition(), ToolTipTransformInToolCoordinates->GetOrientation()); } catch (std::exception& e) { MITK_ERROR << "Error while trying to set the tool tip to the running tracking device. Aborting! (" << e.what() << ")"; } MITK_INFO << message; } void IGTNavigationToolCalibration::ShowToolTipPreview(mitk::NavigationData::Pointer ToolTipInTrackingCoordinates) { mitk::DataNode::Pointer m_ToolTipPointPreview = mitk::DataNode::New(); m_ToolTipPointPreview->SetName("Modified Tool Tip Preview"); mitk::Color blue; blue.SetBlue(1); m_ToolTipPointPreview->SetColor(blue); mitk::Surface::Pointer mySphere = mitk::Surface::New(); vtkSphereSource *vtkData = vtkSphereSource::New(); vtkData->SetRadius(3.0f); vtkData->SetCenter(0.0, 0.0, 0.0); vtkData->Update(); mySphere->SetVtkPolyData(vtkData->GetOutput()); vtkData->Delete(); m_ToolTipPointPreview->SetData(mySphere); m_ToolTipPointPreview->GetData()->GetGeometry()->SetIndexToWorldTransform(ToolTipInTrackingCoordinates->GetAffineTransform3D()); this->GetDataStorage()->Add(m_ToolTipPointPreview); } void IGTNavigationToolCalibration::RemoveToolTipPreview() { this->GetDataStorage()->Remove(m_ToolTipPointPreview.GetPointer()); } void IGTNavigationToolCalibration::UpdateManualToolTipCalibrationView() { if (m_ToolToCalibrate.IsNull()) { return; } //parse human readable transformation data and display it std::stringstream translation; std::stringstream orientation; translation << m_ToolToCalibrate->GetToolTipPosition(); orientation << "Quaternion: (" << m_ToolToCalibrate->GetToolTipOrientation() << ")" << std::endl; orientation << std::endl; orientation << "Euler Angles [rad]: (" << m_ToolToCalibrate->GetToolTipOrientation().rotation_euler_angles() << ")" << std::endl; orientation << std::endl; orientation << "Matrix:" << std::endl; vnl_matrix_fixed<double, 3, 3> rotMatrix = m_ToolToCalibrate->GetToolTipOrientation().rotation_matrix_transpose(); orientation << rotMatrix[0][0] << " " << rotMatrix[0][1] << " " << rotMatrix[0][2] << std::endl; orientation << rotMatrix[1][0] << " " << rotMatrix[1][1] << " " << rotMatrix[1][2] << std::endl; orientation << rotMatrix[2][0] << " " << rotMatrix[2][1] << " " << rotMatrix[2][2] << std::endl; m_Controls.m_ManualCurrentTranslation->setText(translation.str().c_str()); m_Controls.m_ManualCurrentOrientation->setPlainText(orientation.str().c_str()); } void IGTNavigationToolCalibration::OnStartManualToolTipCalibration() { if (!CheckInitialization(false)) { return; } - m_ManualToolTipEditWidget->SetToolTipSurface(false, m_ToolToCalibrate->GetDataNode()); - m_ManualToolTipEditWidget->show(); - m_ManualToolTipEditWidget->SetDefaultTooltip(m_ToolToCalibrate->GetToolTipTransform()); - m_ManualToolTipEditWidget->ReInitialize(); -} -void IGTNavigationToolCalibration::OnRetrieveDataForManualTooltipManipulation() -{ - this->GetDataStorage()->Add(m_ToolSurfaceInToolCoordinatesDataNode); - m_ManualToolTipEditWidget->SetToolTipSurface(false, m_ToolSurfaceInToolCoordinatesDataNode); + m_ToolTransformationWidget->SetToolToEdit(m_ToolToCalibrate); + m_ToolTransformationWidget->SetDefaultOffset(m_ToolToCalibrate->GetToolTipPosition()); + m_ToolTransformationWidget->SetDefaultRotation(m_ToolToCalibrate->GetToolTipOrientation()); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(m_ToolTransformationWidget); + m_ToolEditDialog.setLayout(mainLayout); + m_ToolEditDialog.setWindowTitle("Edit Tool Tip and Tool Orientation"); + m_ToolEditDialog.setProperty("minimumSizeHint", m_ToolTransformationWidget->size()); + m_ToolEditDialog.open(); } -void IGTNavigationToolCalibration::OnProcessManualTooltipEditDialogCloseRequest() +void IGTNavigationToolCalibration::OnManualEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip) { - mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(m_ManualToolTipEditWidget->GetManipulatedToolTip()); - this->ApplyToolTipTransform(tempND); + //This function is called, when the toolTipEdit view is closed. + m_ToolEditDialog.close(); + + //if user pressed cancle, nullptr is returned. Do nothing. Else, set values. + if (toolTip) + { + mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(toolTip);//Convert to Navigation data for simple transversion to quaternion + QString resultString = QString("Manual edited values are written to ") + m_ToolToCalibrate->GetToolName().c_str(); + ApplyToolTipTransform(tempND, resultString.toStdString()); + m_Controls.m_ResultText->setText(resultString); + } + UpdateManualToolTipCalibrationView(); - m_ManualToolTipEditWidget->hide(); - this->GetDataStorage()->Remove(m_ToolSurfaceInToolCoordinatesDataNode); } void IGTNavigationToolCalibration::OnGetPositions() { - //tool tip from tool to be calibrated - mitk::NavigationData::Pointer StartTool = mitk::NavigationData::New(); - StartTool->Graft(m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_IDToolToCalibrate)); - double startX = StartTool->GetPosition().GetVnlVector()[0]; - double startY = StartTool->GetPosition().GetVnlVector()[1]; - double startZ = StartTool->GetPosition().GetVnlVector()[2]; - m_StartToolPosition.SetElement(0, startX); - m_StartToolPosition.SetElement(1, startY); - m_StartToolPosition.SetElement(2, startZ); - - //tool end from calibration tool - mitk::NavigationData::Pointer EndTool = mitk::NavigationData::New(); - EndTool->Graft(m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_IDCalibrationPointer)); - double endX = EndTool->GetPosition().GetVnlVector()[0]; - double endY = EndTool->GetPosition().GetVnlVector()[1]; - double endZ = EndTool->GetPosition().GetVnlVector()[2]; - m_EndToolPosition.SetElement(0, endX); - m_EndToolPosition.SetElement(1, endY); - m_EndToolPosition.SetElement(2, endZ); - - mitk::NavigationData::Pointer trackingToToolTransform = m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_IDToolToCalibrate)->GetInverse(); - mitk::Vector3D trackingToToolPos; - trackingToToolPos.SetElement(0, trackingToToolTransform->GetPosition()[0]); - trackingToToolPos.SetElement(1, trackingToToolTransform->GetPosition()[1]); - trackingToToolPos.SetElement(2, trackingToToolTransform->GetPosition()[2]); - - mitk::Vector3D startPosToolCoordinates = trackingToToolTransform->GetRotationMatrix() * (m_StartToolPosition)+trackingToToolPos; - mitk::Vector3D endPosToolCoordinates = trackingToToolTransform->GetRotationMatrix() * (m_EndToolPosition)+trackingToToolPos; - m_CalibratedToolAxis.SetElement(0, (-1 * endPosToolCoordinates[0] + startPosToolCoordinates[0])); - m_CalibratedToolAxis.SetElement(1, (-1 * endPosToolCoordinates[1] + startPosToolCoordinates[1])); - m_CalibratedToolAxis.SetElement(2, (-1 * endPosToolCoordinates[2] + startPosToolCoordinates[2])); - m_CalibratedToolAxis.Normalize(); + if (!CheckInitialization(true)) { return; } + + //Navigation Data from Tool which should be calibrated + if (!m_AxisCalibration_ToolToCalibrate) + m_AxisCalibration_ToolToCalibrate = mitk::NavigationData::New(); + m_AxisCalibration_ToolToCalibrate->Graft(m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_IDToolToCalibrate)); + + //Navigation Data from calibration pointer tool + if (!m_AxisCalibration_NavDataCalibratingTool) + m_AxisCalibration_NavDataCalibratingTool = mitk::NavigationData::New(); + m_AxisCalibration_NavDataCalibratingTool->Graft(m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_IDCalibrationPointer)); + + MITK_DEBUG << "Positions for tool axis calibration:"; + MITK_DEBUG << " ToolTip: " << m_AxisCalibration_ToolToCalibrate->GetPosition() << ","; + MITK_DEBUG << " Rotation: \n" << m_AxisCalibration_ToolToCalibrate->GetRotationMatrix(); + MITK_DEBUG << " End of the tool: " << m_AxisCalibration_NavDataCalibratingTool->GetPosition(); + + QString _label = "Position recorded: " + QString::number(m_AxisCalibration_NavDataCalibratingTool->GetPosition()[0], 'f', 1) + ", " + + QString::number(m_AxisCalibration_NavDataCalibratingTool->GetPosition()[1], 'f', 1) + ", " + + QString::number(m_AxisCalibration_NavDataCalibratingTool->GetPosition()[2], 'f', 1); + m_Controls.m_ToolAxisPositionLabel->setText(_label); } void IGTNavigationToolCalibration::OnCalibrateToolAxis() { - QString xString = QString::number(m_CalibratedToolAxis.GetElement(0),'g',3); - QString yString = QString::number(m_CalibratedToolAxis.GetElement(1), 'g', 3); - QString zString = QString::number(m_CalibratedToolAxis.GetElement(2),'g',3); + if (!m_AxisCalibration_ToolToCalibrate || !m_AxisCalibration_NavDataCalibratingTool) + { + MITK_ERROR << "Please record position first."; + return; + } - QString calibratedToolAxisString = xString + ", " + yString + ", " + zString; - m_Controls.m_ToolAxis->setText(calibratedToolAxisString); - MITK_INFO << m_CalibratedToolAxis; + //Calculate the tool tip + //here is an explanation, what is happening here: + /* + The axis is equal to the (tool tip) minus the (end of the tool) in tool coordinates of the tool which should be calibrated. + The tool tip in tool coordinates is zero (definition of the tip). + The end of the tool is recorded by the calibration pointer's position and is transformed using the inverse of the tool which should be calibrated. + Normalize it. + */ + m_CalibratedToolAxis = -m_AxisCalibration_ToolToCalibrate->GetInverse()->TransformPoint(m_AxisCalibration_NavDataCalibratingTool->GetPosition()).GetVectorFromOrigin(); + MITK_DEBUG << "Tool Endpoint in Tool coordinates: " << m_CalibratedToolAxis; + m_CalibratedToolAxis.Normalize(); + MITK_DEBUG << "Tool Axis: " << m_CalibratedToolAxis; m_ToolToCalibrate->SetToolAxis(m_CalibratedToolAxis); + + //Update GUI + QString calibratedToolAxisString = "Tool Axis: " + QString::number(m_CalibratedToolAxis.GetElement(0), 'f', 3) + ", " + + QString::number(m_CalibratedToolAxis.GetElement(1), 'f', 3) + ", " + QString::number(m_CalibratedToolAxis.GetElement(2), 'f', 3); + m_Controls.m_ToolAxisCalibrationLabel->setText(calibratedToolAxisString); + + //Block QT signals, we don't want to emit SpinboxChanged on the first value to overwrite the next ones + m_Controls.m_ToolAxis_X->blockSignals(true); m_Controls.m_ToolAxis_Y->blockSignals(true); m_Controls.m_ToolAxis_Z->blockSignals(true); + m_Controls.m_ToolAxis_X->setValue(m_CalibratedToolAxis[0]); + m_Controls.m_ToolAxis_Y->setValue(m_CalibratedToolAxis[1]); + m_Controls.m_ToolAxis_Z->setValue(m_CalibratedToolAxis[2]); + m_Controls.m_ToolAxis_X->blockSignals(false); m_Controls.m_ToolAxis_Y->blockSignals(false); m_Controls.m_ToolAxis_Z->blockSignals(false); +} + +void IGTNavigationToolCalibration::OnToolAxisSpinboxChanged() +{ + m_CalibratedToolAxis.SetElement(0, m_Controls.m_ToolAxis_X->value()); + m_CalibratedToolAxis.SetElement(1, m_Controls.m_ToolAxis_Y->value()); + m_CalibratedToolAxis.SetElement(2, m_Controls.m_ToolAxis_Z->value()); + m_ToolToCalibrate->SetToolAxis(m_CalibratedToolAxis); + MITK_INFO << "Tool axis changed to " << m_CalibratedToolAxis; } void IGTNavigationToolCalibration::SetToolToCalibrate() { m_IDToolToCalibrate = m_Controls.m_SelectionWidget->GetSelectedToolID(); - m_ToolToCalibrate = m_Controls.m_SelectionWidget->GetSelectedNavigationTool(); if (m_IDToolToCalibrate == -1) //no valid tool to calibrate { m_Controls.m_CalToolLabel->setText("<none>"); m_Controls.m_StatusWidgetToolToCalibrate->RemoveStatusLabels(); m_TrackingTimer->stop(); } else { + m_ToolToCalibrate = m_Controls.m_SelectionWidget->GetSelectedNavigationTool(); m_NavigationDataSourceOfToolToCalibrate = m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource(); m_Controls.m_CalToolLabel->setText(m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate)->GetName()); //initialize widget m_Controls.m_StatusWidgetToolToCalibrate->RemoveStatusLabels(); m_Controls.m_StatusWidgetToolToCalibrate->SetShowPositions(true); m_Controls.m_StatusWidgetToolToCalibrate->SetTextAlignment(Qt::AlignLeft); m_Controls.m_StatusWidgetToolToCalibrate->AddNavigationData(m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate)); m_Controls.m_StatusWidgetToolToCalibrate->ShowStatusLabels(); //initialize manual tool tip calibration view UpdateManualToolTipCalibrationView(); //save tool surface in tool coordinates for further editing mitk::Surface::Pointer ToolSurface = dynamic_cast<mitk::Surface*>(m_ToolToCalibrate->GetDataNode()->GetData())->Clone(); m_ToolSurfaceInToolCoordinatesDataNode->SetData(ToolSurface); m_ToolSurfaceInToolCoordinatesDataNode->GetData()->GetGeometry()->SetIdentity(); + + //Set the default needle axis + m_CalibratedToolAxis = m_ToolToCalibrate->GetToolAxis().GetVectorFromOrigin(); + //Block QT signals, we don't want to emit SpinboxChanged on the first value to overwrite the next ones + m_Controls.m_ToolAxis_X->blockSignals(true); m_Controls.m_ToolAxis_Y->blockSignals(true); m_Controls.m_ToolAxis_Z->blockSignals(true); + m_Controls.m_ToolAxis_X->setValue(m_CalibratedToolAxis[0]); + m_Controls.m_ToolAxis_Y->setValue(m_CalibratedToolAxis[1]); + m_Controls.m_ToolAxis_Z->setValue(m_CalibratedToolAxis[2]); + m_Controls.m_ToolAxis_X->blockSignals(false); m_Controls.m_ToolAxis_Y->blockSignals(false); m_Controls.m_ToolAxis_Z->blockSignals(false); + + UpdateManualToolTipCalibrationView(); + //start updating timer for status widgets, etc. if (!m_TrackingTimer->isActive()) m_TrackingTimer->start(100); } } void IGTNavigationToolCalibration::SetCalibrationPointer() { m_IDCalibrationPointer = m_Controls.m_SelectionWidget->GetSelectedToolID(); - m_NavigationDataSourceOfCalibrationPointer = m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource(); if (m_IDCalibrationPointer == -1) { m_Controls.m_PointerLabel->setText("<none>"); m_Controls.m_StatusWidgetCalibrationPointer->RemoveStatusLabels(); m_TrackingTimer->stop(); } else { + m_NavigationDataSourceOfCalibrationPointer = m_Controls.m_SelectionWidget->GetSelectedNavigationDataSource(); m_Controls.m_PointerLabel->setText(m_NavigationDataSourceOfCalibrationPointer->GetOutput(m_IDCalibrationPointer)->GetName()); //initialize widget m_Controls.m_StatusWidgetCalibrationPointer->RemoveStatusLabels(); m_Controls.m_StatusWidgetCalibrationPointer->SetShowPositions(true); m_Controls.m_StatusWidgetCalibrationPointer->SetTextAlignment(Qt::AlignLeft); m_Controls.m_StatusWidgetCalibrationPointer->AddNavigationData(m_NavigationDataSourceOfCalibrationPointer->GetOutput(m_IDCalibrationPointer)); m_Controls.m_StatusWidgetCalibrationPointer->ShowStatusLabels(); if (!m_TrackingTimer->isActive()) m_TrackingTimer->start(100); } } void IGTNavigationToolCalibration::UpdateOffsetCoordinates() { if (m_NavigationDataSourceOfCalibrationPointer.IsNull() || m_NavigationDataSourceOfToolToCalibrate.IsNull()) { return; } mitk::NavigationData::Pointer referenceToolND = m_NavigationDataSourceOfCalibrationPointer->GetOutput(m_IDCalibrationPointer); mitk::NavigationData::Pointer toolToCalibrateND = m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate); if (referenceToolND->IsDataValid() && toolToCalibrateND->IsDataValid()) { //computation: difference between both tools (in tool coordinates) //differenceND = toolToCalibrateND^-1 * referenceToolND mitk::NavigationData::Pointer differenceND = mitk::NavigationData::New(); differenceND->Compose(referenceToolND); differenceND->Compose(toolToCalibrateND->GetInverse()); //display this orientation in the UI m_Controls.m_OffsetCoordinates->setText( QString("x: ") + QString(QString::number(differenceND->GetPosition()[0], 103, 3)) + QString("; y: ") + (QString::number(differenceND->GetPosition()[1], 103, 3)) + QString("; z: ") + (QString::number(differenceND->GetPosition()[2], 103, 3))); m_Controls.m_OrientationOffsetCoordinates->setText( QString("qx: ") + QString(QString::number(differenceND->GetOrientation().x(), 103, 3)) + QString("; qy: ") + (QString::number(differenceND->GetOrientation().y(), 103, 3)) + QString("; qz: ") + (QString::number(differenceND->GetOrientation().z(), 103, 3)) + QString("; qr: ") + (QString::number(differenceND->GetOrientation().r(), 103, 3))); //also update preview if active if (m_ToolTipPointPreview.IsNotNull()) //NOT WORKING! TODO: fix or remove! { mitk::NavigationData::Pointer ToolTipTransform = mitk::NavigationData::New(); ToolTipTransform->SetPosition(m_ResultOffsetVector); mitk::NavigationData::Pointer ToolTipInTrackingCoordinates = mitk::NavigationData::New(); //maybe store as for better peformance... ToolTipInTrackingCoordinates->Compose(m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate)); ToolTipInTrackingCoordinates->Compose(ToolTipTransform); m_ToolTipPointPreview->GetData()->GetGeometry()->SetIndexToWorldTransform(ToolTipInTrackingCoordinates->GetAffineTransform3D()); } } } void IGTNavigationToolCalibration::UpdateTrackingTimer() { m_Controls.m_StatusWidgetToolToCalibrate->Refresh(); m_Controls.m_StatusWidgetCalibrationPointer->Refresh(); if (m_OnLoginSingleRefToolNavigationDataClicked) LoginSingleRefToolNavigationData(); if (m_OnAddPivotPoseClicked) AddPivotPose(); // 1 == Single Reference Calibration Method if (m_IndexCurrentCalibrationMethod == 1) UpdateOffsetCoordinates(); } void IGTNavigationToolCalibration::AddLandmark() { if (!CheckInitialization()) { return; } mitk::NavigationData::Pointer navDataTool = m_NavigationDataSourceOfToolToCalibrate->GetOutput(m_IDToolToCalibrate); mitk::Point3D landmark = m_NavigationDataSourceOfCalibrationPointer->GetOutput(m_IDCalibrationPointer)->GetPosition(); //convert to itk transform itk::Vector<double, 3> translation; for (int k = 0; k < 3; k++) translation[k] = navDataTool->GetPosition()[k]; itk::Matrix<double, 3, 3> rotation; for (int k = 0; k < 3; k++) for (int l = 0; l < 3; l++) rotation[k][l] = navDataTool->GetOrientation().rotation_matrix_transpose()[k][l]; rotation = rotation.GetTranspose(); itk::Vector<double> landmarkItk; landmarkItk[0] = landmark[0]; landmarkItk[1] = landmark[1]; landmarkItk[2] = landmark[2]; //compute landmark in tool coordinates itk::Matrix<double, 3, 3> rotationInverse; for (int k = 0; k < 3; k++) for (int l = 0; l < 3; l++) rotationInverse[k][l] = rotation.GetInverse()[k][l]; landmarkItk = rotationInverse * (landmarkItk - translation); //convert back and add landmark to pointset landmark[0] = landmarkItk[0]; landmark[1] = landmarkItk[1]; landmark[2] = landmarkItk[2]; m_RegistrationLandmarks->InsertPoint(m_RegistrationLandmarks->GetSize(), landmark); } void IGTNavigationToolCalibration::SaveCalibratedTool() { if (m_ToolToCalibrate.IsNotNull()) { mitk::NavigationTool::Pointer calibratedTool = m_ToolToCalibrate; calibratedTool->SetToolCalibrationLandmarks(this->m_CalibrationLandmarks); calibratedTool->SetToolRegistrationLandmarks(this->m_RegistrationLandmarks); mitk::NavigationToolWriter::Pointer myWriter = mitk::NavigationToolWriter::New(); std::string filename = QFileDialog::getSaveFileName(NULL, tr("Save Navigation Tool"), "/", "*.IGTTool").toUtf8().data(); filename.append(".IGTTool"); if (filename == "") return; if (myWriter->DoWrite(filename, calibratedTool)) MITK_INFO << "Saved calibrated tool to file " << filename; else MITK_WARN << "Can't write tool to file " << filename; } else { MITK_ERROR << "Did not find navigation tool storage of calibrated tool, aborting!"; } } bool IGTNavigationToolCalibration::CheckInitialization(bool CalibrationPointerRequired) { if ((m_IDToolToCalibrate == -1) || ((CalibrationPointerRequired) && (m_IDCalibrationPointer == -1) ) ) { QMessageBox msgBox; msgBox.setText("Tool to calibrate and/or calibration pointer not initialized, cannot proceed!"); msgBox.exec(); return false; } else { return true; } } diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.h b/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.h index 90ddce2f52..973f36e244 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.h +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibration.h @@ -1,141 +1,145 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef IGTNavigationToolCalibration_h #define IGTNavigationToolCalibration_h #include <berryISelectionListener.h> #include <QmitkAbstractView.h> #include <mitkNavigationData.h> -#include <QmitkNavigationToolCreationAdvancedWidget.h> + +#include "QmitkInteractiveTransformationWidget.h" + +#include <QDialog> #include "ui_IGTNavigationToolCalibrationControls.h" #include <mitkNavigationDataRecorder.h> //QT headers #include <QTimer> /*! \brief IGTNavigationToolCalibration \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \ingroup ${plugin_target}_internal */ class IGTNavigationToolCalibration : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: IGTNavigationToolCalibration(); virtual ~IGTNavigationToolCalibration(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent); protected slots: void OnAddPivotPose(); void OnComputePivot(); void OnUseComputedPivotPoint(); void SetToolToCalibrate(); void SetCalibrationPointer(); void UpdateTrackingTimer(); void AddLandmark(); void SaveCalibratedTool(); void OnToolCalibrationMethodChanged(int index); void OnStartManualToolTipCalibration(); - void OnRetrieveDataForManualTooltipManipulation(); - void OnProcessManualTooltipEditDialogCloseRequest(); void OnRunSingleRefToolCalibrationClicked(); void OnLoginSingleRefToolNavigationDataClicked(); void OnSetNewToolTipPosButtonClicked(); void OnGetPositions(); void OnCalibrateToolAxis(); + void OnToolAxisSpinboxChanged(); + void OnManualEditToolTipFinished(mitk::AffineTransform3D::Pointer toolTip); protected: virtual void SetFocus(); void UpdateOffsetCoordinates(); int m_IndexCurrentCalibrationMethod; Ui::IGTNavigationToolCalibrationControls m_Controls; //some general members mitk::NavigationTool::Pointer m_ToolToCalibrate; //<<< tool that will be calibrated int m_IDToolToCalibrate; //<<< id of tool that will be calibrated (of the navigation data source) mitk::NavigationDataSource::Pointer m_NavigationDataSourceOfToolToCalibrate; //<<< navigation data source of the tool that will be calibrated mitk::NavigationDataSource::Pointer m_NavigationDataSourceOfCalibrationPointer; //<<< navigation data source of the calibration pointer mitk::DataNode::Pointer m_ToolSurfaceInToolCoordinatesDataNode; //<<< holds the tool surface in tool coordinates (for preview purposes) int m_IDCalibrationPointer; //<<< id of the calibration pointer (of the corresponding navigation data source) QTimer* m_TrackingTimer; //<<< tracking timer that updates the status widgets void ApplyToolTipTransform(mitk::NavigationData::Pointer ToolTipTransformInToolCoordinates, std::string message = "Tool was updated with the calibrated tool tip!"); //<<< applys the given tool tip transform to the tool to calibrate bool CheckInitialization(bool CalibrationPointerRequired = true); //<<< checks if the tool to calibrate and (if required) the calibration pointer is initialized. Displays a warning and returns false if not. mitk::NavigationData::Pointer m_ComputedToolTipTransformation; //<<< holds the new tooltip transformation after it was computed to write it into the tool later // members and helper methods for pivot tool calibration std::vector<mitk::NavigationData::Pointer> m_PivotPoses; void AddPivotPose(); void ClearOldPivot(); void UpdatePivotCount(); bool m_OnAddPivotPoseClicked; int PivotCount; // members and helper methods for manual tool calibration void UpdateManualToolTipCalibrationView(); - QmitkNavigationToolCreationAdvancedWidget* m_ManualToolTipEditWidget; + QDialog m_ToolEditDialog; + QmitkInteractiveTransformationWidget* m_ToolTransformationWidget; // members and helper methods for single reference tool calibration void LoginSingleRefToolNavigationData(); std::vector< mitk::Point3D > m_LoggedNavigationDataOffsets; std::vector< mitk::NavigationData::Pointer > m_LoggedNavigationDataDifferences; bool m_OnLoginSingleRefToolNavigationDataClicked; int m_NumberOfNavigationData; int m_NumberOfNavigationDataCounter; mitk::Point3D m_ResultOffsetVector; // members and helper methods for tool tip preview mitk::DataNode::Pointer m_ToolTipPointPreview; //<<< Data node of the tool tip preview void ShowToolTipPreview(mitk::NavigationData::Pointer ToolTipInTrackingCoordinates); //<<< Adds a preview of the tool tip into the data storage void RemoveToolTipPreview(); //<<< Removes the preview // members for the tool landmark calibration mitk::PointSet::Pointer m_CalibrationLandmarks; mitk::DataNode::Pointer m_CalibrationLandmarksNode; mitk::PointSet::Pointer m_RegistrationLandmarks; mitk::DataNode::Pointer m_RegistrationLandmarksNode; //members and helper methods for tool axis calibration mitk::Vector3D m_CalibratedToolAxis; - mitk::Vector3D m_EndToolPosition; - mitk::Vector3D m_StartToolPosition; + mitk::NavigationData::Pointer m_AxisCalibration_ToolToCalibrate; + mitk::NavigationData::Pointer m_AxisCalibration_NavDataCalibratingTool; }; #endif // IGTNavigationToolCalibration_h diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibrationControls.ui b/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibrationControls.ui index 8b9d44b573..20f1642f61 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibrationControls.ui +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/IGTNavigationToolCalibrationControls.ui @@ -1,1077 +1,1126 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>IGTNavigationToolCalibrationControls</class> <widget class="QWidget" name="IGTNavigationToolCalibrationControls"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>551</width> + <width>557</width> <height>958</height> </rect> </property> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="windowTitle"> <string>QmitkTemplate</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QLabel" name="label"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Navigation Tool Calibration</span></p></body></html></string> </property> </widget> </item> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Tool to calibrate</string> </property> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <widget class="QmitkToolTrackingStatusWidget" name="m_StatusWidgetToolToCalibrate" native="true"> <property name="minimumSize"> <size> <width>0</width> <height>50</height> </size> </property> <property name="maximumSize"> <size> <width>16777215</width> <height>50</height> </size> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Calibration pointer</string> </property> <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <widget class="QmitkToolTrackingStatusWidget" name="m_StatusWidgetCalibrationPointer" native="true"> <property name="minimumSize"> <size> <width>0</width> <height>30</height> </size> </property> + <zorder>tabWidget</zorder> </widget> </item> </layout> </widget> </item> <item> <widget class="QTabWidget" name="tabWidget"> <property name="enabled"> <bool>true</bool> </property> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> <string>Initialization</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; text-decoration: underline;">Choose Tracking Device and Tools</span></p></body></html></string> </property> </widget> </item> <item> <widget class="QmitkNavigationDataSourceSelectionWidget" name="m_SelectionWidget" native="true"/> </item> <item> <widget class="Line" name="line_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLabel" name="label_4"> <property name="minimumSize"> <size> <width>120</width> <height>0</height> </size> </property> <property name="text"> <string>Tool to Calibrate:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="m_CalToolLabel"> <property name="text"> <string><none></string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <spacer name="horizontalSpacer_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_SetToolToCalibrate"> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> <property name="text"> <string>Use as Tool to Calibrate</string> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_11"> <item> <widget class="QLabel" name="label_5"> <property name="minimumSize"> <size> <width>120</width> <height>0</height> </size> </property> <property name="text"> <string>Calibration Pointer:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="m_PointerLabel"> <property name="text"> <string><none></string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <spacer name="horizontalSpacer_10"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_SetPointer"> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> <property name="text"> <string> Use as Calibration Pointer</string> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line_7"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>586</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>Tool Tip Calibration</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_10"> <item> <layout class="QHBoxLayout" name="horizontalLayout_9"> <item> <widget class="QLabel" name="label_8"> <property name="font"> <font> <weight>50</weight> <bold>false</bold> </font> </property> <property name="text"> <string>Calibration Method:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_8"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QComboBox" name="m_CalibrationMethodComboBox"> <item> <property name="text"> <string>Manual</string> </property> </item> <item> <property name="text"> <string>Single Reference Tool</string> </property> </item> <item> <property name="text"> <string>Multiple Tools Reference</string> </property> </item> <item> <property name="text"> <string>Pivoting</string> </property> </item> </widget> </item> </layout> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QStackedWidget" name="m_CalibrationMethodsWidget"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="page_4"> <layout class="QVBoxLayout" name="verticalLayout_11"> <item> <widget class="QLabel" name="label_9"> <property name="text"> <string>Current Tool Tip Translation:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_ManualCurrentTranslation"> <property name="enabled"> <bool>true</bool> </property> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QLabel" name="label_10"> <property name="text"> <string>Current Tool Tip Orientation:</string> </property> </widget> </item> <item> <widget class="QPlainTextEdit" name="m_ManualCurrentOrientation"> <property name="enabled"> <bool>true</bool> </property> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_StartEditTooltipManually"> <property name="text"> <string>Start Edit Tooltip</string> </property> </widget> </item> </layout> </item> </layout> </widget> <widget class="QWidget" name="page_6"> <layout class="QVBoxLayout" name="verticalLayout_12"> <item> <widget class="QFrame" name="frameExample"> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>319</width> <height>160</height> </size> </property> <property name="maximumSize"> <size> <width>319</width> <height>160</height> </size> </property> <property name="styleSheet"> <string notr="true"> QFrame { border-image: url(:/IGTNavigationToolCalibration/Description.svg); } </string> </property> <property name="frameShape"> <enum>QFrame::Box</enum> </property> <property name="frameShadow"> <enum>QFrame::Plain</enum> </property> <property name="lineWidth"> <number>1</number> </property> </widget> </item> <item> <widget class="QLabel" name="label_12"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Current Offset between Tool to calibrate and Calibration pointer:</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_12"> <item> <widget class="QLabel" name="label_3"> <property name="text"> <string>Pos:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_OffsetCoordinates"> <property name="font"> <font> <pointsize>8</pointsize> </font> </property> <property name="text"> <string/> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_13"> <item> <widget class="QLabel" name="label_14"> <property name="text"> <string>Rot:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_OrientationOffsetCoordinates"> <property name="font"> <font> <pointsize>8</pointsize> </font> </property> <property name="text"> <string/> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_6"> <item> <widget class="QLabel" name="label_11"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Number of tracking data to collect:</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_NumberOfNavigationDataToCollect"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="maximum"> <number>10000</number> </property> <property name="value"> <number>100</number> </property> </widget> </item> </layout> </item> <item> <widget class="QLabel" name="m_CollectionStatus"> <property name="text"> <string/> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item> <widget class="QPushButton" name="m_CollectNavigationDataButton"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>1: Collect Navigation Data</string> </property> </widget> </item> <item> <widget class="Line" name="line_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_InvertQuaternions"> <property name="text"> <string>Invert calibration transformation</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_16"> <item> <widget class="QCheckBox" name="m_CalibratePosition"> <property name="text"> <string>Calibrate position</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_CalibrateOrientation"> <property name="text"> <string>Calibrate orientation</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> </layout> </item> <item> <widget class="QPushButton" name="m_RunCalibrationButton"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>2: Run Calibration</string> </property> </widget> </item> <item> <widget class="Line" name="line_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_13"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>New Tool Tip Position and/or Orientation of Tool to calibrate:</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_14"> <item> <widget class="QLabel" name="label_15"> <property name="text"> <string>Pos:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_ResultOfCalibration"> <property name="font"> <font> <pointsize>8</pointsize> </font> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_15"> <item> <widget class="QLabel" name="label_16"> <property name="text"> <string>Rot:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_ResultOfCalibrationOrientation"> <property name="font"> <font> <pointsize>8</pointsize> </font> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> </layout> </item> <item> <widget class="QPushButton" name="m_SetNewToolTipPosButton"> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>3: Set New Tool Tip Position and/or Tool Orientation</string> </property> </widget> </item> <item> <spacer name="verticalSpacer_4"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="page_5"/> <widget class="QWidget" name="page"> <layout class="QVBoxLayout" name="verticalLayout_9"> <item> <layout class="QHBoxLayout" name="horizontalLayout_17"> <item> <widget class="QLabel" name="label_17"> <property name="text"> <string>Number of pivot poses to collect:</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_PosesToCollect"> <property name="minimum"> <number>10</number> </property> <property name="maximum"> <number>1000</number> </property> <property name="value"> <number>100</number> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_7"> <item> <widget class="QLabel" name="label_7"> <property name="text"> <string>Number of saved poses:</string> </property> </widget> </item> <item> <widget class="QLabel" name="m_PoseNumber"> <property name="text"> <string>0</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_AddPivotPose"> <property name="text"> <string>Collect Pivot Poses</string> </property> </widget> </item> </layout> </item> <item> <widget class="QGroupBox" name="groupBox_5"> <property name="title"> <string>Calibration Result:</string> </property> <layout class="QVBoxLayout" name="verticalLayout_8"> <item> <widget class="QTextEdit" name="m_ResultText"/> </item> </layout> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_8"> <item> <spacer name="horizontalSpacer_7"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_ComputePivot"> <property name="minimumSize"> <size> <width>175</width> <height>0</height> </size> </property> <property name="text"> <string>Compute Pivot Point</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_10"> <item> <spacer name="horizontalSpacer_9"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_UseComputedPivotPoint"> <property name="enabled"> <bool>false</bool> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>175</width> <height>0</height> </size> </property> <property name="text"> <string>Use Computed Pivot Point</string> </property> </widget> </item> </layout> </item> <item> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>99</height> </size> </property> </spacer> </item> </layout> </widget> </widget> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Tool Landmark Calibration</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QLabel" name="label_6"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; text-decoration: underline;">Calibrate tool by marking the landmarks with the pointer</span></p></body></html></string> </property> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_3"> <property name="title"> <string>Registration Landmarks</string> </property> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> <widget class="QmitkPointListWidget" name="m_RegistrationLandmarkWidget" native="true"> <property name="minimumSize"> <size> <width>0</width> <height>170</height> </size> </property> </widget> </item> <item> <widget class="QPushButton" name="m_AddLandmark"> <property name="text"> <string>Add Pointer Position</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_4"> <property name="title"> <string>Calibration Landmarks</string> </property> <layout class="QVBoxLayout" name="verticalLayout_7"> <item> <widget class="QmitkPointListWidget" name="m_CalibrationLandmarkWidget" native="true"/> </item> </layout> </widget> </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>259</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="tab_4"> <attribute name="title"> <string>Tool Axis Calibration</string> </attribute> - <widget class="QLabel" name="label_18"> - <property name="geometry"> - <rect> - <x>30</x> - <y>30</y> - <width>341</width> - <height>16</height> - </rect> - </property> - <property name="text"> - <string>Calibrate tool axis with calibrated needle holder and already calibrated tip</string> - </property> - </widget> - <widget class="QPushButton" name="m_GetPositions"> - <property name="geometry"> - <rect> - <x>210</x> - <y>60</y> - <width>75</width> - <height>23</height> - </rect> - </property> - <property name="text"> - <string>Get Positions</string> - </property> - </widget> - <widget class="QLabel" name="label_20"> - <property name="geometry"> - <rect> - <x>30</x> - <y>60</y> - <width>171</width> - <height>21</height> - </rect> - </property> - <property name="text"> - <string>Select when sensor is at tools end</string> - </property> - </widget> - <widget class="QPushButton" name="m_CalibrateToolAxis"> - <property name="geometry"> - <rect> - <x>30</x> - <y>100</y> - <width>101</width> - <height>23</height> - </rect> - </property> - <property name="text"> - <string>Calibrate Tool Axis</string> - </property> - </widget> - <widget class="QLineEdit" name="m_ToolAxis"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="geometry"> - <rect> - <x>160</x> - <y>100</y> - <width>241</width> - <height>21</height> - </rect> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> + <layout class="QVBoxLayout" name="verticalLayout_13"> + <item> + <layout class="QGridLayout" name="gridLayout_2"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item row="1" column="1"> + <widget class="QLabel" name="m_ToolAxisPositionLabel"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_19"> + <property name="text"> + <string>Tool axis:</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QPushButton" name="m_GetPositions"> + <property name="text"> + <string>Get Positions</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QPushButton" name="m_CalibrateToolAxis"> + <property name="text"> + <string>Calibrate Tool Axis</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_19"> + <item> + <widget class="QDoubleSpinBox" name="m_ToolAxis_X"> + <property name="decimals"> + <number>4</number> + </property> + <property name="minimum"> + <double>-1000.000000000000000</double> + </property> + <property name="maximum"> + <double>1000.000000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="m_ToolAxis_Y"> + <property name="decimals"> + <number>4</number> + </property> + <property name="minimum"> + <double>-1000.000000000000000</double> + </property> + <property name="maximum"> + <double>1000.000000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="m_ToolAxis_Z"> + <property name="decimals"> + <number>4</number> + </property> + <property name="minimum"> + <double>-1000.000000000000000</double> + </property> + <property name="maximum"> + <double>1000.000000000000000</double> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="m_ToolAxisCalibrationLabel"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string>Calibrate the tool axis: +1. Make sure, tool tips of both tools are calibrated +2. Hold pointer at the end of the needle +3. Get Position +4. Calibrate tool axis + +Alternative: Manually edit the axis using the spinboxes.</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_5"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>497</height> + </size> + </property> + </spacer> + </item> + </layout> + <zorder>gridLayoutWidget_2</zorder> + <zorder>label_18</zorder> + <zorder>verticalSpacer_5</zorder> </widget> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_SaveCalibratedTool"> <property name="text"> <string>Save Calibrated Navigation Tool</string> </property> </widget> </item> </layout> </item> </layout> <zorder>tabWidget</zorder> <zorder>label</zorder> <zorder>groupBox</zorder> <zorder>groupBox_2</zorder> </widget> <layoutdefault spacing="6" margin="11"/> <customwidgets> <customwidget> - <class>QmitkNavigationDataSourceSelectionWidget</class> + <class>QmitkPointListWidget</class> <extends>QWidget</extends> - <header>QmitkNavigationDataSourceSelectionWidget.h</header> + <header>QmitkPointListWidget.h</header> <container>1</container> </customwidget> <customwidget> - <class>QmitkToolTrackingStatusWidget</class> + <class>QmitkNavigationDataSourceSelectionWidget</class> <extends>QWidget</extends> - <header>QmitkToolTrackingStatusWidget.h</header> + <header>QmitkNavigationDataSourceSelectionWidget.h</header> <container>1</container> </customwidget> <customwidget> - <class>QmitkPointListWidget</class> + <class>QmitkToolTrackingStatusWidget</class> <extends>QWidget</extends> - <header>QmitkPointListWidget.h</header> + <header>QmitkToolTrackingStatusWidget.h</header> <container>1</container> </customwidget> </customwidgets> <resources/> <connections/> </ui> diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkNavigationDataPlayerView.cpp b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkNavigationDataPlayerView.cpp index 27f1f46617..6d993d52ee 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkNavigationDataPlayerView.cpp +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkNavigationDataPlayerView.cpp @@ -1,241 +1,240 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Qmitk #include "QmitkNavigationDataPlayerView.h" // QT #include <QFileDialog> #include <QMessageBox> //mitk #include <mitkNavigationDataSet.h> #include <mitkNavigationDataReaderInterface.h> #include <mitkNavigationDataSequentialPlayer.h> #include <mitkNavigationDataPlayer.h> #include <mitkVirtualTrackingTool.h> #include <mitkIOUtil.h> // VTK #include <vtkSphereSource.h> const std::string QmitkNavigationDataPlayerView::VIEW_ID = "org.mitk.views.navigationdataplayer"; QmitkNavigationDataPlayerView::QmitkNavigationDataPlayerView() : m_Controls( 0 ) { } QmitkNavigationDataPlayerView::~QmitkNavigationDataPlayerView() { } void QmitkNavigationDataPlayerView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkNavigationDataPlayerViewControls; m_Controls->setupUi( parent ); this->CreateConnections(); // make deselected Player invisible m_Controls->m_TimedWidget->setVisible(false); } } void QmitkNavigationDataPlayerView::SetFocus() { if ( m_Controls ) { m_Controls->m_grpbxControls->setFocus(); } } void QmitkNavigationDataPlayerView::CreateConnections() { connect( m_Controls->m_RdbSequential, SIGNAL(released()), this, SLOT(OnSelectPlayer()) ); connect( m_Controls->m_RdbTimeBased, SIGNAL(released()), this, SLOT(OnSelectPlayer()) ); connect( m_Controls->m_BtnOpenFile, SIGNAL(released()), this, SLOT(OnOpenFile()) ); connect( m_Controls->m_ChkDisplay, SIGNAL(released()), this, SLOT(OnSetDisplay()) ); connect( m_Controls->m_chkRepeat, SIGNAL(stateChanged(int)), this, SLOT(OnSetRepeat(int)) ); connect( m_Controls->m_ChkMicroservice, SIGNAL(released()), this, SLOT(OnSetMicroservice()) ); connect( m_Controls->m_SequentialWidget, SIGNAL(SignalUpdate()), this, SLOT(OnUpdate()) ); connect( m_Controls->m_TimedWidget, SIGNAL(SignalUpdate()), this, SLOT(OnUpdate()) ); this->SetInteractionComponentsEnabledState(false); } void QmitkNavigationDataPlayerView::OnOpenFile() { mitk::NavigationDataReaderInterface::Pointer reader = NULL; QString filter = tr("NavigationData File (*.csv *.xml)"); QString fileName = QFileDialog::getOpenFileName(NULL, tr("Open NavigationData Set"), "", filter); if ( fileName.isNull() ) { return; } // user pressed cancel try { m_Data = dynamic_cast<mitk::NavigationDataSet*> (mitk::IOUtil::LoadBaseData(fileName.toStdString()).GetPointer()); } catch ( const mitk::Exception &e ) { MITK_WARN("NavigationDataPlayerView") << "could not open file " << fileName.toStdString(); QMessageBox::critical(0, "Error Reading File", "The file '" + fileName +"' could not be read.\n" + e.GetDescription() ); return; } if (m_Controls->m_ChkConvertToPointSet->isChecked()) m_Data->ConvertNavigationDataToPointSet(); // Update Labels m_Controls->m_LblFilePath->setText(fileName); m_Controls->m_LblFrames->setText(QString::number(m_Data->Size())); m_Controls->m_LblTools->setText(QString::number(m_Data->GetNumberOfTools())); // Initialize Widgets and create Player this->OnSelectPlayer(); this->SetInteractionComponentsEnabledState(true); } void QmitkNavigationDataPlayerView::OnSelectPlayer() { if (m_Controls->m_RdbSequential->isChecked()) { m_Controls->m_SequentialWidget->setVisible(true); m_Controls->m_TimedWidget->setVisible(false); mitk::NavigationDataSequentialPlayer::Pointer seqPlayer = mitk::NavigationDataSequentialPlayer::New(); seqPlayer->SetNavigationDataSet(m_Data); m_Controls->m_SequentialWidget->SetPlayer(seqPlayer); m_Player = seqPlayer; } else { m_Controls->m_SequentialWidget->setVisible(false); m_Controls->m_TimedWidget->setVisible(true); mitk::NavigationDataPlayer::Pointer timedPlayer = mitk::NavigationDataPlayer::New(); timedPlayer->SetNavigationDataSet(m_Data); m_Controls->m_TimedWidget->SetPlayer(timedPlayer); m_Player = timedPlayer; } this->ConfigurePlayer(); // SetupRenderingPipeline this->OnSetDisplay(); } void QmitkNavigationDataPlayerView::ConfigurePlayer() { // set repeat mode according to the checkbox m_Player->SetRepeat( m_Controls->m_chkRepeat->isChecked() ); } void QmitkNavigationDataPlayerView::OnSetRepeat(int checkState) { m_Player->SetRepeat(checkState != 0); } void QmitkNavigationDataPlayerView::OnSetMicroservice(){ if(m_Controls->m_ChkMicroservice->isChecked()) { m_ToolStorage = mitk::NavigationToolStorage::New(); for (itk::ProcessObject::DataObjectPointerArraySizeType i = 0; i < m_Player->GetNumberOfIndexedOutputs(); i++) { mitk::NavigationTool::Pointer currentDummyTool = mitk::NavigationTool::New(); mitk::VirtualTrackingTool::Pointer dummyTool = mitk::VirtualTrackingTool::New(); std::stringstream name; name << "Virtual Tool " << i; dummyTool->SetToolName(name.str()); - currentDummyTool->SetTrackingTool(dummyTool.GetPointer()); currentDummyTool->SetDataNode(m_RenderingNodes.at(i)); currentDummyTool->SetIdentifier(name.str()); m_ToolStorage->AddTool(currentDummyTool); } m_Player->RegisterAsMicroservice(); m_ToolStorage->SetName("NavigationDataPlayer Tool Storage"); m_ToolStorage->SetSourceID(m_Player->GetMicroserviceID()); m_ToolStorage->RegisterAsMicroservice(); } else { if (m_ToolStorage.IsNotNull()) m_ToolStorage->UnRegisterMicroservice(); m_ToolStorage = NULL; m_Player->UnRegisterMicroservice(); } } void QmitkNavigationDataPlayerView::OnUpdate(){ if (m_VisFilter.IsNotNull()) { m_VisFilter->Update(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkNavigationDataPlayerView::OnSetDisplay(){ DestroyPipeline(); if ( (m_Controls->m_ChkDisplay->isChecked()) && ( m_Player.IsNotNull() )) { CreatePipeline(); } } void QmitkNavigationDataPlayerView::CreatePipeline(){ m_VisFilter = mitk::NavigationDataObjectVisualizationFilter::New(); m_VisFilter->ConnectTo(m_Player); for (unsigned int i = 0 ; i < m_Player->GetNumberOfIndexedOutputs(); i++ ) { mitk::DataNode::Pointer node = mitk::DataNode::New(); QString name = "Recorded Tool " + QString::number(i + 1); node->SetName(name.toStdString()); //create small sphere and use it as surface mitk::Surface::Pointer mySphere = mitk::Surface::New(); vtkSphereSource *vtkData = vtkSphereSource::New(); vtkData->SetRadius(5.0f); vtkData->SetCenter(0.0, 0.0, 0.0); vtkData->Update(); mySphere->SetVtkPolyData(vtkData->GetOutput()); vtkData->Delete(); node->SetData(mySphere); m_VisFilter->SetRepresentationObject(i, mySphere); // Add Node to DataStorageand to local list of Nodes GetDataStorage()->Add(node); m_RenderingNodes.push_back(node); } m_VisFilter->Update(); mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(GetDataStorage()); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkNavigationDataPlayerView::DestroyPipeline(){ m_VisFilter = NULL; for (unsigned int i = 0; i < m_RenderingNodes.size(); i++){ this->GetDataStorage()->Remove(m_RenderingNodes[i]); } m_RenderingNodes.clear(); } void QmitkNavigationDataPlayerView::SetInteractionComponentsEnabledState(bool isActive){ m_Controls->m_grpbxSettings->setEnabled(isActive); m_Controls->m_grpbxControls->setEnabled(isActive); } \ No newline at end of file