diff --git a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/CMakeLists.txt b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/CMakeLists.txt index 0b4e7a4fac..56a7b399b3 100644 --- a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/CMakeLists.txt +++ b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/CMakeLists.txt @@ -1,7 +1,7 @@ project(org_mitk_gui_qt_matchpoint_evaluator) mitk_create_plugin( EXPORT_DIRECTIVE MITK_GUI_QT_MATCHPOINT_REGEVAL_EXPORT EXPORTED_INCLUDE_SUFFIXES src - MODULE_DEPENDS MitkQtWidgetsExt MitkMatchPointRegistration + MODULE_DEPENDS MitkQtWidgetsExt MitkMatchPointRegistration MitkMatchPointRegistrationUI ) diff --git a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.cpp b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.cpp index edf15e5b91..587c2023a3 100644 --- a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.cpp +++ b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.cpp @@ -1,456 +1,492 @@ /*=================================================================== 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. ===================================================================*/ // Blueberry #include #include // Mitk -#include #include +#include #include #include #include "mitkRegVisPropertyTags.h" +#include "mitkMatchPointPropertyTags.h" #include "mitkRegEvaluationObject.h" -#include "mitkRegEvalStyleProperty.h" -#include "mitkRegEvalWipeStyleProperty.h" +#include "mitkRegistrationHelper.h" +#include "mitkRegEvaluationMapper2D.h" +#include // Qmitk #include "QmitkRenderWindow.h" #include "QmitkMatchPointRegistrationEvaluator.h" // Qt #include #include #include ///********************************************** QmitkSliceChangedListener::QmitkSliceChangedListener(): m_renderWindowPart(NULL), m_PendingSliceChangedEvent(false), m_internalUpdateFlag(false) { } QmitkSliceChangedListener::~QmitkSliceChangedListener() { this->RemoveAllObservers(); }; void QmitkSliceChangedListener::OnSliceChangedDelayed() { m_PendingSliceChangedEvent = false; emit SliceChanged(); }; void QmitkSliceChangedListener::OnSliceChangedInternal(const itk::EventObject& e) { // Taken from QmitkStdMultiWidget::HandleCrosshairPositionEvent(). // Since there are always 3 events arriving (one for each render window) every time the slice // or time changes, the slot OnSliceChangedDelayed is triggered - and only if it hasn't been // triggered yet - so it is only executed once for every slice/time change. if (!m_PendingSliceChangedEvent) { m_PendingSliceChangedEvent = true; QTimer::singleShot(0, this, SLOT(OnSliceChangedDelayed())); } }; void QmitkSliceChangedListener::OnSliceNavigationControllerDeleted(const itk::Object* sender, const itk::EventObject& /*e*/) { const mitk::SliceNavigationController* sendingSlicer = dynamic_cast(sender); this->RemoveObservers(sendingSlicer); }; void QmitkSliceChangedListener::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { if (m_renderWindowPart != renderWindowPart) { m_renderWindowPart = renderWindowPart; if (!InitObservers()) { QMessageBox::information(NULL, "Error", "Unable to set up the event observers. The " \ "plot will not be triggered on changing the crosshair, " \ "position or time step."); } } }; void QmitkSliceChangedListener::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) { m_renderWindowPart = NULL; this->RemoveAllObservers(renderWindowPart); }; bool QmitkSliceChangedListener::InitObservers() { bool result = true; typedef QHash WindowMapType; WindowMapType windowMap = m_renderWindowPart->GetQmitkRenderWindows(); auto i = windowMap.begin(); while (i != windowMap.end()) { mitk::SliceNavigationController* sliceNavController = i.value()->GetSliceNavigationController(); if (sliceNavController) { itk::ReceptorMemberCommand::Pointer cmdSliceEvent = itk::ReceptorMemberCommand::New(); cmdSliceEvent->SetCallbackFunction(this, &QmitkSliceChangedListener::OnSliceChangedInternal); int tag = sliceNavController->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), cmdSliceEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, i.key().toStdString(), m_renderWindowPart))); itk::ReceptorMemberCommand::Pointer cmdTimeEvent = itk::ReceptorMemberCommand::New(); cmdTimeEvent->SetCallbackFunction(this, &QmitkSliceChangedListener::OnSliceChangedInternal); tag = sliceNavController->AddObserver( mitk::SliceNavigationController::GeometryTimeEvent(NULL, 0), cmdTimeEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, i.key().toStdString(), m_renderWindowPart))); itk::MemberCommand::Pointer cmdDelEvent = itk::MemberCommand::New(); cmdDelEvent->SetCallbackFunction(this, &QmitkSliceChangedListener::OnSliceNavigationControllerDeleted); tag = sliceNavController->AddObserver( itk::DeleteEvent(), cmdDelEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, i.key().toStdString(), m_renderWindowPart))); } ++i; result = result && sliceNavController; } return result; }; void QmitkSliceChangedListener::RemoveObservers(const mitk::SliceNavigationController* deletedSlicer) { std::pair < ObserverMapType::const_iterator, ObserverMapType::const_iterator> obsRange = m_ObserverMap.equal_range(deletedSlicer); for (ObserverMapType::const_iterator pos = obsRange.first; pos != obsRange.second; ++pos) { pos->second.controller->RemoveObserver(pos->second.observerTag); } m_ObserverMap.erase(deletedSlicer); }; void QmitkSliceChangedListener::RemoveAllObservers(mitk::IRenderWindowPart* deletedPart) { for (ObserverMapType::const_iterator pos = m_ObserverMap.begin(); pos != m_ObserverMap.end();) { ObserverMapType::const_iterator delPos = pos++; if (deletedPart == NULL || deletedPart == delPos->second.renderWindowPart) { delPos->second.controller->RemoveObserver(delPos->second.observerTag); m_ObserverMap.erase(delPos); } } }; QmitkSliceChangedListener::ObserverInfo::ObserverInfo(mitk::SliceNavigationController* controller, int observerTag, const std::string& renderWindowName, mitk::IRenderWindowPart* part) : controller(controller), observerTag(observerTag), renderWindowName(renderWindowName), renderWindowPart(part) { }; ///********************************************** const std::string QmitkMatchPointRegistrationEvaluator::VIEW_ID = "org.mitk.views.matchpoint.registration.evaluator"; QmitkMatchPointRegistrationEvaluator::QmitkMatchPointRegistrationEvaluator() - : m_Parent(NULL), m_internalBlendUpdate(false), m_currentSelectedTimeStep(0) + : m_Parent(NULL), m_activeEvaluation(false), m_autoMoving(false), m_autoTarget(false), m_currentSelectedTimeStep(0), HelperNodeName("RegistrationEvaluationHelper") { m_currentSelectedPosition.Fill(0.0); } +QmitkMatchPointRegistrationEvaluator::~QmitkMatchPointRegistrationEvaluator() +{ + if (this->m_selectedEvalNode.IsNotNull() && this->GetDataStorage().IsNotNull()) + { + this->GetDataStorage()->Remove(this->m_selectedEvalNode); + } +} + void QmitkMatchPointRegistrationEvaluator::SetFocus() { } void QmitkMatchPointRegistrationEvaluator::Error(QString msg) { mitk::StatusBar::GetInstance()->DisplayErrorText(msg.toLatin1()); MITK_ERROR << msg.toStdString().c_str(); } void QmitkMatchPointRegistrationEvaluator::CreateQtPartControl(QWidget* parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Parent = parent; - mitk::RegEvalStyleProperty::Pointer sampleProp = mitk::RegEvalStyleProperty::New(); - - for (unsigned int pos = 0; pos < sampleProp->Size(); ++pos) - { - this->m_Controls.comboStyle->insertItem(pos, - QString::fromStdString(sampleProp->GetEnumString(pos))); - } - - connect(m_Controls.comboStyle, SIGNAL(currentIndexChanged(int)), this, - SLOT(OnComboStyleChanged(int))); - - connect(m_Controls.pbBlend50, SIGNAL(clicked()), this, SLOT(OnBlend50Pushed())); - connect(m_Controls.pbBlendTarget, SIGNAL(clicked()), this, SLOT(OnBlendTargetPushed())); - connect(m_Controls.pbBlendMoving, SIGNAL(clicked()), this, SLOT(OnBlendMovingPushed())); - connect(m_Controls.pbBlendToggle, SIGNAL(clicked()), this, SLOT(OnBlendTogglePushed())); - connect(m_Controls.slideBlend, SIGNAL(valueChanged(int)), this, SLOT(OnSlideBlendChanged(int))); - connect(m_Controls.sbBlend, SIGNAL(valueChanged(int)), this, SLOT(OnSpinBlendChanged(int))); - - connect(m_Controls.sbChecker, SIGNAL(valueChanged(int)), this, SLOT(OnSpinCheckerChanged(int))); - - connect(m_Controls.radioWipeCross, SIGNAL(toggled(bool)), this, SLOT(OnWipeStyleChanged())); - connect(m_Controls.radioWipeH, SIGNAL(toggled(bool)), this, SLOT(OnWipeStyleChanged())); - connect(m_Controls.radioWipeV, SIGNAL(toggled(bool)), this, SLOT(OnWipeStyleChanged())); - - connect(m_Controls.radioTargetContour, SIGNAL(toggled(bool)), this, SLOT(OnContourStyleChanged())); + connect(m_Controls.pbEval, SIGNAL(clicked()), this, SLOT(OnEvalBtnPushed())); + connect(m_Controls.pbStop, SIGNAL(clicked()), this, SLOT(OnStopBtnPushed())); + connect(m_Controls.evalSettings, SIGNAL(SettingsChanged(mitk::DataNode*)), this, SLOT(OnSettingsChanged(mitk::DataNode*))); this->m_SliceChangeListener.RenderWindowPartActivated(this->GetRenderWindowPart()); connect(&m_SliceChangeListener, SIGNAL(SliceChanged()), this, SLOT(OnSliceChanged())); + m_selectedEvalNode = this->GetDataStorage()->GetNamedNode(HelperNodeName); + + this->CheckInputs(); this->ConfigureControls(); } void QmitkMatchPointRegistrationEvaluator::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { this->m_SliceChangeListener.RenderWindowPartActivated(renderWindowPart); } void QmitkMatchPointRegistrationEvaluator::RenderWindowPartDeactivated( mitk::IRenderWindowPart* renderWindowPart) { this->m_SliceChangeListener.RenderWindowPartDeactivated(renderWindowPart); } - -void QmitkMatchPointRegistrationEvaluator::OnSelectionChanged(berry::IWorkbenchPart::Pointer source, - const QList& nodes) +void QmitkMatchPointRegistrationEvaluator::CheckInputs() { - m_selectedEvalNode = NULL; + if (!m_activeEvaluation) + { + QList dataNodes = this->GetDataManagerSelection(); + this->m_autoMoving = false; + this->m_autoTarget = false; + this->m_spSelectedMovingNode = NULL; + this->m_spSelectedTargetNode = NULL; + this->m_spSelectedRegNode = NULL; + + if (dataNodes.size() > 0) + { + //test if auto select works + if (mitk::MITKRegistrationHelper::IsRegNode(dataNodes[0])) + { + this->m_spSelectedRegNode = dataNodes[0]; + dataNodes.pop_front(); + + mitk::BaseProperty* uidProp = m_spSelectedRegNode->GetProperty(mitk::nodeProp_RegAlgMovingData); + + if (uidProp) + { + //search for the moving node + mitk::NodePredicateProperty::Pointer predicate = mitk::NodePredicateProperty::New(mitk::nodeProp_UID, + uidProp); + this->m_spSelectedMovingNode = this->GetDataStorage()->GetNode(predicate); + this->m_autoMoving = this->m_spSelectedMovingNode.IsNotNull(); + } + + uidProp = m_spSelectedRegNode->GetProperty(mitk::nodeProp_RegAlgTargetData); + + if (uidProp) + { + //search for the target node + mitk::NodePredicateProperty::Pointer predicate = mitk::NodePredicateProperty::New(mitk::nodeProp_UID, + uidProp); + this->m_spSelectedTargetNode = this->GetDataStorage()->GetNode(predicate); + this->m_autoTarget = this->m_spSelectedTargetNode.IsNotNull(); + } + } - if (nodes.size() > 0) - { - mitk::RegEvaluationObject* evalObj = dynamic_cast(nodes[0]->GetData()); + //if still nodes are selected -> ignore possible auto select + if (!dataNodes.empty()) + { + mitk::Image* inputImage = dynamic_cast(dataNodes[0]->GetData()); + + if (inputImage) + { + this->m_spSelectedMovingNode = dataNodes[0]; + this->m_autoMoving = false; + dataNodes.pop_front(); + } + } - if (evalObj) - { - this->m_selectedEvalNode = nodes[0]; - m_selectedNodeTime.Modified(); - OnSliceChanged(); - } - } + if (!dataNodes.empty()) + { + mitk::Image* inputImage = dynamic_cast(dataNodes[0]->GetData()); + + if (inputImage) + { + this->m_spSelectedTargetNode = dataNodes[0]; + this->m_autoTarget = false; + dataNodes.pop_front(); + } + } + } + } +} - ConfigureControls(); + +void QmitkMatchPointRegistrationEvaluator::OnSelectionChanged(berry::IWorkbenchPart::Pointer source, + const QList& nodes) +{ + this->CheckInputs(); + this->ConfigureControls(); }; void QmitkMatchPointRegistrationEvaluator::ConfigureControls() { - this->m_Controls.comboStyle->setEnabled(this->m_selectedEvalNode.IsNotNull()); - this->m_Controls.labelNoSelect->setVisible(this->m_selectedEvalNode.IsNull()); - - if (this->m_selectedEvalNode.IsNotNull()) - { - mitk::RegEvalStyleProperty* evalProp = NULL; - - if (this->m_selectedEvalNode->GetProperty(evalProp, mitk::nodeProp_RegEvalStyle)) - { - OnComboStyleChanged(evalProp->GetValueAsId()); - this->m_Controls.comboStyle->setCurrentIndex(evalProp->GetValueAsId()); - } - else - { - this->Error(QString("Cannot configure plugin controlls correctly. Node property ") + QString( - mitk::nodeProp_RegEvalStyle) + QString(" has not the assumed type.")); - } - - int factor = 50; - this->m_selectedEvalNode->GetIntProperty(mitk::nodeProp_RegEvalBlendFactor, factor); - this->m_Controls.sbBlend->setValue(factor); - - int count = 3; - this->m_selectedEvalNode->GetIntProperty(mitk::nodeProp_RegEvalCheckerCount, count); - this->m_Controls.sbChecker->setValue(count); - - bool targetContour = true; - this->m_selectedEvalNode->GetBoolProperty(mitk::nodeProp_RegEvalTargetContour, targetContour); - this->m_Controls.radioTargetContour->setChecked(targetContour); - } - else - { - this->m_Controls.groupBlend->setVisible(false); - this->m_Controls.groupCheck->setVisible(false); - this->m_Controls.groupWipe->setVisible(false); - this->m_Controls.groupContour->setVisible(false); - } + //configure input data widgets + if (this->m_spSelectedRegNode.IsNull()) + { + if (this->m_spSelectedMovingNode.IsNotNull() && this->m_spSelectedTargetNode.IsNotNull()) + { + m_Controls.lbRegistrationName->setText( + QString("No registration selected! Direct comparison")); + } + else + { + m_Controls.lbRegistrationName->setText( + QString("No registration selected!")); + } + } + else + { + m_Controls.lbRegistrationName->setText(QString::fromStdString( + this->m_spSelectedRegNode->GetName())); + } + + if (this->m_spSelectedMovingNode.IsNull()) + { + m_Controls.lbMovingName->setText(QString("no moving image selected!")); + } + else + { + if (this->m_autoMoving) + { + m_Controls.lbMovingName->setText(QString("") + QString::fromStdString( + this->m_spSelectedMovingNode->GetName()) + QString(" (auto selected)")); + } + else + { + m_Controls.lbMovingName->setText(QString::fromStdString(this->m_spSelectedMovingNode->GetName())); + } + } + + if (this->m_spSelectedTargetNode.IsNull()) + { + m_Controls.lbTargetName->setText(QString("no target image selected!")); + } + else + { + if (this->m_autoTarget) + { + m_Controls.lbTargetName->setText(QString("") + QString::fromStdString( + this->m_spSelectedTargetNode->GetName()) + QString(" (auto selected)")); + } + else + { + m_Controls.lbTargetName->setText(QString::fromStdString(this->m_spSelectedTargetNode->GetName())); + } + } + + //config settings widget + this->m_Controls.evalSettings->setVisible(m_activeEvaluation); + this->m_Controls.pbEval->setEnabled(this->m_spSelectedMovingNode.IsNotNull() + && this->m_spSelectedTargetNode.IsNotNull()); + this->m_Controls.pbEval->setVisible(!m_activeEvaluation); + this->m_Controls.pbStop->setVisible(m_activeEvaluation); + this->m_Controls.lbMovingName->setEnabled(!m_activeEvaluation); + this->m_Controls.lbRegistrationName->setEnabled(!m_activeEvaluation); + this->m_Controls.lbTargetName->setEnabled(!m_activeEvaluation); } void QmitkMatchPointRegistrationEvaluator::OnSliceChanged() { mitk::Point3D currentSelectedPosition = GetRenderWindowPart()->GetSelectedPosition(NULL); unsigned int currentSelectedTimeStep = GetRenderWindowPart()->GetTimeNavigationController()->GetTime()->GetPos(); if (m_currentSelectedPosition != currentSelectedPosition || m_currentSelectedTimeStep != currentSelectedTimeStep || m_selectedNodeTime > m_currentPositionTime) { //the current position has been changed or the selected node has been changed since the last position validation -> check position m_currentSelectedPosition = currentSelectedPosition; m_currentSelectedTimeStep = currentSelectedTimeStep; m_currentPositionTime.Modified(); if (this->m_selectedEvalNode.IsNotNull()) { this->m_selectedEvalNode->SetProperty(mitk::nodeProp_RegEvalCurrentPosition, mitk::GenericProperty::New(currentSelectedPosition)); } } } -void QmitkMatchPointRegistrationEvaluator::OnComboStyleChanged(int index) +void QmitkMatchPointRegistrationEvaluator::OnSettingsChanged(mitk::DataNode*) { - m_Controls.groupBlend->setVisible(index == 0); - m_Controls.groupCheck->setVisible(index == 2); - m_Controls.groupWipe->setVisible(index == 3); - m_Controls.groupContour->setVisible(index == 5); - - if (m_selectedEvalNode.IsNotNull()) - { - m_selectedEvalNode->SetProperty(mitk::nodeProp_RegEvalStyle, mitk::RegEvalStyleProperty::New(index)); - this->GetRenderWindowPart()->RequestUpdate(); - } + this->GetRenderWindowPart()->RequestUpdate(); }; -void QmitkMatchPointRegistrationEvaluator::OnBlend50Pushed() +void QmitkMatchPointRegistrationEvaluator::OnEvalBtnPushed() { - m_Controls.sbBlend->setValue(50); -}; + mitk::RegEvaluationObject::Pointer regEval = mitk::RegEvaluationObject::New(); -void QmitkMatchPointRegistrationEvaluator::OnBlendTargetPushed() -{ - m_Controls.sbBlend->setValue(0); -}; + mitk::MAPRegistrationWrapper::Pointer reg; -void QmitkMatchPointRegistrationEvaluator::OnBlendMovingPushed() -{ - m_Controls.sbBlend->setValue(100); -}; + if (m_spSelectedRegNode.IsNotNull()) + { + reg = dynamic_cast(this->m_spSelectedRegNode->GetData()); + } + else + { + //generate a dymme reg to use + reg = mitk::GenerateIdentityRegistration3D(); + } -void QmitkMatchPointRegistrationEvaluator::OnBlendTogglePushed() -{ - m_Controls.sbBlend->setValue(100 - m_Controls.sbBlend->value()); -}; + regEval->SetRegistration(reg); + regEval->SetTargetNode(this->m_spSelectedTargetNode); + regEval->SetMovingNode(this->m_spSelectedMovingNode); -void QmitkMatchPointRegistrationEvaluator::OnSlideBlendChanged(int factor) -{ - m_internalBlendUpdate = true; - m_Controls.sbBlend->setValue(factor); - m_internalBlendUpdate = false; -}; + if (this->m_selectedEvalNode.IsNotNull()) + { + this->GetDataStorage()->Remove(this->m_selectedEvalNode); + } -void QmitkMatchPointRegistrationEvaluator::OnSpinBlendChanged(int factor) -{ - if (m_selectedEvalNode.IsNotNull()) - { - m_selectedEvalNode->SetIntProperty(mitk::nodeProp_RegEvalBlendFactor, factor); - this->GetRenderWindowPart()->RequestUpdate(); - - if (!m_internalBlendUpdate) - { - this->m_Controls.slideBlend->setValue(factor); - } - } -}; + this->m_selectedEvalNode = mitk::DataNode::New(); + this->m_selectedEvalNode->SetData(regEval); + + mitk::RegEvaluationMapper2D::SetDefaultProperties(this->m_selectedEvalNode); + this->m_selectedEvalNode->SetName(HelperNodeName); + this->m_selectedEvalNode->SetBoolProperty("helper object", true); + this->GetDataStorage()->Add(this->m_selectedEvalNode); -void QmitkMatchPointRegistrationEvaluator::OnSpinCheckerChanged(int count) -{ - if (m_selectedEvalNode.IsNotNull()) - { - m_selectedEvalNode->SetIntProperty(mitk::nodeProp_RegEvalCheckerCount, count); - this->GetRenderWindowPart()->RequestUpdate(); - } -}; + this->m_Controls.evalSettings->SetNode(this->m_selectedEvalNode); + this->OnSliceChanged(); -void QmitkMatchPointRegistrationEvaluator::OnWipeStyleChanged() -{ - if (m_selectedEvalNode.IsNotNull()) - { - if (this->m_Controls.radioWipeCross->isChecked()) - { - m_selectedEvalNode->SetProperty(mitk::nodeProp_RegEvalWipeStyle, - mitk::RegEvalWipeStyleProperty::New(0)); - } - else if (this->m_Controls.radioWipeH->isChecked()) - { - m_selectedEvalNode->SetProperty(mitk::nodeProp_RegEvalWipeStyle, - mitk::RegEvalWipeStyleProperty::New(1)); - } - else - { - m_selectedEvalNode->SetProperty(mitk::nodeProp_RegEvalWipeStyle, - mitk::RegEvalWipeStyleProperty::New(2)); - } - - this->GetRenderWindowPart()->RequestUpdate(); - } -}; + this->GetRenderWindowPart()->RequestUpdate(); + this->m_activeEvaluation = true; + this->CheckInputs(); + this->ConfigureControls(); +} -void QmitkMatchPointRegistrationEvaluator::OnContourStyleChanged() +void QmitkMatchPointRegistrationEvaluator::OnStopBtnPushed() { - if (m_selectedEvalNode.IsNotNull()) - { - m_selectedEvalNode->SetBoolProperty(mitk::nodeProp_RegEvalTargetContour, - m_Controls.radioTargetContour->isChecked()); - this->GetRenderWindowPart()->RequestUpdate(); - } -}; \ No newline at end of file + this->m_activeEvaluation = false; + + this->GetDataStorage()->Remove(this->m_selectedEvalNode); + this->m_selectedEvalNode = nullptr; + this->m_Controls.evalSettings->SetNode(this->m_selectedEvalNode); + + this->CheckInputs(); + this->ConfigureControls(); + this->GetRenderWindowPart()->RequestUpdate(); +} \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.h b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.h index 5049a51cb8..8cc1b4bb91 100644 --- a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.h +++ b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.h @@ -1,172 +1,181 @@ /*=================================================================== 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 __Q_MITK_MATCHPOINT_REGISTRATION_EVALUATOR_H #define __Q_MITK_MATCHPOINT_REGISTRATION_EVALUATOR_H #include #include #include "ui_QmitkMatchPointRegistrationEvaluator.h" class QmitkSliceChangedListener : public QObject { // 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: QmitkSliceChangedListener(); virtual ~QmitkSliceChangedListener(); signals: void SliceChanged(); public slots: void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart); void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart); protected slots: /** Overwrite function to implement the behavior on slice/time changes. */ void OnSliceChangedDelayed(); protected: /** @brief Calls OnSliceChangedDelayed so the event isn't triggered multiple times. */ void OnSliceChangedInternal(const itk::EventObject& e); void OnSliceNavigationControllerDeleted(const itk::Object* sender, const itk::EventObject& /*e*/); /** Initializes and sets the observers that are used to monitor changes in the selected position or time point in order to actualize the view.h*/ bool InitObservers(); void RemoveObservers(const mitk::SliceNavigationController* deletedSlicer); /** Removes all observers of the deletedPart. If null pointer is passed all observers will be removed.*/ void RemoveAllObservers(mitk::IRenderWindowPart* deletedPart = NULL); mitk::IRenderWindowPart* m_renderWindowPart; // Needed for observing the events for when a slice or time step is changed. bool m_PendingSliceChangedEvent; /**Helper structure to manage the registered observer events.*/ struct ObserverInfo { mitk::SliceNavigationController* controller; int observerTag; std::string renderWindowName; mitk::IRenderWindowPart* renderWindowPart; ObserverInfo(mitk::SliceNavigationController* controller, int observerTag, const std::string& renderWindowName, mitk::IRenderWindowPart* part); }; typedef std::multimap ObserverMapType; ObserverMapType m_ObserverMap; /** @brief Is a visualization currently running? */ bool m_internalUpdateFlag; }; /*! \brief QmitkMatchPointRegistrationEvaluator \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkMatchPointRegistrationEvaluator : public QmitkAbstractView, public mitk::IRenderWindowPartListener { // 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: static const std::string VIEW_ID; /** * Creates smartpointer typedefs */ berryObjectMacro(QmitkMatchPointRegistrationEvaluator) - QmitkMatchPointRegistrationEvaluator(); + QmitkMatchPointRegistrationEvaluator(); + ~QmitkMatchPointRegistrationEvaluator(); virtual void CreateQtPartControl(QWidget *parent); protected slots: /// \brief Called when the user clicks the GUI button - void OnComboStyleChanged(int); - void OnBlend50Pushed(); - void OnBlendTargetPushed(); - void OnBlendMovingPushed(); - void OnBlendTogglePushed(); - void OnSlideBlendChanged(int); - void OnSpinBlendChanged(int); - void OnSpinCheckerChanged(int); - void OnWipeStyleChanged(); - void OnContourStyleChanged(); + void OnEvalBtnPushed(); + void OnStopBtnPushed(); + void OnSettingsChanged(mitk::DataNode*); void OnSliceChanged(); protected: /// \brief called by QmitkFunctionality when DataManager's selection has changed virtual void OnSelectionChanged( berry::IWorkbenchPart::Pointer source, const QList& nodes); virtual void SetFocus(); virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart); virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart); Ui::MatchPointRegistrationEvaluatorControls m_Controls; private: QWidget *m_Parent; void Error(QString msg); /** Methods returns a list of all eval nodes in the data manager.*/ QList GetEvalNodes(); + /** + * Checks if appropriated nodes are selected in the data manager. If nodes are selected, + * they are stored m_spSelectedRegNode, m_spSelectedInputNode and m_spSelectedRefNode. + * They are also checked for vadility and stored in m_ValidInput,... . + * It also sets the info lables accordingly.*/ + void CheckInputs(); + /** * Updates the state of controls regarding to selected eval object.*/ void ConfigureControls(); mitk::DataNode::Pointer m_selectedEvalNode; mitk::DataStorage::SetOfObjects::ConstPointer m_evalNodes; QmitkSliceChangedListener m_SliceChangeListener; - bool m_internalBlendUpdate; - itk::TimeStamp m_selectedNodeTime; itk::TimeStamp m_currentPositionTime; /** @brief currently valid selected position in the inspector*/ mitk::Point3D m_currentSelectedPosition; /** @brief indicates if the currently selected position is valid for the currently selected fit. * This it is within the input image */ unsigned int m_currentSelectedTimeStep; + + mitk::DataNode::Pointer m_spSelectedRegNode; + mitk::DataNode::Pointer m_spSelectedMovingNode; + mitk::DataNode::Pointer m_spSelectedTargetNode; + + bool m_autoTarget; + bool m_autoMoving; + bool m_activeEvaluation; + + const std::string HelperNodeName; }; #endif // MatchPoint_h diff --git a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.ui b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.ui index 3d470be346..163812fb96 100644 --- a/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.ui +++ b/Plugins/org.mitk.gui.qt.matchpoint.evaluator/src/internal/QmitkMatchPointRegistrationEvaluator.ui @@ -1,324 +1,340 @@ MatchPointRegistrationEvaluatorControls 0 0 379 694 5 - + + 5 + + + 5 + + + 5 + + 5 - + - Evaluation visualization style: + Selected registration: - - - - - - Blend settings: - - - - 5 - - - 1 - - - 5 - - - - - - 60 - 16777215 - - - - Sets the blend factor to 0% (only target is visible) - - - target - - - - - - - - 60 - 16777215 - - - - Sets the blend factor to 100% (only mapped moving image is visible) - - - mapped - - - - - - - "Inverts" the current blend factor. - - - Toggle - - - - - - - - - 100 - - - 50 - - - Qt::Horizontal - - - - - - - % - - - 100 - - - 50 - - - - - - - - - - - - 60 - 16777215 - - - - Sets blend factor to 50%:50% - - - 50:50 - - - - - - + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + 0 + 170 + 0 + + + + + + + + + 0 + 170 + 0 + + + + + + + + + 159 + 158 + 158 + + + + + + + + + 75 + true + + + + Registration that should be used to map the moving image... + + + QFrame::StyledPanel + + + 2 + + + 1 + + + + - - - Checkerboard settings: - - - - 5 - - - 5 - - - - - Field counts: - - - - - - - 1 - - - - + + + Selected moving image: + - - - Wipe settings: - - - - 5 - - - 5 - - - - - Cross - - - true - - - - - - - Horizontal Wipe - - - - - - - Vertical wipe - - - - + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + 0 + 170 + 0 + + + + + + + + + 0 + 170 + 0 + + + + + + + + + 159 + 158 + 158 + + + + + + + + + 75 + true + + + + Moving image that should be mapped... + + + QFrame::StyledPanel + + + 2 + + + 1 + + + + - - - Contour settings - - - - 5 - - - 5 - - - - - Target image as contour - - - - - - - Mapped image as contour - - - - + + + Selected target image: + - + + + + 0 + 0 + + - + - 170 - 0 + 0 + 170 0 - + - 170 - 0 + 0 + 170 0 - + - 120 - 120 - 120 + 159 + 158 + 158 75 true + + Reference image that is used to determine the field of view mapped into... + + + QFrame::StyledPanel + + + 2 + + + 1 + + + + + + + + + + <html><head/><body><p>Starts the mapping of the input image with the current settings.</p></body></html> + - No registration evaluation object selected! + Start evaluation - - Qt::AlignCenter + + + + + + Stop evaluation + + + + + + + + 0 + 0 + + + + + 250 + 10 + Qt::Vertical 20 40 + + + QmitkRegEvalSettingsWidget + QWidget +
QmitkRegEvalSettingsWidget.h
+
+
5 5 true true true