00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00044
#ifndef __vtkCellArray_h
00045
#define __vtkCellArray_h
00046
00047
#include "vtkObject.h"
00048
00049
#include "vtkIdTypeArray.h"
00050
#include "vtkCell.h"
00051
00052 class VTK_COMMON_EXPORT vtkCellArray :
public vtkObject
00053 {
00054
public:
00055 vtkTypeRevisionMacro(vtkCellArray,
vtkObject);
00056
00058
static vtkCellArray *
New();
00059
00061
00062 int Allocate(
const vtkIdType sz,
const int ext=1000)
00063 {
return this->Ia->Allocate(sz,ext);}
00065
00067
00068 void Initialize()
00069 {this->Ia->Initialize();}
00071
00073
00074 vtkIdType GetNumberOfCells()
00075 {
return this->NumberOfCells;}
00077
00079
00085 vtkIdType EstimateSize(
vtkIdType numCells,
int maxPtsPerCell)
00086 {
return numCells*(1+maxPtsPerCell);}
00088
00092 void InitTraversal() {this->TraversalLocation=0;};
00093
00097
int GetNextCell(
vtkIdType& npts,
vtkIdType* &pts);
00098
00100
00101 vtkIdType GetSize()
00102 {
return this->Ia->GetSize();}
00104
00106
00109 vtkIdType GetNumberOfConnectivityEntries()
00110 {
return this->Ia->GetMaxId()+1;}
00112
00115
void GetCell(
vtkIdType loc,
vtkIdType &npts,
vtkIdType* &pts);
00116
00118
vtkIdType InsertNextCell(
vtkCell *cell);
00119
00122
vtkIdType InsertNextCell(
vtkIdType npts,
vtkIdType* pts);
00123
00126
vtkIdType InsertNextCell(
vtkIdList *pts);
00127
00132
vtkIdType InsertNextCell(
int npts);
00133
00136
void InsertCellPoint(
vtkIdType id);
00137
00140
void UpdateCellCount(
int npts);
00141
00143
00145 vtkIdType GetInsertLocation(
int npts)
00146 {
return (this->InsertLocation - npts - 1);};
00148
00150
00151 vtkIdType GetTraversalLocation()
00152 {
return this->TraversalLocation;}
00153 void SetTraversalLocation(
vtkIdType loc)
00154 {this->TraversalLocation = loc;}
00156
00158
00160 vtkIdType GetTraversalLocation(
vtkIdType npts)
00161 {
return(this->TraversalLocation-npts-1);}
00163
00166
void ReverseCell(
vtkIdType loc);
00167
00169
void ReplaceCell(
vtkIdType loc,
int npts,
vtkIdType *pts);
00170
00173
int GetMaxCellSize();
00174
00176
00177 vtkIdType *GetPointer()
00178 {
return this->Ia->GetPointer(0);}
00180
00184
vtkIdType *WritePointer(
const vtkIdType ncells,
const vtkIdType size);
00185
00193
void SetCells(
vtkIdType ncells,
vtkIdTypeArray *cells);
00194
00196
void DeepCopy(vtkCellArray *ca);
00197
00199
00200 vtkIdTypeArray* GetData()
00201 {
return this->Ia;}
00203
00205
void Reset();
00206
00208
00209 void Squeeze()
00210 {this->Ia->Squeeze();}
00212
00219
unsigned long GetActualMemorySize();
00220
00221
protected:
00222 vtkCellArray();
00223 ~vtkCellArray();
00224
00225 vtkIdType NumberOfCells;
00226 vtkIdType InsertLocation;
00227 vtkIdType TraversalLocation;
00228 vtkIdTypeArray *Ia;
00229
private:
00230 vtkCellArray(
const vtkCellArray&);
00231
void operator=(
const vtkCellArray&);
00232 };
00233
00234
00235 inline vtkIdType vtkCellArray::InsertNextCell(
vtkIdType npts,
vtkIdType* pts)
00236 {
00237
vtkIdType i = this->
Ia->
GetMaxId() + 1;
00238
vtkIdType *ptr = this->
Ia->
WritePointer(i, npts+1);
00239
00240
for ( *ptr++ = npts, i = 0; i < npts; i++)
00241 {
00242 *ptr++ = *pts++;
00243 }
00244
00245 this->
NumberOfCells++;
00246 this->
InsertLocation += npts + 1;
00247
00248
return this->
NumberOfCells - 1;
00249 }
00250
00251 inline vtkIdType vtkCellArray::InsertNextCell(
vtkIdList *pts)
00252 {
00253
vtkIdType npts = pts->
GetNumberOfIds();
00254
vtkIdType i = this->
Ia->
GetMaxId() + 1;
00255
vtkIdType *ptr = this->
Ia->
WritePointer(i,npts+1);
00256
00257
for ( *ptr++ = npts, i = 0; i < npts; i++)
00258 {
00259 *ptr++ = pts->
GetId(i);
00260 }
00261
00262 this->
NumberOfCells++;
00263 this->
InsertLocation += npts + 1;
00264
00265
return this->
NumberOfCells - 1;
00266 }
00267
00268 inline vtkIdType vtkCellArray::InsertNextCell(
int npts)
00269 {
00270 this->
InsertLocation = this->
Ia->
InsertNextValue(npts) + 1;
00271 this->
NumberOfCells++;
00272
00273
return this->
NumberOfCells - 1;
00274 }
00275
00276 inline void vtkCellArray::InsertCellPoint(
vtkIdType id)
00277 {
00278 this->
Ia->
InsertValue(this->InsertLocation++,
id);
00279 }
00280
00281 inline void vtkCellArray::UpdateCellCount(
int npts)
00282 {
00283 this->
Ia->
SetValue(this->InsertLocation-npts-1, npts);
00284 }
00285
00286 inline vtkIdType vtkCellArray::InsertNextCell(
vtkCell *cell)
00287 {
00288
int npts = cell->
GetNumberOfPoints();
00289
vtkIdType i = this->
Ia->
GetMaxId() + 1;
00290
vtkIdType *ptr = this->
Ia->
WritePointer(i,npts+1);
00291
00292
for ( *ptr++ = npts, i = 0; i < npts; i++)
00293 {
00294 *ptr++ = cell->
PointIds->
GetId(i);
00295 }
00296
00297 this->
NumberOfCells++;
00298 this->
InsertLocation += npts + 1;
00299
00300
return this->
NumberOfCells - 1;
00301 }
00302
00303
00304 inline void vtkCellArray::Reset()
00305 {
00306 this->
NumberOfCells = 0;
00307 this->
InsertLocation = 0;
00308 this->
TraversalLocation = 0;
00309 this->
Ia->
Reset();
00310 }
00311
00312
00313 inline int vtkCellArray::GetNextCell(
vtkIdType& npts,
vtkIdType* &pts)
00314 {
00315
if ( this->
Ia->
GetMaxId() >= 0 &&
00316 this->
TraversalLocation <= this->
Ia->
GetMaxId() )
00317 {
00318 npts = this->
Ia->
GetValue(this->TraversalLocation++);
00319 pts = this->
Ia->
GetPointer(this->TraversalLocation);
00320 this->
TraversalLocation += npts;
00321
return 1;
00322 }
00323
else
00324 {
00325
return 0;
00326 }
00327 }
00328
00329 inline void vtkCellArray::GetCell(
vtkIdType loc,
vtkIdType &npts,
00330
vtkIdType* &pts)
00331 {
00332 npts=this->
Ia->
GetValue(loc++);
00333 pts=this->
Ia->
GetPointer(loc);
00334 }
00335
00336
00337 inline void vtkCellArray::ReverseCell(
vtkIdType loc)
00338 {
00339
int i;
00340
vtkIdType tmp;
00341
vtkIdType npts=this->
Ia->
GetValue(loc);
00342
vtkIdType *pts=this->
Ia->
GetPointer(loc+1);
00343
for (i=0; i < (npts/2); i++)
00344 {
00345 tmp = pts[i];
00346 pts[i] = pts[npts-i-1];
00347 pts[npts-i-1] = tmp;
00348 }
00349 }
00350
00351 inline void vtkCellArray::ReplaceCell(
vtkIdType loc,
int npts,
vtkIdType *pts)
00352 {
00353
vtkIdType *oldPts=this->
Ia->
GetPointer(loc+1);
00354
for (
int i=0; i < npts; i++)
00355 {
00356 oldPts[i] = pts[i];
00357 }
00358 }
00359
00360 inline vtkIdType *
vtkCellArray::WritePointer(
const vtkIdType ncells,
00361
const vtkIdType size)
00362 {
00363 this->
NumberOfCells = ncells;
00364 this->
InsertLocation = 0;
00365 this->
TraversalLocation = 0;
00366
return this->
Ia->
WritePointer(0,size);
00367 }
00368
00369
#endif