Slicer 5.6
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkMRMLMarkupsPlaneNode.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 __vtkMRMLMarkupsPlaneNode_h
22#define __vtkMRMLMarkupsPlaneNode_h
23
24// MRML includes
26
27// Markups includes
29#include "vtkMRMLMarkupsNode.h"
30#include "vtkSlicerMarkupsModuleMRMLExport.h"
31
32// VTK includes
33#include <vtkMatrix4x4.h>
34
54class VTK_SLICER_MARKUPS_MODULE_MRML_EXPORT vtkMRMLMarkupsPlaneNode : public vtkMRMLMarkupsNode
55{
56public:
60 void PrintSelf(ostream& os, vtkIndent indent) override;
61
62 const char* GetIcon() override {return ":/Icons/MarkupsPlane.png";}
63 const char* GetAddIcon() override {return ":/Icons/MarkupsPlaneMouseModePlace.png";}
64 const char* GetPlaceAddIcon() override {return ":/Icons/MarkupsPlaneMouseModePlaceAdd.png";}
65
66 //--------------------------------------------------------------------------
67 // MRMLNode methods
68 //--------------------------------------------------------------------------
69
70 enum
71 {
75 };
76
78 enum
79 {
83 PlaneType_Last
84 };
85
88 const char* GetNodeTagName() override {return "MarkupsPlane";}
89
91 const char* GetMarkupType() override {return "Plane";};
92
93 // Get markup type GUI display name
94 const char* GetTypeDisplayName() override {return "Plane";};
95
97 const char* GetDefaultNodeNamePrefix() override {return "P";};
98
100 void ReadXMLAttributes( const char** atts) override;
101
103 void WriteXML(ostream& of, int indent) override;
104
108
110 void ApplyTransform(vtkAbstractTransform* transform) override;
111
113
117 void SetSizeMode(int sizeMode);
118 vtkGetMacro(SizeMode, int);
119 static const char* GetSizeModeAsString(int sizeMode);
120 static int GetSizeModeFromString(const char* sizeMode);
122
126 vtkGetMacro(AutoSizeScalingFactor, double);
127 vtkSetMacro(AutoSizeScalingFactor, double);
129
131
135 void GetSize(double size[2]);
136 double* GetSize() VTK_SIZEHINT(2);
137 virtual void SetSize(double x, double y);
138 virtual void SetSize(double size[2]) { this->SetSize(size[0], size[1]); }
140
142
146 void GetSizeWorld(double size[2]);
147 double* GetSizeWorld() VTK_SIZEHINT(2);
148 void SetSizeWorld(const double normal[2]);
149 void SetSizeWorld(double x, double y);
151
153
154 vtkGetVector4Macro(PlaneBounds, double);
155 virtual void SetPlaneBounds(double x0, double x1, double y0, double y1);
156 virtual void SetPlaneBounds(double bounds[4]) { this->SetPlaneBounds(bounds[0], bounds[1], bounds[2], bounds[3]); };
158
160
161 void GetNormal(double normal[3]);
162 double* GetNormal() VTK_SIZEHINT(3);
163 void GetNormalWorld(double normal[3]);
164 double* GetNormalWorld() VTK_SIZEHINT(3);
165 void SetNormal(const double normal[3]);
166 void SetNormal(double x, double y, double z);
167 void SetNormalWorld(const double normal[3]);
168 void SetNormalWorld(double x, double y, double z);
170
172
173 void GetOrigin(double origin[3]);
174 double* GetOrigin() VTK_SIZEHINT(3);
175 void GetOriginWorld(double origin[3]);
176 double* GetOriginWorld() VTK_SIZEHINT(3);
177 void SetOrigin(const double origin[3]);
178 void SetOrigin(double x, double y, double z);
179 void SetOriginWorld(const double origin[3]);
180 void SetOriginWorld(double x, double y, double z);
182
184
185 void GetCenter(double origin[3]) { this->GetOrigin(origin); };
186 double* GetCenter() VTK_SIZEHINT(3) { return this->GetOrigin(); };
187 void GetCenterWorld(double origin[3]) { this->GetOriginWorld(origin); };
188 double* GetCenterWorld() VTK_SIZEHINT(3) { return this->GetOriginWorld(); };
189 void SetCenter(const double origin[3]) { this->SetOrigin(origin); };
190 void SetCenter(double x, double y, double z) { this->SetOrigin(x, y, z); };
191 void SetCenterWorld(const double origin[3]) { this->SetOriginWorld(origin); };
192 void SetCenterWorld(double x, double y, double z) { this->SetOriginWorld(x, y, z); };
194
196
201 void GetAxes(double x[3], double y[3], double z[3]);
202 void SetAxes(const double x[3], const double y[3], const double z[3]);
203 void GetAxesWorld(double x[3], double y[3], double z[3]);
204 void SetAxesWorld(const double x[3], const double y[3], const double z[3]);
206
208 virtual void GetObjectToNodeMatrix(vtkMatrix4x4* objectToNodeMatrix);
210 virtual void GetObjectToWorldMatrix(vtkMatrix4x4* objectToWorldMatrix);
212 virtual void GetBaseToWorldMatrix(vtkMatrix4x4* baseToWorldMatrix);
214
215 virtual void GetBaseToNodeMatrix(vtkMatrix4x4* matrix);
216 virtual vtkMatrix4x4* GetBaseToNodeMatrix();
218
221 virtual vtkMatrix4x4* GetObjectToBaseMatrix();
222
230 double GetClosestPointOnPlaneWorld(const double posWorld[3], double closestPosWorld[3], bool infinitePlane = true);
231
234
237
239
241 void GetRASBounds(double bounds[6]) override;
242 void GetBounds(double bounds[6]) override;
244
246
251 vtkGetMacro(PlaneType, int);
252 void SetPlaneType(int planeType);
253 static const char* GetPlaneTypeAsString(int planeType);
254 static int GetPlaneTypeFromString(const char* planeType);
256
258 vtkGetMacro(IsPlaneValid, bool);
259
261
263 static void GenerateOrthogonalMatrix(vtkMatrix4x4* inputMatrix,
264 vtkMatrix4x4* outputMatrix, vtkAbstractTransform* transform = nullptr, bool applyScaling = true);
265 static void GenerateOrthogonalMatrix(double xAxis[3], double yAxis[3], double zAxis[3], double origin[3],
266 vtkMatrix4x4* outputMatrix, vtkAbstractTransform* transform = nullptr, bool applyScaling = true);
268
270 void ProcessMRMLEvents(vtkObject* caller, unsigned long event, void* callData) override;
271
273
274 void GetPlaneCornerPoints(vtkPoints* points_Node);
275 void GetPlaneCornerPointsWorld(vtkPoints* points_World);
277
278protected:
279
280 vtkSetMacro(MaximumNumberOfControlPoints, int);
281 vtkSetMacro(RequiredNumberOfControlPoints, int);
282
283 // Set plane validity flag. True if the plane is fully defined.
284 vtkSetMacro(IsPlaneValid, bool);
285
288
290 void CalculateAxesFromPoints(const double point0[3], const double point1[3], const double point2[3], double x[3], double y[3], double z[3]);
291
293 void CalculatePlaneBounds(vtkPoints* cornerPoints, double bounds[6]);
294
296 void CalculatePlaneCornerPoints(vtkPoints* points, double xAxis[3], double yAxis[3], double center[3], double size[2]);
297
303 virtual void UpdatePlaneSize();
304
310 bool GetClosestFitPlaneFromControlPoints(vtkMatrix4x4* closestFitPlane);
311
316
317 virtual void SetNormalPointRequired(bool);
318 vtkGetMacro(NormalPointRequired, bool);
319
320protected:
321 bool IsUpdatingControlPointsFromPlane{ false };
322 bool IsUpdatingPlaneFromControlPoints{ false };
323
324 int SizeMode{ SizeModeAuto };
325 double AutoSizeScalingFactor{ 1.0 };
326
327 vtkSmartPointer<vtkMatrix4x4> ObjectToBaseMatrix;
328 vtkSmartPointer<vtkMatrix4x4> BaseToNodeMatrix;
329
330 double Size[2] = { 100.0, 100.0 };
331 double PlaneBounds[4] = { -50.0, 50.0, -50.0, 50.0 };
332
333 // Arrays used to return pointers from GetNormal/GetOrigin functions.
334 double Normal[3] = { 0.0, 0.0, 0.0 };
335 double NormalWorld[3] = { 0.0, 0.0, 0.0 };
336 double Origin[3] = { 0.0, 0.0, 0.0 };
337 double OriginWorld[3] = { 0.0, 0.0, 0.0 };
338 double SizeWorld[2] = { 0.0, 0.0 };
339
340 int PlaneType{ PlaneTypePointNormal };
341 bool IsPlaneValid{ false };
342 bool NormalPointRequired{ false };
343
346
347 friend class vtkSlicerPlaneWidget; // To directly access plane update functions
348 friend class vtkSlicerPlaneRepresentation3D; // To directly access plane update functions
349 friend class vtkSlicerPlaneRepresentation2D; // To directly access plane update functions
350};
351
352#endif
MRML node to represent a plane markup Plane Markups nodes contain three control points....
void operator=(const vtkMRMLMarkupsPlaneNode &)
virtual void UpdateControlPointsFromPlaneFit()
static vtkMRMLMarkupsPlaneNode * New()
virtual void UpdateControlPointsFrom3Points()
void SetAxes(const double x[3], const double y[3], const double z[3])
vtkSmartPointer< vtkMatrix4x4 > BaseToNodeMatrix
void UpdateInteractionHandleToWorldMatrix() override
Calculates the handle to world matrix based on the current control points.
virtual void GetBaseToWorldMatrix(vtkMatrix4x4 *baseToWorldMatrix)
Mapping from Base plane coordinates to world coordinates.
const char * GetTypeDisplayName() override
void CalculatePlaneBounds(vtkPoints *cornerPoints, double bounds[6])
Calculates the axis-aligned bounds defined by the corners of the plane.
virtual void UpdatePlaneFromPointNormal()
virtual void GetObjectToNodeMatrix(vtkMatrix4x4 *objectToNodeMatrix)
Mapping from XYZ plane coordinates to local coordinates.
vtkSmartPointer< vtkMatrix4x4 > ObjectToBaseMatrix
void SetSizeMode(int sizeMode)
void ApplyTransform(vtkAbstractTransform *transform) override
Apply the passed transformation to the ROI.
vtkMRMLCopyContentMacro(vtkMRMLMarkupsPlaneNode)
virtual void UpdateControlPointsFromPlane()
Calculate the position of control points from the ROI.
double * GetSize() VTK_SIZEHINT(2)
virtual void GetObjectToWorldMatrix(vtkMatrix4x4 *objectToWorldMatrix)
Mapping from XYZ plane coordinates to world coordinates.
static const char * GetSizeModeAsString(int sizeMode)
const char * GetPlaceAddIcon() override
void GetNormal(double normal[3])
Get/Set the normal vector for the plane in object or world coordinate system.
void WriteXML(ostream &of, int indent) override
Write this node's information to a MRML file in XML format.
bool GetClosestFitPlaneFromControlPoints(vtkMatrix4x4 *closestFitPlane)
void GetAxesWorld(double x[3], double y[3], double z[3])
double * GetCenterWorld() VTK_SIZEHINT(3)
virtual void SetNormalPointRequired(bool)
~vtkMRMLMarkupsPlaneNode() override
void SetAxesWorld(const double x[3], const double y[3], const double z[3])
void CalculatePlaneCornerPoints(vtkPoints *points, double xAxis[3], double yAxis[3], double center[3], double size[2])
Calculates the axis-aligned bounds defined by the corners of the plane.
virtual void SetSize(double size[2])
static int GetSizeModeFromString(const char *sizeMode)
virtual void GetBaseToNodeMatrix(vtkMatrix4x4 *matrix)
Mapping from Base plane coordinates to local coordinates.
void ProcessMRMLEvents(vtkObject *caller, unsigned long event, void *callData) override
Re-implemented to react to changes in internal matrices or control points.
void GetRASBounds(double bounds[6]) override
virtual void UpdateControlPointsFromPointNormal()
void GetAxes(double x[3], double y[3], double z[3])
void SetCenterWorld(double x, double y, double z)
void OnTransformNodeReferenceChanged(vtkMRMLTransformNode *transformNode) override
Reimplemented to recalculate InteractionHandleToWorld matrix when parent transform is changed.
void SetCenterWorld(const double origin[3])
void GetPlaneCornerPointsWorld(vtkPoints *points_World)
void ReadXMLAttributes(const char **atts) override
Read node attributes from XML file.
void CreateDefaultDisplayNodes() override
Create default display node or nullptr if does not have one.
double GetClosestPointOnPlaneWorld(const double posWorld[3], double closestPosWorld[3], bool infinitePlane=true)
static void GenerateOrthogonalMatrix(vtkMatrix4x4 *inputMatrix, vtkMatrix4x4 *outputMatrix, vtkAbstractTransform *transform=nullptr, bool applyScaling=true)
vtkMRMLNode * CreateNodeInstance() override
MRMLNode methods.
virtual void UpdatePlaneSize()
double * GetCenter() VTK_SIZEHINT(3)
virtual void UpdatePlaneFromPlaneFit()
static const char * GetPlaneTypeAsString(int planeType)
virtual void UpdatePlaneFromControlPoints()
Updates the plane based on plane type and control point position.
vtkMRMLMarkupsPlaneNode(const vtkMRMLMarkupsPlaneNode &)
const char * GetMarkupType() override
Get markup type internal name.
virtual vtkMatrix4x4 * GetObjectToBaseMatrix()
virtual void SetPlaneBounds(double bounds[4])
double * GetSizeWorld() VTK_SIZEHINT(2)
void SetCenter(const double origin[3])
const char * GetAddIcon() override
virtual void UpdatePlaneFrom3Points()
static void GenerateOrthogonalMatrix(double xAxis[3], double yAxis[3], double zAxis[3], double origin[3], vtkMatrix4x4 *outputMatrix, vtkAbstractTransform *transform=nullptr, bool applyScaling=true)
const char * GetIcon() override
void GetCenterWorld(double origin[3])
vtkMRMLStorageNode * CreateDefaultStorageNode() override
Create default storage node or nullptr if does not have one.
static int GetPlaneTypeFromString(const char *planeType)
const char * GetNodeTagName() override
Get node XML tag name (like Volume, Model)
const char * GetDefaultNodeNamePrefix() override
Get markup short name.
void PrintSelf(ostream &os, vtkIndent indent) override
Print out the node information to the output stream.
void SetCenter(double x, double y, double z)
void SetPlaneType(int planeType)
double * GetNormal() VTK_SIZEHINT(3)
void GetBounds(double bounds[6]) override
void GetSizeWorld(double size[2])
void GetSize(double size[2])
void GetPlaneCornerPoints(vtkPoints *points_Node)
Retrieves the list of points that define the corners of the plane.
virtual vtkMatrix4x4 * GetBaseToNodeMatrix()
void CalculateAxesFromPoints(const double point0[3], const double point1[3], const double point2[3], double x[3], double y[3], double z[3])
Calculates the x y and z axis of the plane from the 3 input points.
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.
Default representation for the plane widget.
Default representation for the plane widget.
create a plane with a set of 3 points