Slicer 5.9
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 <QPoint>
31#include <QList>
32#include <QVector3D>
33
34// VTK includes
35#include "vtkWeakPointer.h"
36
37class qSlicerSegmentEditorAbstractEffectPrivate;
38
39class vtkActor2D;
41class vtkMRMLNode;
42class vtkMRMLScene;
48class vtkSegment;
50class vtkRenderer;
51class vtkRenderWindow;
52class vtkRenderWindowInteractor;
54class vtkProp3D;
55class qMRMLWidget;
57class QColor;
58class QFormLayout;
59class QFrame;
60class QLayout;
61
63class Q_SLICER_SEGMENTATIONS_EFFECTS_EXPORT qSlicerSegmentEditorAbstractEffect : public QObject
64{
65public:
66 Q_OBJECT
67 Q_ENUMS(ConfirmationResult)
68 Q_ENUMS(ModificationMode)
69
70
73 Q_PROPERTY(QString name READ name WRITE setName)
74
77 Q_PROPERTY(QString title READ title WRITE setTitle)
78
83 Q_PROPERTY(bool perSegment READ perSegment WRITE setPerSegment)
84
90
94
98
99public:
100 typedef QObject Superclass;
101 qSlicerSegmentEditorAbstractEffect(QObject* parent = nullptr);
103
104 // API: Methods that are to be reimplemented in the effect subclasses
105public:
113
120
122 virtual QIcon icon() { return QIcon(); };
123
125 Q_INVOKABLE virtual const QString helpText() const { return QString(); };
126
129
132 Q_INVOKABLE virtual void activate();
133
136 Q_INVOKABLE virtual void deactivate();
137
139 Q_INVOKABLE virtual bool active();
140
142 ModificationMode modificationMode,
143 const int modificationExtent[6],
144 bool bypassMasking = false);
145 Q_INVOKABLE virtual void modifySelectedSegmentByLabelmap(vtkOrientedImageData* modifierLabelmap, ModificationMode modificationMode, bool bypassMasking = false);
147 ModificationMode modificationMode,
148 QList<int> extent,
149 bool bypassMasking = false);
150 Q_INVOKABLE virtual void modifySegmentByLabelmap(vtkMRMLSegmentationNode* segmentationNode,
151 const char* segmentID,
153 ModificationMode modificationMode,
154 bool bypassMasking = false);
155 Q_INVOKABLE virtual void modifySegmentByLabelmap(vtkMRMLSegmentationNode* segmentationNode,
156 const char* segmentID,
158 ModificationMode modificationMode,
159 const int modificationExtent[6],
160 bool bypassMasking = false);
161
165 Q_INVOKABLE static void applyImageMask(vtkOrientedImageData* input, vtkOrientedImageData* mask, double fillValue, bool notMask = false);
166
169 virtual void setupOptionsFrame() {};
170
172 virtual QCursor createCursor(qMRMLWidget* viewWidget);
173
179 virtual bool processInteractionEvents(vtkRenderWindowInteractor* callerInteractor, unsigned long eid, qMRMLWidget* viewWidget)
180 {
181 Q_UNUSED(callerInteractor);
182 Q_UNUSED(eid);
183 Q_UNUSED(viewWidget);
184 return false;
185 };
186
191 virtual void processViewNodeEvents(vtkMRMLAbstractViewNode* callerViewNode, unsigned long eid, qMRMLWidget* viewWidget)
192 {
193 Q_UNUSED(callerViewNode);
194 Q_UNUSED(eid);
195 Q_UNUSED(viewWidget);
196 };
197
200 virtual void setMRMLDefaults() = 0;
201
204 virtual void referenceGeometryChanged() {};
207 virtual void sourceVolumeNodeChanged() {};
209 virtual void masterVolumeNodeChanged() {};
211 virtual void layoutChanged() {};
214 virtual void interactionNodeModified(vtkMRMLInteractionNode* interactionNode);
222 Q_INVOKABLE virtual void cleanup() {};
223
224public slots:
227 virtual void updateGUIFromMRML() = 0;
228
231 virtual void updateMRMLFromGUI() = 0;
232
233 // Get/set methods
234public:
239
241 Q_INVOKABLE vtkMRMLScene* scene();
242
244 Q_INVOKABLE QFrame* optionsFrame();
245
247 Q_INVOKABLE QFormLayout* optionsLayout();
248
251 Q_INVOKABLE void addActor2D(qMRMLWidget* viewWidget, vtkActor2D* actor);
252
254 Q_INVOKABLE void removeActor2D(qMRMLWidget* viewWidget, vtkActor2D* actor);
255
258 Q_INVOKABLE void addActor3D(qMRMLWidget* viewWidget, vtkProp3D* actor);
259
261 Q_INVOKABLE void removeActor3D(qMRMLWidget* viewWidget, vtkProp3D* actor);
262
266 Q_INVOKABLE void addOptionsWidget(QWidget* newOptionsWidget);
267 Q_INVOKABLE void addOptionsWidget(QLayout* newOptionsWidget);
268
269 Q_INVOKABLE QWidget* addLabeledOptionsWidget(QString label, QWidget* newOptionsWidget);
270 Q_INVOKABLE QWidget* addLabeledOptionsWidget(QString label, QLayout* newOptionsWidget);
271
275 virtual QString name() const;
278 virtual void setName(QString name);
279
283 virtual QString title() const;
285 virtual void setTitle(QString title);
286
288 virtual bool perSegment() const;
291 virtual void setPerSegment(bool perSegment);
292
294 virtual bool requireSegments() const;
297
299 Q_INVOKABLE void cursorOff(qMRMLWidget* viewWidget);
301 Q_INVOKABLE void cursorOn(qMRMLWidget* viewWidget);
302
305 Q_INVOKABLE void selectEffect(QString effectName);
306
311 void setCallbackSlots(QObject* receiver, const char* selectEffectSlot, const char* updateVolumeSlot, const char* saveStateForUndoSlot);
312
314 void setVolumes(vtkOrientedImageData* alignedSourceVolume,
319
320 // Effect parameter functions
321public:
323 Q_INVOKABLE QString parameter(QString name);
324
326 Q_INVOKABLE int integerParameter(QString name);
327
329 Q_INVOKABLE double doubleParameter(QString name);
330
332 Q_INVOKABLE vtkMRMLNode* nodeReference(QString name);
333
337 Q_INVOKABLE void setParameter(QString name, QString value);
340 Q_INVOKABLE void setParameterDefault(QString name, QString value);
347 Q_INVOKABLE void setCommonParameter(QString name, QString value);
350 Q_INVOKABLE void setCommonParameterDefault(QString name, QString value);
351
355 Q_INVOKABLE void setParameter(QString name, int value);
358 Q_INVOKABLE void setParameterDefault(QString name, int value);
360 Q_INVOKABLE void setCommonParameter(QString name, int value);
363 Q_INVOKABLE void setCommonParameterDefault(QString name, int value);
364
368 Q_INVOKABLE void setParameter(QString name, double value);
371 Q_INVOKABLE void setParameterDefault(QString name, double value);
373 Q_INVOKABLE void setCommonParameter(QString name, double value);
376 Q_INVOKABLE void setCommonParameterDefault(QString name, double value);
377
381 Q_INVOKABLE void setNodeReference(QString name, vtkMRMLNode* node);
383 Q_INVOKABLE void setCommonNodeReference(QString name, vtkMRMLNode* node);
384
385 // Utility functions
386public:
388 Q_INVOKABLE bool parameterDefined(QString name);
389
391 Q_INVOKABLE bool commonParameterDefined(QString name);
392
399
401
405
407
409
411
414
417
421
424
427 Q_INVOKABLE void saveStateForUndo();
428
430 Q_INVOKABLE static vtkRenderWindow* renderWindow(qMRMLWidget* viewWidget);
432 Q_INVOKABLE static vtkRenderer* renderer(qMRMLWidget* viewWidget);
434 Q_INVOKABLE static vtkMRMLAbstractViewNode* viewNode(qMRMLWidget* viewWidget);
435
437 static QPoint rasToXy(double ras[3], qMRMLSliceWidget* sliceWidget);
439 Q_INVOKABLE static QPoint rasToXy(QVector3D ras, qMRMLSliceWidget* sliceWidget);
444 static void xyzToRas(double inputXyz[3], double outputRas[3], qMRMLSliceWidget* sliceWidget);
446 Q_INVOKABLE static QVector3D xyzToRas(QVector3D inputXyz, qMRMLSliceWidget* sliceWidget);
448 static void xyToRas(QPoint xy, double outputRas[3], qMRMLSliceWidget* sliceWidget);
450 static void xyToRas(double xy[2], double outputRas[3], qMRMLSliceWidget* sliceWidget);
452 Q_INVOKABLE static QVector3D xyToRas(QPoint xy, qMRMLSliceWidget* sliceWidget);
454 static void xyzToIjk(double inputXyz[3], int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
456 Q_INVOKABLE static QVector3D xyzToIjk(QVector3D inputXyz, qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
458 static void xyToIjk(QPoint xy, int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
460 static void xyToIjk(double xy[2], int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
462 Q_INVOKABLE static QVector3D xyToIjk(QPoint xy, qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
463
464 Q_INVOKABLE static void forceRender(qMRMLWidget* viewWidget);
465 Q_INVOKABLE static void scheduleRender(qMRMLWidget* viewWidget);
466
467 Q_INVOKABLE static double sliceSpacing(qMRMLSliceWidget* sliceWidget);
468
470
472
473protected:
475
476 QString m_Name;
477 bool m_Active{ false };
478 QString m_Title;
479
484 bool m_PerSegment{ true };
485
486 bool m_RequireSegments{ true };
487
490
491 double m_FillValue{ 1.0 };
492 double m_EraseValue{ 0.0 };
493
496 vtkWeakPointer<vtkSegment> m_AlreadyConfirmedSegmentVisible;
497
498protected:
499 QScopedPointer<qSlicerSegmentEditorAbstractEffectPrivate> d_ptr;
500
501private:
502 Q_DECLARE_PRIVATE(qSlicerSegmentEditorAbstractEffect);
504};
505
506#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)
void setSegmentEditorLogic(vtkSegmentEditorLogic *segmentEditorLogic)
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)
Q_INVOKABLE int confirmCurrentSegmentVisible()
Q_INVOKABLE vtkOrientedImageData * referenceGeometryImage()
virtual QCursor createCursor(qMRMLWidget *viewWidget)
Create a cursor customized for the given effect, potentially for each view.
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.
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.
Helper segment editor logic for qMRMLSegmentEditorWidget and its associated effects.
This class encapsulates a segment that is part of a segmentation.
Definition vtkSegment.h:45