You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
336 lines
12 KiB
336 lines
12 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkGenericGlyph3DFilter.h,v $
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkGenericGlyph3DFilter - copy oriented and scaled glyph geometry to every input point
|
|
// .SECTION Description
|
|
// vtkGenericGlyph3DFilter is a filter that copies a geometric representation (called
|
|
// a glyph) to every point in the input dataset. The glyph is defined with
|
|
// polygonal data from a source filter input. The glyph may be oriented
|
|
// along the input vectors or normals, and it may be scaled according to
|
|
// scalar data or vector magnitude. More than one glyph may be used by
|
|
// creating a table of source objects, each defining a different glyph. If a
|
|
// table of glyphs is defined, then the table can be indexed into by using
|
|
// either scalar value or vector magnitude.
|
|
//
|
|
// To use this object you'll have to provide an input dataset and a source
|
|
// to define the glyph. Then decide whether you want to scale the glyph and
|
|
// how to scale the glyph (using scalar value or vector magnitude). Next
|
|
// decide whether you want to orient the glyph, and whether to use the
|
|
// vector data or normal data to orient it. Finally, decide whether to use a
|
|
// table of glyphs, or just a single glyph. If you use a table of glyphs,
|
|
// you'll have to decide whether to index into it with scalar value or with
|
|
// vector magnitude.
|
|
//
|
|
// .SECTION Caveats
|
|
// Contrary to vtkGlyph3D, the only way to specify which attributes will be
|
|
// used for scaling, coloring and orienting is through SelectInputScalars(),
|
|
// SelectInputVectors() and SelectInputNormals().
|
|
//
|
|
// The scaling of the glyphs is controlled by the ScaleFactor ivar multiplied
|
|
// by the scalar value at each point (if VTK_SCALE_BY_SCALAR is set), or
|
|
// multiplied by the vector magnitude (if VTK_SCALE_BY_VECTOR is set),
|
|
// Alternatively (if VTK_SCALE_BY_VECTORCOMPONENTS is set), the scaling
|
|
// may be specified for x,y,z using the vector components. The
|
|
// scale factor can be further controlled by enabling clamping using the
|
|
// Clamping ivar. If clamping is enabled, the scale is normalized by the
|
|
// Range ivar, and then multiplied by the scale factor. The normalization
|
|
// process includes clamping the scale value between (0,1).
|
|
//
|
|
// Typically this object operates on input data with scalar and/or vector
|
|
// data. However, scalar and/or vector aren't necessary, and it can be used
|
|
// to copy data from a single source to each point. In this case the scale
|
|
// factor can be used to uniformly scale the glyphs.
|
|
//
|
|
// The object uses "vector" data to scale glyphs, orient glyphs, and/or index
|
|
// into a table of glyphs. You can choose to use either the vector or normal
|
|
// data at each input point. Use the method SetVectorModeToUseVector() to use
|
|
// the vector input data, and SetVectorModeToUseNormal() to use the
|
|
// normal input data.
|
|
//
|
|
// If you do use a table of glyphs, make sure to set the Range ivar to make
|
|
// sure the index into the glyph table is computed correctly.
|
|
//
|
|
// You can turn off scaling of the glyphs completely by using the Scaling
|
|
// ivar. You can also turn off scaling due to data (either vector or scalar)
|
|
// by using the SetScaleModeToDataScalingOff() method.
|
|
|
|
// .SECTION See Also
|
|
// vtkTensorGlyph
|
|
|
|
#ifndef __vtkGenericGlyph3DFilter_h
|
|
#define __vtkGenericGlyph3DFilter_h
|
|
|
|
#include "vtkPolyDataAlgorithm.h"
|
|
|
|
#define VTK_SCALE_BY_SCALAR 0
|
|
#define VTK_SCALE_BY_VECTOR 1
|
|
#define VTK_SCALE_BY_VECTORCOMPONENTS 2
|
|
#define VTK_DATA_SCALING_OFF 3
|
|
|
|
#define VTK_COLOR_BY_SCALE 0
|
|
#define VTK_COLOR_BY_SCALAR 1
|
|
#define VTK_COLOR_BY_VECTOR 2
|
|
|
|
#define VTK_USE_VECTOR 0
|
|
#define VTK_USE_NORMAL 1
|
|
#define VTK_VECTOR_ROTATION_OFF 2
|
|
|
|
#define VTK_INDEXING_OFF 0
|
|
#define VTK_INDEXING_BY_SCALAR 1
|
|
#define VTK_INDEXING_BY_VECTOR 2
|
|
|
|
class VTK_GENERIC_FILTERING_EXPORT vtkGenericGlyph3DFilter : public vtkPolyDataAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkGenericGlyph3DFilter,vtkPolyDataAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description
|
|
// Construct object with scaling on, scaling mode is by scalar value,
|
|
// scale factor = 1.0, the range is (0,1), orient geometry is on, and
|
|
// orientation is by vector. Clamping and indexing are turned off. No
|
|
// initial sources are defined.
|
|
static vtkGenericGlyph3DFilter *New();
|
|
|
|
// Description:
|
|
// Set the source to use for he glyph.
|
|
void SetSource(vtkPolyData *pd) {this->SetSource(0,pd);};
|
|
|
|
// Description:
|
|
// Specify a source object at a specified table location.
|
|
void SetSource(int id, vtkPolyData *pd);
|
|
|
|
// Description:
|
|
// Get a pointer to a source object at a specified table location.
|
|
vtkPolyData *GetSource(int id=0);
|
|
|
|
// Description:
|
|
// Turn on/off scaling of source geometry.
|
|
vtkSetMacro(Scaling,int);
|
|
vtkBooleanMacro(Scaling,int);
|
|
vtkGetMacro(Scaling,int);
|
|
|
|
// Description:
|
|
// Either scale by scalar or by vector/normal magnitude.
|
|
vtkSetMacro(ScaleMode,int);
|
|
vtkGetMacro(ScaleMode,int);
|
|
void SetScaleModeToScaleByScalar()
|
|
{this->SetScaleMode(VTK_SCALE_BY_SCALAR);};
|
|
void SetScaleModeToScaleByVector()
|
|
{this->SetScaleMode(VTK_SCALE_BY_VECTOR);};
|
|
void SetScaleModeToScaleByVectorComponents()
|
|
{this->SetScaleMode(VTK_SCALE_BY_VECTORCOMPONENTS);};
|
|
void SetScaleModeToDataScalingOff()
|
|
{this->SetScaleMode(VTK_DATA_SCALING_OFF);};
|
|
const char *GetScaleModeAsString();
|
|
|
|
// Description:
|
|
// Either color by scale, scalar or by vector/normal magnitude.
|
|
vtkSetMacro(ColorMode,int);
|
|
vtkGetMacro(ColorMode,int);
|
|
void SetColorModeToColorByScale()
|
|
{this->SetColorMode(VTK_COLOR_BY_SCALE);};
|
|
void SetColorModeToColorByScalar()
|
|
{this->SetColorMode(VTK_COLOR_BY_SCALAR);};
|
|
void SetColorModeToColorByVector()
|
|
{this->SetColorMode(VTK_COLOR_BY_VECTOR);};
|
|
const char *GetColorModeAsString();
|
|
|
|
// Description:
|
|
// Specify scale factor to scale object by.
|
|
vtkSetMacro(ScaleFactor,double);
|
|
vtkGetMacro(ScaleFactor,double);
|
|
|
|
// Description:
|
|
// Specify range to map scalar values into.
|
|
vtkSetVector2Macro(Range,double);
|
|
vtkGetVectorMacro(Range,double,2);
|
|
|
|
// Description:
|
|
// Turn on/off orienting of input geometry along vector/normal.
|
|
vtkSetMacro(Orient,int);
|
|
vtkBooleanMacro(Orient,int);
|
|
vtkGetMacro(Orient,int);
|
|
|
|
// Description:
|
|
// Turn on/off clamping of "scalar" values to range. (Scalar value may be
|
|
// vector magnitude if ScaleByVector() is enabled.)
|
|
vtkSetMacro(Clamping,int);
|
|
vtkBooleanMacro(Clamping,int);
|
|
vtkGetMacro(Clamping,int);
|
|
|
|
// Description:
|
|
// Specify whether to use vector or normal to perform vector operations.
|
|
vtkSetMacro(VectorMode,int);
|
|
vtkGetMacro(VectorMode,int);
|
|
void SetVectorModeToUseVector() {this->SetVectorMode(VTK_USE_VECTOR);};
|
|
void SetVectorModeToUseNormal() {this->SetVectorMode(VTK_USE_NORMAL);};
|
|
void SetVectorModeToVectorRotationOff()
|
|
{this->SetVectorMode(VTK_VECTOR_ROTATION_OFF);};
|
|
const char *GetVectorModeAsString();
|
|
|
|
// Description:
|
|
// Index into table of sources by scalar, by vector/normal magnitude, or
|
|
// no indexing. If indexing is turned off, then the first source glyph in
|
|
// the table of glyphs is used.
|
|
vtkSetMacro(IndexMode,int);
|
|
vtkGetMacro(IndexMode,int);
|
|
void SetIndexModeToScalar() {this->SetIndexMode(VTK_INDEXING_BY_SCALAR);};
|
|
void SetIndexModeToVector() {this->SetIndexMode(VTK_INDEXING_BY_VECTOR);};
|
|
void SetIndexModeToOff() {this->SetIndexMode(VTK_INDEXING_OFF);};
|
|
const char *GetIndexModeAsString();
|
|
|
|
// Description:
|
|
// Enable/disable the generation of point ids as part of the output. The
|
|
// point ids are the id of the input generating point. The point ids are
|
|
// stored in the output point field data and named "InputPointIds". Point
|
|
// generation is useful for debugging and pick operations.
|
|
vtkSetMacro(GeneratePointIds,int);
|
|
vtkGetMacro(GeneratePointIds,int);
|
|
vtkBooleanMacro(GeneratePointIds,int);
|
|
|
|
// Description:
|
|
// Set/Get the name of the PointIds array if generated. By default the Ids
|
|
// are named "InputPointIds", but this can be changed with this function.
|
|
vtkSetStringMacro(PointIdsName);
|
|
vtkGetStringMacro(PointIdsName);
|
|
|
|
// Description:
|
|
// If you want to use an arbitrary scalars array, then set its name here.
|
|
// By default this in NULL and the filter will use the active scalar array.
|
|
vtkGetStringMacro(InputScalarsSelection);
|
|
void SelectInputScalars(const char *fieldName)
|
|
{this->SetInputScalarsSelection(fieldName);}
|
|
|
|
// Description:
|
|
// If you want to use an arbitrary vectors array, then set its name here.
|
|
// By default this in NULL and the filter will use the active vector array.
|
|
vtkGetStringMacro(InputVectorsSelection);
|
|
void SelectInputVectors(const char *fieldName)
|
|
{this->SetInputVectorsSelection(fieldName);}
|
|
|
|
// Description:
|
|
// If you want to use an arbitrary normals array, then set its name here.
|
|
// By default this in NULL and the filter will use the active normal array.
|
|
vtkGetStringMacro(InputNormalsSelection);
|
|
void SelectInputNormals(const char *fieldName)
|
|
{this->SetInputNormalsSelection(fieldName);}
|
|
|
|
protected:
|
|
vtkGenericGlyph3DFilter();
|
|
~vtkGenericGlyph3DFilter();
|
|
|
|
int FillInputPortInformation(int, vtkInformation*);
|
|
|
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
int RequestInformation(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
vtkPolyData **Source; // Geometry to copy to each point
|
|
int Scaling; // Determine whether scaling of geometry is performed
|
|
int ScaleMode; // Scale by scalar value or vector magnitude
|
|
int ColorMode; // new scalars based on scale, scalar or vector
|
|
double ScaleFactor; // Scale factor to use to scale geometry
|
|
double Range[2]; // Range to use to perform scalar scaling
|
|
int Orient; // boolean controls whether to "orient" data
|
|
int VectorMode; // Orient/scale via normal or via vector data
|
|
int Clamping; // whether to clamp scale factor
|
|
int IndexMode; // what to use to index into glyph table
|
|
int GeneratePointIds; // produce input points ids for each output point
|
|
char *PointIdsName;
|
|
|
|
char *InputScalarsSelection;
|
|
char *InputVectorsSelection;
|
|
char *InputNormalsSelection;
|
|
vtkSetStringMacro(InputScalarsSelection);
|
|
vtkSetStringMacro(InputVectorsSelection);
|
|
vtkSetStringMacro(InputNormalsSelection);
|
|
|
|
private:
|
|
vtkGenericGlyph3DFilter(const vtkGenericGlyph3DFilter&); // Not implemented.
|
|
void operator=(const vtkGenericGlyph3DFilter&); // Not implemented.
|
|
};
|
|
|
|
// Description:
|
|
// Return the method of scaling as a descriptive character string.
|
|
inline const char *vtkGenericGlyph3DFilter::GetScaleModeAsString(void)
|
|
{
|
|
if ( this->ScaleMode == VTK_SCALE_BY_SCALAR )
|
|
{
|
|
return "ScaleByScalar";
|
|
}
|
|
else if ( this->ScaleMode == VTK_SCALE_BY_VECTOR )
|
|
{
|
|
return "ScaleByVector";
|
|
}
|
|
else
|
|
{
|
|
return "DataScalingOff";
|
|
}
|
|
}
|
|
|
|
// Description:
|
|
// Return the method of coloring as a descriptive character string.
|
|
inline const char *vtkGenericGlyph3DFilter::GetColorModeAsString(void)
|
|
{
|
|
if ( this->ColorMode == VTK_COLOR_BY_SCALAR )
|
|
{
|
|
return "ColorByScalar";
|
|
}
|
|
else if ( this->ColorMode == VTK_COLOR_BY_VECTOR )
|
|
{
|
|
return "ColorByVector";
|
|
}
|
|
else
|
|
{
|
|
return "ColorByScale";
|
|
}
|
|
}
|
|
|
|
// Description:
|
|
// Return the vector mode as a character string.
|
|
inline const char *vtkGenericGlyph3DFilter::GetVectorModeAsString(void)
|
|
{
|
|
if ( this->VectorMode == VTK_USE_VECTOR)
|
|
{
|
|
return "UseVector";
|
|
}
|
|
else if ( this->VectorMode == VTK_USE_NORMAL)
|
|
{
|
|
return "UseNormal";
|
|
}
|
|
else
|
|
{
|
|
return "VectorRotationOff";
|
|
}
|
|
}
|
|
|
|
// Description:
|
|
// Return the index mode as a character string.
|
|
inline const char *vtkGenericGlyph3DFilter::GetIndexModeAsString(void)
|
|
{
|
|
if ( this->IndexMode == VTK_INDEXING_OFF)
|
|
{
|
|
return "IndexingOff";
|
|
}
|
|
else if ( this->IndexMode == VTK_INDEXING_BY_SCALAR)
|
|
{
|
|
return "IndexingByScalar";
|
|
}
|
|
else
|
|
{
|
|
return "IndexingByVector";
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|