Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 {
70 };
71
72 enum
73 {
78 Layer_Last // must be last
79 };
80
82 vtkGetObjectMacro (SliceNode, vtkMRMLSliceNode);
83 void SetSliceNode (vtkMRMLSliceNode * newSliceNode);
84
86 vtkMRMLSliceNode* AddSliceNode(const char* layoutName);
87
93
99
105
111
113 void SetNthLayer(int layerIndex, vtkMRMLSliceLayerLogic *layer);
114
115 vtkAlgorithmOutput* GetNthLayerImageDataConnection(int layerIndex);
116 vtkAlgorithmOutput* GetNthLayerImageDataConnectionUVW(int layerIndex);
117
121
123 void SetBackgroundWindowLevel(double window, double level);
124
127 void GetBackgroundWindowLevelAndRange(double& window, double& level,
128 double& rangeLow, double& rangeHigh, bool& autoWindowLevel);
129
131 void GetBackgroundWindowLevelAndRange(double& window, double& level,
132 double& rangeLow, double& rangeHigh);
133
135 void SetForegroundWindowLevel(double window, double level);
136
139 void GetForegroundWindowLevelAndRange(double& window, double& level,
140 double& rangeLow, double& rangeHigh, bool& autoWindowLevel);
141
143 void GetForegroundWindowLevelAndRange(double& window, double& level,
144 double& rangeLow, double& rangeHigh);
145
147 vtkGetObjectMacro(SliceModelNode, vtkMRMLModelNode);
148
152
155
158
161 vtkImageBlend* GetBlend();
162 vtkImageBlend* GetBlendUVW();
163
166 vtkGetObjectMacro(ExtractModelTexture, vtkImageReslice);
167
170 vtkAlgorithmOutput *GetImageDataConnection();
171
174 bool HasInputs();
175
179
182
185
188 virtual bool EnterMRMLCallback() const;
189
192
195
198
204
206 static void GetVolumeRASBox(vtkMRMLVolumeNode *volumeNode, double rasDimensions[3], double rasCenter[3]);
207
209 void GetVolumeSliceDimensions(vtkMRMLVolumeNode *volumeNode, double sliceDimensions[3], double sliceCenter[3]);
210
214 double* GetVolumeSliceSpacing(vtkMRMLVolumeNode *volumeNode) VTK_SIZEHINT(3);
215
221 void GetVolumeSliceBounds(vtkMRMLVolumeNode *volumeNode, double sliceBounds[6], bool useVoxelCenter=false);
222
224 void FitSliceToVolume(vtkMRMLVolumeNode *volumeNode, int width, int height);
225
227 void FitSliceToVolumes(vtkCollection *volumeNodes, int width, int height);
228
230 void GetBackgroundRASBox(double rasDimensions[3], double rasCenter[3]);
231
233 void GetBackgroundSliceDimensions(double sliceDimensions[3], double sliceCenter[3]);
234
238 double* GetBackgroundSliceSpacing() VTK_SIZEHINT(3);
239
243 void GetBackgroundSliceBounds(double sliceBounds[6]);
244
249 void RotateSliceToLowestVolumeAxes(bool forceSlicePlaneToSingleSlice = true);
250
252 void FitSliceToFirst(int width = -1, int height = -1);
253
258 void FitSliceToBackground(int width = -1, int height = -1);
259
261 void FitSliceToAll(int width = -1, int height = -1);
262
265 void FitFOVToBackground(double fov);
266
272 void ResizeSliceNode(double newWidth, double newHeight);
273
279 double* GetLowestVolumeSliceSpacing() VTK_SIZEHINT(3);
280
287 void GetLowestVolumeSliceBounds(double sliceBounds[6], bool useVoxelCenter=false);
288
292 void SetSliceOffset(double offset);
294
296 void GetSliceBounds(double sliceBounds[6]);
297
300
304 void StartSliceNodeInteraction(unsigned int parameters);
305
308
312 void StartSliceCompositeNodeInteraction(unsigned int parameters);
313
316
319
322
326
327 static const int SLICE_INDEX_ROTATED;
329 static const int SLICE_INDEX_NO_VOLUME;
330
336 int GetSliceIndexFromOffset(double sliceOffset, vtkMRMLVolumeNode *volumeNode);
337
346 int GetSliceIndexFromOffset(double sliceOffset);
347
353
360
364 static const std::string SLICE_MODEL_NODE_NAME_SUFFIX;
365
369 static bool IsSliceModelNode(vtkMRMLNode *mrmlNode);
374 static bool IsSliceModelDisplayNode(vtkMRMLDisplayNode *mrmlDisplayNode);
375
380 int GetEditableLayerAtWorldPosition(double worldPos[3], bool backgroundVolumeEditable = true, bool foregroundVolumeEditable = true);
381
384 bool GetSliceOffsetRangeResolution(double range[2], double& resolution);
385
386protected:
387
389 ~vtkMRMLSliceLogic() override;
390
391 void SetMRMLSceneInternal(vtkMRMLScene * newScene) override;
392
394 void ProcessMRMLLogicsEvents(vtkObject * caller,
395 unsigned long event,
396 void * callData) override;
398
399 void OnMRMLSceneNodeAdded(vtkMRMLNode* node) override;
401 void UpdateFromMRMLScene() override;
402 void OnMRMLSceneStartClose() override;
403 void OnMRMLSceneEndImport() override;
404 void OnMRMLSceneEndRestore() override;
405
408
409 void OnMRMLNodeModified(vtkMRMLNode* node) override;
411 const char* layoutName);
413 const char* layoutName);
414
416 void SetNthLayerVolumeNode(int layerIndex, vtkMRMLVolumeNode* volumeNode);
417
420 void SetWindowLevel(int layer, double window, double level);
421 void GetWindowLevelAndRange(int layer, double& window, double& level,
422 double& rangeLow, double& rangeHigh, bool& autoWindowLevel);
424
429 static bool UpdateBlendLayers(vtkImageBlend* blend, const std::deque<SliceLayerInfo> &layers, bool clipToBackgroundVolume);
430
432 static bool UpdateAddSubOperation(vtkImageMathematics* addSubMath, int compositing);
433
435 static bool UpdateFractions(vtkImageMathematics* fraction, double opacity);
436
438 static bool UpdateFractions(BlendPipeline* pipeline, const std::vector<vtkAlgorithmOutput*>& imagePorts, const std::vector<double>& opacities);
439
441 static void UpdateReconstructionSlab(vtkMRMLSliceLogic* sliceLogic, vtkMRMLSliceLayerLogic* sliceLayerLogic);
442
445 bool IsEventInsideVolume(bool background, double worldPos[3]);
446
451
453 bool VolumeWindowLevelEditable(const char* vtkNotUsed(volumeNodeID))
454 {
455 vtkWarningMacro("vtkMRMLSliceLogic::VolumeWindowLevelEditable method is deprecated. Volume Window Level is always editable. Use the interaction node to check if in editing mode. "
456 "e.g. slicer.app.applicationLogic().GetInteractionNode().GetCurrentInteractionMode() == slicer.vtkMRMLInteractionNode.AdjustWindowLevel");
457 return true;
458 };
459
460 typedef vtkSmartPointer<vtkMRMLSliceLayerLogic> LayerListItem;
461 typedef std::vector<LayerListItem> LayerList;
462 typedef std::vector<LayerListItem>::iterator LayerListIterator;
463 typedef std::vector<LayerListItem>::const_iterator LayerListConstIterator;
464
466
468
471
472 BlendPipeline* Pipeline;
473 BlendPipeline* PipelineUVW;
474 vtkImageReslice* ExtractModelTexture;
475 vtkAlgorithmOutput* ImageDataConnection;
476
480 double SliceSpacing[3];
481
482private:
483
484 vtkMRMLSliceLogic(const vtkMRMLSliceLogic&) = delete;
485 void operator=(const vtkMRMLSliceLogic&) = delete;
486
487};
488
489#endif
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.
vtkAlgorithmOutput * GetNthLayerImageDataConnectionUVW(int layerIndex)
void GetBackgroundSliceBounds(double sliceBounds[6])
std::vector< LayerListItem >::iterator LayerListIterator
void UpdateSliceNode()
Manage and synchronize the SliceNode.
void OnMRMLSceneEndRestore() override
void GetBackgroundSliceDimensions(double sliceDimensions[3], double sliceCenter[3])
Get the size of the volume, transformed to slice space.
void SetNthLayer(int layerIndex, vtkMRMLSliceLayerLogic *layer)
void OnMRMLSceneNodeRemoved(vtkMRMLNode *node) override
vtkMRMLVolumeNode * GetNthLayerVolumeNode(int layerIndex)
vtkMRMLSliceLayerLogic * GetForegroundLayer()
void FitSliceToBackground(int width=-1, int height=-1)
void PrintSelf(ostream &os, vtkIndent indent) override
void SetSliceCompositeNode(vtkMRMLSliceCompositeNode *SliceCompositeNode)
void StartSliceCompositeNodeInteraction(unsigned int parameters)
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.
void OnMRMLSceneStartClose() override
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.
void GetSliceBounds(double sliceBounds[6])
Get the largest slice bounding box for all volumes in layers.
void SnapSliceOffsetToIJK()
vtkMRMLSliceLayerLogic * GetBackgroundLayer()
double GetSliceOffset()
bool GetSliceOffsetRangeResolution(double range[2], double &resolution)
void OnMRMLNodeModified(vtkMRMLNode *node) override
BlendPipeline * Pipeline
bool IsEventInsideVolume(bool background, double worldPos[3])
double * GetBackgroundSliceSpacing() VTK_SIZEHINT(3)
static bool UpdateBlendLayers(vtkImageBlend *blend, const std::deque< SliceLayerInfo > &layers, bool clipToBackgroundVolume)
void OnMRMLSceneEndImport() override
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 UpdateFromMRMLScene() override
void SetBackgroundWindowLevel(double window, double level)
Helper to set the background layer Window/Level.
bool VolumeWindowLevelEditable(const char *vtkNotUsed(volumeNodeID))
Deprecated. Returns true if the volume's window/level values are editable on the GUI.
vtkMRMLSliceLayerLogic * GetNthLayer(int layerIndex)
void SetSliceNode(vtkMRMLSliceNode *newSliceNode)
static bool IsSliceModelNode(vtkMRMLNode *mrmlNode)
BlendPipeline * PipelineUVW
void GetBackgroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh)
Helper to get the background layer Window/Level and intensity range.
static const int SLICE_INDEX_NO_VOLUME
void FitFOVToBackground(double fov)
static vtkMRMLSliceLogic * New()
The Usual VTK class functions.
void GetBackgroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh, bool &autoWindowLevel)
std::vector< LayerListItem > LayerList
vtkSmartPointer< vtkMRMLSliceLayerLogic > LayerListItem
vtkAlgorithmOutput * GetNthLayerImageDataConnection(int layerIndex)
void FitSliceToVolume(vtkMRMLVolumeNode *volumeNode, int width, int height)
adjust the node's field of view to match the extent of the volume
void GetWindowLevelAndRange(int layer, double &window, double &level, double &rangeLow, double &rangeHigh, bool &autoWindowLevel)
static bool UpdateAddSubOperation(vtkImageMathematics *addSubMath, int compositing)
Helper to update the operation to perform based on compositing mode.
void StartSliceNodeInteraction(unsigned int parameters)
std::vector< LayerListItem >::const_iterator LayerListConstIterator
vtkMRMLVolumeNode * GetLayerVolumeNode(int layer)
double * GetLowestVolumeSliceSpacing() VTK_SIZEHINT(3)
void SetWindowLevel(int layer, double window, double level)
vtkImageBlend * GetBlend()
void ResizeSliceNode(double newWidth, double newHeight)
static bool IsSliceModelDisplayNode(vtkMRMLDisplayNode *mrmlDisplayNode)
static bool UpdateFractions(vtkImageMathematics *fraction, double opacity)
Helper to update layer opacity when adding/subtracting the background layer.
void SetLabelLayer(vtkMRMLSliceLayerLogic *LabelLayer)
vtkMRMLSliceCompositeNode * SliceCompositeNode
static void UpdateReconstructionSlab(vtkMRMLSliceLogic *sliceLogic, vtkMRMLSliceLayerLogic *sliceLayerLogic)
Helper to update reconstruction slab settings for a given layer.
void OnMRMLSceneNodeAdded(vtkMRMLNode *node) override
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.
static const std::string SLICE_MODEL_NODE_NAME_SUFFIX
void StartSliceOffsetInteraction()
Indicate the slice offset value is starting to change.
void SetForegroundWindowLevel(double window, double level)
Helper to set the foreground layer Window/Level.
void ProcessMRMLLogicsEvents(vtkObject *caller, unsigned long event, void *callData) override
process logic events
void SetSliceExtentsToSliceNode()
Set slice extents to all layers.
void GetVolumeSliceBounds(vtkMRMLVolumeNode *volumeNode, double sliceBounds[6], bool useVoxelCenter=false)
vtkAlgorithmOutput * GetImageDataConnection()
static const int SLICE_INDEX_ROTATED
void EndSliceCompositeNodeInteraction()
Indicate an interaction with the slice composite node has been completed.
vtkMRMLSliceLayerLogic * GetLabelLayer()
void SetMRMLSceneInternal(vtkMRMLScene *newScene) override
std::vector< vtkMRMLDisplayNode * > GetPolyDataDisplayNodes()
Get all slice displaynodes creating PolyData models like glyphs etc.
vtkImageReslice * ExtractModelTexture
double * GetVolumeSliceSpacing(vtkMRMLVolumeNode *volumeNode) VTK_SIZEHINT(3)
void SetSliceOffset(double offset)
void SetBackgroundLayer(vtkMRMLSliceLayerLogic *BackgroundLayer)
static const int SLICE_INDEX_OUT_OF_VOLUME
virtual vtkMRMLSliceNode * GetSliceNode()
The MRML slice node for this slice logic.
vtkAlgorithmOutput * ImageDataConnection
vtkMRMLSliceNode * SliceNode
void UpdateSliceNodeFromLayout()
Update slicer node given a layout name.
void FitSliceToAll(int width=-1, int height=-1)
adjust the node's field of view to match the extent of all volume layers
void GetForegroundWindowLevelAndRange(double &window, double &level, double &rangeLow, double &rangeHigh, bool &autoWindowLevel)
int GetEditableLayerAtWorldPosition(double worldPos[3], bool backgroundVolumeEditable=true, bool foregroundVolumeEditable=true)
void RotateSliceToLowestVolumeAxes(bool forceSlicePlaneToSingleSlice=true)
vtkMRMLVolumeNode * GetFirstVolumeNode()
void UpdatePipeline()
update the pipeline to reflect the current state of the nodes
virtual bool EnterMRMLCallback() const
void GetLowestVolumeSliceBounds(double sliceBounds[6], bool useVoxelCenter=false)
void SetNthLayerVolumeNode(int layerIndex, vtkMRMLVolumeNode *volumeNode)
Set volume associated with a layer.
int GetSliceIndexFromOffset(double sliceOffset, vtkMRMLVolumeNode *volumeNode)
void EndSliceOffsetInteraction()
Indicate the slice offset value has completed its change.
virtual vtkMRMLSliceCompositeNode * GetSliceCompositeNode()
void SetupCrosshairNode()
void FitSliceToFirst(int width=-1, int height=-1)
adjust the node's field of view to match the extent of the first selected volume (background,...
vtkMRMLModelDisplayNode * SliceModelDisplayNode
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.
void EndSliceNodeInteraction()
Indicate an interaction with the slice node has been completed.
MRML node for storing a slice through RAS space.
MRML node for representing a volume (image stack).