diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp index 86e7e0c42c..45cc312691 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp @@ -1,160 +1,254 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkSurfaceRegistration.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include -const std::string QmitkSurfaceRegistration::VIEW_ID = "org.mitk.views.qmitksurfaceregistration"; +const std::string QmitkSurfaceRegistration::VIEW_ID = "org.mitk.views.surfaceregistration"; QmitkSurfaceRegistration::QmitkSurfaceRegistration(QObject *parent) : m_ParentWidget(0) { } QmitkSurfaceRegistration::~QmitkSurfaceRegistration() { m_movingSurface = nullptr; m_targetSurface = nullptr; } void QmitkSurfaceRegistration::SetFocus() { - m_Controls.movingGroupBox->setFocus(); + m_Controls.executePushButton->setFocus(); } QWidget * QmitkSurfaceRegistration::GetControls() { return nullptr; } void QmitkSurfaceRegistration::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.movingSurfaceNameComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.movingSurfaceNameComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); m_Controls.targetSurfaceNameComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.targetSurfaceNameComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); connect(m_Controls.executePushButton, SIGNAL(clicked()), this, SLOT(doExecute())); connect(m_Controls.movingSurfaceNameComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedMovingSurfaceChanged(const mitk::DataNode *))); connect(m_Controls.targetSurfaceNameComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedTargetSurfaceChanged(const mitk::DataNode *))); + connect(m_Controls.executeAllPushButton, SIGNAL(clicked()), this, SLOT(doExecuteAll())); mitk::RenderingManager::GetInstance()->SetDataStorage(this->GetDataStorageReference()->GetDataStorage()); mitk::RenderingManager::GetInstance()->InitializeViews(); + m_Controls.automatizedGroupBox->setEnabled(true); + m_Controls.OutputLineEdit->setEnabled(true); + m_Controls.executeAllPushButton->setEnabled(true); + m_ParentWidget = parent; } void QmitkSurfaceRegistration::OnSelectedMovingSurfaceChanged(const mitk::DataNode *node) { if (node != nullptr) { m_movingSurface = dynamic_cast(node->GetData()); m_Controls.selectMovingSurfaceLabel->setText("Selected moving surface:"); m_Controls.mirroringCheckBox->setEnabled(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_targetSurface != nullptr && m_targetSurface.GetPointer() != m_movingSurface.GetPointer()) { m_Controls.executePushButton->setEnabled(true); } } } void QmitkSurfaceRegistration::OnSelectedTargetSurfaceChanged(const mitk::DataNode *node) { if (node != nullptr) { m_targetSurface = dynamic_cast(node->GetData()); m_Controls.selectTargetSurfaceLabel->setText("Selected moving surface:"); m_Controls.mappedDataGroupBox->setEnabled(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_movingSurface != nullptr && m_targetSurface.GetPointer() != m_movingSurface.GetPointer()) { m_Controls.executePushButton->setEnabled(true); } } } void QmitkSurfaceRegistration::doExecute() { MITK_INFO << "execute clicked..."; m_ShapeComparisonManager = new mitk::ShapeComparisonManager(m_movingSurface, m_targetSurface); m_ShapeComparisonManager->setMirroring(m_Controls.mirroringCheckBox->isChecked()); m_ShapeComparisonManager->execute(); mitk::DataNode::Pointer colouredData = mitk::DataNode::New(); colouredData = m_ShapeComparisonManager->getColourTransformedDataNode(); colouredData->SetName(m_Controls.mappedDataNameLineEdit->text().toStdString()); this->GetDataStorage()->Add(colouredData); this->GetDataStorageReference()->GetDataStorage()->Modified(); mitk::RenderingManager::GetInstance()->InitializeViews(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); vtkSmartPointer lut = m_ShapeComparisonManager->getTable(); showLookUpTable(lut); } +void QmitkSurfaceRegistration::doExecuteAll() +{ + MITK_INFO << "Compare all surfaces in Storage "; + auto datastorage = this->GetDataStorage(); + + mitk::NodePredicateDataType::Pointer isSurface = mitk::NodePredicateDataType::New("Surface"); + mitk::DataStorage::SetOfObjects::ConstPointer surfaces = datastorage->GetSubset(isSurface); + + if (!surfaces->empty()) + { + //initialize variables + mitk::Surface::Pointer tibiaLeft= nullptr; + mitk::Surface::Pointer fibulaLeft = nullptr; + mitk::Surface::Pointer talusLeft = nullptr; + mitk::Surface::Pointer tibiaRight = nullptr; + mitk::Surface::Pointer fibulaRight = nullptr; + mitk::Surface::Pointer talusRight = nullptr; + + //iterate over all child nodes with NodePredicateProperty + for (mitk::DataStorage::SetOfObjects::const_iterator iter = surfaces->begin(); iter != surfaces->end(); ++iter) + { + mitk::DataNode::Pointer node = (*iter); + //check for left + if (QString(node->GetName().c_str()).contains(QString("L"), Qt::CaseSensitive)) + { + if (QString(node->GetName().c_str()).contains(QString("Tibia"), Qt::CaseSensitive)) + { + mitk::DataNode* tibiaNode(this->GetDataStorage()->GetNamedNode(node->GetName())); + tibiaLeft = dynamic_cast(tibiaNode->GetData()); + } + else if (QString(node->GetName().c_str()).contains(QString("Fibula"), Qt::CaseSensitive)) + { + mitk::DataNode* fibulaNode(this->GetDataStorage()->GetNamedNode(node->GetName())); + fibulaLeft = dynamic_cast(fibulaNode->GetData()); + } + else if (QString(node->GetName().c_str()).contains(QString("Talus"), Qt::CaseSensitive)) + { + mitk::DataNode* talusNode(this->GetDataStorage()->GetNamedNode(node->GetName())); + talusLeft = dynamic_cast(talusNode->GetData()); + } + }//check for right + else if (QString(node->GetName().c_str()).contains(QString("R"), Qt::CaseSensitive)) + { + if (QString(node->GetName().c_str()).contains(QString("Tibia"), Qt::CaseSensitive)) + { + mitk::DataNode* tibiaMovingNode(this->GetDataStorage()->GetNamedNode(node->GetName())); + tibiaRight = dynamic_cast(tibiaMovingNode->GetData()); + } + else if (QString(node->GetName().c_str()).contains(QString("Fibula"), Qt::CaseSensitive)) + { + mitk::DataNode* fibulaMovingNode(this->GetDataStorage()->GetNamedNode(node->GetName())); + fibulaRight = dynamic_cast(fibulaMovingNode->GetData()); + } + else if (QString(node->GetName().c_str()).contains(QString("Talus"), Qt::CaseSensitive)) + { + mitk::DataNode* talusMovingNode(this->GetDataStorage()->GetNamedNode(node->GetName())); + talusRight = dynamic_cast(talusMovingNode->GetData()); + } + } + } + MITK_INFO << "Calculating Tibia..."; + performTwoSidedComparison(tibiaLeft, tibiaRight, "Tibia"); + MITK_INFO << "Calculating Fibula..."; + performTwoSidedComparison(fibulaLeft, fibulaRight, "Fibula"); + MITK_INFO << "Calculating Talus..."; + performTwoSidedComparison(talusLeft, talusRight, "Target"); + } + +} + +void QmitkSurfaceRegistration::performTwoSidedComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, QString resultName) +{ + if (left != nullptr && right != nullptr) + { + m_Controls.mirroringCheckBox->setChecked(true); + + m_movingSurface = left; + m_targetSurface = right; + m_Controls.mappedDataNameLineEdit->setText(resultName + "MovingL"); + doExecute(); + m_movingSurface = right; + m_targetSurface = left; + m_Controls.mappedDataNameLineEdit->setText(resultName + "MovingR"); + doExecute(); + } +} + void QmitkSurfaceRegistration::showLookUpTable(vtkSmartPointer lut) { mitk::BaseRenderer::Pointer renderer = mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget4")); m_colorBarAnnotation = mitk::ColorBarAnnotation::New(); mitk::LookupTable::Pointer mitkTable = mitk::LookupTable::New(); mitkTable->SetVtkLookupTable(lut); mitk::LookupTableProperty::Pointer prop = mitk::LookupTableProperty::New(mitkTable); m_colorBarAnnotation->SetProperty("ColorBarAnnotation.LookupTable", prop.GetPointer()); MITK_INFO<GetPropertyList(); m_colorBarAnnotation->SetNumberOfLabels(9); m_colorBarAnnotation->SetAnnotationTextScaling(true); m_colorBarAnnotation->SetDrawAnnotations(true); m_colorBarAnnotation->SetDrawTickLabels(true); mitk::LayoutAnnotationRenderer::AddAnnotation( m_colorBarAnnotation, renderer, mitk::LayoutAnnotationRenderer::Right, 10, 10, 10); -} \ No newline at end of file +} + + diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h index 549308e75c..ff4f57a99e 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h @@ -1,120 +1,124 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef QmitkSurfaceRegistration_h #define QmitkSurfaceRegistration_h #include #ifdef WIN32 #pragma warning( disable : 4250 ) #endif #include "QVTKWidget.h" #include "QmitkRegisterClasses.h" #include #include #include "ui_SurfaceRegistrationControls.h" #include "usServiceRegistration.h" #include "mitkAnnotation.h" #include "mitkColorBarAnnotation.h" +#include "mitkDataStorage.h" #include #include #include /*! @brief QmitkSurfaceRegistrationView \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 QmitkSurfaceRegistration : 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) private: Q_OBJECT public: /*! @brief Constructor. Called by SampleApp (or other apps that use functionalities) */ QmitkSurfaceRegistration(QObject *parent = 0); virtual ~QmitkSurfaceRegistration(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent); virtual void SetFocus() override; ///*! //@brief Creates the Qt connections needed //*/ QWidget* GetControls(); /// @brief Called when the user clicks the GUI button protected slots: void doExecute(); + void doExecuteAll(); + void OnSelectedMovingSurfaceChanged(const mitk::DataNode *); void OnSelectedTargetSurfaceChanged(const mitk::DataNode *); protected: // /*! //@brief called by QmitkFunctionality when DataManager's selection has changed // */ //void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; private: /*! * The parent QWidget */ QWidget* m_ParentWidget; mitk::BaseRenderer *m_Renderer; /*! * @brief A pointer to the node of the moving surface. */ mitk::Surface::Pointer m_movingSurface; /*! * @brief A pointer to the node of the target surface. */ mitk::Surface::Pointer m_targetSurface; - mitk::ShapeComparisonManager *m_ShapeComparisonManager; Ui::SurfaceRegistrationControls m_Controls; mitk::ColorBarAnnotation::Pointer m_colorBarAnnotation; void showLookUpTable(vtkSmartPointer lut); + + void performTwoSidedComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, QString resultName); }; #endif // QmitkSurfaceRegistration_h \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/SurfaceRegistrationControls.ui b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/SurfaceRegistrationControls.ui index e9bb0b6845..7a4da598a1 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/SurfaceRegistrationControls.ui +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/SurfaceRegistrationControls.ui @@ -1,354 +1,417 @@ SurfaceRegistrationControls Qt::WindowModal true 0 0 434 - 395 + 566 0 0 100 100 16777215 16777215 QmitkTemplate true 0 0 0 95 Moving false 0 0 QLabel { color: rgb(0, 0, 0) } Select moving surface false Mirroring true 0 0 0 75 Target false 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 QLabel { color: rgb(0, 0, 0) } Select target surface true false 0 0 0 75 0 75 Mapped Data 0 0 0 0 0 0 120 120 120 Type mapped data name: defaultMappedData false Execute + + + + + 0 + 0 + + + + + 0 + 95 + + + + Automatized Evaluation + + + + + 10 + 20 + 388 + 22 + + + + + 0 + 0 + + + + OutputFile.txt + + + + + + + + false + + + + 10 + 50 + 388 + 28 + + + + + 0 + 0 + + + + Execute for All + + + + Qt::Vertical 20 40 QmitkDataStorageComboBox QComboBox
QmitkDataStorageComboBox.h