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.

163 lines
4.5 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkSplitField.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 vtkSplitField
* @brief Split a field into single component fields
*
* 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).
* Note that, by default, the original array is also passed through.
*
* @warning
* When using 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 wrapped 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.
*
* @sa
* vtkFieldData vtkDataSet vtkDataObjectToDataSetFilter
* vtkDataSetAttributes vtkDataArray vtkRearrangeFields
* vtkAssignAttribute vtkMergeFields
*/
#ifndef vtkSplitField_h
#define vtkSplitField_h
#include "vtkDataSetAlgorithm.h"
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkDataSetAttributes.h" // Needed for NUM_ATTRIBUTES
class vtkFieldData;
class VTKFILTERSGENERAL_EXPORT vtkSplitField : public vtkDataSetAlgorithm
{
public:
vtkTypeMacro(vtkSplitField, vtkDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Create a new vtkSplitField.
*/
static vtkSplitField* New();
/**
* Use the given attribute in the field data given
* by fieldLoc as input.
*/
void SetInputField(int attributeType, int fieldLoc);
/**
* Use the array with given name in the field data given
* by fieldLoc as input.
*/
void SetInputField(const char* name, int fieldLoc);
/**
* 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);
/**
* Create a new array with the given component.
*/
void Split(int component, const char* arrayName);
enum FieldLocations
{
DATA_OBJECT = 0,
POINT_DATA = 1,
CELL_DATA = 2
};
struct Component
{
int Index;
char* FieldName;
Component* Next; // linked list
void SetName(const char* name)
{
delete[] this->FieldName;
this->FieldName = nullptr;
if (name)
{
size_t len = strlen(name) + 1;
this->FieldName = new char[len];
#ifdef _MSC_VER
strncpy_s(this->FieldName, len, name, len - 1);
#else
strncpy(this->FieldName, name, len);
#endif
}
}
Component() { FieldName = nullptr; }
~Component() { delete[] FieldName; }
};
protected:
enum FieldTypes
{
NAME,
ATTRIBUTE
};
vtkSplitField();
~vtkSplitField() override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
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&) = delete;
void operator=(const vtkSplitField&) = delete;
};
#endif