Slicer 5.4
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
56class VTK_SLICER_MARKUPS_MODULE_MRML_EXPORT vtkMRMLMarkupsROINode : public vtkMRMLMarkupsNode
57{
58public:
62 void PrintSelf(ostream& os, vtkIndent indent) override;
63
64 const char* GetIcon() override {return ":/Icons/MarkupsROI.png";}
65 const char* GetAddIcon() override {return ":/Icons/MarkupsROIMouseModePlace.png";}
66 const char* GetPlaceAddIcon() override {return ":/Icons/MarkupsROIMouseModePlaceAdd.png";}
67
68 //--------------------------------------------------------------------------
69 // MRMLNode methods
70 //--------------------------------------------------------------------------
71
73
75 const char* GetNodeTagName() override {return "MarkupsROI";}
76
78 const char* GetMarkupType() override {return "ROI";};
79
80 // Get markup type GUI display name
81 const char* GetTypeDisplayName() override {return "ROI";};
82
84 const char* GetDefaultNodeNamePrefix() override {return "R";};
85
89
91 void ApplyTransform(vtkAbstractTransform* transform) override;
92
94
95 vtkGetVector3Macro(Size, double);
96 void SetSize(const double size[3]);
97 void SetSize(double x, double y, double z);
98 void GetSizeWorld(double size_World[3]);
99 void SetSizeWorld(const double size_World[3]);
100 void SetSizeWorld(double x_World, double y_World, double z_World);
102
104
105 void GetCenter(double center[3]);
106 void GetCenterWorld(double center[3]);
107 vtkVector3d GetCenter();
108 vtkVector3d GetCenterWorld();
109 void SetCenterWorld(const double center[3]);
110 void SetCenterWorld(double x, double y, double z);
111 void SetCenter(const double center[3]);
112 void SetCenter(double x, double y, double z);
114
116
118 void GetXAxisWorld(double axis_World[3]);
119 void GetYAxisWorld(double axis_World[3]);
120 void GetZAxisWorld(double axis_World[3]);
121 void GetAxisWorld(int axisIndex, double axis_World[3]);
122 void GetXAxis(double axis_Node[3]);
123 void GetYAxis(double axis_Node[3]);
124 void GetZAxis(double axis_Node[3]);
125 void GetAxis(int axisIndex, double axis_Node[3]);
127
129
130 vtkMatrix4x4* GetObjectToNodeMatrix()
131 {
132 return this->ObjectToNodeMatrix;
133 };
134 void SetAndObserveObjectToNodeMatrix(vtkMatrix4x4* objectToNodeMatrix);
136
140 {
141 return this->ObjectToWorldMatrix;
142 };
143
145
147 vtkGetMacro(ROIType, int);
148 void SetROIType(int roiType);
149 static const char* GetROITypeAsString(int roiType);
150 static int GetROITypeFromString(const char* roiType);
152
154
159
161
166
167 // ROI type enum defines the calculation method that should be used to convert to and from control points.
168 enum
169 {
172 ROIType_Last
173 };
174
177
178 void ProcessMRMLEvents(vtkObject* caller, unsigned long event, void* callData) override;
179
182
185
188
190
196 void GetRASBounds(double bounds[6]) override;
197 void GetBounds(double bounds[6]) override;
199
202 void GetObjectBounds(double bounds[6]);
203
205
209 void GetPlanes(vtkPlanes* planes) { this->GetPlanes(planes, this->GetInsideOut()); }
210 void GetPlanesWorld(vtkPlanes* planes) { this->GetPlanesWorld(planes, this->GetInsideOut()); }
212
214
218 void GetPlanes(vtkPlanes* planes, bool insideOut);
219 void GetPlanesWorld(vtkPlanes* planes, bool insideOut);
221
223
224 bool IsPointInROI(double point_Node[3]);
225 bool IsPointInROIWorld(double point_World[3]);
227
229
233 void SetInsideOut(bool insideOut);
234 vtkGetMacro(InsideOut, bool);
235 vtkBooleanMacro(InsideOut, bool);
237
239 vtkGetObjectMacro(ImplicitFunction, vtkImplicitFunction);
241 vtkGetObjectMacro(ImplicitFunctionWorld, vtkImplicitFunction);
242
245 VTK_NEWINSTANCE vtkPolyData* CreateROIBoxPolyDataWorld();
246
250
252
261 int SetXYZ(double center[3]);
262 int SetXYZ(double x, double y, double z);
263 bool GetXYZ(double center[3]);
265
267
274 void SetRadiusXYZ(double radiusXYZ[3]);
275 void SetRadiusXYZ(double x, double y, double z);
276 void GetRadiusXYZ(double radiusXYZ[3]);
278
281 void GetTransformedPlanes(vtkPlanes* planes, bool insideOut=false);
282
284
286 static void GenerateOrthogonalMatrix(vtkMatrix4x4* inputMatrix,
287 vtkMatrix4x4* outputMatrix, vtkAbstractTransform* transform = nullptr, bool applyScaling = true);
288 static void GenerateOrthogonalMatrix(double xAxis[3], double yAxis[3], double zAxis[3], double origin[3],
289 vtkMatrix4x4* outputMatrix, vtkAbstractTransform* transform = nullptr, bool applyScaling = true);
291
296 void WriteCLI(std::vector<std::string>& commandLine,
297 std::string prefix, int coordinateSystem = vtkMRMLStorageNode::CoordinateSystemRAS,
298 int multipleFlag = 1) override;
299
300protected:
302
303 double Size[3]{ 0.0, 0.0, 0.0 };
304
305 bool IsUpdatingControlPointsFromROI{false};
306 bool IsUpdatingROIFromControlPoints{false};
307 bool IsUpdatingInteractionHandleToWorldMatrix{false};
308 bool InsideOut{false};
310
311 vtkSmartPointer<vtkMatrix4x4> ObjectToNodeMatrix { nullptr };
312 vtkSmartPointer<vtkMatrix4x4> ObjectToWorldMatrix { nullptr };
313
314 vtkSmartPointer<vtkImplicitFunction> ImplicitFunction { nullptr };
315 vtkSmartPointer<vtkImplicitFunction> ImplicitFunctionWorld { nullptr };
316
318 void GenerateBoxBounds(double bounds[6], double xAxis[3], double yAxis[3], double zAxis[3], double center[3], double size[3]);
319
322
325
330};
331
332#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.