Slicer 5.11
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
qSlicerSegmentEditorAbstractEffect.h
Go to the documentation of this file.
1/*==============================================================================
2
3 Copyright (c) Laboratory for Percutaneous Surgery (PerkLab)
4 Queen's University, Kingston, ON, Canada. All Rights Reserved.
5
6 See COPYRIGHT.txt
7 or http://www.slicer.org/copyright/copyright.txt for details.
8
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14
15 This file was originally developed by Csaba Pinter, PerkLab, Queen's University
16 and was supported through the Applied Cancer Research Unit program of Cancer Care
17 Ontario with funds provided by the Ontario Ministry of Health and Long-Term Care
18
19==============================================================================*/
20
21#ifndef __qSlicerSegmentEditorAbstractEffect_h
22#define __qSlicerSegmentEditorAbstractEffect_h
23
24// Segmentations Editor Effects includes
25#include "qSlicerSegmentationsEditorEffectsExport.h"
26
27// Qt includes
28#include <QCursor>
29#include <QIcon>
30#include <QList>
31#include <QObject>
32#include <QPoint>
33#include <QVector3D>
34
35// VTK includes
36#include "vtkWeakPointer.h"
37
38class qSlicerSegmentEditorAbstractEffectPrivate;
39
40class vtkActor2D;
42class vtkMRMLNode;
43class vtkMRMLScene;
49class vtkSegment;
51class vtkRenderer;
52class vtkRenderWindow;
53class vtkRenderWindowInteractor;
55class vtkProp3D;
56class qMRMLWidget;
58class QColor;
59class QFormLayout;
60class QFrame;
61class QLayout;
62
64class Q_SLICER_SEGMENTATIONS_EFFECTS_EXPORT qSlicerSegmentEditorAbstractEffect : public QObject
65{
66 Q_OBJECT
67 Q_ENUMS(ConfirmationResult)
68 Q_ENUMS(ModificationMode)
69
70public:
74 Q_PROPERTY(QString name READ name WRITE setName)
75
76
78 Q_PROPERTY(QString title READ title WRITE setTitle)
79
84 Q_PROPERTY(bool perSegment READ perSegment WRITE setPerSegment)
85
91
95
99
100public:
101 typedef QObject Superclass;
102 qSlicerSegmentEditorAbstractEffect(QObject* parent = nullptr);
104
105 // API: Methods that are to be reimplemented in the effect subclasses
106public:
114
121
123 virtual QIcon icon() { return QIcon(); };
124
126 Q_INVOKABLE virtual const QString helpText() const { return QString(); };
127
130
133 Q_INVOKABLE virtual void activate();
134
137 Q_INVOKABLE virtual void deactivate();
138
140 Q_INVOKABLE virtual bool active();
141
143 ModificationMode modificationMode,
144 const int modificationExtent[6],
145 bool bypassMasking = false);
146 Q_INVOKABLE virtual void modifySelectedSegmentByLabelmap(vtkOrientedImageData* modifierLabelmap, ModificationMode modificationMode, bool bypassMasking = false);
148 ModificationMode modificationMode,
149 QList<int> extent,
150 bool bypassMasking = false);
151 Q_INVOKABLE virtual void modifySegmentByLabelmap(vtkMRMLSegmentationNode* segmentationNode,
152 const char* segmentID,
154 ModificationMode modificationMode,
155 bool bypassMasking = false);
156 Q_INVOKABLE virtual void modifySegmentByLabelmap(vtkMRMLSegmentationNode* segmentationNode,
157 const char* segmentID,
159 ModificationMode modificationMode,
160 const int modificationExtent[6],
161 bool bypassMasking = false);
162
166 Q_INVOKABLE static void applyImageMask(vtkOrientedImageData* input, vtkOrientedImageData* mask, double fillValue, bool notMask = false);
167
170 virtual void setupOptionsFrame() {};
171
173 Q_INVOKABLE virtual QCursor createCursor(qMRMLWidget* viewWidget);
174
180 virtual bool processInteractionEvents(vtkRenderWindowInteractor* callerInteractor, unsigned long eid, qMRMLWidget* viewWidget)
181 {
182 Q_UNUSED(callerInteractor);
183 Q_UNUSED(eid);
184 Q_UNUSED(viewWidget);
185 return false;
186 };
187
192 virtual void processViewNodeEvents(vtkMRMLAbstractViewNode* callerViewNode, unsigned long eid, qMRMLWidget* viewWidget)
193 {
194 Q_UNUSED(callerViewNode);
195 Q_UNUSED(eid);
196 Q_UNUSED(viewWidget);
197 };
198
201 virtual void setMRMLDefaults() = 0;
202
205 virtual void referenceGeometryChanged() {};
208 virtual void sourceVolumeNodeChanged() {};
210 virtual void masterVolumeNodeChanged() {};
212 virtual void layoutChanged() {};
215 virtual void interactionNodeModified(vtkMRMLInteractionNode* interactionNode);
223 Q_INVOKABLE virtual void cleanup() {};
224
225public slots:
228 virtual void updateGUIFromMRML() = 0;
229
232 virtual void updateMRMLFromGUI() = 0;
233
234 // Get/set methods
235public:
240
242 Q_INVOKABLE vtkMRMLScene* scene();
243
245 Q_INVOKABLE QFrame* optionsFrame();
246
248 Q_INVOKABLE QFormLayout* optionsLayout();
249
252 Q_INVOKABLE void addActor2D(qMRMLWidget* viewWidget, vtkActor2D* actor);
253
255 Q_INVOKABLE void removeActor2D(qMRMLWidget* viewWidget, vtkActor2D* actor);
256
259 Q_INVOKABLE void addActor3D(qMRMLWidget* viewWidget, vtkProp3D* actor);
260
262 Q_INVOKABLE void removeActor3D(qMRMLWidget* viewWidget, vtkProp3D* actor);
263
267 Q_INVOKABLE void addOptionsWidget(QWidget* newOptionsWidget);
268 Q_INVOKABLE void addOptionsWidget(QLayout* newOptionsWidget);
269
270 Q_INVOKABLE QWidget* addLabeledOptionsWidget(QString label, QWidget* newOptionsWidget);
271 Q_INVOKABLE QWidget* addLabeledOptionsWidget(QString label, QLayout* newOptionsWidget);
272
276 virtual QString name() const;
279 virtual void setName(QString name);
280
284 virtual QString title() const;
286 virtual void setTitle(QString title);
287
289 virtual bool perSegment() const;
292 virtual void setPerSegment(bool perSegment);
293
295 virtual bool requireSegments() const;
298
300 Q_INVOKABLE void cursorOff(qMRMLWidget* viewWidget);
302 Q_INVOKABLE void cursorOn(qMRMLWidget* viewWidget);
303
306 Q_INVOKABLE void selectEffect(QString effectName);
307
312 void setCallbackSlots(QObject* receiver, const char* selectEffectSlot, const char* updateVolumeSlot, const char* saveStateForUndoSlot);
313
315 void setVolumes(vtkOrientedImageData* alignedSourceVolume,
320
321 // Effect parameter functions
322public:
324 Q_INVOKABLE QString parameter(QString name);
325
327 Q_INVOKABLE int integerParameter(QString name);
328
330 Q_INVOKABLE double doubleParameter(QString name);
331
333 Q_INVOKABLE vtkMRMLNode* nodeReference(QString name);
334
338 Q_INVOKABLE void setParameter(QString name, QString value);
341 Q_INVOKABLE void setParameterDefault(QString name, QString value);
348 Q_INVOKABLE void setCommonParameter(QString name, QString value);
351 Q_INVOKABLE void setCommonParameterDefault(QString name, QString value);
352
356 Q_INVOKABLE void setParameter(QString name, int value);
359 Q_INVOKABLE void setParameterDefault(QString name, int value);
361 Q_INVOKABLE void setCommonParameter(QString name, int value);
364 Q_INVOKABLE void setCommonParameterDefault(QString name, int value);
365
369 Q_INVOKABLE void setParameter(QString name, double value);
372 Q_INVOKABLE void setParameterDefault(QString name, double value);
374 Q_INVOKABLE void setCommonParameter(QString name, double value);
377 Q_INVOKABLE void setCommonParameterDefault(QString name, double value);
378
382 Q_INVOKABLE void setNodeReference(QString name, vtkMRMLNode* node);
384 Q_INVOKABLE void setCommonNodeReference(QString name, vtkMRMLNode* node);
385
386 // Utility functions
387public:
389 Q_INVOKABLE bool parameterDefined(QString name);
390
392 Q_INVOKABLE bool commonParameterDefined(QString name);
393
400
402
406
408
410
412
415
418
422
425
428 Q_INVOKABLE void saveStateForUndo();
429
431 Q_INVOKABLE static vtkRenderWindow* renderWindow(qMRMLWidget* viewWidget);
433 Q_INVOKABLE static vtkRenderer* renderer(qMRMLWidget* viewWidget);
435 Q_INVOKABLE static vtkMRMLAbstractViewNode* viewNode(qMRMLWidget* viewWidget);
436
438 static QPoint rasToXy(double ras[3], qMRMLSliceWidget* sliceWidget);
440 Q_INVOKABLE static QPoint rasToXy(QVector3D ras, qMRMLSliceWidget* sliceWidget);
445 static void xyzToRas(double inputXyz[3], double outputRas[3], qMRMLSliceWidget* sliceWidget);
447 Q_INVOKABLE static QVector3D xyzToRas(QVector3D inputXyz, qMRMLSliceWidget* sliceWidget);
449 static void xyToRas(QPoint xy, double outputRas[3], qMRMLSliceWidget* sliceWidget);
451 static void xyToRas(double xy[2], double outputRas[3], qMRMLSliceWidget* sliceWidget);
453 Q_INVOKABLE static QVector3D xyToRas(QPoint xy, qMRMLSliceWidget* sliceWidget);
455 static void xyzToIjk(double inputXyz[3], int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
457 Q_INVOKABLE static QVector3D xyzToIjk(QVector3D inputXyz, qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
459 static void xyToIjk(QPoint xy, int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
461 static void xyToIjk(double xy[2], int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
463 Q_INVOKABLE static QVector3D xyToIjk(QPoint xy, qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
464
465 Q_INVOKABLE static void forceRender(qMRMLWidget* viewWidget);
466 Q_INVOKABLE static void scheduleRender(qMRMLWidget* viewWidget);
467
468 Q_INVOKABLE static double sliceSpacing(qMRMLSliceWidget* sliceWidget);
469
471
473
474protected:
476
477 QString m_Name;
478 bool m_Active{ false };
479 QString m_Title;
480
485 bool m_PerSegment{ true };
486
487 bool m_RequireSegments{ true };
488
491
492 double m_FillValue{ 1.0 };
493 double m_EraseValue{ 0.0 };
494
497 vtkWeakPointer<vtkSegment> m_AlreadyConfirmedSegmentVisible;
498
499protected:
500 QScopedPointer<qSlicerSegmentEditorAbstractEffectPrivate> d_ptr;
501
502private:
503 Q_DECLARE_PRIVATE(qSlicerSegmentEditorAbstractEffect);
505};
506
507#endif
Base class for any widget that requires a MRML Scene.
Definition qMRMLWidget.h:36
static void xyToRas(QPoint xy, double outputRas[3], qMRMLSliceWidget *sliceWidget)
Convert XY in-slice position to RAS position.
static Q_INVOKABLE void forceRender(qMRMLWidget *viewWidget)
Q_INVOKABLE vtkOrientedImageData * defaultModifierLabelmap()
virtual Q_INVOKABLE void modifySelectedSegmentByLabelmap(vtkOrientedImageData *modifierLabelmap, ModificationMode modificationMode, bool bypassMasking=false)
Q_INVOKABLE void setParameterDefault(QString name, double value)
virtual Q_INVOKABLE void modifySelectedSegmentByLabelmap(vtkOrientedImageData *modifierLabelmap, ModificationMode modificationMode, QList< int > extent, bool bypassMasking=false)
virtual Q_INVOKABLE void deactivate()
void setVolumes(vtkOrientedImageData *alignedSourceVolume, vtkOrientedImageData *modifierLabelmap, vtkOrientedImageData *maskLabelmap, vtkOrientedImageData *selectedSegmentLabelmap, vtkOrientedImageData *referenceGeometryImage)
Called by the editor widget.
Q_INVOKABLE void setCommonParameterDefault(QString name, double value)
Q_INVOKABLE void setCommonNodeReference(QString name, vtkMRMLNode *node)
Convenience function to set node reference common parameter.
static Q_INVOKABLE double sliceSpacing(qMRMLSliceWidget *sliceWidget)
virtual qSlicerSegmentEditorAbstractEffect * clone()=0
Clone editor effect. Override to return a new instance of the effect sub-class.
Q_INVOKABLE bool commonParameterDefined(QString name)
Returns true if the common parameter is already defined.
virtual void setRequireSegments(bool requireSegments)
If this property is set to true then this effect is enabled only when the segmentation has segment(s)...
Q_INVOKABLE void setParameter(QString name, QString value)
virtual Q_INVOKABLE void modifySelectedSegmentByLabelmap(vtkOrientedImageData *modifierLabelmap, ModificationMode modificationMode, const int modificationExtent[6], bool bypassMasking=false)
Q_INVOKABLE void removeActor3D(qMRMLWidget *viewWidget, vtkProp3D *actor)
Remove actor from the renderer of the widget.
void setShowEffectCursorInThreeDView(bool show)
Q_INVOKABLE void removeActor2D(qMRMLWidget *viewWidget, vtkActor2D *actor)
Remove actor from the renderer of the widget.
Q_INVOKABLE void setCommonParameter(QString name, int value)
Convenience function to set integer common parameter.
Q_INVOKABLE void setParameterDefault(QString name, QString value)
Q_INVOKABLE void saveStateForUndo()
Q_INVOKABLE QWidget * addLabeledOptionsWidget(QString label, QLayout *newOptionsWidget)
Q_INVOKABLE QFrame * optionsFrame()
Get effect options frame.
Q_INVOKABLE void selectEffect(QString effectName)
virtual bool perSegment() const
Get flag indicating whether effect operates on segments (true) or the whole segmentation (false).
Q_INVOKABLE void setParameterDefault(QString name, int value)
Q_INVOKABLE QWidget * addLabeledOptionsWidget(QString label, QWidget *newOptionsWidget)
Q_INVOKABLE double doubleParameter(QString name)
Get effect-specific or common double type parameter from effect parameter set node.
Q_INVOKABLE void setParameterSetNode(vtkMRMLSegmentEditorNode *node)
Set segment editor parameter set node.
static vtkMRMLSliceNode * sliceNode(qMRMLSliceWidget *viewWidget)
virtual bool processInteractionEvents(vtkRenderWindowInteractor *callerInteractor, unsigned long eid, qMRMLWidget *viewWidget)
void setShowEffectCursorInSliceView(bool show)
virtual void masterVolumeNodeChanged()
Deprecated. Override sourceVolumeNodeChanged() method instead.
Q_INVOKABLE vtkMRMLScene * scene()
Get MRML scene (from parameter set node)
Q_INVOKABLE bool segmentationDisplayableInView(vtkMRMLAbstractViewNode *viewNode)
Q_INVOKABLE void setParameter(QString name, int value)
virtual Q_INVOKABLE void modifySegmentByLabelmap(vtkMRMLSegmentationNode *segmentationNode, const char *segmentID, vtkOrientedImageData *modifierLabelmap, ModificationMode modificationMode, bool bypassMasking=false)
static Q_INVOKABLE vtkRenderWindow * renderWindow(qMRMLWidget *viewWidget)
Get render window for view widget.
static Q_INVOKABLE vtkRenderer * renderer(qMRMLWidget *viewWidget)
Get renderer for view widget.
Q_INVOKABLE vtkOrientedImageData * modifierLabelmap()
Q_INVOKABLE bool parameterDefined(QString name)
Returns true if the effect-specific parameter is already defined.
Q_INVOKABLE vtkOrientedImageData * sourceVolumeImageData()
Q_INVOKABLE QFormLayout * optionsLayout()
Get layout of options frame.
Q_INVOKABLE int integerParameter(QString name)
Get effect-specific or common integer type parameter from effect parameter set node.
virtual Q_INVOKABLE const QString helpText() const
Get help text for effect to be displayed in the help box.
virtual void setTitle(QString title)
Set the title of the effect.
Q_INVOKABLE void addActor2D(qMRMLWidget *viewWidget, vtkActor2D *actor)
void setSegmentEditorLogic(vtkSlicerSegmentEditorLogic *segmentEditorLogic)
Q_INVOKABLE int confirmCurrentSegmentVisible()
Q_INVOKABLE vtkOrientedImageData * referenceGeometryImage()
Q_INVOKABLE void setCommonParameter(QString name, QString value)
static Q_INVOKABLE QVector3D xyzToIjk(QVector3D inputXyz, qMRMLSliceWidget *sliceWidget, vtkOrientedImageData *image, vtkMRMLTransformNode *parentTransform=nullptr)
Convert XYZ slice view position to image IJK position, python accessor method,.
static Q_INVOKABLE QVector3D xyToRas(QPoint xy, qMRMLSliceWidget *sliceWidget)
Convert XY in-slice position to RAS position, python accessor method.
Q_INVOKABLE vtkMRMLNode * nodeReference(QString name)
Get effect-specific or common node reference type parameter from effect parameter set node.
virtual Q_INVOKABLE QCursor createCursor(qMRMLWidget *viewWidget)
Create a cursor customized for the given effect, potentially for each view.
vtkWeakPointer< vtkSegment > m_AlreadyConfirmedSegmentVisible
virtual void processViewNodeEvents(vtkMRMLAbstractViewNode *callerViewNode, unsigned long eid, qMRMLWidget *viewWidget)
static Q_INVOKABLE QVector3D xyzToRas(QVector3D inputXyz, qMRMLSliceWidget *sliceWidget)
Convert XYZ slice view position to RAS position, python accessor method.
static QPoint rasToXy(double ras[3], qMRMLSliceWidget *sliceWidget)
Convert RAS position to XY in-slice position.
Q_INVOKABLE void setCommonParameterDefault(QString name, QString value)
static void xyToRas(double xy[2], double outputRas[3], qMRMLSliceWidget *sliceWidget)
Convert XY in-slice position to RAS position.
Q_INVOKABLE void setParameter(QString name, double value)
virtual void setPerSegment(bool perSegment)
static Q_INVOKABLE QPoint rasToXy(QVector3D ras, qMRMLSliceWidget *sliceWidget)
Convert RAS position to XY in-slice position, python accessor method.
static Q_INVOKABLE vtkMRMLAbstractViewNode * viewNode(qMRMLWidget *viewWidget)
Get node for view widget.
virtual void setName(QString name)
Q_INVOKABLE void cursorOn(qMRMLWidget *viewWidget)
Restore saved cursor.
Q_INVOKABLE void addActor3D(qMRMLWidget *viewWidget, vtkProp3D *actor)
virtual Q_INVOKABLE void activate()
virtual QIcon icon()
Get icon for effect to be displayed in segment editor.
Q_INVOKABLE void setCommonParameterDefault(QString name, int value)
virtual void interactionNodeModified(vtkMRMLInteractionNode *interactionNode)
Q_INVOKABLE vtkOrientedImageData * maskLabelmap()
virtual void layoutChanged()
Simple mechanism to let the effects know that the layout has changed.
static Q_INVOKABLE void scheduleRender(qMRMLWidget *viewWidget)
Q_INVOKABLE void cursorOff(qMRMLWidget *viewWidget)
Turn off cursor and save cursor to restore later.
Q_INVOKABLE vtkMRMLSegmentEditorNode * parameterSetNode()
Get segment editor parameter set node.
Q_INVOKABLE void setNodeReference(QString name, vtkMRMLNode *node)
static void xyzToRas(double inputXyz[3], double outputRas[3], qMRMLSliceWidget *sliceWidget)
Q_INVOKABLE void addOptionsWidget(QWidget *newOptionsWidget)
Q_INVOKABLE QString parameter(QString name)
Get effect-specific or common string type parameter from effect parameter set node.
virtual QString name() const
QScopedPointer< qSlicerSegmentEditorAbstractEffectPrivate > d_ptr
static void xyzToIjk(double inputXyz[3], int outputIjk[3], qMRMLSliceWidget *sliceWidget, vtkOrientedImageData *image, vtkMRMLTransformNode *parentTransform=nullptr)
Convert XYZ slice view position to image IJK position,.
static void xyToIjk(double xy[2], int outputIjk[3], qMRMLSliceWidget *sliceWidget, vtkOrientedImageData *image, vtkMRMLTransformNode *parentTransform=nullptr)
Convert XY in-slice position to image IJK position.
static Q_INVOKABLE void applyImageMask(vtkOrientedImageData *input, vtkOrientedImageData *mask, double fillValue, bool notMask=false)
static void xyToIjk(QPoint xy, int outputIjk[3], qMRMLSliceWidget *sliceWidget, vtkOrientedImageData *image, vtkMRMLTransformNode *parentTransform=nullptr)
Convert XY in-slice position to image IJK position.
void setCallbackSlots(QObject *receiver, const char *selectEffectSlot, const char *updateVolumeSlot, const char *saveStateForUndoSlot)
Q_INVOKABLE vtkOrientedImageData * masterVolumeImageData()
Deprecated. Use sourceVolumeImageData method instead.
static Q_INVOKABLE QVector3D xyToIjk(QPoint xy, qMRMLSliceWidget *sliceWidget, vtkOrientedImageData *image, vtkMRMLTransformNode *parentTransform=nullptr)
Convert XY in-slice position to image IJK position, python accessor method.
virtual Q_INVOKABLE bool active()
Returns true if the effect is currently active (activated and has not deactivated since then)
Q_INVOKABLE void addOptionsWidget(QLayout *newOptionsWidget)
virtual QString title() const
virtual bool requireSegments() const
If this property is set to true then this effect is enabled only when the segmentation has segment(s)...
Q_INVOKABLE void setCommonParameter(QString name, double value)
Convenience function to set double common parameter.
qSlicerSegmentEditorAbstractEffect(QObject *parent=nullptr)
virtual Q_INVOKABLE void modifySegmentByLabelmap(vtkMRMLSegmentationNode *segmentationNode, const char *segmentID, vtkOrientedImageData *modifierLabelmap, ModificationMode modificationMode, const int modificationExtent[6], bool bypassMasking=false)
Q_INVOKABLE vtkOrientedImageData * selectedSegmentLabelmap()
Abstract MRML node to represent a view. The class holds the properties common to any view type (3D,...
Abstract Superclass for all specific types of MRML nodes.
A set of MRML Nodes that supports serialization and undo/redo.
Parameter set node for the segment editor widget.
MRML node containing segmentations.
MRML node for storing a slice through RAS space.
MRML node for representing a transformation between this node space and a parent node space.
Image data containing orientation information.
This class encapsulates a segment that is part of a segmentation.
Definition vtkSegment.h:45
Helper segment editor logic for qMRMLSegmentEditorWidget and its associated effects.