diff --git a/Modules/QtWidgets/include/QmitkMultiNodeSelectionWidget.h b/Modules/QtWidgets/include/QmitkMultiNodeSelectionWidget.h index a82e42d432..0705e7dac8 100644 --- a/Modules/QtWidgets/include/QmitkMultiNodeSelectionWidget.h +++ b/Modules/QtWidgets/include/QmitkMultiNodeSelectionWidget.h @@ -1,79 +1,79 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QMITK_MULTI_NODE_SELECTION_WIDGET_H #define QMITK_MULTI_NODE_SELECTION_WIDGET_H #include -#include "ui_QmitkMultiNodeSelectionWidget.h" +#include #include #include #include #include #include class QmitkAbstractDataStorageModel; /** * @class QmitkMultiNodeSelectionWidget * @brief Widget that allows to perform and represents a multiple node selection. */ class MITKQTWIDGETS_EXPORT QmitkMultiNodeSelectionWidget : public QmitkAbstractNodeSelectionWidget { Q_OBJECT public: explicit QmitkMultiNodeSelectionWidget(QWidget* parent = nullptr); using NodeList = QmitkAbstractNodeSelectionWidget::NodeList; /** * @brief Helper function that is used to check the given selection for consistency. * Returning an empty string assumes that everything is alright and the selection * is valid. If the string is not empty, the content of the string will be used * as error message in the overlay to indicate the problem. */ using SelectionCheckFunctionType = std::function; /** * @brief A selection check function can be set. If set the widget uses this function to * check the made/set selection. If the selection is valid, everything is fine. * If selection is indicated as invalid, it will not be communicated by the widget * (no signal emission). */ void SetSelectionCheckFunction(const SelectionCheckFunctionType &checkFunction); public Q_SLOTS: void OnEditSelection(); protected Q_SLOTS: void OnClearSelection(const mitk::DataNode* node); protected: void changeEvent(QEvent *event) override; void UpdateInfo() override; void OnInternalSelectionChanged() override; bool AllowEmissionOfSelection(const NodeList& emissionCandidates) const override; QmitkSimpleTextOverlayWidget* m_Overlay; SelectionCheckFunctionType m_CheckFunction; mutable std::string m_CheckResponse; Ui_QmitkMultiNodeSelectionWidget m_Controls; }; #endif // QMITK_MULTI_NODE_SELECTION_WIDGET_H diff --git a/Modules/QtWidgets/include/QmitkNodeSelectionDialog.h b/Modules/QtWidgets/include/QmitkNodeSelectionDialog.h index 21155b9e49..a91eb7a97e 100644 --- a/Modules/QtWidgets/include/QmitkNodeSelectionDialog.h +++ b/Modules/QtWidgets/include/QmitkNodeSelectionDialog.h @@ -1,146 +1,146 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QMITK_NODE_SELECTION_DIALOG_H #define QMITK_NODE_SELECTION_DIALOG_H #include -#include "ui_QmitkNodeSelectionDialog.h" +#include #include #include #include #include "mitkIDataStorageInspectorProvider.h" #include #include #include /** * @class QmitkNodeSelectionDialog * @brief A customized QDialog that displays different data storage inspectors and allows to * set and get a current selection by selecting data nodes in the data storage inspectors. */ class MITKQTWIDGETS_EXPORT QmitkNodeSelectionDialog : public QDialog { Q_OBJECT public: explicit QmitkNodeSelectionDialog(QWidget* parent = nullptr, QString caption = "", QString hint = ""); /** * @brief Set the data storage that will be used. * The function iterates over the dialog's panels and sets the data storage of each panel accordingly. * Each panel is a specific data storage inspector. * * @param dataStorage A pointer to the data storage to set. */ void SetDataStorage(mitk::DataStorage* dataStorage); /** * @brief Set the node predicate that will be used. * The function iterates over the dialog's panels and sets the node predicate of each panel accordingly. * Each panel is a specific data storage inspector. * * @param nodePredicate A pointer to node predicate. */ virtual void SetNodePredicate(const mitk::NodePredicateBase* nodePredicate); const mitk::NodePredicateBase* GetNodePredicate() const; using NodeList = QList; NodeList GetSelectedNodes() const; /** * @brief Helper function that is used to check the given selection for consistency. * Returning an empty string assumes that everything is alright and the selection is valid. * If the string is not empty, the content of the string will be used as error message. */ using SelectionCheckFunctionType = std::function; /** * @brief A selection check function can be set. If set the dialog uses this function to check the made/set selection. * If the selection is valid, everything is fine. * If the selection is indicated as invalid, the dialog will display the selection check function error message. */ void SetSelectionCheckFunction(const SelectionCheckFunctionType &checkFunction); bool GetSelectOnlyVisibleNodes() const; using SelectionMode = QAbstractItemView::SelectionMode; /** * @brief Set the Qt selection mode (e.g. Single selection, multi selection). * The function iterates over the dialog's panels and sets the Qt selection mode of each panel accordingly. * Each panel is a concrete data storage inspector. * * @param mode The QAbstractItemView::SelectionMode to define the selection mode. */ void SetSelectionMode(SelectionMode mode); SelectionMode GetSelectionMode() const; Q_SIGNALS: /** * @brief A signal that will be emitted if the selected node has changed. * * @param nodes A list of data nodes that are newly selected. */ void CurrentSelectionChanged(NodeList nodes); public Q_SLOTS: /** * @brief Set the selection modus to (not) include invisible nodes in the selection. * The function iterates over the dialog's panels and sets the selection modus of each panel accordingly. * Each panel is a concrete data storage inspector. * * @param selectOnlyVisibleNodes The bool value to define the selection modus. */ void SetSelectOnlyVisibleNodes(bool selectOnlyVisibleNodes); /** * @brief Set the currently selected nodes given a list of data nodes. * The function iterates over the dialog's panels and sets the current selection of each panel accordingly. * Each panel is a concrete data storage inspector. * * @param selectedNodes A list of data nodes that should be newly selected. */ void SetCurrentSelection(NodeList selectedNodes); protected Q_SLOTS: void OnSelectionChanged(NodeList selectedNodes); void OnFavoriteNodesButtonClicked(); void OnOK(); void OnCancel(); void OnDoubleClicked(const QModelIndex& index); protected: void SetErrorText(const std::string& checkResponse); void AddPanel(const mitk::IDataStorageInspectorProvider* provider, const mitk::IDataStorageInspectorProvider::InspectorIDType &preferredID, bool &preferredFound, int &preferredIndex); mitk::WeakPointer m_DataStorage; mitk::NodePredicateBase::ConstPointer m_NodePredicate; bool m_SelectOnlyVisibleNodes; NodeList m_SelectedNodes; SelectionCheckFunctionType m_CheckFunction; SelectionMode m_SelectionMode; using PanelVectorType = std::vector; PanelVectorType m_Panels; QPushButton* m_FavoriteNodesButton; Ui_QmitkNodeSelectionDialog m_Controls; }; #endif // QMITK_NODE_SELECTION_DIALOG_H diff --git a/Modules/QtWidgets/include/QmitkNodeSelectionListItemWidget.h b/Modules/QtWidgets/include/QmitkNodeSelectionListItemWidget.h index cab0a0c91e..b1448a3024 100644 --- a/Modules/QtWidgets/include/QmitkNodeSelectionListItemWidget.h +++ b/Modules/QtWidgets/include/QmitkNodeSelectionListItemWidget.h @@ -1,52 +1,52 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QMITK_NODE_SELECTION_LIST_ITEM_WIDGET_H #define QMITK_NODE_SELECTION_LIST_ITEM_WIDGET_H #include -#include "ui_QmitkNodeSelectionListItemWidget.h" +#include #include #include class MITKQTWIDGETS_EXPORT QmitkNodeSelectionListItemWidget : public QWidget { Q_OBJECT public: explicit QmitkNodeSelectionListItemWidget(QWidget* parent = nullptr); ~QmitkNodeSelectionListItemWidget() override; const mitk::DataNode* GetSelectedNode() const; public Q_SLOTS : virtual void SetSelectedNode(const mitk::DataNode* node); virtual void SetClearAllowed(bool allowed); signals: void ClearSelection(const mitk::DataNode* node); protected Q_SLOTS: void OnClearSelection(); protected: bool eventFilter(QObject *obj, QEvent *ev) override; Ui_QmitkNodeSelectionListItemWidget m_Controls; }; #endif // QMITK_NODE_SELECTION_LIST_ITEM_WIDGET_H diff --git a/Modules/QtWidgets/include/QmitkSingleNodeSelectionWidget.h b/Modules/QtWidgets/include/QmitkSingleNodeSelectionWidget.h index af818d8e8b..10f776d00c 100644 --- a/Modules/QtWidgets/include/QmitkSingleNodeSelectionWidget.h +++ b/Modules/QtWidgets/include/QmitkSingleNodeSelectionWidget.h @@ -1,97 +1,97 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QMITK_SINGLE_NODE_SELECTION_WIDGET_H #define QMITK_SINGLE_NODE_SELECTION_WIDGET_H #include -#include "ui_QmitkSingleNodeSelectionWidget.h" +#include #include #include #include #include #include class QmitkAbstractDataStorageModel; /** * @class QmitkSingleNodeSelectionWidget * @brief Widget that represents a node selection of (max) one node. It acts like a button. Clicking on it * allows to change the selection. * * @remark This class provides a public function 'SetAutoSelectNewNodes' that can be used to enable * the auto selection mode (default is false). * The user of this class calling this function has to make sure that the base-class Q_SIGNAL * 'CurrentSelectionChanged', which will be emitted by this function, is already * connected to a receiving slot, if the initial valid auto selection should not get lost. */ class MITKQTWIDGETS_EXPORT QmitkSingleNodeSelectionWidget : public QmitkAbstractNodeSelectionWidget { Q_OBJECT public: explicit QmitkSingleNodeSelectionWidget(QWidget* parent = nullptr); mitk::DataNode::Pointer GetSelectedNode() const; bool GetAutoSelectNewNodes() const; using NodeList = QmitkAbstractNodeSelectionWidget::NodeList; public Q_SLOTS: void SetCurrentSelectedNode(mitk::DataNode* selectedNode); /** * Sets the auto selection mode (default is false). * If auto select is true and the following conditions are fullfilled, the widget will * select a node automatically from the data storage: * - a data storage is set * - data storage contains at least one node that matches the given predicate * - no selection is set * * @remark Enabling the auto selection mode by calling 'SetAutoSelectNewNodes(true)' * will directly emit a 'QmitkSingleNodeSelectionWidget::CurrentSelectionChanged' Q_SIGNAL * if a valid auto selection was made. * If this initial emission should not get lost, auto selection mode needs to be enabled after this * selection widget has been connected via the 'QmitkSingleNodeSelectionWidget::CurrentSelectionChanged' * Q_SIGNAL to a receiving function. */ void SetAutoSelectNewNodes(bool autoSelect); protected Q_SLOTS: virtual void OnClearSelection(); protected: void ReviseSelectionChanged(const NodeList& oldInternalSelection, NodeList& newInternalSelection) override; bool eventFilter(QObject *obj, QEvent *ev) override; void EditSelection(); void UpdateInfo() override; void OnDataStorageChanged() override; void OnNodeAddedToStorage(const mitk::DataNode* node) override; void AutoSelectNodes(); /** Helper function that gets a suitable auto selected node from the datastorage that fits to the predicate settings. @param ignoreNodes You may pass a list of nodes that must not be choosen as auto selected node. */ mitk::DataNode::Pointer DetermineAutoSelectNode(const NodeList& ignoreNodes = {}); /** See documentation of SetAutoSelectNewNodes for details*/ bool m_AutoSelectNodes; Ui_QmitkSingleNodeSelectionWidget m_Controls; }; #endif // QMITK_SINGLE_NODE_SELECTION_WIDGET_H diff --git a/Modules/QtWidgets/src/QmitkNodeSelectionListItemWidget.ui b/Modules/QtWidgets/src/QmitkNodeSelectionListItemWidget.ui index 6f59ef5284..32dff99ebf 100644 --- a/Modules/QtWidgets/src/QmitkNodeSelectionListItemWidget.ui +++ b/Modules/QtWidgets/src/QmitkNodeSelectionListItemWidget.ui @@ -1,124 +1,124 @@ QmitkNodeSelectionListItemWidget 0 0 348 25 0 0 0 25 16777215 40 Form 0 0 0 0 0 0 0 0 25 Right click to show details about selected node. false 0 0 0 25 25 16777215 Press to remove the current selection. - :/org.mitk.gui.qt.common/resources/times.svg:/org.mitk.gui.qt.common/resources/times.svg + :/Qmitk/times.svg:/Qmitk/times.svg 19 19 QmitkNodeSelectionButton QPushButton
QmitkNodeSelectionButton.h
diff --git a/Modules/QtWidgets/src/QmitkSingleNodeSelectionWidget.ui b/Modules/QtWidgets/src/QmitkSingleNodeSelectionWidget.ui index 94f5047e55..e70437df13 100644 --- a/Modules/QtWidgets/src/QmitkSingleNodeSelectionWidget.ui +++ b/Modules/QtWidgets/src/QmitkSingleNodeSelectionWidget.ui @@ -1,124 +1,124 @@ QmitkSingleNodeSelectionWidget 0 0 348 25 0 0 0 25 16777215 40 Form 0 0 0 0 0 0 0 0 25 <html><head/><body><p>Press to change the selection.</p><p>Right click to show details about selected node.</p></body></html> true 0 0 0 25 25 16777215 Press to remove the current selection. - :/org.mitk.gui.qt.common/resources/times.svg:/org.mitk.gui.qt.common/resources/times.svg + :/Qmitk/times.svg:/Qmitk/times.svg 19 19 QmitkNodeSelectionButton QPushButton
QmitkNodeSelectionButton.h
diff --git a/Modules/Segmentation/Algorithms/mitkFeatureBasedEdgeDetectionFilter.cpp b/Modules/Segmentation/Algorithms/mitkFeatureBasedEdgeDetectionFilter.cpp index 969e1c7e84..7c724274d0 100644 --- a/Modules/Segmentation/Algorithms/mitkFeatureBasedEdgeDetectionFilter.cpp +++ b/Modules/Segmentation/Algorithms/mitkFeatureBasedEdgeDetectionFilter.cpp @@ -1,196 +1,195 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkFeatureBasedEdgeDetectionFilter.h" #include #include #include #include #include #include #include #include -#include #include #include #include #include #include #include #include #include mitk::FeatureBasedEdgeDetectionFilter::FeatureBasedEdgeDetectionFilter() { this->SetNumberOfRequiredInputs(1); this->SetNumberOfIndexedOutputs(1); } mitk::FeatureBasedEdgeDetectionFilter::~FeatureBasedEdgeDetectionFilter() { } void mitk::FeatureBasedEdgeDetectionFilter::GenerateData() { mitk::Image::ConstPointer image = ImageToUnstructuredGridFilter::GetInput(); if (m_SegmentationMask.IsNull()) { MITK_WARN << "Please set a segmentation mask first" << std::endl; return; } // First create a threshold segmentation of the image. The threshold is determined // by the mean +/- stddev of the pixel values that are covered by the segmentation mask // Compute mean and stdDev based on the current segmentation mitk::ImageStatisticsCalculator::Pointer statCalc = mitk::ImageStatisticsCalculator::New(); statCalc->SetInputImage(image); mitk::ImageMaskGenerator::Pointer imgMask = mitk::ImageMaskGenerator::New(); imgMask->SetInputImage(image); imgMask->SetImageMask(m_SegmentationMask); auto stats = statCalc->GetStatistics()->GetStatisticsForTimeStep(0); double mean = stats.GetValueConverted(mitk::ImageStatisticsConstants::MEAN()); double stdDev = stats.GetValueConverted(mitk::ImageStatisticsConstants::STANDARDDEVIATION()); double upperThreshold = mean + stdDev; double lowerThreshold = mean - stdDev; // Perform thresholding mitk::Image::Pointer thresholdImage = mitk::Image::New(); AccessByItk_3(image.GetPointer(), ITKThresholding, lowerThreshold, upperThreshold, thresholdImage) mitk::ProgressBar::GetInstance() ->Progress(2); // Postprocess threshold segmentation // First a closing will be executed mitk::Image::Pointer closedImage = mitk::Image::New(); AccessByItk_1(thresholdImage, ThreadedClosing, closedImage); // Then we will holes that might exist mitk::MorphologicalOperations::FillHoles(closedImage); mitk::ProgressBar::GetInstance()->Progress(); // Extract the binary edges of the resulting segmentation mitk::Image::Pointer edgeImage = mitk::Image::New(); AccessByItk_1(closedImage, ContourSearch, edgeImage); // Convert the edge image into an unstructured grid mitk::ImageToUnstructuredGridFilter::Pointer i2UFilter = mitk::ImageToUnstructuredGridFilter::New(); i2UFilter->SetInput(edgeImage); i2UFilter->SetThreshold(1.0); i2UFilter->Update(); m_PointGrid = this->GetOutput(); if (m_PointGrid.IsNull()) m_PointGrid = mitk::UnstructuredGrid::New(); m_PointGrid->SetVtkUnstructuredGrid(i2UFilter->GetOutput()->GetVtkUnstructuredGrid()); mitk::ProgressBar::GetInstance()->Progress(); } template void mitk::FeatureBasedEdgeDetectionFilter::ThreadedClosing(itk::Image *originalImage, mitk::Image::Pointer &result) { typedef itk::BinaryBallStructuringElement myKernelType; myKernelType ball; ball.SetRadius(1); ball.CreateStructuringElement(); typedef typename itk::Image ImageType; typename itk::DilateObjectMorphologyImageFilter::Pointer dilationFilter = itk::DilateObjectMorphologyImageFilter::New(); dilationFilter->SetInput(originalImage); dilationFilter->SetKernel(ball); dilationFilter->Update(); typename itk::Image::Pointer dilatedImage = dilationFilter->GetOutput(); typename itk::ErodeObjectMorphologyImageFilter::Pointer erodeFilter = itk::ErodeObjectMorphologyImageFilter::New(); erodeFilter->SetInput(dilatedImage); erodeFilter->SetKernel(ball); erodeFilter->Update(); mitk::GrabItkImageMemory(erodeFilter->GetOutput(), result); } template void mitk::FeatureBasedEdgeDetectionFilter::ContourSearch(itk::Image *originalImage, mitk::Image::Pointer &result) { typedef itk::Image ImageType; typedef itk::BinaryContourImageFilter binaryContourImageFilterType; typename binaryContourImageFilterType::Pointer binaryContourFilter = binaryContourImageFilterType::New(); binaryContourFilter->SetInput(originalImage); binaryContourFilter->SetForegroundValue(1); binaryContourFilter->SetBackgroundValue(0); binaryContourFilter->Update(); typename itk::Image::Pointer itkImage = itk::Image::New(); itkImage->Graft(binaryContourFilter->GetOutput()); mitk::GrabItkImageMemory(itkImage, result); } template void mitk::FeatureBasedEdgeDetectionFilter::ITKThresholding(const itk::Image *originalImage, double lower, double upper, mitk::Image::Pointer &result) { typedef itk::Image ImageType; typedef itk::Image SegmentationType; typedef itk::BinaryThresholdImageFilter ThresholdFilterType; if (typeid(TPixel) != typeid(float) && typeid(TPixel) != typeid(double)) { // round the thresholds if we have nor a float or double image lower = std::floor(lower + 0.5); upper = std::floor(upper - 0.5); } if (lower >= upper) { upper = lower; } typename ThresholdFilterType::Pointer filter = ThresholdFilterType::New(); filter->SetInput(originalImage); filter->SetLowerThreshold(lower); filter->SetUpperThreshold(upper); filter->SetInsideValue(1); filter->SetOutsideValue(0); filter->Update(); mitk::GrabItkImageMemory(filter->GetOutput(), result); } void mitk::FeatureBasedEdgeDetectionFilter::SetSegmentationMask(mitk::Image::Pointer segmentation) { this->m_SegmentationMask = segmentation; } void mitk::FeatureBasedEdgeDetectionFilter::GenerateOutputInformation() { Superclass::GenerateOutputInformation(); } diff --git a/Modules/SegmentationUI/CMakeLists.txt b/Modules/SegmentationUI/CMakeLists.txt index be064b6867..e8ff32e1d3 100644 --- a/Modules/SegmentationUI/CMakeLists.txt +++ b/Modules/SegmentationUI/CMakeLists.txt @@ -1,5 +1,5 @@ MITK_CREATE_MODULE ( -INCLUDE_DIRS Qmitk -DEPENDS MitkSegmentation MitkQtWidgetsExt -PACKAGE_DEPENDS PRIVATE CTK|CTKWidgets nlohmann_json + INCLUDE_DIRS Qmitk SegmentationUtilities + DEPENDS MitkSegmentation MitkQtWidgetsExt + PACKAGE_DEPENDS PRIVATE CTK|CTKWidgets nlohmann_json ) diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidget.cpp similarity index 62% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidget.cpp index 10322cfe9d..c1e2aa0412 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.cpp +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidget.cpp @@ -1,144 +1,158 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkBooleanOperationsWidget.h" -#include "../../Common/QmitkDataSelectionWidget.h" +#include + +#include #include #include -#include + #include +#include + static const char* const HelpText = "Select two different segmentations above"; namespace { static std::string GetPrefix(mitk::BooleanOperation::Type type) { switch (type) { case mitk::BooleanOperation::Difference: return "DifferenceFrom_"; case mitk::BooleanOperation::Intersection: return "IntersectionWith_"; case mitk::BooleanOperation::Union: return "UnionWith_"; default: assert(false && "Unknown boolean operation type"); return "UNKNOWN_BOOLEAN_OPERATION_WITH_"; } } static void AddToDataStorage(mitk::DataStorage::Pointer dataStorage, mitk::Image::Pointer segmentation, const std::string& name, mitk::DataNode::Pointer parent = nullptr) { - auto dataNode = mitk::DataNode::New(); + if (dataStorage.IsNull()) + { + std::string exception = "Cannot add result to the data storage. Data storage invalid."; + MITK_ERROR << "Boolean operation failed: " << exception; + QMessageBox::information(nullptr, "Boolean operation failed", QString::fromStdString(exception)); + } + auto dataNode = mitk::DataNode::New(); dataNode->SetName(name); dataNode->SetData(segmentation); dataStorage->Add(dataNode, parent); } } -QmitkBooleanOperationsWidget::QmitkBooleanOperationsWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) +QmitkBooleanOperationsWidget::QmitkBooleanOperationsWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent) { - m_Controls.setupUi(this); + m_Controls = new Ui::QmitkBooleanOperationsWidgetControls; + m_Controls->setupUi(this); - m_Controls.dataSelectionWidget->AddDataSelection("", "Select 1st segmentation", "Select 1st segmentation", "", QmitkDataSelectionWidget::SegmentationPredicate); - m_Controls.dataSelectionWidget->AddDataSelection("", "Select 2nd segmentation", "Select 2nd segmentation", "", QmitkDataSelectionWidget::SegmentationPredicate); + m_Controls->dataSelectionWidget->SetDataStorage(dataStorage); + m_Controls->dataSelectionWidget->AddDataSelection("", "Select 1st segmentation", "Select 1st segmentation", "", QmitkDataSelectionWidget::SegmentationPredicate); + m_Controls->dataSelectionWidget->AddDataSelection("", "Select 2nd segmentation", "Select 2nd segmentation", "", QmitkDataSelectionWidget::SegmentationPredicate); - m_Controls.dataSelectionWidget->SetHelpText(HelpText); + m_Controls->dataSelectionWidget->SetHelpText(HelpText); - connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); - connect(m_Controls.differenceButton, SIGNAL(clicked()), this, SLOT(OnDifferenceButtonClicked())); - connect(m_Controls.intersectionButton, SIGNAL(clicked()), this, SLOT(OnIntersectionButtonClicked())); - connect(m_Controls.unionButton, SIGNAL(clicked()), this, SLOT(OnUnionButtonClicked())); + connect(m_Controls->dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); + connect(m_Controls->differenceButton, SIGNAL(clicked()), this, SLOT(OnDifferenceButtonClicked())); + connect(m_Controls->intersectionButton, SIGNAL(clicked()), this, SLOT(OnIntersectionButtonClicked())); + connect(m_Controls->unionButton, SIGNAL(clicked()), this, SLOT(OnUnionButtonClicked())); } QmitkBooleanOperationsWidget::~QmitkBooleanOperationsWidget() { } void QmitkBooleanOperationsWidget::OnSelectionChanged(unsigned int, const mitk::DataNode*) { - auto dataSelectionWidget = m_Controls.dataSelectionWidget; + auto dataSelectionWidget = m_Controls->dataSelectionWidget; auto nodeA = dataSelectionWidget->GetSelection(0); auto nodeB = dataSelectionWidget->GetSelection(1); if (nodeA.IsNotNull() && nodeB.IsNotNull() && nodeA != nodeB) { dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } else { dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); } } void QmitkBooleanOperationsWidget::EnableButtons(bool enable) { - m_Controls.differenceButton->setEnabled(enable); - m_Controls.intersectionButton->setEnabled(enable); - m_Controls.unionButton->setEnabled(enable); + m_Controls->differenceButton->setEnabled(enable); + m_Controls->intersectionButton->setEnabled(enable); + m_Controls->unionButton->setEnabled(enable); } void QmitkBooleanOperationsWidget::OnDifferenceButtonClicked() { this->DoBooleanOperation(mitk::BooleanOperation::Difference); } void QmitkBooleanOperationsWidget::OnIntersectionButtonClicked() { this->DoBooleanOperation(mitk::BooleanOperation::Intersection); } void QmitkBooleanOperationsWidget::OnUnionButtonClicked() { this->DoBooleanOperation(mitk::BooleanOperation::Union); } void QmitkBooleanOperationsWidget::DoBooleanOperation(mitk::BooleanOperation::Type type) { auto timeNavigationController = this->GetTimeNavigationController(); assert(timeNavigationController != nullptr); - mitk::Image::Pointer segmentationA = dynamic_cast(m_Controls.dataSelectionWidget->GetSelection(0)->GetData()); - mitk::Image::Pointer segmentationB = dynamic_cast(m_Controls.dataSelectionWidget->GetSelection(1)->GetData()); + mitk::Image::Pointer segmentationA = dynamic_cast(m_Controls->dataSelectionWidget->GetSelection(0)->GetData()); + mitk::Image::Pointer segmentationB = dynamic_cast(m_Controls->dataSelectionWidget->GetSelection(1)->GetData()); mitk::Image::Pointer result; try { mitk::BooleanOperation booleanOperation(type, segmentationA, segmentationB, timeNavigationController->GetSelectedTimePoint()); result = booleanOperation.GetResult(); assert(result.IsNotNull()); - auto dataSelectionWidget = m_Controls.dataSelectionWidget; + auto dataSelectionWidget = m_Controls->dataSelectionWidget; AddToDataStorage( dataSelectionWidget->GetDataStorage(), result, GetPrefix(type) + dataSelectionWidget->GetSelection(1)->GetName(), dataSelectionWidget->GetSelection(0)); } catch (const mitk::Exception& exception) { MITK_ERROR << "Boolean operation failed: " << exception.GetDescription(); QMessageBox::information(nullptr, "Boolean operation failed", exception.GetDescription()); } } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidget.h similarity index 59% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidget.h index 76e56b16a8..29b0e89e87 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidget.h @@ -1,41 +1,55 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkBooleanOperationsWidget_h #define QmitkBooleanOperationsWidget_h -#include "../QmitkSegmentationUtilityWidget.h" -#include +#include + #include +#include + +namespace Ui +{ + class QmitkBooleanOperationsWidgetControls; +} + +namespace mitk +{ + class DataNode; + class DataStorage; +} -class QmitkBooleanOperationsWidget : public QmitkSegmentationUtilityWidget +class MITKSEGMENTATIONUI_EXPORT QmitkBooleanOperationsWidget : public QmitkSegmentationUtilityWidget { Q_OBJECT public: - explicit QmitkBooleanOperationsWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = nullptr); + explicit QmitkBooleanOperationsWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent = nullptr); ~QmitkBooleanOperationsWidget() override; private slots: void OnSelectionChanged(unsigned int index, const mitk::DataNode* selection); void OnDifferenceButtonClicked(); void OnIntersectionButtonClicked(); void OnUnionButtonClicked(); private: void EnableButtons(bool enable = true); void DoBooleanOperation(mitk::BooleanOperation::Type type); - Ui::QmitkBooleanOperationsWidgetControls m_Controls; + Ui::QmitkBooleanOperationsWidgetControls* m_Controls; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidgetControls.ui b/Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidgetControls.ui similarity index 83% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidgetControls.ui rename to Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidgetControls.ui index 67c4a615ba..00a0389ab4 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidgetControls.ui +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkBooleanOperationsWidgetControls.ui @@ -1,178 +1,181 @@ QmitkBooleanOperationsWidgetControls 0 0 210 91 0 0 false 0 0 Subtracts first segmentation from the second one Difference - - :/SegmentationUtilities/BooleanOperations/BooleanDifference_48x48.png:/SegmentationUtilities/BooleanOperations/BooleanDifference_48x48.png + + :/Qmitk/BooleanDifference_48x48.png:/Qmitk/BooleanDifference_48x48.png + 24 24 false false Qt::ToolButtonTextUnderIcon Qt::NoArrow false 0 0 Keeps just the overlapping areas of two the segmentations Intersection - - :/SegmentationUtilities/BooleanOperations/BooleanIntersection_48x48.png:/SegmentationUtilities/BooleanOperations/BooleanIntersection_48x48.png + + :/Qmitk/BooleanIntersection_48x48.png:/Qmitk/BooleanIntersection_48x48.png + 24 24 false false Qt::ToolButtonTextUnderIcon Qt::NoArrow false 0 0 Combines the two segmentations Union - - :/SegmentationUtilities/BooleanOperations/BooleanUnion_48x48.png:/SegmentationUtilities/BooleanOperations/BooleanUnion_48x48.png + + :/Qmitk/BooleanUnion_48x48.png:/Qmitk/BooleanUnion_48x48.png + 24 24 false false Qt::ToolButtonTextUnderIcon Qt::NoArrow Qt::Vertical 20 40 QmitkDataSelectionWidget QWidget -
internal/Common/QmitkDataSelectionWidget.h
+
QmitkDataSelectionWidget.h
1
- +
diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidget.cpp similarity index 90% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidget.cpp index 90e41d7aea..883633b384 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidget.cpp @@ -1,246 +1,259 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkContourModelToImageWidget.h" -#include "mitkImage.h" -#include "../../Common/QmitkDataSelectionWidget.h" +#include + +#include +#include #include #include #include #include #include #include #include #include static const char* const HelpText = "Select a image and a contour(set)"; class QmitkContourModelToImageWidgetPrivate { public: QmitkContourModelToImageWidgetPrivate(); ~QmitkContourModelToImageWidgetPrivate(); /** @brief Check if selections is valid. */ void SelectionControl( unsigned int index, const mitk::DataNode* selection); /** @brief Enable buttons if data selction is valid. */ void EnableButtons(bool enable = true); /** @brief Does the actual contour filling */ mitk::LabelSetImage::Pointer FillContourModelSetIntoImage(mitk::Image *image, mitk::ContourModelSet *contourSet, mitk::TimePointType timePoint); Ui::QmitkContourModelToImageWidgetControls m_Controls; QFutureWatcher m_Watcher; }; QmitkContourModelToImageWidgetPrivate::QmitkContourModelToImageWidgetPrivate() { } QmitkContourModelToImageWidgetPrivate::~QmitkContourModelToImageWidgetPrivate() { } void QmitkContourModelToImageWidgetPrivate::EnableButtons(bool enable) { m_Controls.btnProcess->setEnabled(enable); } void QmitkContourModelToImageWidgetPrivate::SelectionControl(unsigned int index, const mitk::DataNode* /*selection*/) { QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(index); dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } mitk::LabelSetImage::Pointer QmitkContourModelToImageWidgetPrivate::FillContourModelSetIntoImage(mitk::Image* image, mitk::ContourModelSet* contourSet, mitk::TimePointType timePoint) { // Use mitk::ContourModelSetToImageFilter to fill the ContourModelSet into the image mitk::ContourModelSetToImageFilter::Pointer contourFiller = mitk::ContourModelSetToImageFilter::New(); auto timeStep = image->GetTimeGeometry()->TimePointToTimeStep(timePoint); contourFiller->SetTimeStep(timeStep); contourFiller->SetImage(image); contourFiller->SetInput(contourSet); contourFiller->MakeOutputBinaryOn(); try { contourFiller->Update(); } catch (const std::exception & e) { MITK_ERROR << "Error while converting contour model. "<< e.what(); } catch (...) { MITK_ERROR << "Unknown error while converting contour model."; } if (nullptr == contourFiller->GetOutput()) { MITK_ERROR<<"Could not write the selected contours into the image!"; } auto result = mitk::LabelSetImage::New(); result->InitializeByLabeledImage(contourFiller->GetOutput()); return result; } void QmitkContourModelToImageWidget::OnSelectionChanged(unsigned int index, const mitk::DataNode* selection) { Q_D(QmitkContourModelToImageWidget); QmitkDataSelectionWidget* dataSelectionWidget = d->m_Controls.dataSelectionWidget; mitk::DataNode::Pointer node0 = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer node1 = dataSelectionWidget->GetSelection(1); if (node0.IsNull() || node1.IsNull() ) { d->EnableButtons(false); dataSelectionWidget->SetHelpText(HelpText); } else { d->SelectionControl(index, selection); } } void QmitkContourModelToImageWidget::OnProcessingFinished() { // Called when processing finished // Adding the result to the data storage Q_D(QmitkContourModelToImageWidget); // Adding the result to the data storage auto result = d->m_Watcher.result(); if (result.IsNotNull()) { QmitkDataSelectionWidget* dataSelectionWidget = d->m_Controls.dataSelectionWidget; mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer contourNode = dataSelectionWidget->GetSelection(1); mitk::DataNode::Pointer filled = mitk::DataNode::New(); std::stringstream stream; stream << imageNode->GetName(); stream << "_"; stream << contourNode->GetName(); filled->SetName(stream.str()); filled->SetData(result); - dataSelectionWidget->GetDataStorage()->Add(filled, imageNode); + auto dataStorage = dataSelectionWidget->GetDataStorage(); + if (dataStorage.IsNull()) + { + std::string exception = "Cannot add result to the data storage. Data storage invalid."; + MITK_ERROR << "Error filling contours into an image: " << exception; + QMessageBox::information(nullptr, "Error filling contours into an image", QString::fromStdString(exception)); + } + + dataStorage->Add(filled, imageNode); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else { MITK_ERROR<<"Error filling contours into an image!"; } d->EnableButtons(); } void QmitkContourModelToImageWidget::OnProcessPressed() { Q_D(QmitkContourModelToImageWidget); QmitkDataSelectionWidget* dataSelectionWidget = d->m_Controls.dataSelectionWidget; mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer contourNode = dataSelectionWidget->GetSelection(1); // Check if data nodes are valid if(imageNode.IsNull() || contourNode.IsNull() ) { MITK_ERROR << "Selection does not contain valid data"; QMessageBox::information( this, "Contour To Image", "Selection does not contain valid data, please select a binary image and a contour(set)", QMessageBox::Ok ); d->m_Controls.btnProcess->setEnabled(false); return; } mitk::Image::Pointer image = static_cast(imageNode->GetData()); // Check if the image is valid if (image.IsNull()) { MITK_ERROR<<"Error writing contours into image! Invalid image data selected!"; return; } const auto timePoint = this->GetTimeNavigationController()->GetSelectedTimePoint(); if (!image->GetTimeGeometry()->IsValidTimePoint(timePoint)) { MITK_ERROR << "Error writing contours into image! Currently selected time point is not supported by selected image data."; return; } // Check if the selected contours are valid mitk::ContourModelSet::Pointer contourSet; mitk::ContourModel::Pointer contour = dynamic_cast(contourNode->GetData()); if (contour.IsNotNull()) { contourSet = mitk::ContourModelSet::New(); contourSet->AddContourModel(contour); } else { contourSet = static_cast(contourNode->GetData()); if (contourSet.IsNull()) { MITK_ERROR<<"Error writing contours into binary image! Invalid contour data selected!"; return; } } //Disable Buttons during calculation and initialize Progressbar d->EnableButtons(false); // Start the computation in a background thread QFuture< mitk::LabelSetImage::Pointer > future = QtConcurrent::run(d, &QmitkContourModelToImageWidgetPrivate::FillContourModelSetIntoImage, image, contourSet, timePoint); d->m_Watcher.setFuture(future); } -QmitkContourModelToImageWidget::QmitkContourModelToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) +QmitkContourModelToImageWidget::QmitkContourModelToImageWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent), d_ptr(new QmitkContourModelToImageWidgetPrivate()) { Q_D(QmitkContourModelToImageWidget); // Set up UI d->m_Controls.setupUi(this); + d->m_Controls.dataSelectionWidget->SetDataStorage(dataStorage); d->m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::ImageAndSegmentationPredicate); d->m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::ContourModelPredicate); d->m_Controls.dataSelectionWidget->SetHelpText(HelpText); d->EnableButtons(false); // Create connections connect (d->m_Controls.btnProcess, SIGNAL(pressed()), this, SLOT(OnProcessPressed())); connect(d->m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); connect(&d->m_Watcher, SIGNAL(finished()), this, SLOT(OnProcessingFinished())); if( d->m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && d->m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) { OnSelectionChanged(0, d->m_Controls.dataSelectionWidget->GetSelection(0)); } } QmitkContourModelToImageWidget::~QmitkContourModelToImageWidget() { } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidget.h similarity index 78% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidget.h index c31fb9f4dc..562d254434 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidget.h @@ -1,70 +1,76 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkContourModelToImageWidget_h #define QmitkContourModelToImageWidget_h -#include "../QmitkSegmentationUtilityWidget.h" -#include +#include + +#include #include class QmitkContourModelToImageWidgetPrivate; -namespace mitk { +namespace mitk +{ + class DataNode; + class DataStorage; class Image; class ContourModelSet; class ContourModel; class Geometry3D; class PlaneGeometry; } /*! \brief QmitkContourModelToImageWidget Tool masks an image with a binary image or a surface. The Method requires an image and a binary image mask or a surface. The input image and the binary image mask must be of the same size. Masking with a surface creates first a binary image of the surface and then use this for the masking of the input image. */ -class QmitkContourModelToImageWidget : public QmitkSegmentationUtilityWidget +class MITKSEGMENTATIONUI_EXPORT QmitkContourModelToImageWidget : public QmitkSegmentationUtilityWidget { Q_OBJECT public: /** @brief Default constructor, including creation of GUI elements and signals/slots connections. */ - explicit QmitkContourModelToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = nullptr); + explicit QmitkContourModelToImageWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent = nullptr); /** @brief Defaul destructor. */ ~QmitkContourModelToImageWidget() override; private slots: /** @brief This slot is called if the selection in the workbench is changed. */ void OnSelectionChanged(unsigned int index, const mitk::DataNode* selection); /** @brief This slot is called if user activates the button to mask an image. */ void OnProcessPressed(); /** @brief This slot is called after processing is finished */ void OnProcessingFinished(); private: QScopedPointer d_ptr; Q_DECLARE_PRIVATE(QmitkContourModelToImageWidget) Q_DISABLE_COPY(QmitkContourModelToImageWidget) }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui b/Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidgetControls.ui similarity index 95% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui rename to Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidgetControls.ui index 4f9be6b5bf..3409e8ae5b 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkContourModelToImageWidgetControls.ui @@ -1,56 +1,56 @@ QmitkContourModelToImageWidgetControls 0 0 98 62 0 0 Process Qt::Vertical 20 40 QmitkDataSelectionWidget QWidget -
internal/Common/QmitkDataSelectionWidget.h
+
QmitkDataSelectionWidget.h
1
diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidget.cpp similarity index 94% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidget.cpp index 9035c9faa8..2b0aaaafc8 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.cpp +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidget.cpp @@ -1,242 +1,242 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkDataSelectionWidget.h" -#include "../mitkPluginActivator.h" - -#include #include #include -#include #include #include #include #include #include #include #include #include #include #include #include #include #include static mitk::NodePredicateBase::Pointer CreatePredicate(QmitkDataSelectionWidget::Predicate predicate) { auto imageType = mitk::TNodePredicateDataType::New(); auto labelSetImageType = mitk::TNodePredicateDataType::New(); auto surfaceType = mitk::TNodePredicateDataType::New(); auto contourModelType = mitk::TNodePredicateDataType::New(); auto contourModelSetType = mitk::TNodePredicateDataType::New(); auto nonLabelSetImageType = mitk::NodePredicateAnd::New(imageType, mitk::NodePredicateNot::New(labelSetImageType)); auto nonHelperObject = mitk::NodePredicateNot::New(mitk::NodePredicateOr::New( mitk::NodePredicateProperty::New("helper object"), mitk::NodePredicateProperty::New("hidden object"))); auto isBinary = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); auto isSegmentation = mitk::NodePredicateProperty::New("segmentation", mitk::BoolProperty::New(true)); auto isBinaryOrSegmentation = mitk::NodePredicateOr::New(isBinary, isSegmentation); mitk::NodePredicateBase::Pointer returnValue; switch(predicate) { case QmitkDataSelectionWidget::ImagePredicate: returnValue = mitk::NodePredicateAnd::New( mitk::NodePredicateNot::New(isBinaryOrSegmentation), nonLabelSetImageType).GetPointer(); break; case QmitkDataSelectionWidget::SegmentationPredicate: returnValue = mitk::NodePredicateOr::New( mitk::NodePredicateAnd::New(imageType, isBinaryOrSegmentation), labelSetImageType).GetPointer(); break; case QmitkDataSelectionWidget::SurfacePredicate: returnValue = surfaceType.GetPointer(); break; case QmitkDataSelectionWidget::ImageAndSegmentationPredicate: returnValue = imageType.GetPointer(); break; case QmitkDataSelectionWidget::ContourModelPredicate: returnValue = mitk::NodePredicateOr::New( contourModelSetType, contourModelSetType).GetPointer(); break; case QmitkDataSelectionWidget::SegmentationOrSurfacePredicate: returnValue = mitk::NodePredicateOr::New( mitk::NodePredicateAnd::New(imageType, isBinaryOrSegmentation), labelSetImageType).GetPointer(); returnValue = mitk::NodePredicateOr::New(returnValue, surfaceType).GetPointer(); break; default: assert(false && "Unknown predefined predicate!"); return nullptr; } return mitk::NodePredicateAnd::New(returnValue, nonHelperObject).GetPointer(); } QmitkDataSelectionWidget::QmitkDataSelectionWidget(QWidget* parent) : QWidget(parent) { m_Controls.setupUi(this); m_Controls.helpLabel->hide(); } QmitkDataSelectionWidget::~QmitkDataSelectionWidget() { } unsigned int QmitkDataSelectionWidget::AddDataSelection(QmitkDataSelectionWidget::Predicate predicate) { QString hint = "Select node"; switch (predicate) { case QmitkDataSelectionWidget::ImagePredicate: hint = "Select an image"; break; case QmitkDataSelectionWidget::SegmentationPredicate: hint = "Select a segmentation"; break; case QmitkDataSelectionWidget::SurfacePredicate: hint = "Select a surface"; break; case QmitkDataSelectionWidget::ImageAndSegmentationPredicate: hint = "Select an image or segmentation"; break; case QmitkDataSelectionWidget::ContourModelPredicate: hint = "Select a contour model"; break; case QmitkDataSelectionWidget::SegmentationOrSurfacePredicate: hint = "Select a segmentation or surface"; break; } return this->AddDataSelection("", hint, hint, "", predicate); } unsigned int QmitkDataSelectionWidget::AddDataSelection(mitk::NodePredicateBase* predicate) { return this->AddDataSelection("", "Select a node", "Select a node", "", predicate); } unsigned int QmitkDataSelectionWidget::AddDataSelection(const QString &labelText, const QString &info, const QString &popupTitel, const QString &popupHint, QmitkDataSelectionWidget::Predicate predicate) { return this->AddDataSelection(labelText, info, popupHint, popupTitel, CreatePredicate(predicate)); } unsigned int QmitkDataSelectionWidget::AddDataSelection(const QString &labelText, const QString &info, const QString &popupTitel, const QString &popupHint, mitk::NodePredicateBase* predicate) { int row = m_Controls.gridLayout->rowCount(); if (!labelText.isEmpty()) { QLabel* label = new QLabel(labelText, m_Controls.dataSelectionWidget); label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); m_Controls.gridLayout->addWidget(label, row, 0); } QmitkSingleNodeSelectionWidget* nodeSelection = new QmitkSingleNodeSelectionWidget(m_Controls.dataSelectionWidget); nodeSelection->SetSelectionIsOptional(false); nodeSelection->SetInvalidInfo(info); nodeSelection->SetPopUpTitel(popupTitel); nodeSelection->SetPopUpHint(popupHint); nodeSelection->SetDataStorage(this->GetDataStorage()); nodeSelection->SetNodePredicate(predicate); nodeSelection->SetAutoSelectNewNodes(true); nodeSelection->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); nodeSelection->setMinimumSize(0, 40); connect(nodeSelection, &QmitkAbstractNodeSelectionWidget::CurrentSelectionChanged, this, &QmitkDataSelectionWidget::OnSelectionChanged); m_Controls.gridLayout->addWidget(nodeSelection, row, 1); m_NodeSelectionWidgets.push_back(nodeSelection); return static_cast(m_NodeSelectionWidgets.size() - 1); + return row; } -mitk::DataStorage::Pointer QmitkDataSelectionWidget::GetDataStorage() const +void QmitkDataSelectionWidget::SetDataStorage(mitk::DataStorage* dataStorage) { - ctkServiceReference ref = mitk::PluginActivator::getContext()->getServiceReference(); - assert(ref == true); - - mitk::IDataStorageService* service = mitk::PluginActivator::getContext()->getService(ref); + if (m_DataStorage == dataStorage) + { + return; + } - assert(service); + m_DataStorage = dataStorage; +} - return service->GetDefaultDataStorage()->GetDataStorage(); +mitk::DataStorage::Pointer QmitkDataSelectionWidget::GetDataStorage() const +{ + return m_DataStorage.Lock(); } mitk::DataNode::Pointer QmitkDataSelectionWidget::GetSelection(unsigned int index) { assert(index < m_NodeSelectionWidgets.size()); return m_NodeSelectionWidgets[index]->GetSelectedNode(); } void QmitkDataSelectionWidget::SetPredicate(unsigned int index, Predicate predicate) { this->SetPredicate(index, CreatePredicate(predicate)); } void QmitkDataSelectionWidget::SetPredicate(unsigned int index, const mitk::NodePredicateBase* predicate) { assert(index < m_NodeSelectionWidgets.size()); m_NodeSelectionWidgets[index]->SetNodePredicate(predicate); } const mitk::NodePredicateBase *QmitkDataSelectionWidget::GetPredicate(unsigned int index) const { assert(index < m_NodeSelectionWidgets.size()); return m_NodeSelectionWidgets[index]->GetNodePredicate(); } void QmitkDataSelectionWidget::SetHelpText(const QString& text) { if (!text.isEmpty()) { m_Controls.helpLabel->setText(text); if (!m_Controls.helpLabel->isVisible()) m_Controls.helpLabel->show(); } else { m_Controls.helpLabel->hide(); } } void QmitkDataSelectionWidget::OnSelectionChanged(QList selection) { std::vector::iterator it = std::find(m_NodeSelectionWidgets.begin(), m_NodeSelectionWidgets.end(), sender()); assert(it != m_NodeSelectionWidgets.end()); const mitk::DataNode* result = nullptr; if (!selection.empty()) { result = selection.front(); } emit SelectionChanged(std::distance(m_NodeSelectionWidgets.begin(), it), result); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidget.h similarity index 89% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidget.h index 2586454d2d..4195fd235d 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidget.h @@ -1,69 +1,75 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkDataSelectionWidget_h #define QmitkDataSelectionWidget_h +#include + #include #include #include +#include + #include namespace mitk { class NodePredicateBase; } class QmitkSingleNodeSelectionWidget; -class QmitkDataSelectionWidget : public QWidget +class MITKSEGMENTATIONUI_EXPORT QmitkDataSelectionWidget : public QWidget { Q_OBJECT public: enum Predicate { ImagePredicate, SegmentationPredicate, SurfacePredicate, ImageAndSegmentationPredicate, ContourModelPredicate, SegmentationOrSurfacePredicate }; explicit QmitkDataSelectionWidget(QWidget* parent = nullptr); ~QmitkDataSelectionWidget() override; unsigned int AddDataSelection(Predicate predicate); unsigned int AddDataSelection(mitk::NodePredicateBase* predicate = nullptr); unsigned int AddDataSelection(const QString &labelText, const QString &info, const QString &popupTitel, const QString &popupHint, Predicate predicate); unsigned int AddDataSelection(const QString &labelText, const QString &info, const QString &popupTitel, const QString &popupHint, mitk::NodePredicateBase* predicate = nullptr); + void SetDataStorage(mitk::DataStorage* dataStorage); mitk::DataStorage::Pointer GetDataStorage() const; mitk::DataNode::Pointer GetSelection(unsigned int index); void SetPredicate(unsigned int index, Predicate predicate); void SetPredicate(unsigned int index, const mitk::NodePredicateBase* predicate); const mitk::NodePredicateBase *GetPredicate(unsigned int index) const; void SetHelpText(const QString& text); signals: void SelectionChanged(unsigned int index, const mitk::DataNode* selection); private slots: void OnSelectionChanged(QList selection); private: Ui::QmitkDataSelectionWidgetControls m_Controls; + mitk::WeakPointer m_DataStorage; std::vector m_NodeSelectionWidgets; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidgetControls.ui b/Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidgetControls.ui similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/Common/QmitkDataSelectionWidgetControls.ui rename to Modules/SegmentationUI/SegmentationUtilities/QmitkDataSelectionWidgetControls.ui diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidget.cpp similarity index 81% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidget.cpp index b318653e4a..0e542d4d04 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidget.cpp @@ -1,382 +1,393 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkImageMaskingWidget.h" -#include "mitkImage.h" -#include "../../Common/QmitkDataSelectionWidget.h" +#include +#include #include #include +#include #include #include #include #include #include #include #include #include #include #include #include #include namespace { bool IsSurface(const mitk::DataNode* dataNode) { if (nullptr != dataNode) { if (nullptr != dynamic_cast(dataNode->GetData())) return true; } return false; } } static const char* const HelpText = "Select an image and a segmentation or surface"; -QmitkImageMaskingWidget::QmitkImageMaskingWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) +QmitkImageMaskingWidget::QmitkImageMaskingWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent) { - m_Controls.setupUi(this); + m_Controls = new Ui::QmitkImageMaskingWidgetControls; + m_Controls->setupUi(this); - m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::ImagePredicate); - m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::SegmentationOrSurfacePredicate); - m_Controls.dataSelectionWidget->SetHelpText(HelpText); + m_Controls->dataSelectionWidget->SetDataStorage(dataStorage); + m_Controls->dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::ImagePredicate); + m_Controls->dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::SegmentationOrSurfacePredicate); + m_Controls->dataSelectionWidget->SetHelpText(HelpText); // T28795: Disable 2-d reference images since they do not work yet (segmentations are at least 3-d images with a single slice) - m_Controls.dataSelectionWidget->SetPredicate(0, mitk::NodePredicateAnd::New( + m_Controls->dataSelectionWidget->SetPredicate(0, mitk::NodePredicateAnd::New( mitk::NodePredicateNot::New(mitk::NodePredicateDimension::New(2)), - m_Controls.dataSelectionWidget->GetPredicate(0))); + m_Controls->dataSelectionWidget->GetPredicate(0))); this->EnableButtons(false); - connect(m_Controls.btnMaskImage, SIGNAL(clicked()), this, SLOT(OnMaskImagePressed())); - connect(m_Controls.rbnCustom, SIGNAL(toggled(bool)), this, SLOT(OnCustomValueButtonToggled(bool))); - connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), + connect(m_Controls->btnMaskImage, SIGNAL(clicked()), this, SLOT(OnMaskImagePressed())); + connect(m_Controls->rbnCustom, SIGNAL(toggled(bool)), this, SLOT(OnCustomValueButtonToggled(bool))); + connect(m_Controls->dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); - if( m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && - m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) + if( m_Controls->dataSelectionWidget->GetSelection(0).IsNotNull() && + m_Controls->dataSelectionWidget->GetSelection(1).IsNotNull() ) { - this->OnSelectionChanged(0, m_Controls.dataSelectionWidget->GetSelection(0)); + this->OnSelectionChanged(0, m_Controls->dataSelectionWidget->GetSelection(0)); } } QmitkImageMaskingWidget::~QmitkImageMaskingWidget() { } void QmitkImageMaskingWidget::OnSelectionChanged(unsigned int index, const mitk::DataNode *selection) { - auto *dataSelectionWidget = m_Controls.dataSelectionWidget; + auto *dataSelectionWidget = m_Controls->dataSelectionWidget; auto node0 = dataSelectionWidget->GetSelection(0); if (index == 0) { dataSelectionWidget->SetPredicate(1, QmitkDataSelectionWidget::SegmentationOrSurfacePredicate); if (node0.IsNotNull()) { dataSelectionWidget->SetPredicate(1, mitk::NodePredicateAnd::New( mitk::NodePredicateGeometry::New(node0->GetData()->GetGeometry()), dataSelectionWidget->GetPredicate(1))); } } auto node1 = dataSelectionWidget->GetSelection(1); if (node0.IsNull() || node1.IsNull()) { dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); } else { this->SelectionControl(index, selection); } } void QmitkImageMaskingWidget::SelectionControl(unsigned int index, const mitk::DataNode* selection) { - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(index); //if Image-Masking is enabled, check if image-dimension of reference and binary image is identical if( !IsSurface(dataSelectionWidget->GetSelection(1)) ) { if( dataSelectionWidget->GetSelection(0) == dataSelectionWidget->GetSelection(1) ) { dataSelectionWidget->SetHelpText("Select two different images above"); this->EnableButtons(false); return; } else if( node.IsNotNull() && selection ) { mitk::Image::Pointer referenceImage = dynamic_cast ( dataSelectionWidget->GetSelection(0)->GetData() ); mitk::Image::Pointer maskImage = dynamic_cast ( dataSelectionWidget->GetSelection(1)->GetData() ); if (maskImage.IsNull()) { dataSelectionWidget->SetHelpText("Different image sizes cannot be masked"); this->EnableButtons(false); return; } } else { dataSelectionWidget->SetHelpText(HelpText); return; } } dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } void QmitkImageMaskingWidget::EnableButtons(bool enable) { - m_Controls.grpBackgroundValue->setEnabled(enable); - m_Controls.btnMaskImage->setEnabled(enable); + m_Controls->grpBackgroundValue->setEnabled(enable); + m_Controls->btnMaskImage->setEnabled(enable); } template void GetRange(const itk::Image*, double& bottom, double& top) { bottom = std::numeric_limits::lowest(); top = std::numeric_limits::max(); } void QmitkImageMaskingWidget::OnCustomValueButtonToggled(bool checked) { - m_Controls.txtCustom->setEnabled(checked); + m_Controls->txtCustom->setEnabled(checked); } void QmitkImageMaskingWidget::OnMaskImagePressed() { //Disable Buttons during calculation and initialize Progressbar this->EnableButtons(false); mitk::ProgressBar::GetInstance()->AddStepsToDo(4); mitk::ProgressBar::GetInstance()->Progress(); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; //create result image, get mask node and reference image mitk::Image::Pointer resultImage(nullptr); mitk::DataNode::Pointer maskingNode = dataSelectionWidget->GetSelection(1); mitk::Image::Pointer referenceImage = static_cast(dataSelectionWidget->GetSelection(0)->GetData()); if(referenceImage.IsNull() || maskingNode.IsNull() ) { MITK_ERROR << "Selection does not contain an image"; QMessageBox::information( this, "Image and Surface Masking", "Selection does not contain an image", QMessageBox::Ok ); - m_Controls.btnMaskImage->setEnabled(true); + m_Controls->btnMaskImage->setEnabled(true); return; } //Do Image-Masking if (!IsSurface(maskingNode)) { mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer maskImage = dynamic_cast ( maskingNode->GetData() ); if(maskImage.IsNull() ) { MITK_ERROR << "Selection does not contain a segmentation"; QMessageBox::information( this, "Image and Surface Masking", "Selection does not contain a segmentation", QMessageBox::Ok ); this->EnableButtons(); return; } resultImage = this->MaskImage(referenceImage, maskImage); } //Do Surface-Masking else { mitk::ProgressBar::GetInstance()->Progress(); //1. convert surface to image mitk::Surface::Pointer surface = dynamic_cast ( maskingNode->GetData() ); //TODO Get 3D Surface of current time step if(surface.IsNull()) { MITK_ERROR << "Selection does not contain a surface"; QMessageBox::information( this, "Image and Surface Masking", "Selection does not contain a surface", QMessageBox::Ok ); this->EnableButtons(); return; } mitk::Image::Pointer maskImage = this->ConvertSurfaceToImage( referenceImage, surface ); //2. mask reference image with mask image if(maskImage.IsNotNull() && referenceImage->GetLargestPossibleRegion().GetSize() == maskImage->GetLargestPossibleRegion().GetSize() ) { resultImage = this->MaskImage( referenceImage, maskImage ); } } mitk::ProgressBar::GetInstance()->Progress(); if( resultImage.IsNull() ) { MITK_ERROR << "Masking failed"; QMessageBox::information( this, "Image and Surface Masking", "Masking failed. For more information please see logging window.", QMessageBox::Ok ); this->EnableButtons(); mitk::ProgressBar::GetInstance()->Progress(4); return; } //Add result to data storage this->AddToDataStorage( dataSelectionWidget->GetDataStorage(), resultImage, dataSelectionWidget->GetSelection(0)->GetName() + "_" + dataSelectionWidget->GetSelection(1)->GetName(), dataSelectionWidget->GetSelection(0)); this->EnableButtons(); mitk::ProgressBar::GetInstance()->Progress(); } mitk::Image::Pointer QmitkImageMaskingWidget::MaskImage(mitk::Image::Pointer referenceImage, mitk::Image::Pointer maskImage ) { mitk::ScalarType backgroundValue = 0.0; - if (m_Controls.rbnMinimum->isChecked()) + if (m_Controls->rbnMinimum->isChecked()) { backgroundValue = referenceImage->GetStatistics()->GetScalarValueMin(); } - else if (m_Controls.rbnCustom->isChecked()) + else if (m_Controls->rbnCustom->isChecked()) { auto warningTitle = QStringLiteral("Invalid custom pixel value"); bool ok = false; - auto originalBackgroundValue = m_Controls.txtCustom->text().toDouble(&ok); + auto originalBackgroundValue = m_Controls->txtCustom->text().toDouble(&ok); if (!ok) { // Input is not even a number QMessageBox::warning(nullptr, warningTitle, "Please enter a valid number as custom pixel value."); return nullptr; } else { // Clamp to the numerical limits of the pixel/component type double bottom, top; if (referenceImage->GetDimension() == 4) { AccessFixedDimensionByItk_n(referenceImage, GetRange, 4, (bottom, top)); } else { AccessByItk_n(referenceImage, GetRange, (bottom, top)); } backgroundValue = std::max(bottom, std::min(originalBackgroundValue, top)); // Get rid of decimals for integral numbers auto type = referenceImage->GetPixelType().GetComponentType(); if (type != itk::IOComponentEnum::FLOAT && type != itk::IOComponentEnum::DOUBLE) backgroundValue = std::round(backgroundValue); } // Ask the user for permission before correcting their input if (std::abs(originalBackgroundValue - backgroundValue) > 1e-4) { auto warningText = QString( "

