VTK  9.3.0
vtkTensorRepresentation.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
34#ifndef vtkTensorRepresentation_h
35#define vtkTensorRepresentation_h
36
37#include "vtkInteractionWidgetsModule.h" // For export macro
39
40VTK_ABI_NAMESPACE_BEGIN
41class vtkActor;
43class vtkLineSource;
44class vtkSphereSource;
45class vtkCellPicker;
46class vtkProperty;
47class vtkPolyData;
48class vtkPoints;
51class vtkTransform;
52class vtkMatrix4x4;
53class vtkPlane;
54class vtkPlanes;
55class vtkBox;
56class vtkDoubleArray;
57
58class VTKINTERACTIONWIDGETS_EXPORT vtkTensorRepresentation : public vtkWidgetRepresentation
59{
60public:
62
67 void PrintSelf(ostream& os, vtkIndent indent) override;
69
71
85 void SetTensor(double tensor[9]);
86 void SetSymmetricTensor(double symTensor[6]);
87 void GetTensor(double tensor[9]) { std::copy(this->Tensor, this->Tensor + 9, tensor); }
88 void GetSymmetricTensor(double symTensor[6])
89 {
90 symTensor[0] = this->Tensor[0];
91 symTensor[1] = this->Tensor[4];
92 symTensor[2] = this->Tensor[8];
93 symTensor[3] = this->Tensor[1];
94 symTensor[4] = this->Tensor[2];
95 symTensor[5] = this->Tensor[5];
96 }
98
100
105 void GetEigenvalues(double evals[3])
106 {
107 std::copy(this->Eigenvalues, this->Eigenvalues + 3, evals);
108 }
109 void GetEigenvector(int n, double ev[3])
110 {
111 n = (n < 0 ? 0 : (n > 2 ? 2 : n));
112 std::copy(this->Eigenvectors[n], this->Eigenvectors[n] + 3, ev);
113 }
115
117
122 void SetPosition(double pos[3]);
123 void GetPosition(double pos[3])
124 {
125 std::copy(this->TensorPosition, this->TensorPosition + 3, pos);
126 }
128
140
142
147 vtkGetObjectMacro(HandleProperty, vtkProperty);
148 vtkGetObjectMacro(SelectedHandleProperty, vtkProperty);
150
152
157 vtkGetObjectMacro(FaceProperty, vtkProperty);
158 vtkGetObjectMacro(SelectedFaceProperty, vtkProperty);
160
162
167 vtkGetObjectMacro(OutlineProperty, vtkProperty);
168 vtkGetObjectMacro(SelectedOutlineProperty, vtkProperty);
170
172
176 vtkGetObjectMacro(EllipsoidProperty, vtkProperty);
178
180
185 vtkGetMacro(OutlineFaceWires, bool);
186 void OutlineFaceWiresOn() { this->SetOutlineFaceWires(true); }
187 void OutlineFaceWiresOff() { this->SetOutlineFaceWires(false); }
189
191
197 vtkGetMacro(OutlineCursorWires, bool);
198 void OutlineCursorWiresOn() { this->SetOutlineCursorWires(true); }
199 void OutlineCursorWiresOff() { this->SetOutlineCursorWires(false); }
201
203
207 virtual void HandlesOn();
208 virtual void HandlesOff();
210
212
216 vtkGetMacro(TensorEllipsoid, bool);
217 void TensorEllipsoidOn() { this->SetTensorEllipsoid(true); }
218 void TensorEllipsoidOff() { this->SetTensorEllipsoid(false); }
220
227 void PlaceTensor(double tensor[9], double position[3]);
228
230
233 void PlaceWidget(double bounds[6]) override;
234 void BuildRepresentation() override;
235 int ComputeInteractionState(int X, int Y, int modify = 0) override;
236 void StartWidgetInteraction(double e[2]) override;
237 void WidgetInteraction(double e[2]) override;
238 double* GetBounds() VTK_SIZEHINT(6) override;
239 void StartComplexInteraction(vtkRenderWindowInteractor* iren, vtkAbstractWidget* widget,
240 unsigned long event, void* calldata) override;
241 void ComplexInteraction(vtkRenderWindowInteractor* iren, vtkAbstractWidget* widget,
242 unsigned long event, void* calldata) override;
243 int ComputeComplexInteractionState(vtkRenderWindowInteractor* iren, vtkAbstractWidget* widget,
244 unsigned long event, void* calldata, int modify = 0) override;
245 void EndComplexInteraction(vtkRenderWindowInteractor* iren, vtkAbstractWidget* widget,
246 unsigned long event, void* calldata) override;
248
250
253 void ReleaseGraphicsResources(vtkWindow*) override;
254 int RenderOpaqueGeometry(vtkViewport*) override;
255 int RenderTranslucentPolygonalGeometry(vtkViewport*) override;
256 vtkTypeBool HasTranslucentPolygonalGeometry() override;
258
259 // Used to manage the state of the widget
260 enum
261 {
262 Outside = 0,
271 Scaling
272 };
273
283 void SetInteractionState(int state);
284
286
290 vtkGetMacro(SnapToAxes, bool);
291 vtkSetMacro(SnapToAxes, bool);
293
295
302
303 /*
304 * Register internal Pickers within PickingManager
305 */
306 void RegisterPickers() override;
307
309
313 vtkGetMacro(TranslationAxis, int);
314 vtkSetClampMacro(TranslationAxis, int, -1, 2);
316
318
321 void SetXTranslationAxisOn() { this->TranslationAxis = Axis::XAxis; }
322 void SetYTranslationAxisOn() { this->TranslationAxis = Axis::YAxis; }
323 void SetZTranslationAxisOn() { this->TranslationAxis = Axis::ZAxis; }
324 void SetTranslationAxisOff() { this->TranslationAxis = Axis::NONE; }
326
328
331 bool IsTranslationConstrained() { return this->TranslationAxis != Axis::NONE; }
333
334protected:
337
338 // Core data
339 double Tensor[9]; // stored as 3x3 symmetric matrix
340 double Eigenvalues[3];
341 double Eigenvectors[3][3];
342 double TensorPosition[3];
343
344 // Manage how the representation appears
345 double LastEventPosition[3];
346 double LastEventOrientation[4];
347 double StartEventOrientation[4];
348 double SnappedEventOrientations[3][4];
349 bool SnappedOrientation[3];
351
352 // Constraint axis translation
354
355 // the hexahedron (6 faces)
359 vtkPoints* Points; // used by others as well
360 double N[6][3]; // the normals of the faces
361
362 // A face of the hexahedron
366
367 // glyphs representing hot spots (e.g., handles)
371 virtual void PositionHandles();
372 int HighlightHandle(vtkProp* prop); // returns cell id
373 void HighlightFace(int cellId);
374 void HighlightOutline(int highlight);
375 virtual void ComputeNormals();
376 virtual void SizeHandles();
377
378 // wireframe outline
382
383 // the tensor ellipsoid and transforms
389
390 // Do the picking
396
397 // Transform the hexahedral points (used for rotations)
401
402 // Support GetBounds() method
404
405 // Properties used to control the appearance of selected objects and
406 // the manipulator in general.
415
416 // Control the orientation of the normals
422 void UpdateTensorFromWidget(); // tensor information updated from widget state
423 void UpdateWidgetFromTensor(); // widget state updated from tensor specification
424 void UpdateTensorEigenfunctions(double tensor[3][3]);
425
426 // Helper methods
427 virtual void Translate(const double* p1, const double* p2);
428 virtual void Scale(const double* p1, const double* p2, int X, int Y);
429 virtual void Rotate(int X, int Y, const double* p1, const double* p2, const double* vpn);
430 void MovePlusXFace(const double* p1, const double* p2, bool entry);
431 void MoveMinusXFace(const double* p1, const double* p2, bool entry);
432 void MovePlusYFace(const double* p1, const double* p2, bool entry);
433 void MoveMinusYFace(const double* p1, const double* p2, bool entry);
434 void MovePlusZFace(const double* p1, const double* p2, bool entry);
435 void MoveMinusZFace(const double* p1, const double* p2, bool entry);
436 void UpdatePose(const double* p1, const double* d1, const double* p2, const double* d2);
437
438 // Internal ivars for performance
441
442 // The actual planes which are being manipulated
443 vtkPlane* Planes[6];
444
445 //"dir" is the direction in which the face can be moved i.e. the axis passing
446 // through the center
447 void MoveFace(const double* p1, const double* p2, const double* dir, double* x1, double* x2,
448 double* x3, double* x4, double* x5);
449
450 // Helper method to obtain the direction in which the face is to be moved.
451 // Handles special cases where some of the scale factors are 0.
452 void GetDirection(const double Nx[3], const double Ny[3], const double Nz[3], double dir[3]);
453
454private:
456 void operator=(const vtkTensorRepresentation&) = delete;
457};
458
459VTK_ABI_NAMESPACE_END
460#endif
define the API for widget / widget representation
represents an object (geometry & properties) in a rendered scene
Definition vtkActor.h:41
implicit function for a bounding box
Definition vtkBox.h:31
ray-cast cell picker for all kinds of Prop3Ds
dynamic, self-adjusting array of double
a simple class to control print indentation
Definition vtkIndent.h:29
create a line defined by two end points
represent and manipulate 4x4 transformation matrices
perform various plane computations
Definition vtkPlane.h:26
implicit function for convex set of planes
Definition vtkPlanes.h:42
represent the position of a point in 3D space
represent and manipulate 3D points
Definition vtkPoints.h:29
Superclass for algorithms that produce only polydata as output.
map vtkPolyData to graphics primitives
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition vtkPolyData.h:80
abstract superclass for all actors, volumes and annotations
Definition vtkProp.h:43
represent surface properties of a geometric object
Definition vtkProperty.h:57
platform-independent render window interaction including picking and frame rate control.
create a polygonal sphere centered at the origin
class defining a representation for the vtkTensorWidget
void SetZTranslationAxisOn()
Toggles constraint translation axis on/off.
void OutlineCursorWiresOn()
Control the representation of the outline.
virtual void SizeHandles()
void GetEigenvalues(double evals[3])
These are methods used to retrieve derived information about the tensor.
void MovePlusXFace(const double *p1, const double *p2, bool entry)
int HighlightHandle(vtkProp *prop)
void SetOutlineFaceWires(bool)
Control the representation of the outline.
void MoveFace(const double *p1, const double *p2, const double *dir, double *x1, double *x2, double *x3, double *x4, double *x5)
void SetPosition(double pos[3])
Set/Get a position for the location of the tensor.
void HighlightFace(int cellId)
void StartWidgetInteraction(double e[2]) override
These are methods that satisfy vtkWidgetRepresentation's API.
void MovePlusZFace(const double *p1, const double *p2, bool entry)
void SetTensor(double tensor[9])
These are the basic methods used to define the tensor (these methods coordinate with the overloaded P...
void SetOutlineCursorWires(bool)
Control the representation of the outline.
virtual void HandlesOn()
Switches handles (the spheres) on or off by manipulating the underlying actor visibility.
virtual void HandlesOff()
Switches handles (the spheres) on or off by manipulating the underlying actor visibility.
~vtkTensorRepresentation() override
void TensorEllipsoidOn()
Indicate whether to show the tensor ellipsoid.
virtual void PositionHandles()
void UpdateTensorEigenfunctions(double tensor[3][3])
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods for instantiation, obtaining type information, and printing.
void SetYTranslationAxisOn()
Toggles constraint translation axis on/off.
void MoveMinusXFace(const double *p1, const double *p2, bool entry)
void SetXTranslationAxisOn()
Toggles constraint translation axis on/off.
void MovePlusYFace(const double *p1, const double *p2, bool entry)
vtkPolyDataMapper ** HandleMapper
void GetPolyData(vtkPolyData *pd)
Grab the polydata (including points) that define the representation.
int ComputeInteractionState(int X, int Y, int modify=0) override
These are methods that satisfy vtkWidgetRepresentation's API.
void GetEigenvector(int n, double ev[3])
These are methods used to retrieve derived information about the tensor.
static vtkTensorRepresentation * New()
Standard methods for instantiation, obtaining type information, and printing.
void UpdatePose(const double *p1, const double *d1, const double *p2, const double *d2)
virtual void ComputeNormals()
void GetDirection(const double Nx[3], const double Ny[3], const double Nz[3], double dir[3])
void PlaceTensor(double tensor[9], double position[3])
This is a specialized place widget method for a tensor.
void GetSymmetricTensor(double symTensor[6])
These are the basic methods used to define the tensor (these methods coordinate with the overloaded P...
double * GetBounds() override
These are methods that satisfy vtkWidgetRepresentation's API.
bool IsTranslationConstrained()
Returns true if ConstrainedAxis.
virtual void Rotate(int X, int Y, const double *p1, const double *p2, const double *vpn)
virtual void CreateDefaultProperties()
void MoveMinusZFace(const double *p1, const double *p2, bool entry)
vtkPolyDataMapper * EllipsoidMapper
void OutlineCursorWiresOff()
Control the representation of the outline.
void RegisterPickers() override
Register internal Pickers in the Picking Manager.
void StepForward()
For complex events should we snap orientations to be aligned with the x y z axes.
void GetPosition(double pos[3])
Set/Get a position for the location of the tensor.
void TensorEllipsoidOff()
Indicate whether to show the tensor ellipsoid.
void PlaceWidget(double bounds[6]) override
These are methods that satisfy vtkWidgetRepresentation's API.
void OutlineFaceWiresOff()
Control the representation of the outline.
void SetSymmetricTensor(double symTensor[6])
These are the basic methods used to define the tensor (these methods coordinate with the overloaded P...
virtual void Translate(const double *p1, const double *p2)
void SetTranslationAxisOff()
Toggles constraint translation axis on/off.
void StepBackward()
For complex events should we snap orientations to be aligned with the x y z axes.
void OutlineFaceWiresOn()
Control the representation of the outline.
void GetTensor(double tensor[9])
These are the basic methods used to define the tensor (these methods coordinate with the overloaded P...
void SetInteractionState(int state)
The interaction state may be set from a widget (e.g., vtkTensorWidget) or other object.
void SetTensorEllipsoid(bool)
Indicate whether to show the tensor ellipsoid.
void MoveMinusYFace(const double *p1, const double *p2, bool entry)
void WidgetInteraction(double e[2]) override
These are methods that satisfy vtkWidgetRepresentation's API.
virtual void Scale(const double *p1, const double *p2, int X, int Y)
void HighlightOutline(int highlight)
void BuildRepresentation() override
These are methods that satisfy vtkWidgetRepresentation's API.
describes linear transformations via a 4x4 matrix
abstract specification for Viewports
Definition vtkViewport.h:45
abstract class defines interface between the widget and widget representation classes
window superclass for vtkRenderWindow
Definition vtkWindow.h:25
int vtkTypeBool
Definition vtkABI.h:64
#define VTK_SIZEHINT(...)