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.
167 lines
4.8 KiB
167 lines
4.8 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkSplitField.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 vtkSplitField - Split a field into single component fields
|
|
// .SECTION Description
|
|
// vtkSplitField is used to split a multi-component field (vtkDataArray)
|
|
// into multiple single component fields. The new fields are put in
|
|
// the same field data as the original field. The output arrays
|
|
// are of the same type as the input array. Example:
|
|
// @verbatim
|
|
// sf->SetInputField("gradient", vtkSplitField::POINT_DATA);
|
|
// sf->Split(0, "firstcomponent");
|
|
// @endverbatim
|
|
// tells vtkSplitField to extract the first component of the field
|
|
// called gradient and create an array called firstcomponent (the
|
|
// new field will be in the output's point data).
|
|
// The same can be done from Tcl:
|
|
// @verbatim
|
|
// sf SetInputField gradient POINT_DATA
|
|
// sf Split 0 firstcomponent
|
|
//
|
|
// AttributeTypes: SCALARS, VECTORS, NORMALS, TCOORDS, TENSORS
|
|
// Field locations: DATA_OBJECT, POINT_DATA, CELL_DATA
|
|
// @endverbatim
|
|
// Note that, by default, the original array is also passed through.
|
|
|
|
// .SECTION Caveats
|
|
// When using Tcl, Java, Python or Visual Basic bindings, the array name
|
|
// can not be one of the AttributeTypes when calling Split() which takes
|
|
// strings as arguments. The Tcl (Java etc.) command will
|
|
// always assume the string corresponds to an attribute type when
|
|
// the argument is one of the AttributeTypes. In this situation,
|
|
// use the Split() which takes enums.
|
|
|
|
// .SECTION See Also
|
|
// vtkFieldData vtkDataSet vtkDataObjectToDataSetFilter
|
|
// vtkDataSetAttributes vtkDataArray vtkRearrangeFields
|
|
// vtkAssignAttribute vtkMergeFields
|
|
|
|
#ifndef __vtkSplitField_h
|
|
#define __vtkSplitField_h
|
|
|
|
#include "vtkDataSetAlgorithm.h"
|
|
|
|
#include "vtkDataSetAttributes.h" // Needed for NUM_ATTRIBUTES
|
|
|
|
class vtkFieldData;
|
|
|
|
class VTK_GRAPHICS_EXPORT vtkSplitField : public vtkDataSetAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkSplitField,vtkDataSetAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Create a new vtkSplitField.
|
|
static vtkSplitField *New();
|
|
|
|
// Description:
|
|
// Use the given attribute in the field data given
|
|
// by fieldLoc as input.
|
|
void SetInputField(int attributeType, int fieldLoc);
|
|
|
|
// Description:
|
|
// Use the array with given name in the field data given
|
|
// by fieldLoc as input.
|
|
void SetInputField(const char* name, int fieldLoc);
|
|
|
|
// Description:
|
|
// Helper method used by other language bindings. Allows the caller to
|
|
// specify arguments as strings instead of enums.
|
|
void SetInputField(const char* name, const char* fieldLoc);
|
|
|
|
// Description:
|
|
// Create a new array with the given component.
|
|
void Split(int component, const char* arrayName);
|
|
|
|
//BTX
|
|
enum FieldLocations
|
|
{
|
|
DATA_OBJECT=0,
|
|
POINT_DATA=1,
|
|
CELL_DATA=2
|
|
};
|
|
//ETX
|
|
|
|
//BTX
|
|
struct Component
|
|
{
|
|
int Index;
|
|
char* FieldName;
|
|
Component* Next; // linked list
|
|
void SetName(const char* name)
|
|
{
|
|
delete[] this->FieldName;
|
|
this->FieldName = 0;
|
|
if (name)
|
|
{
|
|
this->FieldName = new char[strlen(name)+1];
|
|
strcpy(this->FieldName, name);
|
|
}
|
|
}
|
|
Component() { FieldName = 0; }
|
|
~Component() { delete[] FieldName; }
|
|
};
|
|
//ETX
|
|
|
|
protected:
|
|
|
|
//BTX
|
|
enum FieldTypes
|
|
{
|
|
NAME,
|
|
ATTRIBUTE
|
|
};
|
|
//ETX
|
|
|
|
vtkSplitField();
|
|
virtual ~vtkSplitField();
|
|
|
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
|
|
char* FieldName;
|
|
int FieldType;
|
|
int AttributeType;
|
|
int FieldLocation;
|
|
|
|
static char FieldLocationNames[3][12];
|
|
static char AttributeNames[vtkDataSetAttributes::NUM_ATTRIBUTES][10];
|
|
|
|
vtkDataArray* SplitArray(vtkDataArray* da, int component);
|
|
|
|
|
|
// Components are stored as a linked list.
|
|
Component* Head;
|
|
Component* Tail;
|
|
|
|
// Methods to browse/modify the linked list.
|
|
Component* GetNextComponent(Component* op)
|
|
{ return op->Next; }
|
|
Component* GetFirst()
|
|
{ return this->Head; }
|
|
void AddComponent(Component* op);
|
|
Component* FindComponent(int index);
|
|
void DeleteAllComponents();
|
|
|
|
void PrintComponent(Component* op, ostream& os, vtkIndent indent);
|
|
void PrintAllComponents(ostream& os, vtkIndent indent);
|
|
private:
|
|
vtkSplitField(const vtkSplitField&); // Not implemented.
|
|
void operator=(const vtkSplitField&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|