Cloned library of VTK-5.0.0 with extra build files for internal package management.
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.

403 lines
16 KiB

2 years ago
/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkDataArray.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 vtkDataArray - abstract superclass for arrays
// .SECTION Description
// vtkDataArray is an abstract superclass for data array objects. This class
// defines an API that all array objects must support. Note that the concrete
// subclasses of this class represent data in native form (char, int, etc.) and
// often have specialized more efficient methods for operating on this data
// (for example, getting pointers to data or getting/inserting data in native
// form).
//
// The logical structure of this class is an array of tuples, where each
// tuple is made up of n-components (also called a component group), and n is
// the number of component values in a tuple(n >= 1). Another view of this
// class is a mxn matrix, where m is the number of tuples, and n is the
// number of components in a tuple. Thus vtkDataArray can be used to
// represent scalars (1-4 components), 3D vectors (3 components), texture
// coordinates (1-3 components), tensors, (9 components) and so on.
//
// Each data array is required to have a character-string name. The
// naming of the array occurs automatically when it is instantiated, but
// you are free to name arrays using the SetName() method.
// (The array name is used for data manipulation.)
//
// .SECTION See Also
// vtkBitArray vtkCharArray vtkUnsignedCharArray vtkShortArray
// vtkUnsignedShortArray vtkIntArray vtkUnsignedIntArray vtkLongArray
// vtkUnsignedLongArray vtkDoubleArray vtkDoubleArray
#ifndef __vtkDataArray_h
#define __vtkDataArray_h
#include "vtkObject.h"
class vtkDoubleArray;
class vtkLookupTable;
class vtkIdList;
#define VTK_MAXIMUM_NUMBER_OF_CACHED_COMPONENT_RANGES 11
class VTK_COMMON_EXPORT vtkDataArray : public vtkObject
{
public:
vtkTypeRevisionMacro(vtkDataArray,vtkObject);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Allocate memory for this array. Delete old storage only if necessary.
// Note that ext is no longer used.
virtual int Allocate(vtkIdType sz, vtkIdType ext=1000) = 0;
// Description:
// Release storage and reset array to initial state.
virtual void Initialize() = 0;
// Description:
// Return the underlying data type. An integer indicating data type is
// returned as specified in vtkSetGet.h.
virtual int GetDataType() = 0;
// Description:
// Return the size of the underlying data type. For a bit, 0 is returned.
virtual int GetDataTypeSize() = 0;
static unsigned long GetDataTypeSize(int type);
// Description:
// Set/Get the dimension (n) of the components. Must be >= 1. Make sure that
// this is set before allocation.
vtkSetClampMacro(NumberOfComponents,int,1,VTK_LARGE_INTEGER);
int GetNumberOfComponents() {return this->NumberOfComponents;};
// Description:
// Set the number of tuples (a component group) in the array. Note that
// this may allocate space depending on the number of components.
virtual void SetNumberOfTuples(vtkIdType number) = 0;
// Description:
// Get the number of tuples (a component group) in the array.
vtkIdType GetNumberOfTuples()
{return (this->MaxId + 1)/this->NumberOfComponents;}
// Description:
// Get the data tuple at ith location. Return it as a pointer to an array.
// Note: this method is not thread-safe, and the pointer is only valid
// as long as another method invocation to a vtk object is not performed.
virtual double *GetTuple(vtkIdType i) = 0;
// Description:
// Get the data tuple at ith location by filling in a user-provided array,
// Make sure that your array is large enough to hold the NumberOfComponents
// amount of data being returned.
virtual void GetTuple(vtkIdType i, double * tuple) = 0;
// Description:
// These methods are included as convenience for the wrappers.
// GetTuple() and SetTuple() which return/take arrays can not be
// used from wrapped languages. These methods can be used instead.
double GetTuple1(vtkIdType i);
double* GetTuple2(vtkIdType i);
double* GetTuple3(vtkIdType i);
double* GetTuple4(vtkIdType i);
double* GetTuple9(vtkIdType i);
// Description:
// Given a list of point ids, return an array of tuples.
// You must insure that the output array has been previously
// allocated with enough space to hold the data.
void GetTuples(vtkIdList *ptIds, vtkDataArray *output);
// Description:
// Get the tuples for the range of points ids specified
// (i.e., p1->p2 inclusive). You must insure that the output array has
// been previously allocated with enough space to hold the data.
void GetTuples(vtkIdType p1, vtkIdType p2, vtkDataArray *output);
// Description:
// Set the data tuple at ith location. Note that range checking or
// memory allocation is not performed; use this method in conjunction
// with SetNumberOfTuples() to allocate space.
virtual void SetTuple(vtkIdType i, const float * tuple) = 0;
virtual void SetTuple(vtkIdType i, const double * tuple) = 0;
// Description:
// These methods are included as convenience for the wrappers.
// GetTuple() and SetTuple() which return/take arrays can not be
// used from wrapped languages. These methods can be used instead.
void SetTuple1(vtkIdType i, double value);
void SetTuple2(vtkIdType i, double val0, double val1);
void SetTuple3(vtkIdType i, double val0, double val1, double val2);
void SetTuple4(vtkIdType i, double val0, double val1, double val2,
double val3);
void SetTuple9(vtkIdType i, double val0, double val1, double val2,
double val3, double val4, double val5, double val6,
double val7, double val8);
// Description:
// Insert the data tuple at ith location. Note that memory allocation
// is performed as necessary to hold the data.
virtual void InsertTuple(vtkIdType i, const float * tuple) = 0;
virtual void InsertTuple(vtkIdType i, const double * tuple) = 0;
// Description:
// These methods are included as convenience for the wrappers.
// InsertTuple() which takes arrays can not be
// used from wrapped languages. These methods can be used instead.
void InsertTuple1(vtkIdType i, double value);
void InsertTuple2(vtkIdType i, double val0, double val1);
void InsertTuple3(vtkIdType i, double val0, double val1, double val2);
void InsertTuple4(vtkIdType i, double val0, double val1, double val2,
double val3);
void InsertTuple9(vtkIdType i, double val0, double val1, double val2,
double val3, double val4, double val5, double val6,
double val7, double val8);
// Description:
// Insert the data tuple at the end of the array and return the location at
// which the data was inserted. Memory is allocated as necessary to hold
// the data.
virtual vtkIdType InsertNextTuple(const float * tuple) = 0;
virtual vtkIdType InsertNextTuple(const double * tuple) = 0;
// Description:
// These methods are included as convenience for the wrappers.
// InsertTuple() which takes arrays can not be
// used from wrapped languages. These methods can be used instead.
void InsertNextTuple1(double value);
void InsertNextTuple2(double val0, double val1);
void InsertNextTuple3(double val0, double val1, double val2);
void InsertNextTuple4(double val0, double val1, double val2,
double val3);
void InsertNextTuple9(double val0, double val1, double val2,
double val3, double val4, double val5, double val6,
double val7, double val8);
// Description:
// Return the data component at the ith tuple and jth component location.
// Note that i is less than NumberOfTuples and j is less than
// NumberOfComponents.
virtual double GetComponent(vtkIdType i, int j);
// Description:
// Set the data component at the ith tuple and jth component location.
// Note that i is less than NumberOfTuples and j is less than
// NumberOfComponents. Make sure enough memory has been allocated
// (use SetNumberOfTuples() and SetNumberOfComponents()).
virtual void SetComponent(vtkIdType i, int j, double c);
// Description:
// Insert the data component at ith tuple and jth component location.
// Note that memory allocation is performed as necessary to hold the data.
virtual void InsertComponent(vtkIdType i, int j, double c);
// Description:
// Get the data as a double array in the range (tupleMin,tupleMax) and
// (compMin, compMax). The resulting double array consists of all data in
// the tuple range specified and only the component range specified. This
// process typically requires casting the data from native form into
// doubleing point values. This method is provided as a convenience for data
// exchange, and is not very fast.
virtual void GetData(vtkIdType tupleMin, vtkIdType tupleMax, int compMin,
int compMax, vtkDoubleArray* data);
// Description:
// Deep copy of data. Copies data from different data arrays even if
// they are different types (using doubleing-point exchange).
virtual void DeepCopy(vtkDataArray *da);
// Description:
// Fill a component of a data array with a specified value. This method
// sets the specified component to specified value for all tuples in the
// data array. This methods can be used to initialize or reinitialize a
// single component of a multi-component array.
virtual void FillComponent(int j, double c);
// Description:
// Copy a component from one data array into a component on this data array.
// This method copies the specified component ("fromComponent") from the
// specified data array ("from") to the specified component ("j") over all
// the tuples in this data array. This method can be used to extract
// a component (column) from one data array and paste that data into
// a component on this data array.
virtual void CopyComponent(int j, vtkDataArray *from,
int fromComponent);
// Description:
// Get the address of a particular data index. Make sure data is allocated
// for the number of items requested. Set MaxId according to the number of
// data values requested.
virtual void* WriteVoidPointer(vtkIdType id, vtkIdType number) = 0;
// Description:
// Return a void pointer. For image pipeline interface and other
// special pointer manipulation.
virtual void *GetVoidPointer(vtkIdType id) = 0;
// Description:
// Free any unnecessary memory.
virtual void Squeeze() = 0;
// Description:
// Resize the array while conserving the data. Returns 1 if
// resizing succeeded and 0 otherwise.
virtual int Resize(vtkIdType numTuples) = 0;
// Description:
// Reset to an empty state, without freeing any memory.
void Reset()
{this->MaxId = -1;}
// Description:
// Return the size of the data.
vtkIdType GetSize()
{return this->Size;}
// Description:
// What is the maximum id currently in the array.
vtkIdType GetMaxId()
{return this->MaxId;}
// Description:
// This method lets the user specify data to be held by the array. The
// array argument is a pointer to the data. size is the size of
// the array supplied by the user. Set save to 1 to keep the class
// from deleting the array when it cleans up or reallocates memory.
// The class uses the actual array provided; it does not copy the data
// from the supplied array.
virtual void SetVoidArray(void *vtkNotUsed(array),
vtkIdType vtkNotUsed(size),
int vtkNotUsed(save)) {};
// Description:
// This method copies the array data to the void pointer specified
// by the user. It is up to the user to allocate enough memory for
// the void pointer.
virtual void ExportToVoidPointer(void *vtkNotUsed(out_ptr)) {}
// Description:
// Return the memory in kilobytes consumed by this data array. Used to
// support streaming and reading/writing data. The value returned is
// guaranteed to be greater than or equal to the memory required to
// actually represent the data represented by this object. The
// information returned is valid only after the pipeline has
// been updated.
unsigned long GetActualMemorySize();
// Description:
// Create default lookup table. Generally used to create one when none
// is available.
void CreateDefaultLookupTable();
// Description:
// Set/get the lookup table associated with this scalar data, if any.
void SetLookupTable(vtkLookupTable *lut);
vtkGetObjectMacro(LookupTable,vtkLookupTable);
// Description:
// Set/get array's name
vtkSetStringMacro(Name);
vtkGetStringMacro(Name);
// Description:
// Return the range of the array values for the given component.
// Range is copied into the array provided.
// If comp is equal to -1, it returns the range of the magnitude
// (if the number of components is equal to 1 it still returns the range of
// component 0).
void GetRange(double range[2], int comp)
{
this->ComputeRange(comp);
memcpy(range, this->Range, 2*sizeof(double));
}
double* GetRange(int comp)
{
this->ComputeRange(comp);
return this->Range;
}
virtual void ComputeRange(int comp);
// Description:
// Return the range of the array values for the 0th component.
// Range is copied into the array provided.
double* GetRange()
{
this->ComputeRange(0);
return this->Range;
}
void GetRange(double range[2])
{
this->GetRange(range,0);
}
// Description:
// These methods return the Min and Max possible range of the native
// data type. For example if a vtkScalars consists of unsigned char
// data these will return (0,255).
void GetDataTypeRange(double range[2]);
double GetDataTypeMin();
double GetDataTypeMax();
static void GetDataTypeRange(int type, double range[2]);
static double GetDataTypeMin(int type);
static double GetDataTypeMax(int type);
// Description:
// Return the maximum norm for the tuples.
// Note that the max. is computed everytime GetMaxNorm is called.
virtual double GetMaxNorm();
// Description:
// Creates an array for dataType where dataType is one of
// VTK_BIT, VTK_CHAR, VTK_SIGNED_CHAR, VTK_UNSIGNED_CHAR, VTK_SHORT,
// VTK_UNSIGNED_SHORT, VTK_INT, VTK_UNSIGNED_INT, VTK_LONG,
// VTK_UNSIGNED_LONG, VTK_DOUBLE, VTK_DOUBLE, VTK_ID_TYPE.
// Note that the data array returned has be deleted by the
// user.
static vtkDataArray* CreateDataArray(int dataType);
protected:
// Construct object with default tuple dimension (number of components) of 1.
vtkDataArray(vtkIdType numComp=1);
~vtkDataArray();
vtkLookupTable *LookupTable;
vtkIdType Size; // allocated size of data
vtkIdType MaxId; // maximum index inserted thus far
int NumberOfComponents; // the number of components per tuple
char* Name;
double Range[2];
// We can have arbitrary number of components, but 11 should
// take care of 99.99% of the cases. Components greater
// than 11 do not get cached. The comment below assume max of 4 comps.
// 5 components since you can compute the range of components
// less than 0 to get a magnitude range. ComponentRange[4] is
// this magnitude range
vtkTimeStamp
ComponentRangeComputeTime[VTK_MAXIMUM_NUMBER_OF_CACHED_COMPONENT_RANGES];
double ComponentRange[VTK_MAXIMUM_NUMBER_OF_CACHED_COMPONENT_RANGES][2];
private:
double* GetTupleN(vtkIdType i, int n);
private:
vtkDataArray(const vtkDataArray&); // Not implemented.
void operator=(const vtkDataArray&); // Not implemented.
};
#endif