The custom pixel value %1 lies not within the range of valid pixel values for the selected image.

" "

Apply the closest valid pixel value %2 instead?

").arg(originalBackgroundValue).arg(backgroundValue); auto ret = QMessageBox::warning( nullptr, warningTitle, warningText, QMessageBox::StandardButton::Apply | QMessageBox::StandardButton::Cancel, QMessageBox::StandardButton::Apply); if (QMessageBox::StandardButton::Apply != ret) return nullptr; - m_Controls.txtCustom->setText(QString("%1").arg(backgroundValue)); + m_Controls->txtCustom->setText(QString("%1").arg(backgroundValue)); } } auto maskFilter = mitk::MaskImageFilter::New(); maskFilter->SetInput(referenceImage); maskFilter->SetMask(maskImage); maskFilter->OverrideOutsideValueOn(); maskFilter->SetOutsideValue(backgroundValue); try { maskFilter->Update(); } catch(const itk::ExceptionObject& e) { MITK_ERROR << e.GetDescription(); return nullptr; } return maskFilter->GetOutput(); } mitk::Image::Pointer QmitkImageMaskingWidget::ConvertSurfaceToImage( mitk::Image::Pointer image, mitk::Surface::Pointer surface ) { mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); mitk::SurfaceToImageFilter::Pointer surfaceToImageFilter = mitk::SurfaceToImageFilter::New(); surfaceToImageFilter->MakeOutputBinaryOn(); surfaceToImageFilter->SetInput(surface); surfaceToImageFilter->SetImage(image); try { surfaceToImageFilter->Update(); } catch(itk::ExceptionObject& excpt) { MITK_ERROR << excpt.GetDescription(); return nullptr; } mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer resultImage = mitk::Image::New(); resultImage = surfaceToImageFilter->GetOutput(); return resultImage; } void QmitkImageMaskingWidget::AddToDataStorage(mitk::DataStorage::Pointer dataStorage, mitk::Image::Pointer segmentation, const std::string& name, mitk::DataNode::Pointer parent ) { - auto dataNode = mitk::DataNode::New(); + if (dataStorage.IsNull()) + { + std::string exception = "Cannot add result to the data storage. Data storage invalid."; + MITK_ERROR << "Masking failed: " << exception; + QMessageBox::information(nullptr, "Masking failed", QString::fromStdString(exception)); + } + auto dataNode = mitk::DataNode::New(); dataNode->SetName(name); dataNode->SetData(segmentation); if (parent.IsNotNull()) { mitk::LevelWindow levelWindow; parent->GetLevelWindow(levelWindow); dataNode->SetLevelWindow(levelWindow); } dataStorage->Add(dataNode, parent); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidget.h similarity index 80% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidget.h index 7a24096fb5..b8be1847bf 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidget.h @@ -1,77 +1,87 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkImageMaskingWidget_h #define QmitkImageMaskingWidget_h -#include "../QmitkSegmentationUtilityWidget.h" -#include +#include +#include #include +#include -namespace mitk { +namespace Ui +{ + class QmitkImageMaskingWidgetControls; +} + +namespace mitk +{ + class DataStorage; class Image; } /*! \brief QmitkImageMaskingWidget Tool masks an image with a binary image or a surface. The Method requires an image and a binary image mask or a surface. The input image and the binary image mask must be of the same size. Masking with a surface creates first a binary image of the surface and then use this for the masking of the input image. */ -class QmitkImageMaskingWidget : public QmitkSegmentationUtilityWidget +class MITKSEGMENTATIONUI_EXPORT QmitkImageMaskingWidget : public QmitkSegmentationUtilityWidget { Q_OBJECT public: /** @brief Default constructor, including creation of GUI elements and signals/slots connections. */ - explicit QmitkImageMaskingWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = nullptr); + explicit QmitkImageMaskingWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent = nullptr); /** @brief Defaul destructor. */ ~QmitkImageMaskingWidget() override; private slots: /** @brief This slot is called if the selection in the workbench is changed. */ void OnSelectionChanged(unsigned int index, const mitk::DataNode* selection); /** @brief This slot is called if user activates the button to mask an image. */ void OnMaskImagePressed(); /** @brief This slot is called if the user toggles the "Custom" radio button. */ void OnCustomValueButtonToggled(bool checked); private: /** @brief Check if selections is valid. */ void SelectionControl( unsigned int index, const mitk::DataNode* selection); /** @brief Enable buttons if data selction is valid. */ void EnableButtons(bool enable = true); /** @brief Mask an image with a given binary mask. Note that the input image and the mask image must be of the same size. */ itk::SmartPointer MaskImage(itk::SmartPointer referenceImage, itk::SmartPointer maskImage ); /** @brief Convert a surface into an binary image. */ itk::SmartPointer ConvertSurfaceToImage( itk::SmartPointer image, mitk::Surface::Pointer surface ); /** @brief Adds a new data object to the DataStorage.*/ void AddToDataStorage(mitk::DataStorage::Pointer dataStorage, itk::SmartPointer segmentation, const std::string& name, mitk::DataNode::Pointer parent = nullptr); - Ui::QmitkImageMaskingWidgetControls m_Controls; + Ui::QmitkImageMaskingWidgetControls* m_Controls; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidgetControls.ui b/Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidgetControls.ui similarity index 97% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidgetControls.ui rename to Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidgetControls.ui index ff45a758c6..6d0bfa0eaf 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidgetControls.ui +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkImageMaskingWidgetControls.ui @@ -1,109 +1,109 @@ QmitkImageMaskingWidgetControls 0 0 238 329 0 0 Background value Zero true Minimum 0 0 Custom: false 0 Mask Qt::Vertical 20 40 QmitkDataSelectionWidget QWidget -
internal/Common/QmitkDataSelectionWidget.h
+
QmitkDataSelectionWidget.h
1
diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidget.cpp similarity index 57% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidget.cpp index 5a15febb83..b02a5ea938 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.cpp +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidget.cpp @@ -1,251 +1,258 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkMorphologicalOperationsWidget.h" +#include + #include #include + #include static const char* const HelpText = "Select a segmentation above"; -QmitkMorphologicalOperationsWidget::QmitkMorphologicalOperationsWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) +QmitkMorphologicalOperationsWidget::QmitkMorphologicalOperationsWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent) { - m_Controls.setupUi(this); - - m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::SegmentationPredicate); - m_Controls.dataSelectionWidget->SetHelpText(HelpText); - - connect(m_Controls.btnClosing, SIGNAL(clicked()), this, SLOT(OnClosingButtonClicked())); - connect(m_Controls.btnOpening, SIGNAL(clicked()), this, SLOT(OnOpeningButtonClicked())); - connect(m_Controls.btnDilatation, SIGNAL(clicked()), this, SLOT(OnDilatationButtonClicked())); - connect(m_Controls.btnErosion, SIGNAL(clicked()), this, SLOT(OnErosionButtonClicked())); - connect(m_Controls.btnFillHoles, SIGNAL(clicked()), this, SLOT(OnFillHolesButtonClicked())); - connect(m_Controls.radioButtonMorphoCross, SIGNAL(clicked()), this, SLOT(OnRadioButtonsClicked())); - connect(m_Controls.radioButtonMorphoBall, SIGNAL(clicked()), this, SLOT(OnRadioButtonsClicked())); - connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); - - if (m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull()) - this->OnSelectionChanged(0, m_Controls.dataSelectionWidget->GetSelection(0)); + m_Controls = new Ui::QmitkMorphologicalOperationsWidgetControls; + m_Controls->setupUi(this); + + m_Controls->dataSelectionWidget->SetDataStorage(dataStorage); + m_Controls->dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::SegmentationPredicate); + m_Controls->dataSelectionWidget->SetHelpText(HelpText); + + connect(m_Controls->btnClosing, SIGNAL(clicked()), this, SLOT(OnClosingButtonClicked())); + connect(m_Controls->btnOpening, SIGNAL(clicked()), this, SLOT(OnOpeningButtonClicked())); + connect(m_Controls->btnDilatation, SIGNAL(clicked()), this, SLOT(OnDilatationButtonClicked())); + connect(m_Controls->btnErosion, SIGNAL(clicked()), this, SLOT(OnErosionButtonClicked())); + connect(m_Controls->btnFillHoles, SIGNAL(clicked()), this, SLOT(OnFillHolesButtonClicked())); + connect(m_Controls->radioButtonMorphoCross, SIGNAL(clicked()), this, SLOT(OnRadioButtonsClicked())); + connect(m_Controls->radioButtonMorphoBall, SIGNAL(clicked()), this, SLOT(OnRadioButtonsClicked())); + connect(m_Controls->dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); + + if (m_Controls->dataSelectionWidget->GetSelection(0).IsNotNull()) + this->OnSelectionChanged(0, m_Controls->dataSelectionWidget->GetSelection(0)); } QmitkMorphologicalOperationsWidget::~QmitkMorphologicalOperationsWidget() { } void QmitkMorphologicalOperationsWidget::OnSelectionChanged(unsigned int, const mitk::DataNode*) { - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(0); if (node.IsNotNull()) { - m_Controls.dataSelectionWidget->SetHelpText(""); + m_Controls->dataSelectionWidget->SetHelpText(""); this->EnableButtons(true); } else { - m_Controls.dataSelectionWidget->SetHelpText(HelpText); + m_Controls->dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); } } void QmitkMorphologicalOperationsWidget::EnableButtons(bool enable) { - m_Controls.btnClosing->setEnabled(enable); - m_Controls.btnDilatation->setEnabled(enable); - m_Controls.btnErosion->setEnabled(enable); - m_Controls.btnFillHoles->setEnabled(enable); - m_Controls.btnOpening->setEnabled(enable); + m_Controls->btnClosing->setEnabled(enable); + m_Controls->btnDilatation->setEnabled(enable); + m_Controls->btnErosion->setEnabled(enable); + m_Controls->btnFillHoles->setEnabled(enable); + m_Controls->btnOpening->setEnabled(enable); } void QmitkMorphologicalOperationsWidget::OnRadioButtonsClicked() { - bool enable = m_Controls.radioButtonMorphoBall->isChecked(); + bool enable = m_Controls->radioButtonMorphoBall->isChecked(); - m_Controls.sliderMorphFactor->setEnabled(enable); - m_Controls.spinBoxMorphFactor->setEnabled(enable); + m_Controls->sliderMorphFactor->setEnabled(enable); + m_Controls->spinBoxMorphFactor->setEnabled(enable); } void QmitkMorphologicalOperationsWidget::OnClosingButtonClicked() { QApplication::setOverrideCursor(QCursor(Qt::BusyCursor)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(0); mitk::Image::Pointer image = static_cast(node->GetData()); mitk::MorphologicalOperations::StructuralElementType structuralElement = CreateStructerElement_UI(); try { - int factor = m_Controls.spinBoxMorphFactor->isEnabled() - ? m_Controls.spinBoxMorphFactor->value() + int factor = m_Controls->spinBoxMorphFactor->isEnabled() + ? m_Controls->spinBoxMorphFactor->value() : 1; mitk::MorphologicalOperations::Closing(image, factor, structuralElement); } catch (const itk::ExceptionObject& exception) { MITK_WARN << "Exception caught: " << exception.GetDescription(); QApplication::restoreOverrideCursor(); return; } node->SetData(image); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); QApplication::restoreOverrideCursor(); } void QmitkMorphologicalOperationsWidget::OnOpeningButtonClicked() { QApplication::setOverrideCursor(QCursor(Qt::BusyCursor)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(0); mitk::Image::Pointer image = static_cast(node->GetData()); mitk::MorphologicalOperations::StructuralElementType structuralElement = CreateStructerElement_UI(); try { - int factor = m_Controls.spinBoxMorphFactor->isEnabled() - ? m_Controls.spinBoxMorphFactor->value() + int factor = m_Controls->spinBoxMorphFactor->isEnabled() + ? m_Controls->spinBoxMorphFactor->value() : 1; mitk::MorphologicalOperations::Opening(image, factor, structuralElement); } catch (const itk::ExceptionObject& exception) { MITK_WARN << "Exception caught: " << exception.GetDescription(); QApplication::restoreOverrideCursor(); return; } node->SetData(image); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); QApplication::restoreOverrideCursor(); } void QmitkMorphologicalOperationsWidget::OnDilatationButtonClicked() { QApplication::setOverrideCursor(QCursor(Qt::BusyCursor)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(0); mitk::Image::Pointer image = static_cast(node->GetData()); mitk::MorphologicalOperations::StructuralElementType structuralElement = this->CreateStructerElement_UI(); try { - int factor = m_Controls.spinBoxMorphFactor->isEnabled() - ? m_Controls.spinBoxMorphFactor->value() + int factor = m_Controls->spinBoxMorphFactor->isEnabled() + ? m_Controls->spinBoxMorphFactor->value() : 1; mitk::MorphologicalOperations::Dilate(image, factor, structuralElement); } catch (const itk::ExceptionObject& exception) { MITK_WARN << "Exception caught: " << exception.GetDescription(); QApplication::restoreOverrideCursor(); return; } node->SetData(image); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); QApplication::restoreOverrideCursor(); } void QmitkMorphologicalOperationsWidget::OnErosionButtonClicked() { QApplication::setOverrideCursor(QCursor(Qt::BusyCursor)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(0); mitk::Image::Pointer image = static_cast(node->GetData()); mitk::MorphologicalOperations::StructuralElementType structuralElement = CreateStructerElement_UI(); try { - int factor = m_Controls.spinBoxMorphFactor->isEnabled() - ? m_Controls.spinBoxMorphFactor->value() + int factor = m_Controls->spinBoxMorphFactor->isEnabled() + ? m_Controls->spinBoxMorphFactor->value() : 1; mitk::MorphologicalOperations::Erode(image, factor, structuralElement); } catch (const itk::ExceptionObject& exception) { MITK_WARN << "Exception caught: " << exception.GetDescription(); QApplication::restoreOverrideCursor(); return; } node->SetData(image); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); QApplication::restoreOverrideCursor(); } void QmitkMorphologicalOperationsWidget::OnFillHolesButtonClicked() { QApplication::setOverrideCursor(QCursor(Qt::BusyCursor)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(0); mitk::Image::Pointer image = static_cast(node->GetData()); try { mitk::MorphologicalOperations::FillHoles(image); } catch (const itk::ExceptionObject& exception) { MITK_WARN << "Exception caught: " << exception.GetDescription(); QApplication::restoreOverrideCursor(); return; } node->SetData(image); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); QApplication::restoreOverrideCursor(); } mitk::MorphologicalOperations::StructuralElementType QmitkMorphologicalOperationsWidget::CreateStructerElement_UI() { - bool ball = m_Controls.radioButtonMorphoBall->isChecked(); + bool ball = m_Controls->radioButtonMorphoBall->isChecked(); int accum_flag = 0; if(ball){ - if(m_Controls.planeSelectionComboBox->currentIndex() == 0) accum_flag = mitk::MorphologicalOperations::Ball; // 3D Operation - if(m_Controls.planeSelectionComboBox->currentIndex() == 1) accum_flag = mitk::MorphologicalOperations::Ball_Axial; // 2D Operation - Axial plane - if(m_Controls.planeSelectionComboBox->currentIndex() == 2) accum_flag = mitk::MorphologicalOperations::Ball_Sagittal; // 2D Operation - Sagittal plane - if(m_Controls.planeSelectionComboBox->currentIndex() == 3) accum_flag = mitk::MorphologicalOperations::Ball_Coronal; // 2D Operation - Coronal plane + if(m_Controls->planeSelectionComboBox->currentIndex() == 0) accum_flag = mitk::MorphologicalOperations::Ball; // 3D Operation + if(m_Controls->planeSelectionComboBox->currentIndex() == 1) accum_flag = mitk::MorphologicalOperations::Ball_Axial; // 2D Operation - Axial plane + if(m_Controls->planeSelectionComboBox->currentIndex() == 2) accum_flag = mitk::MorphologicalOperations::Ball_Sagittal; // 2D Operation - Sagittal plane + if(m_Controls->planeSelectionComboBox->currentIndex() == 3) accum_flag = mitk::MorphologicalOperations::Ball_Coronal; // 2D Operation - Coronal plane }else{ - if(m_Controls.planeSelectionComboBox->currentIndex() == 0) accum_flag = mitk::MorphologicalOperations::Cross; - if(m_Controls.planeSelectionComboBox->currentIndex() == 1) accum_flag = mitk::MorphologicalOperations::Cross_Axial; - if(m_Controls.planeSelectionComboBox->currentIndex() == 2) accum_flag = mitk::MorphologicalOperations::Cross_Sagittal; - if(m_Controls.planeSelectionComboBox->currentIndex() == 3) accum_flag = mitk::MorphologicalOperations::Cross_Coronal; + if(m_Controls->planeSelectionComboBox->currentIndex() == 0) accum_flag = mitk::MorphologicalOperations::Cross; + if(m_Controls->planeSelectionComboBox->currentIndex() == 1) accum_flag = mitk::MorphologicalOperations::Cross_Axial; + if(m_Controls->planeSelectionComboBox->currentIndex() == 2) accum_flag = mitk::MorphologicalOperations::Cross_Sagittal; + if(m_Controls->planeSelectionComboBox->currentIndex() == 3) accum_flag = mitk::MorphologicalOperations::Cross_Coronal; } return (mitk::MorphologicalOperations::StructuralElementType)accum_flag; } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidget.h similarity index 63% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidget.h index 386b1152b4..3d19b84668 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidget.h @@ -1,47 +1,61 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkMorphologicalOperationsWidget_h #define QmitkMorphologicalOperationsWidget_h -#include "../QmitkSegmentationUtilityWidget.h" -#include +#include + #include +#include + +namespace Ui +{ + class QmitkMorphologicalOperationsWidgetControls; +} + +namespace mitk +{ + class DataNode; + class DataStorage; +} /** \brief GUI class for morphological segmentation tools. */ -class QmitkMorphologicalOperationsWidget : public QmitkSegmentationUtilityWidget +class MITKSEGMENTATIONUI_EXPORT QmitkMorphologicalOperationsWidget : public QmitkSegmentationUtilityWidget { Q_OBJECT public: - explicit QmitkMorphologicalOperationsWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = nullptr); + explicit QmitkMorphologicalOperationsWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent = nullptr); ~QmitkMorphologicalOperationsWidget() override; public slots: void OnClosingButtonClicked(); void OnOpeningButtonClicked(); void OnDilatationButtonClicked(); void OnErosionButtonClicked(); void OnFillHolesButtonClicked(); void OnSelectionChanged(unsigned int index, const mitk::DataNode* selection); void OnRadioButtonsClicked(); protected: void EnableButtons(bool enable); private: - Ui::QmitkMorphologicalOperationsWidgetControls m_Controls; + Ui::QmitkMorphologicalOperationsWidgetControls* m_Controls; mitk::MorphologicalOperations::StructuralElementType CreateStructerElement_UI(); }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidgetControls.ui b/Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidgetControls.ui similarity index 85% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidgetControls.ui rename to Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidgetControls.ui index b328a3b7ad..bf923876d3 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidgetControls.ui +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkMorphologicalOperationsWidgetControls.ui @@ -1,323 +1,328 @@ QmitkMorphologicalOperationsWidgetControls 0 0 184 377 0 0 Structuring Element Ball true Cross 3D Operation 2D Operation - Axial 2D Operation - Sagittal 2D Operation - Coronal Radius 1 20 1 Qt::Horizontal 1 20 false 0 0 Dilation - - :/SegmentationUtilities/MorphologicalOperations/Dilate_48x48.png:/SegmentationUtilities/MorphologicalOperations/Dilate_48x48.png + + :/Qmitk/Dilate_48x48.png:/Qmitk/Dilate_48x48.png + 32 32 Qt::ToolButtonTextUnderIcon false 0 0 Erosion - - :/SegmentationUtilities/MorphologicalOperations/Erode_48x48.png:/SegmentationUtilities/MorphologicalOperations/Erode_48x48.png + + :/Qmitk/Erode_48x48.png:/Qmitk/Erode_48x48.png + 32 32 Qt::ToolButtonTextUnderIcon false 0 0 Closing - - :/SegmentationUtilities/MorphologicalOperations/Closing_48x48.png:/SegmentationUtilities/MorphologicalOperations/Closing_48x48.png + + :/Qmitk/Closing_48x48.png:/Qmitk/Closing_48x48.png + 32 32 Qt::ToolButtonTextUnderIcon false 0 0 Opening - - :/SegmentationUtilities/MorphologicalOperations/Opening_48x48.png:/SegmentationUtilities/MorphologicalOperations/Opening_48x48.png + + :/Qmitk/Opening_48x48.png:/Qmitk/Opening_48x48.png + 32 32 Qt::ToolButtonTextUnderIcon false 0 0 Globally fills holes in segmentation (structuring element and radius not required) Fill Holes - - :/SegmentationUtilities/MorphologicalOperations/FillHoles_48x48.png:/SegmentationUtilities/MorphologicalOperations/FillHoles_48x48.png + + :/Qmitk/FillHoles_48x48.png:/Qmitk/FillHoles_48x48.png + 32 32 Qt::ToolButtonTextUnderIcon Qt::Vertical 20 40 QmitkDataSelectionWidget QWidget -
internal/Common/QmitkDataSelectionWidget.h
+
QmitkDataSelectionWidget.h
1
- + sliderMorphFactor valueChanged(int) spinBoxMorphFactor setValue(int) 240 27 766 36 spinBoxMorphFactor valueChanged(int) sliderMorphFactor setValue(int) 784 38 657 38
diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkSegmentationUtilityWidget.h similarity index 93% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkSegmentationUtilityWidget.h index 80e988c1ea..d0328f9804 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkSegmentationUtilityWidget.h @@ -1,51 +1,53 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkSegmentationUtilityWidget_h #define QmitkSegmentationUtilityWidget_h +#include + #include namespace mitk { class SliceNavigationController; } /** \brief Base class for segmentation utility widgets that need access to the time navigation controller. * * Call GetTimeNavigationController() in your derived class to gain access to the time navigation controller. * The time navigation controller is not not available at all times and hence this method can return nullptr. */ -class QmitkSegmentationUtilityWidget : public QWidget +class MITKSEGMENTATIONUI_EXPORT QmitkSegmentationUtilityWidget : public QWidget { Q_OBJECT public: explicit QmitkSegmentationUtilityWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = nullptr); ~QmitkSegmentationUtilityWidget() override; /** \brief Usually called only from QmitkSegmentationUtilitiesView::RenderWindowPartActivated() and QmitkSegmentationUtilitiesView::RenderWindowPartDeactivated(). */ void SetTimeNavigationController(mitk::SliceNavigationController* timeNavigationController); protected: /** \brief Call this method to access the time navigation controller. * * \return Pointer to the time navigation controller or nullptr, if it is not available. */ mitk::SliceNavigationController* GetTimeNavigationController() const; private: mitk::SliceNavigationController* m_TimeNavigationController; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp b/Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidget.cpp similarity index 70% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp rename to Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidget.cpp index d358c17492..2e0edecc2f 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidget.cpp @@ -1,157 +1,170 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkSurfaceToImageWidget.h" +#include +#include #include #include #include #include #include #include #include #include #include static const char* const HelpText = "Select an image and a surface above"; -QmitkSurfaceToImageWidget::QmitkSurfaceToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) +QmitkSurfaceToImageWidget::QmitkSurfaceToImageWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent) { - m_Controls.setupUi(this); + m_Controls = new Ui::QmitkSurfaceToImageWidgetControls; + m_Controls->setupUi(this); - m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::ImageAndSegmentationPredicate); - m_Controls.dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::SurfacePredicate); - m_Controls.dataSelectionWidget->SetHelpText(HelpText); + m_Controls->dataSelectionWidget->SetDataStorage(dataStorage); + m_Controls->dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::ImageAndSegmentationPredicate); + m_Controls->dataSelectionWidget->AddDataSelection(QmitkDataSelectionWidget::SurfacePredicate); + m_Controls->dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); - connect (m_Controls.btnSurface2Image, SIGNAL(pressed()), this, SLOT(OnSurface2ImagePressed())); - connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), + connect (m_Controls->btnSurface2Image, SIGNAL(pressed()), this, SLOT(OnSurface2ImagePressed())); + connect(m_Controls->dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); - if( m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && - m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) + if( m_Controls->dataSelectionWidget->GetSelection(0).IsNotNull() && + m_Controls->dataSelectionWidget->GetSelection(1).IsNotNull() ) { - this->OnSelectionChanged(0, m_Controls.dataSelectionWidget->GetSelection(0)); + this->OnSelectionChanged(0, m_Controls->dataSelectionWidget->GetSelection(0)); } } QmitkSurfaceToImageWidget::~QmitkSurfaceToImageWidget() { } void QmitkSurfaceToImageWidget::EnableButtons(bool enable) { - m_Controls.btnSurface2Image->setEnabled(enable); + m_Controls->btnSurface2Image->setEnabled(enable); } void QmitkSurfaceToImageWidget::OnSelectionChanged(unsigned int, const mitk::DataNode*) { - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer surfaceNode = dataSelectionWidget->GetSelection(1); if (imageNode.IsNull() || surfaceNode.IsNull() ) { dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); } else { mitk::Image::Pointer image = dynamic_cast( dataSelectionWidget->GetSelection(0)->GetData() ); mitk::Surface::Pointer surface = dynamic_cast( dataSelectionWidget->GetSelection(1)->GetData() ); if( image->GetTimeSteps() != surface->GetTimeSteps() ) { dataSelectionWidget->SetHelpText("Image and surface are of different size"); this->EnableButtons(false); } else { dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } } } void QmitkSurfaceToImageWidget::OnSurface2ImagePressed() { this->EnableButtons(false); - QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; + QmitkDataSelectionWidget* dataSelectionWidget = m_Controls->dataSelectionWidget; mitk::Image::Pointer image = dynamic_cast( dataSelectionWidget->GetSelection(0)->GetData() ); mitk::Surface::Pointer surface = dynamic_cast( dataSelectionWidget->GetSelection(1)->GetData() ); if( image.IsNull() || surface.IsNull()) { MITK_ERROR << "Selection does not contain an image and/or a surface"; QMessageBox::information( this, "Surface To Image", "Selection does not contain an image and/or a surface", QMessageBox::Ok ); this->EnableButtons(); return; } mitk::Image::Pointer resultImage(nullptr); resultImage = this->ConvertSurfaceToImage( image, surface ); if( resultImage.IsNull() ) { MITK_ERROR << "Convert Surface to binary image failed"; QMessageBox::information( this, "Surface To Image", "Convert Surface to binary image failed", QMessageBox::Ok ); this->EnableButtons(); return; } //create name for result node std::string nameOfResultImage = dataSelectionWidget->GetSelection(0)->GetName(); nameOfResultImage.append("_"); nameOfResultImage.append(dataSelectionWidget->GetSelection(1)->GetName()); //create data node and add to data storage mitk::DataNode::Pointer resultNode = mitk::DataNode::New(); resultNode->SetData( resultImage ); resultNode->SetProperty("name", mitk::StringProperty::New(nameOfResultImage) ); // resultNode->SetProperty("binary", mitk::BoolProperty::New(true) ); - dataSelectionWidget->GetDataStorage()->Add(resultNode, dataSelectionWidget->GetSelection(0)); + auto dataStorage = dataSelectionWidget->GetDataStorage(); + if (dataStorage.IsNull()) + { + std::string exception = "Cannot add result to the data storage. Data storage invalid."; + MITK_ERROR << "Error converting surface to binary image: " << exception; + QMessageBox::information(nullptr, "Error converting surface to binary image", QString::fromStdString(exception)); + } + dataStorage->Add(resultNode, dataSelectionWidget->GetSelection(0)); this->EnableButtons(); } mitk::LabelSetImage::Pointer QmitkSurfaceToImageWidget::ConvertSurfaceToImage( mitk::Image::Pointer image, mitk::Surface::Pointer surface ) { mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); mitk::SurfaceToImageFilter::Pointer surfaceToImageFilter = mitk::SurfaceToImageFilter::New(); surfaceToImageFilter->MakeOutputBinaryOn(); surfaceToImageFilter->SetInput(surface); surfaceToImageFilter->SetImage(image); try { surfaceToImageFilter->Update(); } catch(itk::ExceptionObject& excpt) { MITK_ERROR << excpt.GetDescription(); return nullptr; } mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer resultImage = surfaceToImageFilter->GetOutput(); mitk::LabelSetImage::Pointer multilabelImage = mitk::LabelSetImage::New(); multilabelImage->InitializeByLabeledImage(resultImage); return multilabelImage; } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.h b/Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidget.h similarity index 72% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.h rename to Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidget.h index 9c8895fbe3..55e2178163 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.h +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidget.h @@ -1,64 +1,77 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkSurfaceToImageWidget_h #define QmitkSurfaceToImageWidget_h -#include "../QmitkSegmentationUtilityWidget.h" -#include +#include -namespace mitk { +#include + +#include "itkSmartPointer.h" + +namespace Ui +{ + class QmitkSurfaceToImageWidgetControls; +} + +namespace mitk +{ + class DataNode; + class DataStorage; class Surface; class Image; class LabelSetImage; } /*! \brief QmitkSurfaceToImageWidget The Tool converts a surface to a binary image. The Method requires a surface and an image, which header information defines the output image. The resulting binary image has the same dimension, size, and Geometry3D as the input image. */ -class QmitkSurfaceToImageWidget : public QmitkSegmentationUtilityWidget +class MITKSEGMENTATIONUI_EXPORT QmitkSurfaceToImageWidget : public QmitkSegmentationUtilityWidget { Q_OBJECT public: /** @brief Default constructor, including creation of GUI elements and signals/slots connections. */ - explicit QmitkSurfaceToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent = nullptr); + explicit QmitkSurfaceToImageWidget(mitk::DataStorage* dataStorage, + mitk::SliceNavigationController* timeNavigationController, + QWidget* parent = nullptr); /** @brief Defaul destructor. */ ~QmitkSurfaceToImageWidget() override; private slots: /** @brief This slot is called if the selection in the workbench is changed. */ void OnSelectionChanged(unsigned int index, const mitk::DataNode* selection); /** @brief This slot is called if user activates the button to convert a surface into a binary image. */ void OnSurface2ImagePressed(); private: /** @brief Enable buttons if data selction is valid. */ void EnableButtons(bool enable = true); /** @brief Convert a surface into an binary image. */ itk::SmartPointer ConvertSurfaceToImage( itk::SmartPointer image, itk::SmartPointer surface ); - Ui::QmitkSurfaceToImageWidgetControls m_Controls; + Ui::QmitkSurfaceToImageWidgetControls* m_Controls; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidgetControls.ui b/Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidgetControls.ui similarity index 95% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidgetControls.ui rename to Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidgetControls.ui index a9ae0103d8..e617a3205b 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidgetControls.ui +++ b/Modules/SegmentationUI/SegmentationUtilities/QmitkSurfaceToImageWidgetControls.ui @@ -1,56 +1,56 @@ QmitkSurfaceToImageWidgetControls 0 0 98 62 0 0 Convert Qt::Vertical 20 40 QmitkDataSelectionWidget QWidget -
internal/Common/QmitkDataSelectionWidget.h
+
QmitkDataSelectionWidget.h
1
diff --git a/Modules/SegmentationUI/files.cmake b/Modules/SegmentationUI/files.cmake index 5974d42e8d..adfa9a06ad 100644 --- a/Modules/SegmentationUI/files.cmake +++ b/Modules/SegmentationUI/files.cmake @@ -1,79 +1,99 @@ -set( CPP_FILES -Qmitk/QmitkSegWithPreviewToolGUIBase.cpp -Qmitk/QmitkMultiLabelSegWithPreviewToolGUIBase.cpp -Qmitk/QmitkBinaryThresholdToolGUIBase.cpp -Qmitk/QmitkBinaryThresholdToolGUI.cpp -Qmitk/QmitkBinaryThresholdULToolGUI.cpp -Qmitk/QmitkConfirmSegmentationDialog.cpp -Qmitk/QmitkCopyToClipBoardDialog.cpp -Qmitk/QmitkDrawPaintbrushToolGUI.cpp -Qmitk/QmitkErasePaintbrushToolGUI.cpp -Qmitk/QmitkEditableContourToolGUIBase.cpp -Qmitk/QmitkGrowCutToolGUI.cpp -Qmitk/QmitkLiveWireTool2DGUI.cpp -Qmitk/QmitkLassoToolGUI.cpp -Qmitk/QmitkOtsuTool3DGUI.cpp -Qmitk/QmitkPaintbrushToolGUI.cpp -Qmitk/QmitkPickingToolGUI.cpp -Qmitk/QmitkSlicesInterpolator.cpp -Qmitk/QmitkToolGUI.cpp -Qmitk/QmitkToolGUIArea.cpp -Qmitk/QmitkToolSelectionBox.cpp -Qmitk/QmitknnUNetFolderParser.cpp -Qmitk/QmitknnUNetToolGUI.cpp -Qmitk/QmitknnUNetWorker.cpp -Qmitk/QmitknnUNetGPU.cpp -Qmitk/QmitkSurfaceStampWidget.cpp -Qmitk/QmitkMaskStampWidget.cpp -Qmitk/QmitkStaticDynamicSegmentationDialog.cpp -Qmitk/QmitkSurfaceBasedInterpolatorWidget.cpp -Qmitk/QmitkSimpleLabelSetListWidget.cpp +set(CPP_FILES + Qmitk/QmitkSegWithPreviewToolGUIBase.cpp + Qmitk/QmitkMultiLabelSegWithPreviewToolGUIBase.cpp + Qmitk/QmitkBinaryThresholdToolGUIBase.cpp + Qmitk/QmitkBinaryThresholdToolGUI.cpp + Qmitk/QmitkBinaryThresholdULToolGUI.cpp + Qmitk/QmitkConfirmSegmentationDialog.cpp + Qmitk/QmitkCopyToClipBoardDialog.cpp + Qmitk/QmitkDrawPaintbrushToolGUI.cpp + Qmitk/QmitkErasePaintbrushToolGUI.cpp + Qmitk/QmitkEditableContourToolGUIBase.cpp + Qmitk/QmitkGrowCutToolGUI.cpp + Qmitk/QmitkLiveWireTool2DGUI.cpp + Qmitk/QmitkLassoToolGUI.cpp + Qmitk/QmitkOtsuTool3DGUI.cpp + Qmitk/QmitkPaintbrushToolGUI.cpp + Qmitk/QmitkPickingToolGUI.cpp + Qmitk/QmitkSlicesInterpolator.cpp + Qmitk/QmitkToolGUI.cpp + Qmitk/QmitkToolGUIArea.cpp + Qmitk/QmitkToolSelectionBox.cpp + Qmitk/QmitknnUNetFolderParser.cpp + Qmitk/QmitknnUNetToolGUI.cpp + Qmitk/QmitknnUNetWorker.cpp + Qmitk/QmitknnUNetGPU.cpp + Qmitk/QmitkSurfaceStampWidget.cpp + Qmitk/QmitkMaskStampWidget.cpp + Qmitk/QmitkStaticDynamicSegmentationDialog.cpp + Qmitk/QmitkSurfaceBasedInterpolatorWidget.cpp + Qmitk/QmitkSimpleLabelSetListWidget.cpp + SegmentationUtilities/QmitkBooleanOperationsWidget.cpp + SegmentationUtilities/QmitkContourModelToImageWidget.cpp + SegmentationUtilities/QmitkImageMaskingWidget.cpp + SegmentationUtilities/QmitkMorphologicalOperationsWidget.cpp + SegmentationUtilities/QmitkSurfaceToImageWidget.cpp + SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp + SegmentationUtilities/QmitkDataSelectionWidget.cpp ) set(MOC_H_FILES -Qmitk/QmitkSegWithPreviewToolGUIBase.h -Qmitk/QmitkMultiLabelSegWithPreviewToolGUIBase.h -Qmitk/QmitkBinaryThresholdToolGUIBase.h -Qmitk/QmitkBinaryThresholdToolGUI.h -Qmitk/QmitkBinaryThresholdULToolGUI.h -Qmitk/QmitkConfirmSegmentationDialog.h -Qmitk/QmitkCopyToClipBoardDialog.h -Qmitk/QmitkDrawPaintbrushToolGUI.h -Qmitk/QmitkErasePaintbrushToolGUI.h -Qmitk/QmitkEditableContourToolGUIBase.h -Qmitk/QmitkGrowCutToolGUI.h -Qmitk/QmitkLiveWireTool2DGUI.h -Qmitk/QmitkLassoToolGUI.h -Qmitk/QmitkOtsuTool3DGUI.h -Qmitk/QmitkPaintbrushToolGUI.h -Qmitk/QmitkPickingToolGUI.h -Qmitk/QmitkSlicesInterpolator.h -Qmitk/QmitkToolGUI.h -Qmitk/QmitkToolGUIArea.h -Qmitk/QmitkToolSelectionBox.h -Qmitk/QmitknnUNetFolderParser.h -Qmitk/QmitknnUNetToolGUI.h -Qmitk/QmitknnUNetGPU.h -Qmitk/QmitknnUNetWorker.h -Qmitk/QmitknnUNetEnsembleLayout.h -Qmitk/QmitkSurfaceStampWidget.h -Qmitk/QmitkMaskStampWidget.h -Qmitk/QmitkStaticDynamicSegmentationDialog.h -Qmitk/QmitkSurfaceBasedInterpolatorWidget.h -Qmitk/QmitkSimpleLabelSetListWidget.h + Qmitk/QmitkSegWithPreviewToolGUIBase.h + Qmitk/QmitkMultiLabelSegWithPreviewToolGUIBase.h + Qmitk/QmitkBinaryThresholdToolGUIBase.h + Qmitk/QmitkBinaryThresholdToolGUI.h + Qmitk/QmitkBinaryThresholdULToolGUI.h + Qmitk/QmitkConfirmSegmentationDialog.h + Qmitk/QmitkCopyToClipBoardDialog.h + Qmitk/QmitkDrawPaintbrushToolGUI.h + Qmitk/QmitkErasePaintbrushToolGUI.h + Qmitk/QmitkEditableContourToolGUIBase.h + Qmitk/QmitkGrowCutToolGUI.h + Qmitk/QmitkLiveWireTool2DGUI.h + Qmitk/QmitkLassoToolGUI.h + Qmitk/QmitkOtsuTool3DGUI.h + Qmitk/QmitkPaintbrushToolGUI.h + Qmitk/QmitkPickingToolGUI.h + Qmitk/QmitkSlicesInterpolator.h + Qmitk/QmitkToolGUI.h + Qmitk/QmitkToolGUIArea.h + Qmitk/QmitkToolSelectionBox.h + Qmitk/QmitknnUNetFolderParser.h + Qmitk/QmitknnUNetToolGUI.h + Qmitk/QmitknnUNetGPU.h + Qmitk/QmitknnUNetWorker.h + Qmitk/QmitknnUNetEnsembleLayout.h + Qmitk/QmitkSurfaceStampWidget.h + Qmitk/QmitkMaskStampWidget.h + Qmitk/QmitkStaticDynamicSegmentationDialog.h + Qmitk/QmitkSurfaceBasedInterpolatorWidget.h + Qmitk/QmitkSimpleLabelSetListWidget.h + SegmentationUtilities/QmitkBooleanOperationsWidget.h + SegmentationUtilities/QmitkContourModelToImageWidget.h + SegmentationUtilities/QmitkImageMaskingWidget.h + SegmentationUtilities/QmitkMorphologicalOperationsWidget.h + SegmentationUtilities/QmitkSurfaceToImageWidget.h + SegmentationUtilities/QmitkSegmentationUtilityWidget.h + SegmentationUtilities/QmitkDataSelectionWidget.h ) set(UI_FILES -Qmitk/QmitkConfirmSegmentationDialog.ui -Qmitk/QmitkGrowCutToolWidgetControls.ui -Qmitk/QmitkOtsuToolWidgetControls.ui -Qmitk/QmitkSurfaceStampWidgetGUIControls.ui -Qmitk/QmitkMaskStampWidgetGUIControls.ui -Qmitk/QmitkSurfaceBasedInterpolatorWidgetGUIControls.ui -Qmitk/QmitknnUNetToolGUIControls.ui -Qmitk/QmitkEditableContourToolGUIControls.ui + Qmitk/QmitkConfirmSegmentationDialog.ui + Qmitk/QmitkGrowCutToolWidgetControls.ui + Qmitk/QmitkOtsuToolWidgetControls.ui + Qmitk/QmitkSurfaceStampWidgetGUIControls.ui + Qmitk/QmitkMaskStampWidgetGUIControls.ui + Qmitk/QmitkSurfaceBasedInterpolatorWidgetGUIControls.ui + Qmitk/QmitknnUNetToolGUIControls.ui + Qmitk/QmitkEditableContourToolGUIControls.ui + SegmentationUtilities/QmitkBooleanOperationsWidgetControls.ui + SegmentationUtilities/QmitkContourModelToImageWidgetControls.ui + SegmentationUtilities/QmitkImageMaskingWidgetControls.ui + SegmentationUtilities/QmitkMorphologicalOperationsWidgetControls.ui + SegmentationUtilities/QmitkSurfaceToImageWidgetControls.ui + SegmentationUtilities/QmitkDataSelectionWidgetControls.ui ) set(QRC_FILES resources/SegmentationUI.qrc ) diff --git a/Modules/SegmentationUI/resources/BooleanDifference_48x48.png b/Modules/SegmentationUI/resources/BooleanDifference_48x48.png index 5d7b6a69d6..89a7c9322c 100644 Binary files a/Modules/SegmentationUI/resources/BooleanDifference_48x48.png and b/Modules/SegmentationUI/resources/BooleanDifference_48x48.png differ diff --git a/Modules/SegmentationUI/resources/BooleanIntersection_48x48.png b/Modules/SegmentationUI/resources/BooleanIntersection_48x48.png index 554c43281b..b7301f31f5 100644 Binary files a/Modules/SegmentationUI/resources/BooleanIntersection_48x48.png and b/Modules/SegmentationUI/resources/BooleanIntersection_48x48.png differ diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanLabelA_32x32.png b/Modules/SegmentationUI/resources/BooleanLabelA_32x32.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/BooleanLabelA_32x32.png rename to Modules/SegmentationUI/resources/BooleanLabelA_32x32.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanLabelB_32x32.png b/Modules/SegmentationUI/resources/BooleanLabelB_32x32.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/BooleanLabelB_32x32.png rename to Modules/SegmentationUI/resources/BooleanLabelB_32x32.png diff --git a/Modules/SegmentationUI/resources/BooleanUnion_48x48.png b/Modules/SegmentationUI/resources/BooleanUnion_48x48.png index 4a425fc5c7..4b01a6d74c 100644 Binary files a/Modules/SegmentationUI/resources/BooleanUnion_48x48.png and b/Modules/SegmentationUI/resources/BooleanUnion_48x48.png differ diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/Closing_48x48.png b/Modules/SegmentationUI/resources/Closing_48x48.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/Closing_48x48.png rename to Modules/SegmentationUI/resources/Closing_48x48.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/Dilate_48x48.png b/Modules/SegmentationUI/resources/Dilate_48x48.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/Dilate_48x48.png rename to Modules/SegmentationUI/resources/Dilate_48x48.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/Erode_48x48.png b/Modules/SegmentationUI/resources/Erode_48x48.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/Erode_48x48.png rename to Modules/SegmentationUI/resources/Erode_48x48.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/FillHoles_48x48.png b/Modules/SegmentationUI/resources/FillHoles_48x48.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/FillHoles_48x48.png rename to Modules/SegmentationUI/resources/FillHoles_48x48.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/Opening_48x48.png b/Modules/SegmentationUI/resources/Opening_48x48.png similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/resources/Opening_48x48.png rename to Modules/SegmentationUI/resources/Opening_48x48.png diff --git a/Modules/SegmentationUI/resources/SegmentationUI.qrc b/Modules/SegmentationUI/resources/SegmentationUI.qrc index cfab8d398d..6cb9f4894b 100644 --- a/Modules/SegmentationUI/resources/SegmentationUI.qrc +++ b/Modules/SegmentationUI/resources/SegmentationUI.qrc @@ -1,40 +1,47 @@ AcceptCurrentInterpolation.png AcceptAllInterpolations.png AcceptSurfaceInterpolation.png BooleanDifference_48x48.png BooleanIntersection_48x48.png BooleanUnion_48x48.png + BooleanLabelA_32x32.png + BooleanLabelB_32x32.png + Dilate_48x48.png + Erode_48x48.png + Closing_48x48.png + Opening_48x48.png + FillHoles_48x48.png Accept_48x48.png Cancel_48x48.png Run_48x48.png ImportLabelSet_48x48.png ImportLabeledImage_48x48.png DeleteLayer_48x48.png PreviousLayer_48x48.png NextLayer_48x48.png AddLayer_48x48.png SegmentationInteractor_48x48.png LockExterior_48x48.png UnlockExterior_48x48.png NewLabel_48x48.png NewSegmentation_48x48.png ClearSeeds_48x48.png Start.png Stop.png Help_48x48.png AdvancedTools.png visible.svg invisible.svg lock.svg unlock.svg MergeLabels.png RemoveLabel.png EraseLabel.png CreateSurface.png CreateMask.png RandomColor.png RenameLabel.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/files.cmake b/Plugins/org.mitk.gui.qt.segmentation/files.cmake index ee2f6186bf..49b6f35827 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/files.cmake +++ b/Plugins/org.mitk.gui.qt.segmentation/files.cmake @@ -1,95 +1,73 @@ set(SRC_CPP_FILES QmitkSegmentationPreferencePage.cpp QmitkNewSegmentationDialog.cpp QmitkLabelSetWidget.cpp ) set(INTERNAL_CPP_FILES mitkPluginActivator.cpp QmitkSegmentationView.cpp + QmitkSegmentationUtilitiesView.cpp QmitkAutocropAction.cpp QmitkAutocropLabelSetImageAction.cpp QmitkCreatePolygonModelAction.cpp QmitkLoadMultiLabelPresetAction.cpp QmitkSaveMultiLabelPresetAction.cpp QmitkConvertSurfaceToLabelAction.cpp QmitkConvertMaskToLabelAction.cpp QmitkConvertToMultiLabelSegmentationAction.cpp QmitkCreateMultiLabelSegmentationAction.cpp - Common/QmitkDataSelectionWidget.cpp Common/QmitkLabelsWidget.cpp Common/QmitkLayersWidget.cpp - SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp - SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp - SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.cpp - SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp - SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp - SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.cpp - SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp ) set(UI_FILES src/QmitkSegmentationPreferencePageControls.ui src/QmitkNewSegmentationDialog.ui src/QmitkLabelSetWidgetControls.ui src/internal/QmitkSegmentationViewControls.ui - src/internal/Common/QmitkDataSelectionWidgetControls.ui + src/internal/QmitkSegmentationUtilitiesViewControls.ui src/internal/Common/QmitkLabelsWidgetControls.ui src/internal/Common/QmitkLayersWidgetControls.ui - src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesViewControls.ui - src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidgetControls.ui - src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidgetControls.ui - src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidgetControls.ui - src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidgetControls.ui - src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidgetControls.ui ) set(MOC_H_FILES src/QmitkSegmentationPreferencePage.h src/QmitkNewSegmentationDialog.h src/QmitkLabelSetWidget.h src/internal/mitkPluginActivator.h src/internal/QmitkSegmentationView.h + src/internal/QmitkSegmentationUtilitiesView.h src/internal/QmitkAutocropAction.h src/internal/QmitkAutocropLabelSetImageAction.h src/internal/QmitkCreatePolygonModelAction.h src/internal/QmitkLoadMultiLabelPresetAction.h src/internal/QmitkSaveMultiLabelPresetAction.h src/internal/QmitkConvertSurfaceToLabelAction.h src/internal/QmitkConvertMaskToLabelAction.h src/internal/QmitkConvertToMultiLabelSegmentationAction.h src/internal/QmitkCreateMultiLabelSegmentationAction.h - src/internal/Common/QmitkDataSelectionWidget.h src/internal/Common/QmitkLabelsWidget.h src/internal/Common/QmitkLayersWidget.h - src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h - src/internal/SegmentationUtilities/QmitkSegmentationUtilityWidget.h - src/internal/SegmentationUtilities/BooleanOperations/QmitkBooleanOperationsWidget.h - src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.h - src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.h - src/internal/SegmentationUtilities/MorphologicalOperations/QmitkMorphologicalOperationsWidget.h - src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.h ) set(CACHED_RESOURCE_FILES resources/segmentation.svg resources/segmentation_utilities.svg plugin.xml ) set(QRC_FILES resources/segmentation.qrc resources/SegmentationUtilities.qrc - resources/BooleanOperationsWidget.qrc - resources/MorphologicalOperationsWidget.qrc ) set(CPP_FILES) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanDifference_48x48.png b/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanDifference_48x48.png deleted file mode 100644 index 89a7c9322c..0000000000 Binary files a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanDifference_48x48.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanIntersection_48x48.png b/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanIntersection_48x48.png deleted file mode 100644 index b7301f31f5..0000000000 Binary files a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanIntersection_48x48.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanOperationsWidget.qrc b/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanOperationsWidget.qrc deleted file mode 100644 index 478b9e9d8c..0000000000 --- a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanOperationsWidget.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - BooleanDifference_48x48.png - BooleanIntersection_48x48.png - BooleanUnion_48x48.png - - diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanUnion_48x48.png b/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanUnion_48x48.png deleted file mode 100644 index 4b01a6d74c..0000000000 Binary files a/Plugins/org.mitk.gui.qt.segmentation/resources/BooleanUnion_48x48.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/MorphologicalOperationsWidget.qrc b/Plugins/org.mitk.gui.qt.segmentation/resources/MorphologicalOperationsWidget.qrc deleted file mode 100644 index 3fe0afc1f8..0000000000 --- a/Plugins/org.mitk.gui.qt.segmentation/resources/MorphologicalOperationsWidget.qrc +++ /dev/null @@ -1,9 +0,0 @@ - - - Dilate_48x48.png - Erode_48x48.png - Closing_48x48.png - Opening_48x48.png - FillHoles_48x48.png - - diff --git a/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc b/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc index 61e2804c10..bc86bfb60d 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc +++ b/Plugins/org.mitk.gui.qt.segmentation/resources/SegmentationUtilities.qrc @@ -1,12 +1,10 @@ BooleanOperations_48x48.png ContourModelSetToImage_48x48.png ImageMasking_48x48.png MorphologicalOperations_48x48.png SurfaceToImage_48x48.png segmentation_utilities.svg - BooleanLabelA_32x32.png - BooleanLabelB_32x32.png diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesView.cpp similarity index 82% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp rename to Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesView.cpp index b0afb7cfd2..330e893f69 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesView.cpp @@ -1,84 +1,86 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkSegmentationUtilitiesView.h" -#include "BooleanOperations/QmitkBooleanOperationsWidget.h" -#include "ContourModelToImage/QmitkContourModelToImageWidget.h" -#include "ImageMasking/QmitkImageMaskingWidget.h" -#include "MorphologicalOperations/QmitkMorphologicalOperationsWidget.h" -#include "SurfaceToImage/QmitkSurfaceToImageWidget.h" + +#include +#include +#include +#include +#include QmitkSegmentationUtilitiesView::QmitkSegmentationUtilitiesView() : m_BooleanOperationsWidget(nullptr), m_ContourModelToImageWidget(nullptr), m_ImageMaskingWidget(nullptr), m_MorphologicalOperationsWidget(nullptr), m_SurfaceToImageWidget(nullptr) { } QmitkSegmentationUtilitiesView::~QmitkSegmentationUtilitiesView() { } void QmitkSegmentationUtilitiesView::CreateQtPartControl(QWidget* parent) { m_Controls.setupUi(parent); mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); mitk::SliceNavigationController* timeNavigationController = renderWindowPart != nullptr ? renderWindowPart->GetTimeNavigationController() : nullptr; - m_BooleanOperationsWidget = new QmitkBooleanOperationsWidget(timeNavigationController, parent); - m_ContourModelToImageWidget = new QmitkContourModelToImageWidget(timeNavigationController, parent); - m_ImageMaskingWidget = new QmitkImageMaskingWidget(timeNavigationController, parent); - m_MorphologicalOperationsWidget = new QmitkMorphologicalOperationsWidget(timeNavigationController, parent); - m_SurfaceToImageWidget = new QmitkSurfaceToImageWidget(timeNavigationController, parent); + auto dataStorage = this->GetDataStorage(); + m_BooleanOperationsWidget = new QmitkBooleanOperationsWidget(dataStorage, timeNavigationController, parent); + m_ContourModelToImageWidget = new QmitkContourModelToImageWidget(dataStorage, timeNavigationController, parent); + m_ImageMaskingWidget = new QmitkImageMaskingWidget(dataStorage, timeNavigationController, parent); + m_MorphologicalOperationsWidget = new QmitkMorphologicalOperationsWidget(dataStorage, timeNavigationController, parent); + m_SurfaceToImageWidget = new QmitkSurfaceToImageWidget(dataStorage, timeNavigationController, parent); this->AddUtilityWidget(m_BooleanOperationsWidget, QIcon(":/SegmentationUtilities/BooleanOperations_48x48.png"), "Boolean Operations"); this->AddUtilityWidget(m_ContourModelToImageWidget, QIcon(":/SegmentationUtilities/ContourModelSetToImage_48x48.png"), "Contour to Image"); this->AddUtilityWidget(m_ImageMaskingWidget, QIcon(":/SegmentationUtilities/ImageMasking_48x48.png"), "Image Masking"); this->AddUtilityWidget(m_MorphologicalOperationsWidget, QIcon(":/SegmentationUtilities/MorphologicalOperations_48x48.png"), "Morphological Operations"); this->AddUtilityWidget(m_SurfaceToImageWidget, QIcon(":/SegmentationUtilities/SurfaceToImage_48x48.png"), "Surface to Image"); } void QmitkSegmentationUtilitiesView::AddUtilityWidget(QWidget* widget, const QIcon& icon, const QString& text) { m_Controls.toolBox->addItem(widget, icon, text); } void QmitkSegmentationUtilitiesView::SetFocus() { m_Controls.toolBox->setFocus(); } void QmitkSegmentationUtilitiesView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { mitk::SliceNavigationController* timeNavigationController = renderWindowPart->GetTimeNavigationController(); m_BooleanOperationsWidget->SetTimeNavigationController(timeNavigationController); m_ContourModelToImageWidget->SetTimeNavigationController(timeNavigationController); m_ImageMaskingWidget->SetTimeNavigationController(timeNavigationController); m_MorphologicalOperationsWidget->SetTimeNavigationController(timeNavigationController); m_SurfaceToImageWidget->SetTimeNavigationController(timeNavigationController); } void QmitkSegmentationUtilitiesView::RenderWindowPartDeactivated(mitk::IRenderWindowPart*) { m_BooleanOperationsWidget->SetTimeNavigationController(nullptr); m_ContourModelToImageWidget->SetTimeNavigationController(nullptr); m_ImageMaskingWidget->SetTimeNavigationController(nullptr); m_MorphologicalOperationsWidget->SetTimeNavigationController(nullptr); m_SurfaceToImageWidget->SetTimeNavigationController(nullptr); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesView.h similarity index 100% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesView.h rename to Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesView.h diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesViewControls.ui b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesViewControls.ui similarity index 94% rename from Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesViewControls.ui rename to Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesViewControls.ui index 0cd7cac125..0c86c784e1 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/QmitkSegmentationUtilitiesViewControls.ui +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationUtilitiesViewControls.ui @@ -1,49 +1,49 @@ QmitkSegmentationUtilitiesViewControls 0 0 289 418 0 0 QmitkTemplate icon-size: 32px 32px 0 -1 0 - + diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/mitkPluginActivator.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/mitkPluginActivator.cpp index 7d6054779d..ea361b7226 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/mitkPluginActivator.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/mitkPluginActivator.cpp @@ -1,78 +1,78 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkPluginActivator.h" #include "QmitkSegmentationView.h" #include "QmitkSegmentationPreferencePage.h" -#include "SegmentationUtilities/QmitkSegmentationUtilitiesView.h" +#include "QmitkSegmentationUtilitiesView.h" #include "QmitkAutocropAction.h" #include "QmitkAutocropLabelSetImageAction.h" #include "QmitkCreatePolygonModelAction.h" #include "QmitkLoadMultiLabelPresetAction.h" #include "QmitkSaveMultiLabelPresetAction.h" #include "QmitkConvertSurfaceToLabelAction.h" #include "QmitkConvertMaskToLabelAction.h" #include "QmitkConvertToMultiLabelSegmentationAction.h" #include "QmitkCreateMultiLabelSegmentationAction.h" #include US_INITIALIZE_MODULE using namespace mitk; ctkPluginContext* PluginActivator::m_context = nullptr; PluginActivator* PluginActivator::m_Instance = nullptr; PluginActivator::PluginActivator() { m_Instance = this; } PluginActivator::~PluginActivator() { m_Instance = nullptr; } void PluginActivator::start(ctkPluginContext *context) { BERRY_REGISTER_EXTENSION_CLASS(QmitkSegmentationView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkSegmentationPreferencePage, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkSegmentationUtilitiesView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkAutocropAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkAutocropLabelSetImageAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkCreatePolygonModelAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkLoadMultiLabelPresetAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkSaveMultiLabelPresetAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkConvertSurfaceToLabelAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkConvertMaskToLabelAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkConvertToMultiLabelSegmentationAction, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkCreateMultiLabelSegmentationAction, context) this->m_context = context; } void PluginActivator::stop(ctkPluginContext *) { this->m_context = nullptr; } PluginActivator* PluginActivator::getDefault() { return m_Instance; } ctkPluginContext*PluginActivator::getContext() { return m_context; }