comac_desk_app/ThirdpartyLibs/Libs/windows-x86_64/vtk/include/vtkRearrangeFields.h

209 lines
7.1 KiB
C
Raw Permalink Normal View History

2024-11-21 11:50:43 +08:00
/*=========================================================================
Program: Visualization Toolkit
Module: vtkRearrangeFields.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 vtkRearrangeFields
* @brief Move/copy fields between field data, point data and cell data
*
* vtkRearrangeFields is used to copy/move fields (vtkDataArrays) between
* data object's field data, point data and cell data. To specify which
* fields are copied/moved, the user adds operations. There are two types
* of operations: 1. the type which copies/moves an attribute's data
* (i.e. the field will be copied but will not be an attribute in the
* target), 2. the type which copies/moves fields by name. For example:
* @verbatim
* rf->AddOperation(vtkRearrangeFields::COPY, "foo",
* vtkRearrangeFields::DATA_OBJECT,
* vtkRearrangeFields::POINT_DATA);
* @endverbatim
* adds an operation which copies a field (data array) called foo from
* the data object's field data to point data.
* The same can be done using Python and Java bindings by passing
* strings as arguments.
* @verbatim
* Operation types: COPY, MOVE
* AttributeTypes: SCALARS, VECTORS, NORMALS, TCOORDS, TENSORS
* Field data locations: DATA_OBJECT, POINT_DATA, CELL_DATA
* @endverbatim
*
* @warning
* When using Java, Python or Visual Basic bindings, the array name
* can not be one of the AttributeTypes when calling AddOperation() 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 AddOperation() which takes enums.
*
* @sa
* vtkFieldData vtkDataSet vtkDataObjectToDataSetFilter
* vtkDataSetAttributes vtkDataArray vtkAssignAttribute
* vtkSplitField vtkMergeFields
*/
#ifndef vtkRearrangeFields_h
#define vtkRearrangeFields_h
#include "vtkDataSetAlgorithm.h"
#include "vtkFiltersCoreModule.h" // For export macro
#include "vtkDataSetAttributes.h" // Needed for NUM_ATTRIBUTES
class vtkFieldData;
class VTKFILTERSCORE_EXPORT vtkRearrangeFields : public vtkDataSetAlgorithm
{
public:
vtkTypeMacro(vtkRearrangeFields, vtkDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Create a new vtkRearrangeFields with an empty operation list.
*/
static vtkRearrangeFields* New();
enum OperationType
{
COPY = 0,
MOVE = 1
};
enum FieldLocation
{
DATA_OBJECT = 0,
POINT_DATA = 1,
CELL_DATA = 2
};
/**
* Add an operation which copies an attribute's field (data array) from
* one field data to another. Returns an operation id which can later
* be used to remove the operation.
*/
int AddOperation(int operationType, int attributeType, int fromFieldLoc, int toFieldLoc);
/**
* Add an operation which copies a field (data array) from one field
* data to another. Returns an operation id which can later
* be used to remove the operation.
*/
int AddOperation(int operationType, const char* name, int fromFieldLoc, int toFieldLoc);
/**
* Helper method used by other language bindings. Allows the caller to
* specify arguments as strings instead of enums.Returns an operation id
* which can later be used to remove the operation.
*/
int AddOperation(const char* operationType, const char* attributeType, const char* fromFieldLoc,
const char* toFieldLoc);
/**
* Remove an operation with the given id.
*/
int RemoveOperation(int operationId);
/**
* Remove an operation with the given signature. See AddOperation
* for details.
*/
int RemoveOperation(int operationType, int attributeType, int fromFieldLoc, int toFieldLoc);
/**
* Remove an operation with the given signature. See AddOperation
* for details.
*/
int RemoveOperation(int operationType, const char* name, int fromFieldLoc, int toFieldLoc);
/**
* Remove an operation with the given signature. See AddOperation
* for details.
*/
int RemoveOperation(const char* operationType, const char* attributeType,
const char* fromFieldLoc, const char* toFieldLoc);
///@{
/**
* Remove all operations.
*/
void RemoveAllOperations()
{
this->Modified();
this->LastId = 0;
this->DeleteAllOperations();
}
///@}
enum FieldType
{
NAME,
ATTRIBUTE
};
struct Operation
{
int OperationType; // COPY or MOVE
int FieldType; // NAME or ATTRIBUTE
char* FieldName;
int AttributeType;
int FromFieldLoc; // fd, pd or do
int ToFieldLoc; // fd, pd or do
int Id; // assigned during creation
Operation* Next; // linked list
Operation() { FieldName = nullptr; }
~Operation() { delete[] FieldName; }
};
protected:
vtkRearrangeFields();
~vtkRearrangeFields() override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
// Operations are stored as a linked list.
Operation* Head;
Operation* Tail;
// This is incremented whenever a new operation is created.
// It is not decremented when an operation is deleted.
int LastId;
// Methods to browse/modify the linked list.
Operation* GetNextOperation(Operation* op) { return op->Next; }
Operation* GetFirst() { return this->Head; }
void AddOperation(Operation* op);
void DeleteOperation(Operation* op, Operation* before);
Operation* FindOperation(int id, Operation*& before);
Operation* FindOperation(const char* name, Operation*& before);
Operation* FindOperation(
int operationType, const char* name, int fromFieldLoc, int toFieldLoc, Operation*& before);
Operation* FindOperation(
int operationType, int attributeType, int fromFieldLoc, int toFieldLoc, Operation*& before);
// Used when finding/deleting an operation given a signature.
int CompareOperationsByType(const Operation* op1, const Operation* op2);
int CompareOperationsByName(const Operation* op1, const Operation* op2);
void DeleteAllOperations();
void ApplyOperation(Operation* op, vtkDataSet* input, vtkDataSet* output);
// Given location (DATA_OBJECT, CELL_DATA, POINT_DATA) return the
// pointer to the corresponding field data.
vtkFieldData* GetFieldDataFromLocation(vtkDataSet* ds, int fieldLoc);
// Used by AddOperation() and RemoveOperation() designed to be used
// from other language bindings.
static char OperationTypeNames[2][5];
static char FieldLocationNames[3][12];
static char AttributeNames[vtkDataSetAttributes::NUM_ATTRIBUTES][10];
void PrintAllOperations(ostream& os, vtkIndent indent);
void PrintOperation(Operation* op, ostream& os, vtkIndent indent);
private:
vtkRearrangeFields(const vtkRearrangeFields&) = delete;
void operator=(const vtkRearrangeFields&) = delete;
};
#endif