Slicer 5.6
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkMRMLMarkupsROINode.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 Kyle Sunderland, PerkLab, Queen's University
16 and was supported through CANARIE's Research Software Program, Cancer
17 Care Ontario, OpenAnatomy, and Brigham and Women's Hospital through NIH grant R01MH112748.
18
19==============================================================================*/
20
21#ifndef __vtkMRMLMarkupsROINode_h
22#define __vtkMRMLMarkupsROINode_h
23
24// MRML includes
26#include "vtkMRMLModelNode.h"
27
28// Markups includes
29#include "vtkSlicerMarkupsModuleMRMLExport.h"
31#include "vtkMRMLMarkupsNode.h"
32
33// VTK includes
34#include <vtkImplicitFunction.h>
35#include <vtkMatrix4x4.h>
36#include <vtkSmartPointer.h>
37#include <vtkStringArray.h>
38#include <vtkTransform.h>
39
40// std includes
41#include <vector>
42
43class vtkPlanes;
44
55class VTK_SLICER_MARKUPS_MODULE_MRML_EXPORT vtkMRMLMarkupsROINode : public vtkMRMLMarkupsNode
56{
57public:
61 void PrintSelf(ostream& os, vtkIndent indent) override;
62
63 const char* GetIcon() override {return ":/Icons/MarkupsROI.png";}
64 const char* GetAddIcon() override {return ":/Icons/MarkupsROIMouseModePlace.png";}
65 const char* GetPlaceAddIcon() override {return ":/Icons/MarkupsROIMouseModePlaceAdd.png";}
66
67 //--------------------------------------------------------------------------
68 // MRMLNode methods
69 //--------------------------------------------------------------------------
70
72
74 const char* GetNodeTagName() override {return "MarkupsROI";}
75
77 const char* GetMarkupType() override {return "ROI";};
78
79 // Get markup type GUI display name
80 const char* GetTypeDisplayName() override {return "ROI";};
81
83 const char* GetDefaultNodeNamePrefix() override {return "R";};
84
88
90 void ApplyTransform(vtkAbstractTransform* transform) override;
91
93
94 vtkGetVector3Macro(Size, double);
95 void SetSize(const double size[3]);
96 void SetSize(double x, double y, double z);
97 void GetSizeWorld(double size_World[3]);
98 void SetSizeWorld(const double size_World[3]);
99 void SetSizeWorld(double x_World, double y_World, double z_World);
101
103
104 void GetCenter(double center[3]);
105 void GetCenterWorld(double center[3]);
106 vtkVector3d GetCenter();
107 vtkVector3d GetCenterWorld();
108 void SetCenterWorld(const double center[3]);
109 void SetCenterWorld(double x, double y, double z);
110 void SetCenter(const double center[3]);
111 void SetCenter(double x, double y, double z);
113
115
117 void GetXAxisWorld(double axis_World[3]);
118 void GetYAxisWorld(double axis_World[3]);
119 void GetZAxisWorld(double axis_World[3]);
120 void GetAxisWorld(int axisIndex, double axis_World[3]);
121 void GetXAxis(double axis_Node[3]);
122 void GetYAxis(double axis_Node[3]);
123 void GetZAxis(double axis_Node[3]);
124 void GetAxis(int axisIndex, double axis_Node[3]);
126
128
129 vtkMatrix4x4* GetObjectToNodeMatrix()
130 {
131 return this->ObjectToNodeMatrix;
132 };
133 void SetAndObserveObjectToNodeMatrix(vtkMatrix4x4* objectToNodeMatrix);
135
139 {
140 return this->ObjectToWorldMatrix;
141 };
142
144
146 vtkGetMacro(ROIType, int);
147 void SetROIType(int roiType);
148 static const char* GetROITypeAsString(int roiType);
149 static int GetROITypeFromString(const char* roiType);
151
153
158
160
165
166 // ROI type enum defines the calculation method that should be used to convert to and from control points.
167 enum
168 {
171 ROIType_Last
172 };
173
176
177 void ProcessMRMLEvents(vtkObject* caller, unsigned long event, void* callData) override;
178
181
184
187
189
195 void GetRASBounds(double bounds[6]) override;
196 void GetBounds(double bounds[6]) override;
198
201 void GetObjectBounds(double bounds[6]);
202
204
208 void GetPlanes(vtkPlanes* planes) { this->GetPlanes(planes, this->GetInsideOut()); }
209 void GetPlanesWorld(vtkPlanes* planes) { this->GetPlanesWorld(planes, this->GetInsideOut()); }
211
213
217 void GetPlanes(vtkPlanes* planes, bool insideOut);
218 void GetPlanesWorld(vtkPlanes* planes, bool insideOut);
220
222
223 bool IsPointInROI(double point_Node[3]);
224 bool IsPointInROIWorld(double point_World[3]);
226
228
232 void SetInsideOut(bool insideOut);
233 vtkGetMacro(InsideOut, bool);
234 vtkBooleanMacro(InsideOut, bool);
236
238 vtkGetObjectMacro(ImplicitFunction, vtkImplicitFunction);
240 vtkGetObjectMacro(ImplicitFunctionWorld, vtkImplicitFunction);
241
244 VTK_NEWINSTANCE vtkPolyData* CreateROIBoxPolyDataWorld();
245
249
251
260 int SetXYZ(double center[3]);
261 int SetXYZ(double x, double y, double z);
262 bool GetXYZ(double center[3]);
264
266
273 void SetRadiusXYZ(double radiusXYZ[3]);
274 void SetRadiusXYZ(double x, double y, double z);
275 void GetRadiusXYZ(double radiusXYZ[3]);
277
280 void GetTransformedPlanes(vtkPlanes* planes, bool insideOut=false);
281
283
285 static void GenerateOrthogonalMatrix(vtkMatrix4x4* inputMatrix,
286 vtkMatrix4x4* outputMatrix, vtkAbstractTransform* transform = nullptr, bool applyScaling = true);
287 static void GenerateOrthogonalMatrix(double xAxis[3], double yAxis[3], double zAxis[3], double origin[3],
288 vtkMatrix4x4* outputMatrix, vtkAbstractTransform* transform = nullptr, bool applyScaling = true);
290
295 void WriteCLI(std::vector<std::string>& commandLine,
296 std::string prefix, int coordinateSystem = vtkMRMLStorageNode::CoordinateSystemRAS,
297 int multipleFlag = 1) override;
298
299protected:
301
302 double Size[3]{ 0.0, 0.0, 0.0 };
303
304 bool IsUpdatingControlPointsFromROI{false};
305 bool IsUpdatingROIFromControlPoints{false};
306 bool IsUpdatingInteractionHandleToWorldMatrix{false};
307 bool InsideOut{false};
309
310 vtkSmartPointer<vtkMatrix4x4> ObjectToNodeMatrix { nullptr };
311 vtkSmartPointer<vtkMatrix4x4> ObjectToWorldMatrix { nullptr };
312
313 vtkSmartPointer<vtkImplicitFunction> ImplicitFunction { nullptr };
314 vtkSmartPointer<vtkImplicitFunction> ImplicitFunctionWorld { nullptr };
315
317 void GenerateBoxBounds(double bounds[6], double xAxis[3], double yAxis[3], double zAxis[3], double center[3], double size[3]);
318
321
324
329};
330
331#endif
MRML node to represent an ROI markup.
void GetXAxisWorld(double axis_World[3])
int SetXYZ(double center[3])
void GetRASBounds(double bounds[6]) override
void SetSize(const double size[3])
int SetXYZ(double x, double y, double z)
void GetObjectBounds(double bounds[6])
void SetCenter(double x, double y, double z)
void UpdateObjectToWorldMatrix()
Calculates the transform from the Object (ROI) to World coordinates.
void GetBounds(double bounds[6]) override
void PrintSelf(ostream &os, vtkIndent indent) override
Print out the node information to the output stream.
void GetPlanesWorld(vtkPlanes *planes, bool insideOut)
void WriteCLI(std::vector< std::string > &commandLine, std::string prefix, int coordinateSystem=vtkMRMLStorageNode::CoordinateSystemRAS, int multipleFlag=1) override
bool IsPointInROI(double point_Node[3])
Returns true if the specified point is within the ROI.
vtkVector3d GetCenterWorld()
void OnTransformNodeReferenceChanged(vtkMRMLTransformNode *transformNode) override
Reimplemented to recalculate InteractionHandleToWorld matrix when parent transform is changed.
vtkMatrix4x4 * GetObjectToWorldMatrix()
void GetAxisWorld(int axisIndex, double axis_World[3])
const char * GetIcon() override
void SetSizeWorld(const double size_World[3])
vtkMRMLNode * CreateNodeInstance() override
MRMLNode methods.
const char * GetNodeTagName() override
Get node XML tag name (like Volume, Model)
void ApplyTransform(vtkAbstractTransform *transform) override
Apply the passed transformation to the ROI.
const char * GetAddIcon() override
void GetCenter(double center[3])
Center of the ROI.
static int GetROITypeFromString(const char *roiType)
virtual void UpdateROIFromControlPoints()
Calculate the ROI dimensions from the control points.
void SetRadiusXYZ(double x, double y, double z)
void GetAxis(int axisIndex, double axis_Node[3])
static void GenerateOrthogonalMatrix(vtkMatrix4x4 *inputMatrix, vtkMatrix4x4 *outputMatrix, vtkAbstractTransform *transform=nullptr, bool applyScaling=true)
bool GetObjectToNodeMatrixRotated()
void SetRadiusXYZ(double radiusXYZ[3])
void GetZAxisWorld(double axis_World[3])
static const char * GetROITypeAsString(int roiType)
void SetROIType(int roiType)
void GetTransformedPlanes(vtkPlanes *planes, bool insideOut=false)
void GetYAxisWorld(double axis_World[3])
~vtkMRMLMarkupsROINode() override
virtual void UpdateBoundingBoxROIFromControlPoints()
void GetPlanesWorld(vtkPlanes *planes)
void ProcessMRMLEvents(vtkObject *caller, unsigned long event, void *callData) override
Alternative method to propagate events generated in Display nodes.
VTK_NEWINSTANCE vtkPolyData * CreateROIBoxPolyDataWorld()
void SetCenterWorld(double x, double y, double z)
void SetCenterWorld(const double center[3])
static vtkMRMLMarkupsROINode * New()
virtual void UpdateControlPointsFromBoundingBoxROI()
void GetSizeWorld(double size_World[3])
void operator=(const vtkMRMLMarkupsROINode &)
vtkMatrix4x4 * GetObjectToNodeMatrix()
4x4 matrix defining the object center and axis directions within the node coordinate system.
void GetCenterWorld(double center[3])
const char * GetMarkupType() override
Get markup type internal name.
virtual void UpdateBoxROIFromControlPoints()
vtkMRMLStorageNode * CreateDefaultStorageNode() override
Create default storage node or nullptr if does not have one.
virtual void UpdateControlPointsFromBoxROI()
const char * GetPlaceAddIcon() override
bool IsPointInROIWorld(double point_World[3])
vtkMRMLCopyContentMacro(vtkMRMLMarkupsROINode)
void SetSizeWorld(double x_World, double y_World, double z_World)
void GetYAxis(double axis_Node[3])
bool GetXYZ(double center[3])
void GenerateBoxBounds(double bounds[6], double xAxis[3], double yAxis[3], double zAxis[3], double center[3], double size[3])
Fills the specified vtkPoints with the points for all of the box ROI corners.
void SetAndObserveObjectToNodeMatrix(vtkMatrix4x4 *objectToNodeMatrix)
void CreateDefaultDisplayNodes() override
Create default display node or nullptr if does not have one.
vtkVector3d GetCenter()
const char * GetDefaultNodeNamePrefix() override
Get markup short name.
virtual void UpdateControlPointsFromROI()
Calculate the position of control points from the ROI.
void GetRadiusXYZ(double radiusXYZ[3])
static void GenerateOrthogonalMatrix(double xAxis[3], double yAxis[3], double zAxis[3], double origin[3], vtkMatrix4x4 *outputMatrix, vtkAbstractTransform *transform=nullptr, bool applyScaling=true)
void SetCenter(const double center[3])
void UpdateImplicitFunction()
Updates the parameters of the internal implicit functions.
void GetXAxis(double axis_Node[3])
void SetSize(double x, double y, double z)
void GetPlanes(vtkPlanes *planes, bool insideOut)
void GetPlanes(vtkPlanes *planes)
const char * GetTypeDisplayName() override
void GetZAxis(double axis_Node[3])
void UpdateInteractionHandleToWorldMatrix() override
Update the InteractionHandleToWorldMatrix based on the ObjectToNode and NodeToWorld transforms.
vtkMRMLMarkupsROINode(const vtkMRMLMarkupsROINode &)
void SetInsideOut(bool insideOut)
@ ROITypeBoundingBox
ROI forms a bounding box around the control points.
@ ROITypeBox
Requires two Control points that are removed after they have been placed.
Abstract Superclass for all specific types of MRML nodes.
A superclass for other storage nodes.
MRML node for representing a transformation between this node space and a parent node space.