diff --git a/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.cpp b/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.cpp index 51c3543f4d..8a1d0b8716 100644 --- a/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.cpp +++ b/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.cpp @@ -1,159 +1,161 @@ /*============================================================================ 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 "QmitkRemeshingView.h" #include #include #include #include #include #include #include #include #include #include #include QmitkRemeshingView::QmitkRemeshingView() { } QmitkRemeshingView::~QmitkRemeshingView() { } void QmitkRemeshingView::CreateQtPartControl(QWidget* parent) { m_Controls.setupUi(parent); m_Controls.remeshPushButton->setIcon(berry::QtStyleManager::ThemeIcon(QStringLiteral(":/Remeshing/RemeshingIcon.svg"))); - m_Controls.surfaceComboBox->SetDataStorage(this->GetDataStorage()); - m_Controls.surfaceComboBox->SetPredicate(mitk::NodePredicateAnd::New( + m_Controls.selectionWidget->SetDataStorage(this->GetDataStorage()); + m_Controls.selectionWidget->SetSelectionIsOptional(true); + m_Controls.selectionWidget->SetEmptyInfo(QStringLiteral("Select a surface")); + m_Controls.selectionWidget->SetAutoSelectNewNodes(true); + m_Controls.selectionWidget->SetNodePredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateOr::New( mitk::NodePredicateProperty::New("helper object"), mitk::NodePredicateProperty::New("hidden object"))))); - connect(m_Controls.surfaceComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedSurfaceChanged(const mitk::DataNode *))); + connect(m_Controls.selectionWidget, &QmitkSingleNodeSelectionWidget::CurrentSelectionChanged, this, &QmitkRemeshingView::OnSelectedSurfaceChanged); connect(m_Controls.densitySlider, SIGNAL(valueChanged(int)), this, SLOT(OnDensityChanged(int))); connect(m_Controls.densitySpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnDensityChanged(int))); connect(m_Controls.remeshPushButton, SIGNAL(clicked()), this, SLOT(OnRemeshButtonClicked())); - this->OnSelectedSurfaceChanged(m_Controls.surfaceComboBox->GetSelectedNode()); + this->OnSelectedSurfaceChanged(m_Controls.selectionWidget->GetSelectedNodes()); } -void QmitkRemeshingView::OnSelectedSurfaceChanged(const mitk::DataNode *node) +void QmitkRemeshingView::OnSelectedSurfaceChanged(const QmitkSingleNodeSelectionWidget::NodeList& nodes) { - if (node != nullptr) + if (!nodes.empty() && nodes.front().IsNotNull()) { - m_MaxNumberOfVertices = static_cast(static_cast(node->GetData())->GetVtkPolyData()->GetNumberOfPoints()); + m_MaxNumberOfVertices = static_cast(static_cast(nodes.front()->GetData())->GetVtkPolyData()->GetNumberOfPoints()); this->EnableWidgets(true); } else { m_MaxNumberOfVertices = 0; this->EnableWidgets(false); } } void QmitkRemeshingView::OnDensityChanged(int density) { if (density != m_Controls.densitySlider->value()) m_Controls.densitySlider->setValue(density); if (density != m_Controls.densitySpinBox->value()) m_Controls.densitySpinBox->setValue(density); } void QmitkRemeshingView::OnRemeshButtonClicked() { - mitk::DataNode::Pointer selectedNode = m_Controls.surfaceComboBox->GetSelectedNode(); + mitk::DataNode::Pointer selectedNode = m_Controls.selectionWidget->GetSelectedNode(); mitk::Surface::ConstPointer surface = static_cast(selectedNode->GetData()); int density = m_Controls.densitySpinBox->value(); int numVertices = std::max(100, static_cast(m_MaxNumberOfVertices * (density * 0.01))); double gradation = m_Controls.remeshingComboBox->currentText() == QStringLiteral("Adaptive") ? 1.0 : 0.0; const QString quality = m_Controls.qualityComboBox->currentText(); int subsampling; if (QStringLiteral("High (slow)") == quality) { subsampling = 50; } else if (QStringLiteral("Maximum (very slow)") == quality) { subsampling = 500; } else // The default is "Medium (fast)". { subsampling = 10; } bool boundaryFixing = m_Controls.preserveEdgesCheckBox->isChecked(); mitk::ACVD::RemeshFilter::Pointer remesher = mitk::ACVD::RemeshFilter::New(); remesher->SetInput(surface); remesher->SetTimeStep(0); remesher->SetNumVertices(numVertices); remesher->SetGradation(gradation); remesher->SetSubsampling(subsampling); remesher->SetEdgeSplitting(0.0); remesher->SetOptimizationLevel(1.0); remesher->SetForceManifold(false); remesher->SetBoundaryFixing(boundaryFixing); try { remesher->Update(); } catch(const mitk::Exception& exception) { MITK_ERROR << exception.GetDescription(); return; } mitk::Surface::Pointer remeshedSurface = remesher->GetOutput(); mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetName(QString("%1 (%2%)").arg(selectedNode->GetName().c_str()).arg(density).toStdString()); newNode->SetProperty("material.representation", mitk::VtkRepresentationProperty::New(VTK_WIREFRAME)); newNode->SetData(remeshedSurface); this->GetDataStorage()->Add(newNode, selectedNode); } void QmitkRemeshingView::EnableWidgets(bool enable) { - m_Controls.surfaceComboBox->setEnabled(enable); m_Controls.densitySlider->setEnabled(enable); m_Controls.densitySpinBox->setEnabled(enable); m_Controls.remeshingComboBox->setEnabled(enable); m_Controls.qualityComboBox->setEnabled(enable); m_Controls.preserveEdgesCheckBox->setEnabled(enable); m_Controls.remeshPushButton->setEnabled(enable); m_Controls.explanationLabel->setVisible(enable); } void QmitkRemeshingView::SetFocus() { - m_Controls.surfaceComboBox->setFocus(); + m_Controls.selectionWidget->setFocus(); } diff --git a/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.h b/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.h index 17bf059628..66d3728c8c 100644 --- a/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.h +++ b/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingView.h @@ -1,42 +1,43 @@ /*============================================================================ 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 QmitkRemeshingView_h #define QmitkRemeshingView_h #include +#include #include class QmitkRemeshingView : public QmitkAbstractView { Q_OBJECT public: QmitkRemeshingView(); ~QmitkRemeshingView() override; void CreateQtPartControl(QWidget* parent) override; void SetFocus() override; private slots: - void OnSelectedSurfaceChanged(const mitk::DataNode *node); + void OnSelectedSurfaceChanged(const QmitkSingleNodeSelectionWidget::NodeList& nodes); void OnDensityChanged(int numVertices); void OnRemeshButtonClicked(); private: void EnableWidgets(bool enable); Ui::QmitkRemeshingViewControls m_Controls; int m_MaxNumberOfVertices; }; #endif diff --git a/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingViewControls.ui b/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingViewControls.ui index 929a67acf6..105b8e2ba4 100644 --- a/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingViewControls.ui +++ b/Plugins/org.mitk.gui.qt.remeshing/src/internal/QmitkRemeshingViewControls.ui @@ -1,247 +1,244 @@ QmitkRemeshingViewControls true 0 0 253 573 Remeshing - - - - 0 - - - - Medium (fast) - - - - - High (slow) - - - - - Maximum (very slow) - - - - - - - - % - - - 1 - - - 100 - - - 1 - - - 100 - - - - - - - - 0 - 0 - - - - Preserve Edges - - - true - - - 0 0 Surface - - - true - - - - 0 - 0 - + + + + 0 + 40 + 0 0 Density 0 0 1 100 10 100 Qt::Horizontal + + + + % + + + 1 + + + 100 + + + 1 + + + 100 + + + 0 0 Remeshing Adaptive Regular 0 0 Quality + + + + 0 + + + + Medium (fast) + + + + + High (slow) + + + + + Maximum (very slow) + + + + + + + + + 0 + 0 + + + + Preserve Edges + + + true + + + true Remesh :/Remeshing/RemeshingIcon.svg:/Remeshing/RemeshingIcon.svg 24 24 <html><head/><body><p><span style=" font-weight:600;">Density:</span> The density of the resulting surface compared to the input surface. For example, a density of 50% will effectively halve the number of vertices. It's not uncommen to choose values as low as 10% for overly dense input surfaces. The minimum number of output vertices is at least 100, though.</p><p><span style=" font-weight:600;">Remeshing:</span> Adaptive remeshing results in higher density in curvy areas and less density in flat areas. This remeshing strategy can preserve fine shape details even when the overall density is heavily reduced. Regular remeshing evenly distributes the density regardless of the local shape of the surface.</p><p><span style=" font-weight:600;">Quality</span>: While medium quality is sufficient for the vast majority of use cases, you can increase this setting to further optimize the mesh quality in terms of uniformly shaped triangles. However, computation time and memory consumption increase dramatically compared to very small improvements.</p><p><span style=" font-weight:600;">Preserve Edges:</span> If the input surface contains holes or edges, they will be preserved very accurately by default at the cost of less uniform triangles at their direct neighborhood.</p></body></html> true Qt::Vertical 20 40 - QmitkDataStorageComboBox - QComboBox -
QmitkDataStorageComboBox.h
+ QmitkSingleNodeSelectionWidget + QWidget +
QmitkSingleNodeSelectionWidget.h
+ 1
- surfaceComboBox densitySpinBox preserveEdgesCheckBox remeshPushButton