You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
345 lines
9.6 KiB
C
345 lines
9.6 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkAxesActor.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 vtkAxesActor
|
||
|
* @brief a 3D axes representation
|
||
|
*
|
||
|
* vtkAxesActor is a hybrid 2D/3D actor used to represent 3D axes in a scene.
|
||
|
* The user can define the geometry to use for the shaft or the tip, and the
|
||
|
* user can set the text for the three axes. The text will appear to follow the
|
||
|
* camera since it is implemented by means of vtkCaptionActor2D. All of the
|
||
|
* functionality of the underlying vtkCaptionActor2D objects are accessible so
|
||
|
* that, for instance, the font attributes of the axes text can be manipulated
|
||
|
* through vtkTextProperty. Since this class inherits from vtkProp3D, one can
|
||
|
* apply a user transform to the underlying geometry and the positioning of the
|
||
|
* labels. For example, a rotation transform could be used to generate a
|
||
|
* left-handed axes representation.
|
||
|
*
|
||
|
* @par Thanks:
|
||
|
* Thanks to Goodwin Lawlor for posting a tcl script which featured the
|
||
|
* use of vtkCaptionActor2D to implement the text labels. This class is
|
||
|
* based on Paraview's vtkPVAxesActor.
|
||
|
*
|
||
|
* @warning
|
||
|
* vtkAxesActor is primarily intended for use with vtkOrientationMarkerWidget.
|
||
|
* The bounds of this actor are calculated as though the geometry of the axes
|
||
|
* were symmetric: that is, although only positive axes are visible, bounds
|
||
|
* are calculated as though negative axes are present too. This is done
|
||
|
* intentionally to implement functionality of the camera update mechanism
|
||
|
* in vtkOrientationMarkerWidget.
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkAnnotatedCubeActor vtkOrientationMarkerWidget vtkCaptionActor2D
|
||
|
* vtkTextProperty
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkAxesActor_h
|
||
|
#define vtkAxesActor_h
|
||
|
|
||
|
#include "vtkProp3D.h"
|
||
|
#include "vtkRenderingAnnotationModule.h" // For export macro
|
||
|
|
||
|
class vtkActor;
|
||
|
class vtkCaptionActor2D;
|
||
|
class vtkConeSource;
|
||
|
class vtkCylinderSource;
|
||
|
class vtkLineSource;
|
||
|
class vtkPolyData;
|
||
|
class vtkPropCollection;
|
||
|
class vtkProperty;
|
||
|
class vtkRenderer;
|
||
|
class vtkSphereSource;
|
||
|
|
||
|
class VTKRENDERINGANNOTATION_EXPORT vtkAxesActor : public vtkProp3D
|
||
|
{
|
||
|
public:
|
||
|
static vtkAxesActor* New();
|
||
|
vtkTypeMacro(vtkAxesActor, vtkProp3D);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* For some exporters and other other operations we must be
|
||
|
* able to collect all the actors or volumes. These methods
|
||
|
* are used in that process.
|
||
|
*/
|
||
|
void GetActors(vtkPropCollection*) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Support the standard render methods.
|
||
|
*/
|
||
|
int RenderOpaqueGeometry(vtkViewport* viewport) override;
|
||
|
int RenderTranslucentPolygonalGeometry(vtkViewport* viewport) override;
|
||
|
int RenderOverlay(vtkViewport* viewport) override;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Does this prop have some translucent polygonal geometry?
|
||
|
*/
|
||
|
vtkTypeBool HasTranslucentPolygonalGeometry() override;
|
||
|
|
||
|
/**
|
||
|
* Shallow copy of an axes actor. Overloads the virtual vtkProp method.
|
||
|
*/
|
||
|
void ShallowCopy(vtkProp* prop) override;
|
||
|
|
||
|
/**
|
||
|
* Release any graphics resources that are being consumed by this actor.
|
||
|
* The parameter window could be used to determine which graphic
|
||
|
* resources to release.
|
||
|
*/
|
||
|
void ReleaseGraphicsResources(vtkWindow*) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the bounds for this Actor as (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax). (The
|
||
|
* method GetBounds(double bounds[6]) is available from the superclass.)
|
||
|
*/
|
||
|
void GetBounds(double bounds[6]);
|
||
|
double* GetBounds() VTK_SIZEHINT(6) override;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Get the actors mtime plus consider its properties and texture if set.
|
||
|
*/
|
||
|
vtkMTimeType GetMTime() override;
|
||
|
|
||
|
/**
|
||
|
* Return the mtime of anything that would cause the rendered image to
|
||
|
* appear differently. Usually this involves checking the mtime of the
|
||
|
* prop plus anything else it depends on such as properties, textures
|
||
|
* etc.
|
||
|
*/
|
||
|
vtkMTimeType GetRedrawMTime() override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the total length of the axes in 3 dimensions.
|
||
|
*/
|
||
|
void SetTotalLength(double v[3]) { this->SetTotalLength(v[0], v[1], v[2]); }
|
||
|
void SetTotalLength(double x, double y, double z);
|
||
|
vtkGetVectorMacro(TotalLength, double, 3);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the normalized (0-1) length of the shaft.
|
||
|
*/
|
||
|
void SetNormalizedShaftLength(double v[3]) { this->SetNormalizedShaftLength(v[0], v[1], v[2]); }
|
||
|
void SetNormalizedShaftLength(double x, double y, double z);
|
||
|
vtkGetVectorMacro(NormalizedShaftLength, double, 3);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the normalized (0-1) length of the tip. Normally, this would be
|
||
|
* 1 - the normalized length of the shaft.
|
||
|
*/
|
||
|
void SetNormalizedTipLength(double v[3]) { this->SetNormalizedTipLength(v[0], v[1], v[2]); }
|
||
|
void SetNormalizedTipLength(double x, double y, double z);
|
||
|
vtkGetVectorMacro(NormalizedTipLength, double, 3);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the normalized (0-1) position of the label along the length of
|
||
|
* the shaft. A value > 1 is permissible.
|
||
|
*/
|
||
|
void SetNormalizedLabelPosition(double v[3])
|
||
|
{
|
||
|
this->SetNormalizedLabelPosition(v[0], v[1], v[2]);
|
||
|
}
|
||
|
void SetNormalizedLabelPosition(double x, double y, double z);
|
||
|
vtkGetVectorMacro(NormalizedLabelPosition, double, 3);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/get the resolution of the pieces of the axes actor.
|
||
|
*/
|
||
|
vtkSetClampMacro(ConeResolution, int, 3, 128);
|
||
|
vtkGetMacro(ConeResolution, int);
|
||
|
vtkSetClampMacro(SphereResolution, int, 3, 128);
|
||
|
vtkGetMacro(SphereResolution, int);
|
||
|
vtkSetClampMacro(CylinderResolution, int, 3, 128);
|
||
|
vtkGetMacro(CylinderResolution, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/get the radius of the pieces of the axes actor.
|
||
|
*/
|
||
|
vtkSetClampMacro(ConeRadius, double, 0, VTK_FLOAT_MAX);
|
||
|
vtkGetMacro(ConeRadius, double);
|
||
|
vtkSetClampMacro(SphereRadius, double, 0, VTK_FLOAT_MAX);
|
||
|
vtkGetMacro(SphereRadius, double);
|
||
|
vtkSetClampMacro(CylinderRadius, double, 0, VTK_FLOAT_MAX);
|
||
|
vtkGetMacro(CylinderRadius, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the type of the shaft to a cylinder, line, or user defined geometry.
|
||
|
*/
|
||
|
void SetShaftType(int type);
|
||
|
void SetShaftTypeToCylinder() { this->SetShaftType(vtkAxesActor::CYLINDER_SHAFT); }
|
||
|
void SetShaftTypeToLine() { this->SetShaftType(vtkAxesActor::LINE_SHAFT); }
|
||
|
void SetShaftTypeToUserDefined() { this->SetShaftType(vtkAxesActor::USER_DEFINED_SHAFT); }
|
||
|
vtkGetMacro(ShaftType, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the type of the tip to a cone, sphere, or user defined geometry.
|
||
|
*/
|
||
|
void SetTipType(int type);
|
||
|
void SetTipTypeToCone() { this->SetTipType(vtkAxesActor::CONE_TIP); }
|
||
|
void SetTipTypeToSphere() { this->SetTipType(vtkAxesActor::SPHERE_TIP); }
|
||
|
void SetTipTypeToUserDefined() { this->SetTipType(vtkAxesActor::USER_DEFINED_TIP); }
|
||
|
vtkGetMacro(TipType, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the user defined tip polydata.
|
||
|
*/
|
||
|
void SetUserDefinedTip(vtkPolyData*);
|
||
|
vtkGetObjectMacro(UserDefinedTip, vtkPolyData);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the user defined shaft polydata.
|
||
|
*/
|
||
|
void SetUserDefinedShaft(vtkPolyData*);
|
||
|
vtkGetObjectMacro(UserDefinedShaft, vtkPolyData);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the tip properties.
|
||
|
*/
|
||
|
vtkProperty* GetXAxisTipProperty();
|
||
|
vtkProperty* GetYAxisTipProperty();
|
||
|
vtkProperty* GetZAxisTipProperty();
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the shaft properties.
|
||
|
*/
|
||
|
vtkProperty* GetXAxisShaftProperty();
|
||
|
vtkProperty* GetYAxisShaftProperty();
|
||
|
vtkProperty* GetZAxisShaftProperty();
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Retrieve handles to the X, Y and Z axis (so that you can set their text
|
||
|
* properties for example)
|
||
|
*/
|
||
|
vtkCaptionActor2D* GetXAxisCaptionActor2D() { return this->XAxisLabel; }
|
||
|
vtkCaptionActor2D* GetYAxisCaptionActor2D() { return this->YAxisLabel; }
|
||
|
vtkCaptionActor2D* GetZAxisCaptionActor2D() { return this->ZAxisLabel; }
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/get the label text.
|
||
|
*/
|
||
|
vtkSetStringMacro(XAxisLabelText);
|
||
|
vtkGetStringMacro(XAxisLabelText);
|
||
|
vtkSetStringMacro(YAxisLabelText);
|
||
|
vtkGetStringMacro(YAxisLabelText);
|
||
|
vtkSetStringMacro(ZAxisLabelText);
|
||
|
vtkGetStringMacro(ZAxisLabelText);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Enable/disable drawing the axis labels.
|
||
|
*/
|
||
|
vtkSetMacro(AxisLabels, vtkTypeBool);
|
||
|
vtkGetMacro(AxisLabels, vtkTypeBool);
|
||
|
vtkBooleanMacro(AxisLabels, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
CYLINDER_SHAFT,
|
||
|
LINE_SHAFT,
|
||
|
USER_DEFINED_SHAFT
|
||
|
};
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
CONE_TIP,
|
||
|
SPHERE_TIP,
|
||
|
USER_DEFINED_TIP
|
||
|
};
|
||
|
|
||
|
protected:
|
||
|
vtkAxesActor();
|
||
|
~vtkAxesActor() override;
|
||
|
|
||
|
vtkCylinderSource* CylinderSource;
|
||
|
vtkLineSource* LineSource;
|
||
|
vtkConeSource* ConeSource;
|
||
|
vtkSphereSource* SphereSource;
|
||
|
|
||
|
vtkActor* XAxisShaft;
|
||
|
vtkActor* YAxisShaft;
|
||
|
vtkActor* ZAxisShaft;
|
||
|
|
||
|
vtkActor* XAxisTip;
|
||
|
vtkActor* YAxisTip;
|
||
|
vtkActor* ZAxisTip;
|
||
|
|
||
|
void UpdateProps();
|
||
|
|
||
|
double TotalLength[3];
|
||
|
double NormalizedShaftLength[3];
|
||
|
double NormalizedTipLength[3];
|
||
|
double NormalizedLabelPosition[3];
|
||
|
|
||
|
int ShaftType;
|
||
|
int TipType;
|
||
|
|
||
|
vtkPolyData* UserDefinedTip;
|
||
|
vtkPolyData* UserDefinedShaft;
|
||
|
|
||
|
char* XAxisLabelText;
|
||
|
char* YAxisLabelText;
|
||
|
char* ZAxisLabelText;
|
||
|
|
||
|
vtkCaptionActor2D* XAxisLabel;
|
||
|
vtkCaptionActor2D* YAxisLabel;
|
||
|
vtkCaptionActor2D* ZAxisLabel;
|
||
|
|
||
|
vtkTypeBool AxisLabels;
|
||
|
|
||
|
int ConeResolution;
|
||
|
int SphereResolution;
|
||
|
int CylinderResolution;
|
||
|
|
||
|
double ConeRadius;
|
||
|
double SphereRadius;
|
||
|
double CylinderRadius;
|
||
|
|
||
|
private:
|
||
|
vtkAxesActor(const vtkAxesActor&) = delete;
|
||
|
void operator=(const vtkAxesActor&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|