Slicer 5.4
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 <vector>
23#include <deque>
24
34
35class vtkAlgorithmOutput;
36class vtkCollection;
37class vtkImageBlend;
38class vtkTransform;
39class vtkImageData;
40class vtkImageMathematics;
41class vtkImageReslice;
42class vtkTransform;
43
44struct SliceLayerInfo;
45struct BlendPipeline;
46
59class VTK_MRML_LOGIC_EXPORT vtkMRMLSliceLogic : public vtkMRMLAbstractLogic
60{
61public:
65 void PrintSelf(ostream& os, vtkIndent indent) override;
66
68 enum
69 {
70 CompositeModifiedEvent = 18000
71 };
72
73 enum
74 {
75 LayerNone = -1,
76 LayerBackground = 0,
77 LayerForeground = 1,
78 LayerLabel = 2
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 GetBackgroundRASBox(double rasDimensions[3], double rasCenter[3]);
231
234 void GetBackgroundSliceDimensions(double sliceDimensions[3], double sliceCenter[3]);
235
240 double* GetBackgroundSliceSpacing() VTK_SIZEHINT(3);
241
246 void GetBackgroundSliceBounds(double sliceBounds[6]);
247
252 void RotateSliceToLowestVolumeAxes(bool forceSlicePlaneToSingleSlice = true);
253
256 void FitSliceToBackground(int width, int height);
257
261 void FitSliceToAll(int width = -1, int height = -1);
262
265 void FitFOVToBackground(double fov);
266
272 void ResizeSliceNode(double newWidth, double newHeight);
273
280 double* GetLowestVolumeSliceSpacing() VTK_SIZEHINT(3);
281
289 void GetLowestVolumeSliceBounds(double sliceBounds[6], bool useVoxelCenter=false);
290
293 double GetSliceOffset();
294 void SetSliceOffset(double offset);
295
298 void GetSliceBounds(double sliceBounds[6]);
299
302 void SetSliceExtentsToSliceNode();
303
307 void StartSliceNodeInteraction(unsigned int parameters);
308
310 void EndSliceNodeInteraction();
311
315 void StartSliceCompositeNodeInteraction(unsigned int parameters);
316
318 void EndSliceCompositeNodeInteraction();
319
321 void StartSliceOffsetInteraction();
322
324 void EndSliceOffsetInteraction();
325
329 void SnapSliceOffsetToIJK();
330
331 static const int SLICE_INDEX_ROTATED;
332 static const int SLICE_INDEX_OUT_OF_VOLUME;
333 static const int SLICE_INDEX_NO_VOLUME;
334
340 int GetSliceIndexFromOffset(double sliceOffset, vtkMRMLVolumeNode *volumeNode);
341
350 int GetSliceIndexFromOffset(double sliceOffset);
351
354 void CreateSliceModel();
355 void DeleteSliceModel();
356
359 std::vector< vtkMRMLDisplayNode*> GetPolyDataDisplayNodes();
361 static vtkMRMLSliceCompositeNode* GetSliceCompositeNode(vtkMRMLSliceNode* node);
363 static vtkMRMLSliceNode* GetSliceNode(vtkMRMLSliceCompositeNode* node);
364
368 static const std::string SLICE_MODEL_NODE_NAME_SUFFIX;
369
373 static bool IsSliceModelNode(vtkMRMLNode *mrmlNode);
378 static bool IsSliceModelDisplayNode(vtkMRMLDisplayNode *mrmlDisplayNode);
379
384 int GetEditableLayerAtWorldPosition(double worldPos[3], bool backgroundVolumeEditable = true, bool foregroundVolumeEditable = true);
385
388 bool GetSliceOffsetRangeResolution(double range[2], double& resolution);
389
390protected:
391
393 ~vtkMRMLSliceLogic() override;
394
395 void SetMRMLSceneInternal(vtkMRMLScene * newScene) override;
396
399 void ProcessMRMLLogicsEvents(vtkObject * caller,
400 unsigned long event,
401 void * callData) override;
402 void ProcessMRMLLogicsEvents();
403
404 void OnMRMLSceneNodeAdded(vtkMRMLNode* node) override;
405 void OnMRMLSceneNodeRemoved(vtkMRMLNode* node) override;
406 void UpdateFromMRMLScene() override;
407 void OnMRMLSceneStartClose() override;
408 void OnMRMLSceneEndImport() override;
409 void OnMRMLSceneEndRestore() override;
410
411 void UpdateSliceNodes();
412 void SetupCrosshairNode();
413
414 void OnMRMLNodeModified(vtkMRMLNode* node) override;
415 static vtkMRMLSliceCompositeNode* GetSliceCompositeNode(vtkMRMLScene* scene,
416 const char* layoutName);
417 static vtkMRMLSliceNode* GetSliceNode(vtkMRMLScene* scene,
418 const char* layoutName);
419
422 void SetWindowLevel(double window, double level, int layer);
423
428 bool UpdateBlendLayers(vtkImageBlend* blend, const std::deque<SliceLayerInfo> &layers);
429
431 bool UpdateFractions(vtkImageMathematics* fraction, double opacity);
432
434 static void UpdateReconstructionSlab(vtkMRMLSliceLogic* sliceLogic, vtkMRMLSliceLayerLogic* sliceLayerLogic);
435
438 bool IsEventInsideVolume(bool background, double worldPos[3]);
439
441 bool VolumeWindowLevelEditable(const char* vtkNotUsed(volumeNodeID))
442 {
443 vtkWarningMacro("vtkMRMLSliceLogic::VolumeWindowLevelEditable method is deprecated. Volume Window Level is always editable. Use the interaction node to check if in editing mode. "
444 "e.g. slicer.app.applicationLogic().GetInteractionNode().GetCurrentInteractionMode() == slicer.vtkMRMLInteractionNode.AdjustWindowLevel");
445 return true;
446 };
447
449
455
456 BlendPipeline* Pipeline;
457 BlendPipeline* PipelineUVW;
458 vtkImageReslice * ExtractModelTexture;
459 vtkAlgorithmOutput * ImageDataConnection;
460
464 double SliceSpacing[3];
465
466private:
467
468 vtkMRMLSliceLogic(const vtkMRMLSliceLogic&) = delete;
469 void operator=(const vtkMRMLSliceLogic&) = delete;
470
471};
472
473#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)
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 current background 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).