VTK  9.3.20240327
vtkContourRepresentation.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
69 #ifndef vtkContourRepresentation_h
70 #define vtkContourRepresentation_h
71 
72 #include "vtkInteractionWidgetsModule.h" // For export macro
74 #include <vector> // STL Header; Required for vector
75 
76 VTK_ABI_NAMESPACE_BEGIN
79 class vtkPointPlacer;
80 class vtkPolyData;
81 class vtkIdList;
82 
83 //----------------------------------------------------------------------
85 {
86 public:
87  double WorldPosition[3];
89 
90  // The point id. This is blank except in the case of
91  // vtkPolygonalSurfaceContourLineInterpolator
93 };
94 
96 {
97 public:
98  double WorldPosition[3];
99  double WorldOrientation[9];
101  int Selected;
102  std::vector<vtkContourRepresentationPoint*> Points;
103 
104  // The point id. This is blank except in the case of
105  // vtkPolygonalSurfaceContourLineInterpolator
107 };
108 
110 {
111 public:
112  std::vector<vtkContourRepresentationNode*> Nodes;
113  void ClearNodes()
114  {
115  for (unsigned int i = 0; i < this->Nodes.size(); i++)
116  {
117  for (unsigned int j = 0; j < this->Nodes[i]->Points.size(); j++)
118  {
119  delete this->Nodes[i]->Points[j];
120  }
121  this->Nodes[i]->Points.clear();
122  delete this->Nodes[i];
123  }
124  this->Nodes.clear();
125  }
126 };
127 
128 class VTKINTERACTIONWIDGETS_EXPORT vtkContourRepresentation : public vtkWidgetRepresentation
129 {
130  friend class vtkContourWidget;
131 
132 public:
134 
138  void PrintSelf(ostream& os, vtkIndent indent) override;
140 
142 
146  virtual int AddNodeAtWorldPosition(double x, double y, double z);
147  virtual int AddNodeAtWorldPosition(double worldPos[3]);
148  virtual int AddNodeAtWorldPosition(double worldPos[3], double worldOrient[9]);
150 
152 
158  virtual int AddNodeAtDisplayPosition(double displayPos[2]);
159  virtual int AddNodeAtDisplayPosition(int displayPos[2]);
160  virtual int AddNodeAtDisplayPosition(int X, int Y);
162 
164 
170  virtual int ActivateNode(double displayPos[2]);
171  virtual int ActivateNode(int displayPos[2]);
172  virtual int ActivateNode(int X, int Y);
174 
175  // Description:
176  // Move the active node to a specified world position.
177  // Will return 0 if there is no active node or the node
178  // could not be moved to that position. 1 will be returned
179  // on success.
180  virtual int SetActiveNodeToWorldPosition(double pos[3]);
181  virtual int SetActiveNodeToWorldPosition(double pos[3], double orient[9]);
182 
184 
191  virtual int SetActiveNodeToDisplayPosition(double pos[2]);
192  virtual int SetActiveNodeToDisplayPosition(int pos[2]);
193  virtual int SetActiveNodeToDisplayPosition(int X, int Y);
195 
197 
201  virtual int GetActiveNodeSelected();
202  virtual int GetNthNodeSelected(int);
203  virtual int SetNthNodeSelected(int);
205 
210  virtual int GetActiveNodeWorldPosition(double pos[3]);
211 
216  virtual int GetActiveNodeWorldOrientation(double orient[9]);
217 
222  virtual int GetActiveNodeDisplayPosition(double pos[2]);
223 
227  virtual int GetNumberOfNodes();
228 
234  virtual int GetNthNodeDisplayPosition(int n, double pos[2]);
235 
241  virtual int GetNthNodeWorldPosition(int n, double pos[3]);
242 
247 
253  virtual int GetNthNodeWorldOrientation(int n, double orient[9]);
254 
256 
264  virtual int SetNthNodeDisplayPosition(int n, int X, int Y);
265  virtual int SetNthNodeDisplayPosition(int n, int pos[2]);
266  virtual int SetNthNodeDisplayPosition(int n, double pos[2]);
268 
270 
277  virtual int SetNthNodeWorldPosition(int n, double pos[3]);
278  virtual int SetNthNodeWorldPosition(int n, double pos[3], double orient[9]);
280 
286  virtual int GetNthNodeSlope(int idx, double slope[3]);
287 
288  // Description:
289  // For a given node n, get the number of intermediate
290  // points between this node and the node at
291  // (n+1). If n is the last node and the loop is
292  // closed, this is the number of intermediate points
293  // between node n and node 0. 0 is returned if n is
294  // out of range.
295  virtual int GetNumberOfIntermediatePoints(int n);
296 
303  virtual int GetIntermediatePointWorldPosition(int n, int idx, double point[3]);
304 
310  virtual int AddIntermediatePointWorldPosition(int n, double point[3]);
311 
318  virtual int AddIntermediatePointWorldPosition(int n, double point[3], vtkIdType ptId);
319 
324  virtual int DeleteLastNode();
325 
330  virtual int DeleteActiveNode();
331 
336  virtual int DeleteNthNode(int n);
337 
341  virtual void ClearAllNodes();
342 
347  virtual int AddNodeOnContour(int X, int Y);
348 
350 
354  vtkSetClampMacro(PixelTolerance, int, 1, 100);
355  vtkGetMacro(PixelTolerance, int);
357 
359 
363  vtkSetClampMacro(WorldTolerance, double, 0.0, VTK_DOUBLE_MAX);
364  vtkGetMacro(WorldTolerance, double);
366 
367  // Used to communicate about the state of the representation
368  enum
369  {
370  Outside = 0,
371  Nearby
372  };
373 
374  enum
375  {
376  Inactive = 0,
379  Scale
380  };
381 
383 
387  vtkGetMacro(CurrentOperation, int);
388  vtkSetClampMacro(
391  {
392  this->SetCurrentOperation(vtkContourRepresentation::Inactive);
393  }
395  {
396  this->SetCurrentOperation(vtkContourRepresentation::Translate);
397  }
398  void SetCurrentOperationToShift() { this->SetCurrentOperation(vtkContourRepresentation::Shift); }
399  void SetCurrentOperationToScale() { this->SetCurrentOperation(vtkContourRepresentation::Scale); }
401 
402  // Description:
403  // Set / get the Point Placer. The point placer is
404  // responsible for converting display coordinates into
405  // world coordinates according to some constraints, and
406  // for validating world positions.
408  vtkGetObjectMacro(PointPlacer, vtkPointPlacer);
409 
411 
417  vtkGetObjectMacro(LineInterpolator, vtkContourLineInterpolator);
419 
421 
424  void BuildRepresentation() override = 0;
425  int ComputeInteractionState(int X, int Y, int modified = 0) override = 0;
426  void StartWidgetInteraction(double e[2]) override = 0;
427  void WidgetInteraction(double e[2]) override = 0;
429 
431 
434  void ReleaseGraphicsResources(vtkWindow* w) override = 0;
435  int RenderOverlay(vtkViewport* viewport) override = 0;
436  int RenderOpaqueGeometry(vtkViewport* viewport) override = 0;
437  int RenderTranslucentPolygonalGeometry(vtkViewport* viewport) override = 0;
440 
442 
447  vtkGetMacro(ClosedLoop, vtkTypeBool);
448  vtkBooleanMacro(ClosedLoop, vtkTypeBool);
450 
452 
457  vtkGetMacro(ShowSelectedNodes, vtkTypeBool);
458  vtkBooleanMacro(ShowSelectedNodes, vtkTypeBool);
460 
465 
471 
472  vtkSetMacro(RebuildLocator, bool);
473 
474 protected:
477 
478  // Selection tolerance for the handles
481 
484 
486 
489 
490  // A flag to indicate whether to show the Selected nodes
492 
494 
495  void AddNodeAtPositionInternal(double worldPos[3], double worldOrient[9], int displayPos[2]);
496  void AddNodeAtPositionInternal(double worldPos[3], double worldOrient[9], double displayPos[2]);
497  void SetNthNodeWorldPositionInternal(int n, double worldPos[3], double worldOrient[9]);
498 
500 
505  double worldPos[3], double worldOrient[9], int displayPos[2]);
507  double worldPos[3], double worldOrient[9], double displayPos[2]);
509 
510  virtual void UpdateLines(int index);
511  void UpdateLine(int idx1, int idx2);
512 
513  virtual int FindClosestPointOnContour(int X, int Y, double worldPos[3], int* idx);
514 
515  virtual void BuildLines() = 0;
516 
517  // This method is called when something changes in the point placer.
518  // It will cause all points to be updated, and all lines to be regenerated.
519  // It should be extended to detect changes in the line interpolator too.
520  virtual int UpdateContour();
522 
523  void ComputeMidpoint(double p1[3], double p2[3], double mid[3])
524  {
525  mid[0] = (p1[0] + p2[0]) / 2;
526  mid[1] = (p1[1] + p2[1]) / 2;
527  mid[2] = (p1[2] + p2[2]) / 2;
528  }
529 
541  virtual void Initialize(vtkPolyData*, vtkIdList*);
542 
547  virtual void Initialize(vtkPolyData*);
548 
554 
560 
565  void ResetLocator();
566 
567  void BuildLocator();
568 
570 
571 private:
573  void operator=(const vtkContourRepresentation&) = delete;
574 };
575 
576 VTK_ABI_NAMESPACE_END
577 #endif
Defines API for interpolating/modifying nodes from a vtkContourRepresentation.
std::vector< vtkContourRepresentationNode * > Nodes
std::vector< vtkContourRepresentationPoint * > Points
represent the vtkContourWidget
virtual int AddNodeAtDisplayPosition(int X, int Y)
Add a node at a specific display position.
void StartWidgetInteraction(double e[2]) override=0
These are methods that satisfy vtkWidgetRepresentation's API.
virtual int AddNodeAtDisplayPosition(double displayPos[2])
Add a node at a specific display position.
void SetClosedLoop(vtkTypeBool val)
Set / Get the ClosedLoop value.
vtkContourRepresentationInternals * Internal
void PrintSelf(ostream &os, vtkIndent indent) override
Standard VTK methods.
void AddNodeAtPositionInternal(double worldPos[3], double worldOrient[9], double displayPos[2])
void WidgetInteraction(double e[2]) override=0
These are methods that satisfy vtkWidgetRepresentation's API.
void SetCurrentOperationToTranslate()
Set / get the current operation.
void SetCurrentOperationToInactive()
Set / get the current operation.
virtual int AddNodeOnContour(int X, int Y)
Given a specific X, Y pixel location, add a new node on the contour at this location.
virtual int SetNthNodeWorldPosition(int n, double pos[3], double orient[9])
Set the nth node's world position.
virtual int GetNthNodeSlope(int idx, double slope[3])
Get the nth node's slope.
void GetNodePolyData(vtkPolyData *poly)
Get the nodes and not the intermediate points in this contour as a vtkPolyData.
virtual int UpdateContour()
virtual int GetNumberOfIntermediatePoints(int n)
void SetCurrentOperationToScale()
Set / get the current operation.
vtkIncrementalOctreePointLocator * Locator
Adding a point locator to the representation to speed up lookup of the active node when dealing with ...
virtual int GetActiveNodeSelected()
Set/Get whether the active or nth node is selected.
void SetNthNodeWorldPositionInternal(int n, double worldPos[3], double worldOrient[9])
virtual vtkContourRepresentationNode * GetNthNode(int n)
Get the nth node.
virtual int SetActiveNodeToWorldPosition(double pos[3])
virtual int SetActiveNodeToDisplayPosition(int X, int Y)
Move the active node based on a specified display position.
void ReleaseGraphicsResources(vtkWindow *w) override=0
Methods required by vtkProp superclass.
void GetRendererComputedDisplayPositionFromWorldPosition(double worldPos[3], double worldOrient[9], int displayPos[2])
Given a world position and orientation, this computes the display position using the renderer of this...
virtual int DeleteNthNode(int n)
Delete the nth node.
virtual int DeleteLastNode()
Delete the last node.
virtual int FindClosestPointOnContour(int X, int Y, double worldPos[3], int *idx)
void BuildRepresentation() override=0
These are methods that satisfy vtkWidgetRepresentation's API.
virtual vtkPolyData * GetContourRepresentationAsPolyData()=0
Get the points in this contour as a vtkPolyData.
void UpdateLine(int idx1, int idx2)
void SetPointPlacer(vtkPointPlacer *)
virtual int GetIntermediatePointWorldPosition(int n, int idx, double point[3])
Get the world position of the intermediate point at index idx between nodes n and (n+1) (or n and 0 i...
virtual void Initialize(vtkPolyData *)
Overloaded initialize method, that is called when the vtkIdList is nullptr to maintain backwards comp...
void SetLineInterpolator(vtkContourLineInterpolator *)
Set / Get the Line Interpolator.
virtual int SetNthNodeSelected(int)
Set/Get whether the active or nth node is selected.
int RenderOverlay(vtkViewport *viewport) override=0
Methods required by vtkProp superclass.
virtual int DeleteActiveNode()
Delete the active node.
virtual void InitializeContour(vtkPolyData *, vtkIdList *)
Internal implementation, delegated to another method, so that users who override the method Initializ...
virtual int GetActiveNodeWorldOrientation(double orient[9])
Get the world orientation of the active node.
virtual void UpdateLines(int index)
vtkTypeBool HasTranslucentPolygonalGeometry() override=0
Methods required by vtkProp superclass.
int ComputeInteractionState(int X, int Y, int modified=0) override=0
These are methods that satisfy vtkWidgetRepresentation's API.
virtual int AddNodeAtWorldPosition(double worldPos[3])
Add a node at a specific world position.
void SetCurrentOperationToShift()
Set / get the current operation.
void AddNodeAtPositionInternal(double worldPos[3], double worldOrient[9], int displayPos[2])
int RenderTranslucentPolygonalGeometry(vtkViewport *viewport) override=0
Methods required by vtkProp superclass.
virtual int SetNthNodeDisplayPosition(int n, int X, int Y)
Set the nth node's display position.
virtual int SetNthNodeWorldPosition(int n, double pos[3])
Set the nth node's world position.
virtual int SetNthNodeDisplayPosition(int n, int pos[2])
Set the nth node's display position.
virtual int GetNthNodeWorldOrientation(int n, double orient[9])
Get the nth node's world orientation.
virtual int ActivateNode(int displayPos[2])
Given a display position, activate a node.
virtual int AddNodeAtWorldPosition(double x, double y, double z)
Add a node at a specific world position.
virtual int ToggleActiveNodeSelected()
Set/Get whether the active or nth node is selected.
~vtkContourRepresentation() override
virtual int GetActiveNodeWorldPosition(double pos[3])
Get the world position of the active node.
virtual int GetActiveNodeDisplayPosition(double pos[2])
Get the display position of the active node.
virtual int GetNthNodeWorldPosition(int n, double pos[3])
Get the nth node's world position.
virtual void SetShowSelectedNodes(vtkTypeBool)
A flag to indicate whether to show the Selected nodes Default is to set it to false.
virtual int AddIntermediatePointWorldPosition(int n, double point[3])
Add an intermediate point between node n and n+1 (or n and 0 if n is the last node and the loop is cl...
virtual int ActivateNode(double displayPos[2])
Given a display position, activate a node.
void GetRendererComputedDisplayPositionFromWorldPosition(double worldPos[3], double worldOrient[9], double displayPos[2])
Given a world position and orientation, this computes the display position using the renderer of this...
virtual int ActivateNode(int X, int Y)
Given a display position, activate a node.
int RenderOpaqueGeometry(vtkViewport *viewport) override=0
Methods required by vtkProp superclass.
virtual int SetNthNodeDisplayPosition(int n, double pos[2])
Set the nth node's display position.
virtual int GetNumberOfNodes()
Get the number of nodes.
virtual int SetActiveNodeToDisplayPosition(int pos[2])
Move the active node based on a specified display position.
virtual void ClearAllNodes()
Delete all nodes.
void ComputeMidpoint(double p1[3], double p2[3], double mid[3])
virtual void BuildLines()=0
void ResetLocator()
Deletes the previous locator if it exists and creates a new locator.
virtual int AddIntermediatePointWorldPosition(int n, double point[3], vtkIdType ptId)
Add an intermediate point between node n and n+1 (or n and 0 if n is the last node and the loop is cl...
virtual int GetNthNodeDisplayPosition(int n, double pos[2])
Get the nth node's display position.
virtual int SetActiveNodeToDisplayPosition(double pos[2])
Move the active node based on a specified display position.
virtual int AddNodeAtDisplayPosition(int displayPos[2])
Add a node at a specific display position.
virtual void Initialize(vtkPolyData *, vtkIdList *)
Build a contour representation from externally supplied PolyData.
virtual int GetNthNodeSelected(int)
Set/Get whether the active or nth node is selected.
vtkContourLineInterpolator * LineInterpolator
virtual int SetActiveNodeToWorldPosition(double pos[3], double orient[9])
virtual int AddNodeAtWorldPosition(double worldPos[3], double worldOrient[9])
Add a node at a specific world position.
create a contour with a set of points
list of point or cell ids
Definition: vtkIdList.h:132
Incremental octree in support of both point location and point insertion.
a simple class to control print indentation
Definition: vtkIndent.h:108
Abstract interface to translate 2D display positions to world coordinates.
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:180
record modification and/or execution time
Definition: vtkTimeStamp.h:44
abstract specification for Viewports
Definition: vtkViewport.h:64
abstract class defines interface between the widget and widget representation classes
window superclass for vtkRenderWindow
Definition: vtkWindow.h:47
@ point
Definition: vtkX3D.h:236
@ index
Definition: vtkX3D.h:246
int vtkTypeBool
Definition: vtkABI.h:64
int vtkIdType
Definition: vtkType.h:315
#define VTK_DOUBLE_MAX
Definition: vtkType.h:154