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.
260 lines
7.1 KiB
C++
260 lines
7.1 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkLabelPlacementMapper.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.
|
|
|
|
=========================================================================*/
|
|
/*-------------------------------------------------------------------------
|
|
Copyright 2008 Sandia Corporation.
|
|
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
|
the U.S. Government retains certain rights in this software.
|
|
-------------------------------------------------------------------------*/
|
|
/**
|
|
* @class vtkLabelPlacementMapper
|
|
* @brief Places and renders non-overlapping labels.
|
|
*
|
|
*
|
|
* To use this mapper, first send your data through vtkPointSetToLabelHierarchy,
|
|
* which takes a set of points, associates special arrays to the points (label,
|
|
* priority, etc.), and produces a prioritized spatial tree of labels.
|
|
*
|
|
* This mapper then takes that hierarchy (or hierarchies) as input, and every
|
|
* frame will decide which labels and/or icons to place in order of priority,
|
|
* and will render only those labels/icons. A label render strategy is used to
|
|
* render the labels, and can use e.g. FreeType or Qt for rendering.
|
|
*/
|
|
|
|
#ifndef vtkLabelPlacementMapper_h
|
|
#define vtkLabelPlacementMapper_h
|
|
|
|
#include "vtkMapper2D.h"
|
|
#include "vtkRenderingLabelModule.h" // For export macro
|
|
|
|
class vtkCoordinate;
|
|
class vtkLabelRenderStrategy;
|
|
class vtkSelectVisiblePoints;
|
|
|
|
class VTKRENDERINGLABEL_EXPORT vtkLabelPlacementMapper : public vtkMapper2D
|
|
{
|
|
public:
|
|
static vtkLabelPlacementMapper* New();
|
|
vtkTypeMacro(vtkLabelPlacementMapper, vtkMapper2D);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Draw non-overlapping labels to the screen.
|
|
*/
|
|
void RenderOverlay(vtkViewport* viewport, vtkActor2D* actor) override;
|
|
|
|
//@{
|
|
/**
|
|
* Set the label rendering strategy.
|
|
*/
|
|
virtual void SetRenderStrategy(vtkLabelRenderStrategy* s);
|
|
vtkGetObjectMacro(RenderStrategy, vtkLabelRenderStrategy);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The maximum fraction of the screen that the labels may cover.
|
|
* Label placement stops when this fraction is reached.
|
|
*/
|
|
vtkSetClampMacro(MaximumLabelFraction, double, 0., 1.);
|
|
vtkGetMacro(MaximumLabelFraction, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The type of iterator used when traversing the labels.
|
|
* May be vtkLabelHierarchy::FRUSTUM or vtkLabelHierarchy::FULL_SORT
|
|
*/
|
|
vtkSetMacro(IteratorType, int);
|
|
vtkGetMacro(IteratorType, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set whether, or not, to use unicode strings.
|
|
*/
|
|
vtkSetMacro(UseUnicodeStrings, bool);
|
|
vtkGetMacro(UseUnicodeStrings, bool);
|
|
vtkBooleanMacro(UseUnicodeStrings, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Use label anchor point coordinates as normal vectors and eliminate those
|
|
* pointing away from the camera. Valid only when points are on a sphere
|
|
* centered at the origin (such as a 3D geographic view). Off by default.
|
|
*/
|
|
vtkGetMacro(PositionsAsNormals, bool);
|
|
vtkSetMacro(PositionsAsNormals, bool);
|
|
vtkBooleanMacro(PositionsAsNormals, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Enable drawing spokes (lines) to anchor point coordinates that were perturbed
|
|
* for being coincident with other anchor point coordinates.
|
|
*/
|
|
vtkGetMacro(GeneratePerturbedLabelSpokes, bool);
|
|
vtkSetMacro(GeneratePerturbedLabelSpokes, bool);
|
|
vtkBooleanMacro(GeneratePerturbedLabelSpokes, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Use the depth buffer to test each label to see if it should not be displayed if
|
|
* it would be occluded by other objects in the scene. Off by default.
|
|
*/
|
|
vtkGetMacro(UseDepthBuffer, bool);
|
|
vtkSetMacro(UseDepthBuffer, bool);
|
|
vtkBooleanMacro(UseDepthBuffer, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Tells the placer to place every label regardless of overlap.
|
|
* Off by default.
|
|
*/
|
|
vtkSetMacro(PlaceAllLabels, bool);
|
|
vtkGetMacro(PlaceAllLabels, bool);
|
|
vtkBooleanMacro(PlaceAllLabels, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Whether to render traversed bounds. Off by default.
|
|
*/
|
|
vtkSetMacro(OutputTraversedBounds, bool);
|
|
vtkGetMacro(OutputTraversedBounds, bool);
|
|
vtkBooleanMacro(OutputTraversedBounds, bool);
|
|
//@}
|
|
|
|
enum LabelShape
|
|
{
|
|
NONE,
|
|
RECT,
|
|
ROUNDED_RECT,
|
|
NUMBER_OF_LABEL_SHAPES
|
|
};
|
|
|
|
//@{
|
|
/**
|
|
* The shape of the label background, should be one of the
|
|
* values in the LabelShape enumeration.
|
|
*/
|
|
vtkSetClampMacro(Shape, int, 0, NUMBER_OF_LABEL_SHAPES - 1);
|
|
vtkGetMacro(Shape, int);
|
|
virtual void SetShapeToNone() { this->SetShape(NONE); }
|
|
virtual void SetShapeToRect() { this->SetShape(RECT); }
|
|
virtual void SetShapeToRoundedRect() { this->SetShape(ROUNDED_RECT); }
|
|
//@}
|
|
|
|
enum LabelStyle
|
|
{
|
|
FILLED,
|
|
OUTLINE,
|
|
NUMBER_OF_LABEL_STYLES
|
|
};
|
|
|
|
//@{
|
|
/**
|
|
* The style of the label background shape, should be one of the
|
|
* values in the LabelStyle enumeration.
|
|
*/
|
|
vtkSetClampMacro(Style, int, 0, NUMBER_OF_LABEL_STYLES - 1);
|
|
vtkGetMacro(Style, int);
|
|
virtual void SetStyleToFilled() { this->SetStyle(FILLED); }
|
|
virtual void SetStyleToOutline() { this->SetStyle(OUTLINE); }
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The size of the margin on the label background shape.
|
|
* Default is 5.
|
|
*/
|
|
vtkSetMacro(Margin, double);
|
|
vtkGetMacro(Margin, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The color of the background shape.
|
|
*/
|
|
vtkSetVector3Macro(BackgroundColor, double);
|
|
vtkGetVector3Macro(BackgroundColor, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The opacity of the background shape.
|
|
*/
|
|
vtkSetClampMacro(BackgroundOpacity, double, 0.0, 1.0);
|
|
vtkGetMacro(BackgroundOpacity, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get the transform for the anchor points.
|
|
*/
|
|
vtkGetObjectMacro(AnchorTransform, vtkCoordinate);
|
|
//@}
|
|
|
|
/**
|
|
* Release any graphics resources that are being consumed by this mapper.
|
|
* The parameter window could be used to determine which graphic
|
|
* resources to release.
|
|
*/
|
|
void ReleaseGraphicsResources(vtkWindow*) override;
|
|
|
|
protected:
|
|
vtkLabelPlacementMapper();
|
|
~vtkLabelPlacementMapper() override;
|
|
|
|
virtual void SetAnchorTransform(vtkCoordinate*);
|
|
|
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
|
|
|
class Internal;
|
|
Internal* Buckets;
|
|
|
|
vtkLabelRenderStrategy* RenderStrategy;
|
|
vtkCoordinate* AnchorTransform;
|
|
vtkSelectVisiblePoints* VisiblePoints;
|
|
double MaximumLabelFraction;
|
|
bool PositionsAsNormals;
|
|
bool GeneratePerturbedLabelSpokes;
|
|
bool UseDepthBuffer;
|
|
bool UseUnicodeStrings;
|
|
bool PlaceAllLabels;
|
|
bool OutputTraversedBounds;
|
|
|
|
int LastRendererSize[2];
|
|
double LastCameraPosition[3];
|
|
double LastCameraFocalPoint[3];
|
|
double LastCameraViewUp[3];
|
|
double LastCameraParallelScale;
|
|
int IteratorType;
|
|
|
|
int Style;
|
|
int Shape;
|
|
double Margin;
|
|
double BackgroundOpacity;
|
|
double BackgroundColor[3];
|
|
|
|
private:
|
|
vtkLabelPlacementMapper(const vtkLabelPlacementMapper&) = delete;
|
|
void operator=(const vtkLabelPlacementMapper&) = delete;
|
|
};
|
|
|
|
#endif
|