/*========================================================================= Program: Visualization Toolkit Module: vtkAxesTransformRepresentation.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * @class vtkAxesTransformRepresentation * @brief represent the vtkAxesTransformWidget * * The vtkAxesTransformRepresentation is a representation for the * vtkAxesTransformWidget. This representation consists of a origin sphere * with three tubed axes with cones at the end of the axes. In addition an * optional lable provides delta values of motion. Note that this particular * widget draws its representation in 3D space, so the widget can be * occluded. * @sa * vtkDistanceWidget vtkDistanceRepresentation vtkDistanceRepresentation2D */ #ifndef vtkAxesTransformRepresentation_h #define vtkAxesTransformRepresentation_h #include "vtkInteractionWidgetsModule.h" // For export macro #include "vtkWidgetRepresentation.h" class vtkHandleRepresentation; class vtkPoints; class vtkPolyData; class vtkPolyDataMapper; class vtkActor; class vtkVectorText; class vtkFollower; class vtkBox; class vtkCylinderSource; class vtkGlyph3D; class vtkDoubleArray; class vtkTransformPolyDataFilter; class vtkProperty; class VTKINTERACTIONWIDGETS_EXPORT vtkAxesTransformRepresentation : public vtkWidgetRepresentation { public: /** * Instantiate class. */ static vtkAxesTransformRepresentation *New(); //@{ /** * Standard VTK methods. */ vtkTypeMacro(vtkAxesTransformRepresentation,vtkWidgetRepresentation); void PrintSelf(ostream& os, vtkIndent indent) override; //@} //@{ /** * Set/Get the two handle representations used for the * vtkAxesTransformWidget. (Note: properties can be set by grabbing these * representations and setting the properties appropriately.) */ vtkGetObjectMacro(OriginRepresentation,vtkHandleRepresentation); vtkGetObjectMacro(SelectionRepresentation,vtkHandleRepresentation); //@} //@{ /** * Methods to Set/Get the coordinates of the two points defining * this representation. Note that methods are available for both * display and world coordinates. */ double* GetOriginWorldPosition(); void GetOriginWorldPosition(double pos[3]); void SetOriginWorldPosition(double pos[3]); void SetOriginDisplayPosition(double pos[3]); void GetOriginDisplayPosition(double pos[3]); //@} /** * Specify a scale to control the size of the widget. Large values make the * the widget larger. */ //@{ /** * The tolerance representing the distance to the widget (in pixels) in * which the cursor is considered near enough to the end points of * the widget to be active. */ vtkSetClampMacro(Tolerance,int,1,100); vtkGetMacro(Tolerance,int); //@} //@{ /** * Specify the format to use for labelling information during * transformation. Note that an empty string results in no label, or a * format string without a "%" character will not print numeric values. */ vtkSetStringMacro(LabelFormat); vtkGetStringMacro(LabelFormat); //@} /** * Enum used to communicate interaction state. */ enum {Outside=0,OnOrigin,OnX,OnY,OnZ,OnXEnd,OnYEnd,OnZEnd}; //@{ /** * The interaction state may be set from a widget (e.g., vtkLineWidget2) or * other object. This controls how the interaction with the widget * proceeds. Normally this method is used as part of a handshaking * process with the widget: First ComputeInteractionState() is invoked that * returns a state based on geometric considerations (i.e., cursor near a * widget feature), then based on events, the widget may modify this * further. */ vtkSetClampMacro(InteractionState,int,Outside,OnZEnd); //@} //@{ /** * Method to satisfy superclasses' API. */ void BuildRepresentation() override; int ComputeInteractionState(int X, int Y, int modify=0) override; void StartWidgetInteraction(double e[2]) override; void WidgetInteraction(double e[2]) override; double *GetBounds() override; //@} //@{ /** * Methods required by vtkProp superclass. */ void ReleaseGraphicsResources(vtkWindow *w) override; int RenderOpaqueGeometry(vtkViewport *viewport) override; int RenderTranslucentPolygonalGeometry(vtkViewport *viewport) override; //@} //@{ /** * Scale text (font size along each dimension). This helps control * the appearance of the 3D text. */ void SetLabelScale(double x, double y, double z) { double scale[3]; scale[0] = x; scale[1] = y; scale[2] = z; this->SetLabelScale(scale); } virtual void SetLabelScale( double scale[3] ); virtual double * GetLabelScale(); //@} /** * Get the distance annotation property */ virtual vtkProperty *GetLabelProperty(); protected: vtkAxesTransformRepresentation(); ~vtkAxesTransformRepresentation() override; // The handle and the rep used to close the handles vtkHandleRepresentation *OriginRepresentation; vtkHandleRepresentation *SelectionRepresentation; // Selection tolerance for the handles int Tolerance; // Format for printing the distance char *LabelFormat; // The line vtkPoints *LinePoints; vtkPolyData *LinePolyData; vtkPolyDataMapper *LineMapper; vtkActor *LineActor; // The distance label vtkVectorText *LabelText; vtkPolyDataMapper *LabelMapper; vtkFollower *LabelActor; // The 3D disk tick marks vtkPoints *GlyphPoints; vtkDoubleArray *GlyphVectors; vtkPolyData *GlyphPolyData; vtkCylinderSource *GlyphCylinder; vtkTransformPolyDataFilter *GlyphXForm; vtkGlyph3D *Glyph3D; vtkPolyDataMapper *GlyphMapper; vtkActor *GlyphActor; // Support GetBounds() method vtkBox *BoundingBox; double LastEventPosition[3]; private: vtkAxesTransformRepresentation(const vtkAxesTransformRepresentation&) = delete; void operator=(const vtkAxesTransformRepresentation&) = delete; }; #endif