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.
289 lines
9.0 KiB
C
289 lines
9.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkLabeledDataMapper.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 vtkLabeledDataMapper
|
||
|
* @brief draw text labels at dataset points
|
||
|
*
|
||
|
* vtkLabeledDataMapper is a mapper that renders text at dataset
|
||
|
* points. Various items can be labeled including point ids, scalars,
|
||
|
* vectors, normals, texture coordinates, tensors, and field data components.
|
||
|
*
|
||
|
* The format with which the label is drawn is specified using a
|
||
|
* printf style format string. The font attributes of the text can
|
||
|
* be set through the vtkTextProperty associated to this mapper.
|
||
|
*
|
||
|
* By default, all the components of multi-component data such as
|
||
|
* vectors, normals, texture coordinates, tensors, and multi-component
|
||
|
* scalars are labeled. However, you can specify a single component if
|
||
|
* you prefer. (Note: the label format specifies the format to use for
|
||
|
* a single component. The label is creating by looping over all components
|
||
|
* and using the label format to render each component.)
|
||
|
* The character separator between components can be set. By default,
|
||
|
* it is set to a single whitespace.
|
||
|
*
|
||
|
* @warning
|
||
|
* Use this filter in combination with vtkSelectVisiblePoints if you want
|
||
|
* to label only points that are visible. If you want to label cells rather
|
||
|
* than points, use the filter vtkCellCenters to generate points at the
|
||
|
* center of the cells. Also, you can use the class vtkIdFilter to
|
||
|
* generate ids as scalars or field data, which can then be labeled.
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkMapper2D vtkActor2D vtkTextMapper vtkTextProperty vtkSelectVisiblePoints
|
||
|
* vtkIdFilter vtkCellCenters
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkLabeledDataMapper_h
|
||
|
#define vtkLabeledDataMapper_h
|
||
|
|
||
|
#include "vtkMapper2D.h"
|
||
|
#include "vtkRenderingLabelModule.h" // For export macro
|
||
|
|
||
|
#include <cassert> // For assert macro
|
||
|
|
||
|
class vtkDataObject;
|
||
|
class vtkDataSet;
|
||
|
class vtkTextMapper;
|
||
|
class vtkTextProperty;
|
||
|
class vtkTransform;
|
||
|
|
||
|
#define VTK_LABEL_IDS 0
|
||
|
#define VTK_LABEL_SCALARS 1
|
||
|
#define VTK_LABEL_VECTORS 2
|
||
|
#define VTK_LABEL_NORMALS 3
|
||
|
#define VTK_LABEL_TCOORDS 4
|
||
|
#define VTK_LABEL_TENSORS 5
|
||
|
#define VTK_LABEL_FIELD_DATA 6
|
||
|
|
||
|
class VTKRENDERINGLABEL_EXPORT vtkLabeledDataMapper : public vtkMapper2D
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* Instantiate object with %%-#6.3g label format. By default, point ids
|
||
|
* are labeled.
|
||
|
*/
|
||
|
static vtkLabeledDataMapper* New();
|
||
|
|
||
|
vtkTypeMacro(vtkLabeledDataMapper, vtkMapper2D);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the format with which to print the labels. This should
|
||
|
* be a printf-style format string.
|
||
|
|
||
|
* By default, the mapper will try to print each component of the
|
||
|
* tuple using a sane format: %d for integers, %f for floats, %g for
|
||
|
* doubles, %ld for longs, et cetera. If you need a different
|
||
|
* format, set it here. You can do things like limit the number of
|
||
|
* significant digits, add prefixes/suffixes, basically anything
|
||
|
* that printf can do. If you only want to print one component of a
|
||
|
* vector, see the ivar LabeledComponent.
|
||
|
*/
|
||
|
vtkSetStringMacro(LabelFormat);
|
||
|
vtkGetStringMacro(LabelFormat);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the component number to label if the data to print has
|
||
|
* more than one component. For example, all the components of
|
||
|
* scalars, vectors, normals, etc. are labeled by default
|
||
|
* (LabeledComponent=(-1)). However, if this ivar is nonnegative,
|
||
|
* then only the one component specified is labeled.
|
||
|
*/
|
||
|
vtkSetMacro(LabeledComponent, int);
|
||
|
vtkGetMacro(LabeledComponent, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the separator between components.
|
||
|
*/
|
||
|
vtkSetMacro(ComponentSeparator, char);
|
||
|
vtkGetMacro(ComponentSeparator, char);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the field data array to label. This instance variable is
|
||
|
* only applicable if field data is labeled. This will clear
|
||
|
* FieldDataName when set.
|
||
|
*/
|
||
|
void SetFieldDataArray(int arrayIndex);
|
||
|
vtkGetMacro(FieldDataArray, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the name of the field data array to label. This instance
|
||
|
* variable is only applicable if field data is labeled. This will
|
||
|
* override FieldDataArray when set.
|
||
|
*/
|
||
|
void SetFieldDataName(const char* arrayName);
|
||
|
vtkGetStringMacro(FieldDataName);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Set the input dataset to the mapper. This mapper handles any type of data.
|
||
|
*/
|
||
|
virtual void SetInputData(vtkDataObject*);
|
||
|
|
||
|
/**
|
||
|
* Use GetInputDataObject() to get the input data object for composite
|
||
|
* datasets.
|
||
|
*/
|
||
|
vtkDataSet* GetInput();
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify which data to plot: IDs, scalars, vectors, normals, texture coords,
|
||
|
* tensors, or field data. If the data has more than one component, use
|
||
|
* the method SetLabeledComponent to control which components to plot.
|
||
|
* The default is VTK_LABEL_IDS.
|
||
|
*/
|
||
|
vtkSetMacro(LabelMode, int);
|
||
|
vtkGetMacro(LabelMode, int);
|
||
|
void SetLabelModeToLabelIds() { this->SetLabelMode(VTK_LABEL_IDS); }
|
||
|
void SetLabelModeToLabelScalars() { this->SetLabelMode(VTK_LABEL_SCALARS); }
|
||
|
void SetLabelModeToLabelVectors() { this->SetLabelMode(VTK_LABEL_VECTORS); }
|
||
|
void SetLabelModeToLabelNormals() { this->SetLabelMode(VTK_LABEL_NORMALS); }
|
||
|
void SetLabelModeToLabelTCoords() { this->SetLabelMode(VTK_LABEL_TCOORDS); }
|
||
|
void SetLabelModeToLabelTensors() { this->SetLabelMode(VTK_LABEL_TENSORS); }
|
||
|
void SetLabelModeToLabelFieldData() { this->SetLabelMode(VTK_LABEL_FIELD_DATA); }
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the text property.
|
||
|
* If an integer argument is provided, you may provide different text
|
||
|
* properties for different label types. The type is determined by an
|
||
|
* optional type input array.
|
||
|
*/
|
||
|
virtual void SetLabelTextProperty(vtkTextProperty* p) { this->SetLabelTextProperty(p, 0); }
|
||
|
virtual vtkTextProperty* GetLabelTextProperty() { return this->GetLabelTextProperty(0); }
|
||
|
virtual void SetLabelTextProperty(vtkTextProperty* p, int type);
|
||
|
virtual vtkTextProperty* GetLabelTextProperty(int type);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Draw the text to the screen at each input point.
|
||
|
*/
|
||
|
void RenderOpaqueGeometry(vtkViewport* viewport, vtkActor2D* actor) override;
|
||
|
void RenderOverlay(vtkViewport* viewport, vtkActor2D* actor) override;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Release any graphics resources that are being consumed by this actor.
|
||
|
*/
|
||
|
void ReleaseGraphicsResources(vtkWindow*) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The transform to apply to the labels before mapping to 2D.
|
||
|
*/
|
||
|
vtkGetObjectMacro(Transform, vtkTransform);
|
||
|
void SetTransform(vtkTransform* t);
|
||
|
//@}
|
||
|
|
||
|
/// Coordinate systems that output dataset may use.
|
||
|
enum Coordinates
|
||
|
{
|
||
|
WORLD = 0, //!< Output 3-D world-space coordinates for each label anchor.
|
||
|
DISPLAY = 1 //!< Output 2-D display coordinates for each label anchor (3 components but only 2
|
||
|
//!< are significant).
|
||
|
};
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/get the coordinate system used for output labels.
|
||
|
* The output datasets may have point coordinates reported in the world space or display space.
|
||
|
*/
|
||
|
vtkGetMacro(CoordinateSystem, int);
|
||
|
vtkSetClampMacro(CoordinateSystem, int, WORLD, DISPLAY);
|
||
|
void CoordinateSystemWorld() { this->SetCoordinateSystem(vtkLabeledDataMapper::WORLD); }
|
||
|
void CoordinateSystemDisplay() { this->SetCoordinateSystem(vtkLabeledDataMapper::DISPLAY); }
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return the modified time for this object.
|
||
|
*/
|
||
|
vtkMTimeType GetMTime() override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Return the number of labels rendered by the mapper.
|
||
|
*/
|
||
|
vtkGetMacro(NumberOfLabels, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Return the position of the requested label.
|
||
|
*/
|
||
|
void GetLabelPosition(int label, double pos[3])
|
||
|
{
|
||
|
assert("label index range" && label >= 0 && label < this->NumberOfLabels);
|
||
|
pos[0] = this->LabelPositions[3 * label];
|
||
|
pos[1] = this->LabelPositions[3 * label + 1];
|
||
|
pos[2] = this->LabelPositions[3 * label + 2];
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return the text for the requested label.
|
||
|
*/
|
||
|
const char* GetLabelText(int label);
|
||
|
|
||
|
protected:
|
||
|
vtkLabeledDataMapper();
|
||
|
~vtkLabeledDataMapper() override;
|
||
|
|
||
|
vtkDataSet* Input;
|
||
|
|
||
|
char* LabelFormat;
|
||
|
int LabelMode;
|
||
|
int LabeledComponent;
|
||
|
int FieldDataArray;
|
||
|
char* FieldDataName;
|
||
|
int CoordinateSystem;
|
||
|
|
||
|
char ComponentSeparator;
|
||
|
|
||
|
vtkTimeStamp BuildTime;
|
||
|
|
||
|
int NumberOfLabels;
|
||
|
int NumberOfLabelsAllocated;
|
||
|
vtkTextMapper** TextMappers;
|
||
|
double* LabelPositions;
|
||
|
vtkTransform* Transform;
|
||
|
|
||
|
int FillInputPortInformation(int, vtkInformation*) override;
|
||
|
|
||
|
void AllocateLabels(int numLabels);
|
||
|
void BuildLabels();
|
||
|
void BuildLabelsInternal(vtkDataSet*);
|
||
|
|
||
|
class Internals;
|
||
|
Internals* Implementation;
|
||
|
|
||
|
private:
|
||
|
vtkLabeledDataMapper(const vtkLabeledDataMapper&) = delete;
|
||
|
void operator=(const vtkLabeledDataMapper&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|