From e610014207f43ff6e3d268d269240058a4872dde Mon Sep 17 00:00:00 2001 From: Mohammad Rashid Date: Fri, 19 Jul 2019 10:05:23 -0400 Subject: [PATCH] ENH: Creating and registering VR segment editor widget Creates and registers the VR segment editor widget (which can be switched to from the VR home widget) KitwareMedical#43 --- VirtualReality/Widgets/CMakeLists.txt | 8 ++ .../qMRMLVirtualRealitySegmentEditorWidget.ui | 79 ++++++++++++ .../Widgets/qMRMLVirtualRealityHomeWidget.cxx | 16 +++ .../Widgets/qMRMLVirtualRealityHomeWidget.h | 8 +- ...qMRMLVirtualRealitySegmentEditorWidget.cxx | 118 ++++++++++++++++++ .../qMRMLVirtualRealitySegmentEditorWidget.h | 67 ++++++++++ 6 files changed, 294 insertions(+), 2 deletions(-) create mode 100644 VirtualReality/Widgets/Resources/UI/qMRMLVirtualRealitySegmentEditorWidget.ui create mode 100644 VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.cxx create mode 100644 VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.h diff --git a/VirtualReality/Widgets/CMakeLists.txt b/VirtualReality/Widgets/CMakeLists.txt index 4678eeb..fd2edc3 100644 --- a/VirtualReality/Widgets/CMakeLists.txt +++ b/VirtualReality/Widgets/CMakeLists.txt @@ -9,6 +9,8 @@ set(${KIT}_INCLUDE_DIRECTORIES ${vtkSlicerVirtualRealityModuleMRML_INCLUDE_DIRS} ${VTK_INCLUDE_DIRS} ${qSlicerSubjectHierarchyModuleWidgets_INCLUDE_DIRS} + ${qSlicerSegmentationsModuleWidgets_INCLUDE_DIRS} + ${qSlicerSegmentationsEditorEffects_INCLUDE_DIRS} ) set(${KIT}_SRCS @@ -21,6 +23,8 @@ set(${KIT}_SRCS qMRMLVirtualRealityHomeWidget.h qMRMLVirtualRealityDataModuleWidget.cxx qMRMLVirtualRealityDataModuleWidget.h + qMRMLVirtualRealitySegmentEditorWidget.cxx + qMRMLVirtualRealitySegmentEditorWidget.h ) set(${KIT}_MOC_SRCS @@ -29,11 +33,13 @@ set(${KIT}_MOC_SRCS qMRML${MODULE_NAME}View_p.h qMRMLVirtualRealityHomeWidget.h qMRMLVirtualRealityDataModuleWidget.h + qMRMLVirtualRealitySegmentEditorWidget.h ) set(${KIT}_UI_SRCS Resources/UI/qMRMLVirtualRealityHomeWidget.ui Resources/UI/qMRMLVirtualRealityDataModuleWidget.ui + Resources/UI/qMRMLVirtualRealitySegmentEditorWidget.ui Resources/UI/qMRML${MODULE_NAME}TransformWidget.ui ) @@ -47,6 +53,8 @@ set(${KIT}_TARGET_LIBRARIES vtkSlicerCamerasModuleLogic ${VTK_LIBRARIES} qSlicerSubjectHierarchyModuleWidgets + qSlicerSegmentationsModuleWidgets + ) #----------------------------------------------------------------------------- diff --git a/VirtualReality/Widgets/Resources/UI/qMRMLVirtualRealitySegmentEditorWidget.ui b/VirtualReality/Widgets/Resources/UI/qMRMLVirtualRealitySegmentEditorWidget.ui new file mode 100644 index 0000000..9cf629d --- /dev/null +++ b/VirtualReality/Widgets/Resources/UI/qMRMLVirtualRealitySegmentEditorWidget.ui @@ -0,0 +1,79 @@ + + + qMRMLVirtualRealitySegmentEditorWidget + + + + 0 + 0 + 589 + 590 + + + + + 100 + 0 + + + + qMRMLSegmentEditorWidget + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + qMRMLWidget + QWidget +
qMRMLWidget.h
+ 1 +
+ + qMRMLSegmentEditorWidget + qMRMLWidget +
qMRMLSegmentEditorWidget.h
+ 1 +
+
+ + + + + + + qMRMLVirtualRealitySegmentEditorWidget + mrmlSceneChanged(vtkMRMLScene*) + SegmentEditorWidget + setMRMLScene(vtkMRMLScene*) + + + 189 + 581 + + + 189 + 533 + + + + +
diff --git a/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.cxx b/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.cxx index 1109042..a3704ce 100644 --- a/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.cxx +++ b/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.cxx @@ -23,10 +23,14 @@ #include "qMRMLVirtualRealityHomeWidget.h" #include "ui_qMRMLVirtualRealityHomeWidget.h" #include "qMRMLVirtualRealityDataModuleWidget.h" +#include "qMRMLVirtualRealitySegmentEditorWidget.h" // VirtualReality MRML includes #include "vtkMRMLVirtualRealityViewNode.h" +// Segmentations includes +#include "vtkMRMLSegmentEditorNode.h" + // VTK includes #include @@ -55,6 +59,7 @@ class qMRMLVirtualRealityHomeWidgetPrivate : public Ui_qMRMLVirtualRealityHomeWi /// Virtual reality view MRML node vtkWeakPointer VirtualRealityViewNode; qMRMLVirtualRealityDataModuleWidget* DataModuleWidget; + qMRMLVirtualRealitySegmentEditorWidget* SegmentEditorWidget; }; //----------------------------------------------------------------------------- @@ -63,6 +68,7 @@ qMRMLVirtualRealityHomeWidgetPrivate::qMRMLVirtualRealityHomeWidgetPrivate(qMRML { this->VirtualRealityViewNode = nullptr; this->DataModuleWidget = nullptr; + this->SegmentEditorWidget = nullptr; } //----------------------------------------------------------------------------- @@ -400,8 +406,18 @@ void qMRMLVirtualRealityHomeWidget::registerDefaultModules() d->DataModuleWidget = new qMRMLVirtualRealityDataModuleWidget(this); d->DataModuleWidget->setMRMLScene(this->mrmlScene()); + d->SegmentEditorWidget = new qMRMLVirtualRealitySegmentEditorWidget(this); + d->SegmentEditorWidget->setMRMLScene(this->mrmlScene()); QIcon dataIcon(QPixmap(":/Icons/SubjectHierarchy.png")); + QIcon segmentEditorIcon(QPixmap(":/Icons/SegmentEditor.png")); this->addModuleButton(d->DataModuleWidget, dataIcon); + this->addModuleButton(d->SegmentEditorWidget, segmentEditorIcon); +} + +void qMRMLVirtualRealityHomeWidget::setMRMLSegmentEditorNode(vtkMRMLSegmentEditorNode* newSegmentEditorNode) +{ + Q_D(qMRMLVirtualRealityHomeWidget); + d->SegmentEditorWidget->setMRMLSegmentEditorNode(newSegmentEditorNode); } diff --git a/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.h b/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.h index 59e44e0..31e4559 100644 --- a/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.h +++ b/VirtualReality/Widgets/qMRMLVirtualRealityHomeWidget.h @@ -38,6 +38,7 @@ class vtkMRMLVirtualRealityViewNode; class qMRMLVirtualRealityHomeWidgetPrivate; +class vtkMRMLSegmentEditorNode; /// \ingroup SlicerVirtualReality_Widgets class Q_SLICER_QTMODULES_VIRTUALREALITY_WIDGETS_EXPORT qMRMLVirtualRealityHomeWidget : public qMRMLWidget @@ -62,8 +63,11 @@ class Q_SLICER_QTMODULES_VIRTUALREALITY_WIDGETS_EXPORT qMRMLVirtualRealityHomeWi /// \param icon The icon that appears on the button in the home widget Q_INVOKABLE void addModuleButton(QWidget* moduleWidget, QIcon& icon); - /// Register default modules: Data - Q_INVOKABLE void registerDefaultModules(); + /// Register default modules: Data, Segment Editor + Q_INVOKABLE void registerDefaultModules(); + + /// Set the segment editor node for the segment editor widget + Q_INVOKABLE void setMRMLSegmentEditorNode(vtkMRMLSegmentEditorNode* newSegmentEditorNode); public slots: /// Set virtual reality view MRML node diff --git a/VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.cxx b/VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.cxx new file mode 100644 index 0000000..5640241 --- /dev/null +++ b/VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.cxx @@ -0,0 +1,118 @@ +/*============================================================================== + + Copyright (c) Laboratory for Percutaneous Surgery (PerkLab) + Queen's University, Kingston, ON, Canada. All Rights Reserved. + + See COPYRIGHT.txt + or http://www.slicer.org/copyright/copyright.txt for details. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + This file was originally developed by Csaba Pinter, PerkLab, Queen's University + and was supported through the Applied Cancer Research Unit program of Cancer Care + Ontario with funds provided by the Ontario Ministry of Health and Long-Term Care + and CANARIE. + +==============================================================================*/ + +// VirtualReality Widgets includes +#include "qMRMLVirtualRealitySegmentEditorWidget.h" +#include "ui_qMRMLVirtualRealitySegmentEditorWidget.h" + +// VirtualReality MRML includes +#include "vtkMRMLVirtualRealityViewNode.h" + +// Segmentations includes +#include "vtkMRMLSegmentEditorNode.h" + +// Qt includes +#include +#include "qpushbutton.h" +#include "ctkMenuButton.h" +#include "qtoolbutton.h" + +//----------------------------------------------------------------------------- +class qMRMLVirtualRealitySegmentEditorWidgetPrivate : public Ui_qMRMLVirtualRealitySegmentEditorWidget +{ + Q_DECLARE_PUBLIC(qMRMLVirtualRealitySegmentEditorWidget); + +protected: + qMRMLVirtualRealitySegmentEditorWidget* const q_ptr; + +public: + qMRMLVirtualRealitySegmentEditorWidgetPrivate(qMRMLVirtualRealitySegmentEditorWidget& object); + virtual ~qMRMLVirtualRealitySegmentEditorWidgetPrivate(); + + void init(); +}; + +//----------------------------------------------------------------------------- +qMRMLVirtualRealitySegmentEditorWidgetPrivate::qMRMLVirtualRealitySegmentEditorWidgetPrivate(qMRMLVirtualRealitySegmentEditorWidget& object) + : q_ptr(&object) +{ +} + +//----------------------------------------------------------------------------- +qMRMLVirtualRealitySegmentEditorWidgetPrivate::~qMRMLVirtualRealitySegmentEditorWidgetPrivate() +{ +} + +//----------------------------------------------------------------------------- +void qMRMLVirtualRealitySegmentEditorWidgetPrivate::init() +{ + Q_Q(qMRMLVirtualRealitySegmentEditorWidget); + this->setupUi(q); + + //List of effects to be used in VR; effects not listed here are not shown in the widget + QStringList effectNameOrder; + effectNameOrder.append("None"); + effectNameOrder.append("Paint"); + effectNameOrder.append("Erase"); + effectNameOrder.append("Level tracing"); + effectNameOrder.append("Grow from seeds"); + effectNameOrder.append("Smoothing"); + effectNameOrder.append("Scissors"); + effectNameOrder.append("Logical Operators"); + this->SegmentEditorWidget->setEffectNameOrder(effectNameOrder); + + //Hide unneeded effects and buttons + this->SegmentEditorWidget->setUnorderedEffectsVisible(false); + this->SegmentEditorWidget->setSwitchToSegmentationsButtonVisible(false); + this->SegmentEditorWidget->findChild("SpecifyGeometryButton")->setVisible(false); + this->SegmentEditorWidget->findChild("SliceRotateWarningButton")->setVisible(false); + this->SegmentEditorWidget->findChild("Show3DButton")->setVisible(false); +} + +//----------------------------------------------------------------------------- +// qMRMLVirtualRealitySegmentEditorWidget methods + +//----------------------------------------------------------------------------- +qMRMLVirtualRealitySegmentEditorWidget::qMRMLVirtualRealitySegmentEditorWidget(QWidget* _parent) + : qMRMLWidget(_parent) + , d_ptr(new qMRMLVirtualRealitySegmentEditorWidgetPrivate(*this)) +{ + Q_D(qMRMLVirtualRealitySegmentEditorWidget); + d->init(); + + this->updateWidgetFromMRML(); +} + +//----------------------------------------------------------------------------- +qMRMLVirtualRealitySegmentEditorWidget::~qMRMLVirtualRealitySegmentEditorWidget() += default; + +//----------------------------------------------------------------------------- +void qMRMLVirtualRealitySegmentEditorWidget::updateWidgetFromMRML() +{ + //Q_D(qMRMLVirtualRealitySegmentEditorWidget); +} + +void qMRMLVirtualRealitySegmentEditorWidget::setMRMLSegmentEditorNode(vtkMRMLSegmentEditorNode* newSegmentEditorNode) +{ + Q_D(qMRMLVirtualRealitySegmentEditorWidget); + d->SegmentEditorWidget->setMRMLSegmentEditorNode(newSegmentEditorNode); +} diff --git a/VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.h b/VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.h new file mode 100644 index 0000000..93c10f9 --- /dev/null +++ b/VirtualReality/Widgets/qMRMLVirtualRealitySegmentEditorWidget.h @@ -0,0 +1,67 @@ +/*============================================================================== + + Copyright (c) Laboratory for Percutaneous Surgery (PerkLab) + Queen's University, Kingston, ON, Canada. All Rights Reserved. + + See COPYRIGHT.txt + or http://www.slicer.org/copyright/copyright.txt for details. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + This file was originally developed by Csaba Pinter, PerkLab, Queen's University + and was supported through the Applied Cancer Research Unit program of Cancer Care + Ontario with funds provided by the Ontario Ministry of Health and Long-Term Care + and CANARIE. + +==============================================================================*/ + +#ifndef __qMRMLVirtualRealitySegmentEditorWidget_h +#define __qMRMLVirtualRealitySegmentEditorWidget_h + +// VirtualReality Widgets includes +#include "qSlicerVirtualRealityModuleWidgetsExport.h" + +// MRMLWidgets includes +#include "qMRMLWidget.h" + +// CTK includes +#include +#include + +class qMRMLVirtualRealitySegmentEditorWidgetPrivate; +class vtkMRMLSegmentEditorNode; + +/// \ingroup SlicerVirtualReality_Widgets +class Q_SLICER_QTMODULES_VIRTUALREALITY_WIDGETS_EXPORT qMRMLVirtualRealitySegmentEditorWidget : public qMRMLWidget +{ + Q_OBJECT + QVTK_OBJECT + +public: + typedef qMRMLWidget Superclass; + /// Constructor + explicit qMRMLVirtualRealitySegmentEditorWidget(QWidget* parent = nullptr); + /// Destructor + ~qMRMLVirtualRealitySegmentEditorWidget() override; + + void setMRMLSegmentEditorNode(vtkMRMLSegmentEditorNode* newSegmentEditorNode); + +public slots: + +protected slots: + /// Update widgets from the MRML node + void updateWidgetFromMRML(); + +protected: + QScopedPointer d_ptr; + +private: + Q_DECLARE_PRIVATE(qMRMLVirtualRealitySegmentEditorWidget); + Q_DISABLE_COPY(qMRMLVirtualRealitySegmentEditorWidget); +}; + +#endif