Slicer 5.8
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkMRMLSliceLogic.h
Go to the documentation of this file.
1/*=auto=========================================================================
2
3 Portions (c) Copyright 2005 Brigham and Women's Hospital (BWH) All Rights Reserved.
4
5 See COPYRIGHT.txt
6 or http://www.slicer.org/copyright/copyright.txt for details.
7
8 Program: 3D Slicer
9 Module: $RCSfile: vtkMRMLSliceLogic.h,v $
10 Date: $Date$
11 Version: $Revision: 18866
12
13=========================================================================auto=*/
14
15#ifndef __vtkMRMLSliceLogic_h
16#define __vtkMRMLSliceLogic_h
17
18// MRMLLogic includes
20
21// STD includes
22#include <deque>
23#include <vector>
24
25// MRML includes
35
36// VTK includes
37class vtkAlgorithmOutput;
38class vtkCollection;
39class vtkImageBlend;
40class vtkImageMathematics;
41class vtkImageReslice;
42
43struct BlendPipeline;
44struct SliceLayerInfo;
45
58class VTK_MRML_LOGIC_EXPORT vtkMRMLSliceLogic : public vtkMRMLAbstractLogic
59{
60public:
64 void PrintSelf(ostream& os, vtkIndent indent) override;
65
67 enum
68 {
69 CompositeModifiedEvent = 18000
70 };
71
72 enum
73 {
74 LayerNone = -1,
75 LayerBackground = 0,
76 LayerForeground = 1,
77 LayerLabel = 2,
78 Layer_Last // must be last
79 };
80
83 vtkGetObjectMacro (SliceNode, vtkMRMLSliceNode);
84 void SetSliceNode (vtkMRMLSliceNode * newSliceNode);
85
87 vtkMRMLSliceNode* AddSliceNode(const char* layoutName);
88
91 vtkGetObjectMacro (SliceCompositeNode, vtkMRMLSliceCompositeNode);
93
97 vtkGetObjectMacro (BackgroundLayer, vtkMRMLSliceLayerLogic);
99
103 vtkGetObjectMacro (ForegroundLayer, vtkMRMLSliceLayerLogic);
105
109 vtkGetObjectMacro (LabelLayer, vtkMRMLSliceLayerLogic);
111
114 void SetBackgroundWindowLevel(double window, double level);
115
119 void GetBackgroundWindowLevelAndRange(double& window, double& level,
120 double& rangeLow, double& rangeHigh, bool& autoWindowLevel);
121
124 void GetBackgroundWindowLevelAndRange(double& window, double& level,
125 double& rangeLow, double& rangeHigh);
126
129 void SetForegroundWindowLevel(double window, double level);
130
134 void GetForegroundWindowLevelAndRange(double& window, double& level,
135 double& rangeLow, double& rangeHigh, bool& autoWindowLevel);
136
139 void GetForegroundWindowLevelAndRange(double& window, double& level,
140 double& rangeLow, double& rangeHigh);
143 vtkGetObjectMacro(SliceModelNode, vtkMRMLModelNode);
144
148 vtkGetObjectMacro(SliceModelDisplayNode, vtkMRMLModelDisplayNode);
149
153
156 vtkGetObjectMacro(SliceModelTransformNode, vtkMRMLLinearTransformNode);
157
161 vtkImageBlend* GetBlend();
162 vtkImageBlend* GetBlendUVW();
163
167 vtkGetObjectMacro(ExtractModelTexture, vtkImageReslice);
168
172 vtkAlgorithmOutput *GetImageDataConnection();
173
177
180
183 virtual bool EnterMRMLCallback() const;
184
188
192
196
201
204 static void GetVolumeRASBox(vtkMRMLVolumeNode *volumeNode, double rasDimensions[3], double rasCenter[3]);
205
208 void GetVolumeSliceDimensions(vtkMRMLVolumeNode *volumeNode, double sliceDimensions[3], double sliceCenter[3]);
209
214 double* GetVolumeSliceSpacing(vtkMRMLVolumeNode *volumeNode) VTK_SIZEHINT(3);
215
222 void GetVolumeSliceBounds(vtkMRMLVolumeNode *volumeNode, double sliceBounds[6], bool useVoxelCenter=false);
223
226 void FitSliceToVolume(vtkMRMLVolumeNode *volumeNode, int width, int height);
227
230 void FitSliceToVolumes(vtkCollection *volumeNodes, int width, int height);
231
234 void GetBackgroundRASBox(double rasDimensions[3], double rasCenter[3]);
235
238 void GetBackgroundSliceDimensions(double sliceDimensions[3], double sliceCenter[3]);
239
244 double* GetBackgroundSliceSpacing() VTK_SIZEHINT(3);
245
250 void GetBackgroundSliceBounds(double sliceBounds[6]);
251
256 void RotateSliceToLowestVolumeAxes(bool forceSlicePlaneToSingleSlice = true);
257
260 void FitSliceToFirst(int width = -1, int height = -1);
261
267 void FitSliceToBackground(int width = -1, int height = -1);
268
271 void FitSliceToAll(int width = -1, int height = -1);
272
275 void FitFOVToBackground(double fov);
276
282 void ResizeSliceNode(double newWidth, double newHeight);
283
290 double* GetLowestVolumeSliceSpacing() VTK_SIZEHINT(3);
291
299 void GetLowestVolumeSliceBounds(double sliceBounds[6], bool useVoxelCenter=false);
300
303 double GetSliceOffset();
304 void SetSliceOffset(double offset);
305
308 void GetSliceBounds(double sliceBounds[6]);
309
312 void SetSliceExtentsToSliceNode();
313
317 void StartSliceNodeInteraction(unsigned int parameters);
318
320 void EndSliceNodeInteraction();
321
325 void StartSliceCompositeNodeInteraction(unsigned int parameters);
326
328 void EndSliceCompositeNodeInteraction();
329
331 void StartSliceOffsetInteraction();
332
334 void EndSliceOffsetInteraction();
335
339 void SnapSliceOffsetToIJK();
340
341 static const int SLICE_INDEX_ROTATED;
342 static const int SLICE_INDEX_OUT_OF_VOLUME;
343 static const int SLICE_INDEX_NO_VOLUME;
344
350 int GetSliceIndexFromOffset(double sliceOffset, vtkMRMLVolumeNode *volumeNode);
351
360 int GetSliceIndexFromOffset(double sliceOffset);
361
364 void CreateSliceModel();
365 void DeleteSliceModel();
366
369 std::vector< vtkMRMLDisplayNode*> GetPolyDataDisplayNodes();
371 static vtkMRMLSliceCompositeNode* GetSliceCompositeNode(vtkMRMLSliceNode* node);
373 static vtkMRMLSliceNode* GetSliceNode(vtkMRMLSliceCompositeNode* node);
374
378 static const std::string SLICE_MODEL_NODE_NAME_SUFFIX;
379
383 static bool IsSliceModelNode(vtkMRMLNode *mrmlNode);
388 static bool IsSliceModelDisplayNode(vtkMRMLDisplayNode *mrmlDisplayNode);
389
394 int GetEditableLayerAtWorldPosition(double worldPos[3], bool backgroundVolumeEditable = true, bool foregroundVolumeEditable = true);
395
398 bool GetSliceOffsetRangeResolution(double range[2], double& resolution);
399
400protected:
401
403 ~vtkMRMLSliceLogic() override;
404
405 void SetMRMLSceneInternal(vtkMRMLScene * newScene) override;
406
409 void ProcessMRMLLogicsEvents(vtkObject * caller,
410 unsigned long event,
411 void * callData) override;
412 void ProcessMRMLLogicsEvents();
413
414 void OnMRMLSceneNodeAdded(vtkMRMLNode* node) override;
415 void OnMRMLSceneNodeRemoved(vtkMRMLNode* node) override;
416 void UpdateFromMRMLScene() override;
417 void OnMRMLSceneStartClose() override;
418 void OnMRMLSceneEndImport() override;
419 void OnMRMLSceneEndRestore() override;
420
421 void UpdateSliceNodes();
422 void SetupCrosshairNode();
423
424 void OnMRMLNodeModified(vtkMRMLNode* node) override;
425 static vtkMRMLSliceCompositeNode* GetSliceCompositeNode(vtkMRMLScene* scene,
426 const char* layoutName);
427 static vtkMRMLSliceNode* GetSliceNode(vtkMRMLScene* scene,
428 const char* layoutName);
429
430 // @{
432 void SetWindowLevel(int layer, double window, double level);
433 void GetWindowLevelAndRange(int layer, double& window, double& level,
434 double& rangeLow, double& rangeHigh, bool& autoWindowLevel);
435 // @}
436
441 bool UpdateBlendLayers(vtkImageBlend* blend, const std::deque<SliceLayerInfo> &layers, bool clipToBackgroundVolume);
442
444 bool UpdateFractions(vtkImageMathematics* fraction, double opacity);
445
447 static void UpdateReconstructionSlab(vtkMRMLSliceLogic* sliceLogic, vtkMRMLSliceLayerLogic* sliceLayerLogic);
448
451 bool IsEventInsideVolume(bool background, double worldPos[3]);
452
456 vtkMRMLVolumeNode* GetFirstVolumeNode();
457
459 bool VolumeWindowLevelEditable(const char* vtkNotUsed(volumeNodeID))
460 {
461 vtkWarningMacro("vtkMRMLSliceLogic::VolumeWindowLevelEditable method is deprecated. Volume Window Level is always editable. Use the interaction node to check if in editing mode. "
462 "e.g. slicer.app.applicationLogic().GetInteractionNode().GetCurrentInteractionMode() == slicer.vtkMRMLInteractionNode.AdjustWindowLevel");
463 return true;
464 };
465
467
473
474 BlendPipeline* Pipeline;
475 BlendPipeline* PipelineUVW;
476 vtkImageReslice* ExtractModelTexture;
477 vtkAlgorithmOutput* ImageDataConnection;
478
482 double SliceSpacing[3];
483
484private:
485
486 vtkMRMLSliceLogic(const vtkMRMLSliceLogic&) = delete;
487 void operator=(const vtkMRMLSliceLogic&) = delete;
488
489};
490
491#endif
Superclass for MRML logic classes.
Abstract class that contains graphical display properties for displayable nodes.
MRML node for representing a linear transformation.
MRML node to represent a display property of 3D surface model.
MRML node to represent a 3D surface model.
Abstract Superclass for all specific types of MRML nodes.
A set of MRML Nodes that supports serialization and undo/redo.
MRML node for storing a slice through RAS space.
MRML node to store display properties of slice nodes.
Slicer logic class for slice manipulation.
void UpdateSliceNode()
Manage and synchronize the SliceNode.
void GetBackgroundSliceDimensions(double sliceDimensions[3], double sliceCenter[3])
Get the size of the volume, transformed to slice space.
vtkMRMLSliceLayerLogic * LabelLayer
void PrintSelf(ostream &os, vtkIndent indent) override
void SetSliceCompositeNode(vtkMRMLSliceCompositeNode *SliceCompositeNode)
void SetForegroundLayer(vtkMRMLSliceLayerLogic *ForegroundLayer)
void UpdateImageData()
Internally used by UpdatePipeline.
vtkMRMLSliceNode * AddSliceNode(const char *layoutName)
Convenience function for adding a slice node and setting it in this logic.
vtkImageBlend * GetBlendUVW()
void GetVolumeSliceDimensions(vtkMRMLVolumeNode *volumeNode, double sliceDimensions[3], double sliceCenter[3])
Get the size of the volume, transformed to slice space.
vtkMRMLSliceDisplayNode * GetSliceDisplayNode()
Slice plane display properties.
BlendPipeline * Pipeline
double * GetBackgroundSliceSpacing() VTK_SIZEHINT(3)
void FitSliceToVolumes(vtkCollection *volumeNodes, int width, int height)
adjust the node's field of view to match the extent of the volume
vtkMRMLModelNode * SliceModelNode
void SetBackgroundWindowLevel(double window, double level)
Helper to set the background layer Window/Level.
void SetSliceNode(vtkMRMLSliceNode *newSliceNode)
BlendPipeline * PipelineUVW
void GetBackgroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh)
Helper to get the background layer Window/Level and intensity range.
static vtkMRMLSliceLogic * New()
The Usual VTK class functions.
void GetBackgroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh, bool &autoWindowLevel)
void FitSliceToVolume(vtkMRMLVolumeNode *volumeNode, int width, int height)
adjust the node's field of view to match the extent of the volume
vtkMRMLVolumeNode * GetLayerVolumeNode(int layer)
vtkImageBlend * GetBlend()
void SetLabelLayer(vtkMRMLSliceLayerLogic *LabelLayer)
vtkMRMLSliceCompositeNode * SliceCompositeNode
vtkMRMLSliceLayerLogic * BackgroundLayer
void GetBackgroundRASBox(double rasDimensions[3], double rasCenter[3])
Get the size of the volume, transformed to RAS space.
vtkMRMLLinearTransformNode * SliceModelTransformNode
static void GetVolumeRASBox(vtkMRMLVolumeNode *volumeNode, double rasDimensions[3], double rasCenter[3])
Get the size of the volume, transformed to RAS space.
void SetForegroundWindowLevel(double window, double level)
Helper to set the foreground layer Window/Level.
void GetVolumeSliceBounds(vtkMRMLVolumeNode *volumeNode, double sliceBounds[6], bool useVoxelCenter=false)
vtkAlgorithmOutput * GetImageDataConnection()
vtkImageReslice * ExtractModelTexture
double * GetVolumeSliceSpacing(vtkMRMLVolumeNode *volumeNode) VTK_SIZEHINT(3)
void SetBackgroundLayer(vtkMRMLSliceLayerLogic *BackgroundLayer)
vtkAlgorithmOutput * ImageDataConnection
vtkMRMLSliceNode * SliceNode
void UpdateSliceNodeFromLayout()
Update slicer node given a layout name.
void GetForegroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh, bool &autoWindowLevel)
void UpdatePipeline()
update the pipeline to reflect the current state of the nodes
virtual bool EnterMRMLCallback() const
vtkMRMLModelDisplayNode * SliceModelDisplayNode
vtkMRMLSliceLayerLogic * ForegroundLayer
void UpdateSliceCompositeNode()
Manage and synchronize the SliceCompositeNode.
void GetForegroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh)
Helper to get the foreground layer Window/Level and intensity range.
MRML node for storing a slice through RAS space.
MRML node for representing a volume (image stack).