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.
 
 
 
 
 
 

379 lines
12 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkCellArray.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 vtkCellArray - object to represent cell connectivity
// .SECTION Description
// vtkCellArray is a supporting object that explicitly represents cell
// connectivity. The cell array structure is a raw integer list
// of the form: (n,id1,id2,...,idn, n,id1,id2,...,idn, ...)
// where n is the number of points in the cell, and id is a zero-offset index
// into an associated point list.
//
// Advantages of this data structure are its compactness, simplicity, and
// easy interface to external data. However, it is totally inadequate for
// random access. This functionality (when necessary) is accomplished by
// using the vtkCellTypes and vtkCellLinks objects to extend the definition of
// the data structure.
//
// .SECTION See Also
// vtkCellTypes vtkCellLinks
#ifndef __vtkCellArray_h
#define __vtkCellArray_h
#include "vtkObject.h"
#include "vtkIdTypeArray.h" // Needed for inline methods
#include "vtkCell.h" // Needed for inline methods
class VTK_FILTERING_EXPORT vtkCellArray : public vtkObject
{
public:
vtkTypeRevisionMacro(vtkCellArray,vtkObject);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Instantiate cell array (connectivity list).
static vtkCellArray *New();
// Description:
// Allocate memory and set the size to extend by.
int Allocate(const vtkIdType sz, const int ext=1000)
{return this->Ia->Allocate(sz,ext);}
// Description:
// Free any memory and reset to an empty state.
void Initialize()
{this->Ia->Initialize();}
// Description:
// Get the number of cells in the array.
vtkGetMacro(NumberOfCells, vtkIdType);
// Description:
// Set the number of cells in the array.
// DO NOT do any kind of allocation, advanced use only.
vtkSetMacro(NumberOfCells, vtkIdType);
// Description:
// Utility routines help manage memory of cell array. EstimateSize()
// returns a value used to initialize and allocate memory for array based
// on number of cells and maximum number of points making up cell. If
// every cell is the same size (in terms of number of points), then the
// memory estimate is guaranteed exact. (If not exact, use Squeeze() to
// reclaim any extra memory.)
vtkIdType EstimateSize(vtkIdType numCells, int maxPtsPerCell)
{return numCells*(1+maxPtsPerCell);}
// Description:
// A cell traversal methods that is more efficient than vtkDataSet traversal
// methods. InitTraversal() initializes the traversal of the list of cells.
void InitTraversal() {this->TraversalLocation=0;};
// Description:
// A cell traversal methods that is more efficient than vtkDataSet traversal
// methods. GetNextCell() gets the next cell in the list. If end of list
// is encountered, 0 is returned.
int GetNextCell(vtkIdType& npts, vtkIdType* &pts);
// Description:
// Get the size of the allocated connectivity array.
vtkIdType GetSize()
{return this->Ia->GetSize();}
// Description:
// Get the total number of entries (i.e., data values) in the connectivity
// array. This may be much less than the allocated size (i.e., return value
// from GetSize().)
vtkIdType GetNumberOfConnectivityEntries()
{return this->Ia->GetMaxId()+1;}
// Description:
// Internal method used to retrieve a cell given an offset into
// the internal array.
void GetCell(vtkIdType loc, vtkIdType &npts, vtkIdType* &pts);
// Description:
// Insert a cell object. Return the cell id of the cell.
vtkIdType InsertNextCell(vtkCell *cell);
// Description:
// Create a cell by specifying the number of points and an array of point
// id's. Return the cell id of the cell.
vtkIdType InsertNextCell(vtkIdType npts, const vtkIdType* pts);
// Description:
// Create a cell by specifying a list of point ids. Return the cell id of
// the cell.
vtkIdType InsertNextCell(vtkIdList *pts);
// Description:
// Create cells by specifying count, and then adding points one at a time
// using method InsertCellPoint(). If you don't know the count initially,
// use the method UpdateCellCount() to complete the cell. Return the cell
// id of the cell.
vtkIdType InsertNextCell(int npts);
// Description:
// Used in conjunction with InsertNextCell(int npts) to add another point
// to the list of cells.
void InsertCellPoint(vtkIdType id);
// Description:
// Used in conjunction with InsertNextCell(int npts) and InsertCellPoint() to
// update the number of points defining the cell.
void UpdateCellCount(int npts);
// Description:
// Computes the current insertion location within the internal array.
// Used in conjunction with GetCell(int loc,...).
vtkIdType GetInsertLocation(int npts)
{return (this->InsertLocation - npts - 1);};
// Description:
// Get/Set the current traversal location.
vtkIdType GetTraversalLocation()
{return this->TraversalLocation;}
void SetTraversalLocation(vtkIdType loc)
{this->TraversalLocation = loc;}
// Description:
// Computes the current traversal location within the internal array. Used
// in conjunction with GetCell(int loc,...).
vtkIdType GetTraversalLocation(vtkIdType npts)
{return(this->TraversalLocation-npts-1);}
// Description:
// Special method inverts ordering of current cell. Must be called
// carefully or the cell topology may be corrupted.
void ReverseCell(vtkIdType loc);
// Description:
// Replace the point ids of the cell with a different list of point ids.
void ReplaceCell(vtkIdType loc, int npts, const vtkIdType *pts);
// Description:
// Returns the size of the largest cell. The size is the number of points
// defining the cell.
int GetMaxCellSize();
// Description:
// Get pointer to array of cell data.
vtkIdType *GetPointer()
{return this->Ia->GetPointer(0);}
// Description:
// Get pointer to data array for purpose of direct writes of data. Size is the
// total storage consumed by the cell array. ncells is the number of cells
// represented in the array.
vtkIdType *WritePointer(const vtkIdType ncells, const vtkIdType size);
// Description:
// Define multiple cells by providing a connectivity list. The list is in
// the form (npts,p0,p1,...p(npts-1), repeated for each cell). Be careful
// using this method because it discards the old cells, and anything
// referring these cells becomes invalid (for example, if BuildCells() has
// been called see vtkPolyData). The traversal location is reset to the
// beginning of the list; the insertion location is set to the end of the
// list.
void SetCells(vtkIdType ncells, vtkIdTypeArray *cells);
// Description:
// Perform a deep copy (no reference counting) of the given cell array.
void DeepCopy(vtkCellArray *ca);
// Description:
// Return the underlying data as a data array.
vtkIdTypeArray* GetData()
{return this->Ia;}
// Description:
// Reuse list. Reset to initial condition.
void Reset();
// Description:
// Reclaim any extra memory.
void Squeeze()
{this->Ia->Squeeze();}
// Description:
// Return the memory in kilobytes consumed by this cell 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();
protected:
vtkCellArray();
~vtkCellArray();
vtkIdType NumberOfCells;
vtkIdType InsertLocation; //keep track of current insertion point
vtkIdType TraversalLocation; //keep track of traversal position
vtkIdTypeArray *Ia;
private:
vtkCellArray(const vtkCellArray&); // Not implemented.
void operator=(const vtkCellArray&); // Not implemented.
};
//----------------------------------------------------------------------------
inline vtkIdType vtkCellArray::InsertNextCell(vtkIdType npts,
const vtkIdType* pts)
{
vtkIdType i = this->Ia->GetMaxId() + 1;
vtkIdType *ptr = this->Ia->WritePointer(i, npts+1);
for ( *ptr++ = npts, i = 0; i < npts; i++)
{
*ptr++ = *pts++;
}
this->NumberOfCells++;
this->InsertLocation += npts + 1;
return this->NumberOfCells - 1;
}
//----------------------------------------------------------------------------
inline vtkIdType vtkCellArray::InsertNextCell(vtkIdList *pts)
{
vtkIdType npts = pts->GetNumberOfIds();
vtkIdType i = this->Ia->GetMaxId() + 1;
vtkIdType *ptr = this->Ia->WritePointer(i,npts+1);
for ( *ptr++ = npts, i = 0; i < npts; i++)
{
*ptr++ = pts->GetId(i);
}
this->NumberOfCells++;
this->InsertLocation += npts + 1;
return this->NumberOfCells - 1;
}
//----------------------------------------------------------------------------
inline vtkIdType vtkCellArray::InsertNextCell(int npts)
{
this->InsertLocation = this->Ia->InsertNextValue(npts) + 1;
this->NumberOfCells++;
return this->NumberOfCells - 1;
}
//----------------------------------------------------------------------------
inline void vtkCellArray::InsertCellPoint(vtkIdType id)
{
this->Ia->InsertValue(this->InsertLocation++, id);
}
//----------------------------------------------------------------------------
inline void vtkCellArray::UpdateCellCount(int npts)
{
this->Ia->SetValue(this->InsertLocation-npts-1, npts);
}
//----------------------------------------------------------------------------
inline vtkIdType vtkCellArray::InsertNextCell(vtkCell *cell)
{
int npts = cell->GetNumberOfPoints();
vtkIdType i = this->Ia->GetMaxId() + 1;
vtkIdType *ptr = this->Ia->WritePointer(i,npts+1);
for ( *ptr++ = npts, i = 0; i < npts; i++)
{
*ptr++ = cell->PointIds->GetId(i);
}
this->NumberOfCells++;
this->InsertLocation += npts + 1;
return this->NumberOfCells - 1;
}
//----------------------------------------------------------------------------
inline void vtkCellArray::Reset()
{
this->NumberOfCells = 0;
this->InsertLocation = 0;
this->TraversalLocation = 0;
this->Ia->Reset();
}
//----------------------------------------------------------------------------
inline int vtkCellArray::GetNextCell(vtkIdType& npts, vtkIdType* &pts)
{
if ( this->Ia->GetMaxId() >= 0 &&
this->TraversalLocation <= this->Ia->GetMaxId() )
{
npts = this->Ia->GetValue(this->TraversalLocation++);
pts = this->Ia->GetPointer(this->TraversalLocation);
this->TraversalLocation += npts;
return 1;
}
else
{
return 0;
}
}
//----------------------------------------------------------------------------
inline void vtkCellArray::GetCell(vtkIdType loc, vtkIdType &npts,
vtkIdType* &pts)
{
npts = this->Ia->GetValue(loc++);
pts = this->Ia->GetPointer(loc);
}
//----------------------------------------------------------------------------
inline void vtkCellArray::ReverseCell(vtkIdType loc)
{
int i;
vtkIdType tmp;
vtkIdType npts=this->Ia->GetValue(loc);
vtkIdType *pts=this->Ia->GetPointer(loc+1);
for (i=0; i < (npts/2); i++)
{
tmp = pts[i];
pts[i] = pts[npts-i-1];
pts[npts-i-1] = tmp;
}
}
//----------------------------------------------------------------------------
inline void vtkCellArray::ReplaceCell(vtkIdType loc, int npts,
const vtkIdType *pts)
{
vtkIdType *oldPts=this->Ia->GetPointer(loc+1);
for (int i=0; i < npts; i++)
{
oldPts[i] = pts[i];
}
}
//----------------------------------------------------------------------------
inline vtkIdType *vtkCellArray::WritePointer(const vtkIdType ncells,
const vtkIdType size)
{
this->NumberOfCells = ncells;
this->InsertLocation = 0;
this->TraversalLocation = 0;
return this->Ia->WritePointer(0,size);
}
#endif