Slicer 5.6
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 vtkMRMLScene;
46class vtkSegment;
47class vtkRenderer;
48class vtkRenderWindow;
49class vtkRenderWindowInteractor;
51class vtkProp3D;
52class qMRMLWidget;
54class QColor;
55class QFormLayout;
56class QFrame;
57class QLayout;
58
60class Q_SLICER_SEGMENTATIONS_EFFECTS_EXPORT qSlicerSegmentEditorAbstractEffect : public QObject
61{
62public:
63 Q_OBJECT
64 Q_ENUMS(ConfirmationResult)
65 Q_ENUMS(ModificationMode)
66
67
70 Q_PROPERTY(QString name READ name WRITE setName)
71
74 Q_PROPERTY(QString title READ title WRITE setTitle)
75
80 Q_PROPERTY(bool perSegment READ perSegment WRITE setPerSegment)
81
86 Q_PROPERTY(bool requireSegments READ requireSegments WRITE setRequireSegments)
87
90 Q_PROPERTY(bool showEffectCursorInSliceView READ showEffectCursorInSliceView WRITE setShowEffectCursorInSliceView)
91
94 Q_PROPERTY(bool showEffectCursorInThreeDView READ showEffectCursorInThreeDView WRITE setShowEffectCursorInThreeDView)
95
96public:
97 typedef QObject Superclass;
98 qSlicerSegmentEditorAbstractEffect(QObject* parent = nullptr);
100
101// API: Methods that are to be reimplemented in the effect subclasses
102public:
103
111
118
120 virtual QIcon icon() { return QIcon(); };
121
123 Q_INVOKABLE virtual const QString helpText()const { return QString(); };
124
127
130 Q_INVOKABLE virtual void activate();
131
134 Q_INVOKABLE virtual void deactivate();
135
137 Q_INVOKABLE virtual bool active();
138
139 Q_INVOKABLE virtual void modifySelectedSegmentByLabelmap(vtkOrientedImageData* modifierLabelmap,
140 ModificationMode modificationMode, const int modificationExtent[6],bool bypassMasking = false);
141 Q_INVOKABLE virtual void modifySelectedSegmentByLabelmap(vtkOrientedImageData* modifierLabelmap,
142 ModificationMode modificationMode, bool bypassMasking = false);
143 Q_INVOKABLE virtual void modifySelectedSegmentByLabelmap(vtkOrientedImageData* modifierLabelmap,
144 ModificationMode modificationMode, QList<int> extent, bool bypassMasking = false);
145 Q_INVOKABLE virtual void modifySegmentByLabelmap(vtkMRMLSegmentationNode* segmentationNode, const char* segmentID,
146 vtkOrientedImageData* modifierLabelmap, ModificationMode modificationMode, bool bypassMasking = false);
147 Q_INVOKABLE virtual void modifySegmentByLabelmap(vtkMRMLSegmentationNode* segmentationNode, const char* segmentID,
148 vtkOrientedImageData* modifierLabelmap, ModificationMode modificationMode, const int modificationExtent[6], bool bypassMasking = false);
149
153 Q_INVOKABLE static void applyImageMask(vtkOrientedImageData* input, vtkOrientedImageData* mask, double fillValue, bool notMask = false);
154
157 virtual void setupOptionsFrame() { };
158
160 virtual QCursor createCursor(qMRMLWidget* viewWidget);
161
167 virtual bool processInteractionEvents(vtkRenderWindowInteractor* callerInteractor, unsigned long eid, qMRMLWidget* viewWidget)
168 { Q_UNUSED(callerInteractor); Q_UNUSED(eid); Q_UNUSED(viewWidget); return false; };
169
174 virtual void processViewNodeEvents(vtkMRMLAbstractViewNode* callerViewNode, unsigned long eid, qMRMLWidget* viewWidget)
175 { Q_UNUSED(callerViewNode); Q_UNUSED(eid); Q_UNUSED(viewWidget); };
176
179 virtual void setMRMLDefaults() = 0;
180
183 virtual void referenceGeometryChanged() { };
186 virtual void sourceVolumeNodeChanged() { };
188 virtual void masterVolumeNodeChanged() { };
190 virtual void layoutChanged() { };
193 virtual void interactionNodeModified(vtkMRMLInteractionNode* interactionNode);
194
195public slots:
198 virtual void updateGUIFromMRML() = 0;
199
202 virtual void updateMRMLFromGUI() = 0;
203
204// Get/set methods
205public:
210
212 Q_INVOKABLE vtkMRMLScene* scene();
213
215 Q_INVOKABLE QFrame* optionsFrame();
216
218 Q_INVOKABLE QFormLayout* optionsLayout();
219
222 Q_INVOKABLE void addActor2D(qMRMLWidget* viewWidget, vtkActor2D* actor);
223
225 Q_INVOKABLE void removeActor2D(qMRMLWidget* viewWidget, vtkActor2D* actor);
226
229 Q_INVOKABLE void addActor3D(qMRMLWidget* viewWidget, vtkProp3D* actor);
230
232 Q_INVOKABLE void removeActor3D(qMRMLWidget* viewWidget, vtkProp3D* actor);
233
237 Q_INVOKABLE void addOptionsWidget(QWidget* newOptionsWidget);
238 Q_INVOKABLE void addOptionsWidget(QLayout* newOptionsWidget);
239
240 Q_INVOKABLE QWidget* addLabeledOptionsWidget(QString label, QWidget* newOptionsWidget);
241 Q_INVOKABLE QWidget* addLabeledOptionsWidget(QString label, QLayout* newOptionsWidget);
242
246 virtual QString name()const;
249 virtual void setName(QString name);
250
254 virtual QString title()const;
256 virtual void setTitle(QString title);
257
259 virtual bool perSegment()const;
262 virtual void setPerSegment(bool perSegment);
263
265 virtual bool requireSegments()const;
267 virtual void setRequireSegments(bool requireSegments);
268
269
271 Q_INVOKABLE void cursorOff(qMRMLWidget* viewWidget);
273 Q_INVOKABLE void cursorOn(qMRMLWidget* viewWidget);
274
277 Q_INVOKABLE void selectEffect(QString effectName);
278
283 void setCallbackSlots(QObject* receiver, const char* selectEffectSlot, const char* updateVolumeSlot, const char* saveStateForUndoSlot);
284
286 void setVolumes(vtkOrientedImageData* alignedSourceVolume, vtkOrientedImageData* modifierLabelmap,
287 vtkOrientedImageData* maskLabelmap, vtkOrientedImageData* selectedSegmentLabelmap, vtkOrientedImageData* referenceGeometryImage);
288
289// Effect parameter functions
290public:
292 Q_INVOKABLE QString parameter(QString name);
293
295 Q_INVOKABLE int integerParameter(QString name);
296
298 Q_INVOKABLE double doubleParameter(QString name);
299
303 Q_INVOKABLE void setParameter(QString name, QString value);
306 Q_INVOKABLE void setParameterDefault(QString name, QString value);
313 Q_INVOKABLE void setCommonParameter(QString name, QString value);
316 Q_INVOKABLE void setCommonParameterDefault(QString name, QString value);
317
321 Q_INVOKABLE void setParameter(QString name, int value);
324 Q_INVOKABLE void setParameterDefault(QString name, int value);
326 Q_INVOKABLE void setCommonParameter(QString name, int value);
329 Q_INVOKABLE void setCommonParameterDefault(QString name, int value);
330
334 Q_INVOKABLE void setParameter(QString name, double value);
337 Q_INVOKABLE void setParameterDefault(QString name, double value);
339 Q_INVOKABLE void setCommonParameter(QString name, double value);
342 Q_INVOKABLE void setCommonParameterDefault(QString name, double value);
343
344// Utility functions
345public:
347 Q_INVOKABLE bool parameterDefined(QString name);
348
350 Q_INVOKABLE bool commonParameterDefined(QString name);
351
358
360
364
366
368
370
373
376
380
383
386 Q_INVOKABLE void saveStateForUndo();
387
389 Q_INVOKABLE static vtkRenderWindow* renderWindow(qMRMLWidget* viewWidget);
391 Q_INVOKABLE static vtkRenderer* renderer(qMRMLWidget* viewWidget);
393 Q_INVOKABLE static vtkMRMLAbstractViewNode* viewNode(qMRMLWidget* viewWidget);
394
396 static QPoint rasToXy(double ras[3], qMRMLSliceWidget* sliceWidget);
398 Q_INVOKABLE static QPoint rasToXy(QVector3D ras, qMRMLSliceWidget* sliceWidget);
403 static void xyzToRas(double inputXyz[3], double outputRas[3], qMRMLSliceWidget* sliceWidget);
405 Q_INVOKABLE static QVector3D xyzToRas(QVector3D inputXyz, qMRMLSliceWidget* sliceWidget);
407 static void xyToRas(QPoint xy, double outputRas[3], qMRMLSliceWidget* sliceWidget);
409 static void xyToRas(double xy[2], double outputRas[3], qMRMLSliceWidget* sliceWidget);
411 Q_INVOKABLE static QVector3D xyToRas(QPoint xy, qMRMLSliceWidget* sliceWidget);
413 static void xyzToIjk(double inputXyz[3], int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
415 Q_INVOKABLE static QVector3D xyzToIjk(QVector3D inputXyz, qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
417 static void xyToIjk(QPoint xy, int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
419 static void xyToIjk(double xy[2], int outputIjk[3], qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
421 Q_INVOKABLE static QVector3D xyToIjk(QPoint xy, qMRMLSliceWidget* sliceWidget, vtkOrientedImageData* image, vtkMRMLTransformNode* parentTransform = nullptr);
422
423 Q_INVOKABLE static void forceRender(qMRMLWidget* viewWidget);
424 Q_INVOKABLE static void scheduleRender(qMRMLWidget* viewWidget);
425
426 Q_INVOKABLE static double sliceSpacing(qMRMLSliceWidget* sliceWidget);
427
429
430protected:
431 QString m_Name;
432 bool m_Active{false};
433 QString m_Title;
434
439 bool m_PerSegment{true};
440
441 bool m_RequireSegments{true};
442
443 bool m_ShowEffectCursorInSliceView{true};
444 bool m_ShowEffectCursorInThreeDView{false};
445
446 double m_FillValue{1.0};
447 double m_EraseValue{0.0};
448
451 vtkWeakPointer<vtkSegment> m_AlreadyConfirmedSegmentVisible;
452
453protected:
454 QScopedPointer<qSlicerSegmentEditorAbstractEffectPrivate> d_ptr;
455
456private:
457 Q_DECLARE_PRIVATE(qSlicerSegmentEditorAbstractEffect);
459};
460
461#endif
Base class for any widget that requires a MRML Scene.
Definition qMRMLWidget.h:36
Abstract class for segment editor effects.
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)
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)
Convenience function to get double parameter.
Q_INVOKABLE void setParameterSetNode(vtkMRMLSegmentEditorNode *node)
Set segment editor parameter set node.
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)
Convenience function to get integer parameter.
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.
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.
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 or common 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.
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,...
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 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