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.

256 lines
7.7 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkLegendScaleActor.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 vtkLegendScaleActor
* @brief annotate the render window with scale and distance information
*
* This class is used to annotate the render window. Its basic goal is to
* provide an indication of the scale of the scene. Four axes surrounding the
* render window indicate (in a variety of ways) the scale of what the camera
* is viewing. An option also exists for displaying a scale legend.
*
* The axes can be programmed either to display distance scales or x-y
* coordinate values. By default, the scales display a distance. However,
* if you know that the view is down the z-axis, the scales can be programmed
* to display x-y coordinate values.
*
* @warning
* Please be aware that the axes and scale values are subject to perspective
* effects. The distances are computed in the focal plane of the camera.
* When there are large view angles (i.e., perspective projection), the
* computed distances may provide users the wrong sense of scale. These
* effects are not present when parallel projection is enabled.
*/
#ifndef vtkLegendScaleActor_h
#define vtkLegendScaleActor_h
#include "vtkCoordinate.h" // For vtkViewportCoordinateMacro
#include "vtkProp.h"
#include "vtkRenderingAnnotationModule.h" // For export macro
class vtkAxisActor2D;
class vtkTextProperty;
class vtkPolyData;
class vtkPolyDataMapper2D;
class vtkActor2D;
class vtkTextMapper;
class vtkPoints;
class vtkCoordinate;
class VTKRENDERINGANNOTATION_EXPORT vtkLegendScaleActor : public vtkProp
{
public:
/**
* Instantiate the class.
*/
static vtkLegendScaleActor* New();
//@{
/**
* Standard methods for the class.
*/
vtkTypeMacro(vtkLegendScaleActor, vtkProp);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
enum AttributeLocation
{
DISTANCE = 0,
XY_COORDINATES = 1
};
//@{
/**
* Specify the mode for labeling the scale axes. By default, the axes are
* labeled with the distance between points (centered at a distance of
* 0.0). Alternatively if you know that the view is down the z-axis; the
* axes can be labeled with x-y coordinate values.
*/
vtkSetClampMacro(LabelMode, int, DISTANCE, XY_COORDINATES);
vtkGetMacro(LabelMode, int);
void SetLabelModeToDistance() { this->SetLabelMode(DISTANCE); }
void SetLabelModeToXYCoordinates() { this->SetLabelMode(XY_COORDINATES); }
//@}
//@{
/**
* Set/Get the flags that control which of the four axes to display (top,
* bottom, left and right). By default, all the axes are displayed.
*/
vtkSetMacro(RightAxisVisibility, vtkTypeBool);
vtkGetMacro(RightAxisVisibility, vtkTypeBool);
vtkBooleanMacro(RightAxisVisibility, vtkTypeBool);
vtkSetMacro(TopAxisVisibility, vtkTypeBool);
vtkGetMacro(TopAxisVisibility, vtkTypeBool);
vtkBooleanMacro(TopAxisVisibility, vtkTypeBool);
vtkSetMacro(LeftAxisVisibility, vtkTypeBool);
vtkGetMacro(LeftAxisVisibility, vtkTypeBool);
vtkBooleanMacro(LeftAxisVisibility, vtkTypeBool);
vtkSetMacro(BottomAxisVisibility, vtkTypeBool);
vtkGetMacro(BottomAxisVisibility, vtkTypeBool);
vtkBooleanMacro(BottomAxisVisibility, vtkTypeBool);
//@}
//@{
/**
* Indicate whether the legend scale should be displayed or not.
* The default is On.
*/
vtkSetMacro(LegendVisibility, vtkTypeBool);
vtkGetMacro(LegendVisibility, vtkTypeBool);
vtkBooleanMacro(LegendVisibility, vtkTypeBool);
//@}
//@{
/**
* Convenience method that turns all the axes either on or off.
*/
void AllAxesOn();
void AllAxesOff();
//@}
//@{
/**
* Convenience method that turns all the axes and the legend scale.
*/
void AllAnnotationsOn();
void AllAnnotationsOff();
//@}
//@{
/**
* Set/Get the offset of the right axis from the border. This number is expressed in
* pixels, and represents the approximate distance of the axes from the sides
* of the renderer. The default is 50.
*/
vtkSetClampMacro(RightBorderOffset, int, 5, VTK_INT_MAX);
vtkGetMacro(RightBorderOffset, int);
//@}
//@{
/**
* Set/Get the offset of the top axis from the border. This number is expressed in
* pixels, and represents the approximate distance of the axes from the sides
* of the renderer. The default is 30.
*/
vtkSetClampMacro(TopBorderOffset, int, 5, VTK_INT_MAX);
vtkGetMacro(TopBorderOffset, int);
//@}
//@{
/**
* Set/Get the offset of the left axis from the border. This number is expressed in
* pixels, and represents the approximate distance of the axes from the sides
* of the renderer. The default is 50.
*/
vtkSetClampMacro(LeftBorderOffset, int, 5, VTK_INT_MAX);
vtkGetMacro(LeftBorderOffset, int);
//@}
//@{
/**
* Set/Get the offset of the bottom axis from the border. This number is expressed in
* pixels, and represents the approximate distance of the axes from the sides
* of the renderer. The default is 30.
*/
vtkSetClampMacro(BottomBorderOffset, int, 5, VTK_INT_MAX);
vtkGetMacro(BottomBorderOffset, int);
//@}
//@{
/**
* Get/Set the corner offset. This is the offset factor used to offset the
* axes at the corners. Default value is 2.0.
*/
vtkSetClampMacro(CornerOffsetFactor, double, 1.0, 10.0);
vtkGetMacro(CornerOffsetFactor, double);
//@}
//@{
/**
* Set/Get the labels text properties for the legend title and labels.
*/
vtkGetObjectMacro(LegendTitleProperty, vtkTextProperty);
vtkGetObjectMacro(LegendLabelProperty, vtkTextProperty);
//@}
//@{
/**
* These are methods to retrieve the vtkAxisActors used to represent
* the four axes that form this representation. Users may retrieve and
* then modify these axes to control their appearance.
*/
vtkGetObjectMacro(RightAxis, vtkAxisActor2D);
vtkGetObjectMacro(TopAxis, vtkAxisActor2D);
vtkGetObjectMacro(LeftAxis, vtkAxisActor2D);
vtkGetObjectMacro(BottomAxis, vtkAxisActor2D);
//@}
//@{
/**
* Standard methods supporting the rendering process.
*/
virtual void BuildRepresentation(vtkViewport* viewport);
void GetActors2D(vtkPropCollection*) override;
void ReleaseGraphicsResources(vtkWindow*) override;
int RenderOverlay(vtkViewport*) override;
int RenderOpaqueGeometry(vtkViewport*) override;
//@}
protected:
vtkLegendScaleActor();
~vtkLegendScaleActor() override;
int LabelMode;
int RightBorderOffset;
int TopBorderOffset;
int LeftBorderOffset;
int BottomBorderOffset;
double CornerOffsetFactor;
// The four axes around the borders of the renderer
vtkAxisActor2D* RightAxis;
vtkAxisActor2D* TopAxis;
vtkAxisActor2D* LeftAxis;
vtkAxisActor2D* BottomAxis;
// Control the display of the axes
vtkTypeBool RightAxisVisibility;
vtkTypeBool TopAxisVisibility;
vtkTypeBool LeftAxisVisibility;
vtkTypeBool BottomAxisVisibility;
// Support for the legend.
vtkTypeBool LegendVisibility;
vtkPolyData* Legend;
vtkPoints* LegendPoints;
vtkPolyDataMapper2D* LegendMapper;
vtkActor2D* LegendActor;
vtkTextMapper* LabelMappers[6];
vtkActor2D* LabelActors[6];
vtkTextProperty* LegendTitleProperty;
vtkTextProperty* LegendLabelProperty;
vtkCoordinate* Coordinate;
vtkTimeStamp BuildTime;
private:
vtkLegendScaleActor(const vtkLegendScaleActor&) = delete;
void operator=(const vtkLegendScaleActor&) = delete;
};
#endif