00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00040 #ifndef __vtkCellArray_h
00041 #define __vtkCellArray_h
00042
00043 #include "vtkObject.h"
00044
00045 #include "vtkIdTypeArray.h"
00046 #include "vtkCell.h"
00047
00048 class VTK_FILTERING_EXPORT vtkCellArray : public vtkObject
00049 {
00050 public:
00051 vtkTypeMacro(vtkCellArray,vtkObject);
00052 void PrintSelf(ostream& os, vtkIndent indent);
00053
00055 static vtkCellArray *New();
00056
00058
00059 int Allocate(const vtkIdType sz, const int ext=1000)
00060 {return this->Ia->Allocate(sz,ext);}
00062
00064 void Initialize();
00065
00067
00068 vtkGetMacro(NumberOfCells, vtkIdType);
00070
00072
00074 vtkSetMacro(NumberOfCells, vtkIdType);
00076
00078
00084 vtkIdType EstimateSize(vtkIdType numCells, int maxPtsPerCell)
00085 {return numCells*(1+maxPtsPerCell);}
00087
00091 void InitTraversal() {this->TraversalLocation=0;};
00092
00096 int GetNextCell(vtkIdType& npts, vtkIdType* &pts);
00097
00099
00100 vtkIdType GetSize()
00101 {return this->Ia->GetSize();}
00103
00105
00108 vtkIdType GetNumberOfConnectivityEntries()
00109 {return this->Ia->GetMaxId()+1;}
00111
00114 void GetCell(vtkIdType loc, vtkIdType &npts, vtkIdType* &pts);
00115
00117 vtkIdType InsertNextCell(vtkCell *cell);
00118
00121 vtkIdType InsertNextCell(vtkIdType npts, const vtkIdType* pts);
00122
00125 vtkIdType InsertNextCell(vtkIdList *pts);
00126
00131 vtkIdType InsertNextCell(int npts);
00132
00135 void InsertCellPoint(vtkIdType id);
00136
00139 void UpdateCellCount(int npts);
00140
00142
00144 vtkIdType GetInsertLocation(int npts)
00145 {return (this->InsertLocation - npts - 1);};
00147
00149
00150 vtkIdType GetTraversalLocation()
00151 {return this->TraversalLocation;}
00152 void SetTraversalLocation(vtkIdType loc)
00153 {this->TraversalLocation = loc;}
00155
00157
00159 vtkIdType GetTraversalLocation(vtkIdType npts)
00160 {return(this->TraversalLocation-npts-1);}
00162
00165 void ReverseCell(vtkIdType loc);
00166
00168 void ReplaceCell(vtkIdType loc, int npts, const vtkIdType *pts);
00169
00172 int GetMaxCellSize();
00173
00175
00176 vtkIdType *GetPointer()
00177 {return this->Ia->GetPointer(0);}
00179
00183 vtkIdType *WritePointer(const vtkIdType ncells, const vtkIdType size);
00184
00192 void SetCells(vtkIdType ncells, vtkIdTypeArray *cells);
00193
00195 void DeepCopy(vtkCellArray *ca);
00196
00198
00199 vtkIdTypeArray* GetData()
00200 {return this->Ia;}
00202
00204 void Reset();
00205
00207
00208 void Squeeze()
00209 {this->Ia->Squeeze();}
00211
00218 unsigned long GetActualMemorySize();
00219
00220 protected:
00221 vtkCellArray();
00222 ~vtkCellArray();
00223
00224 vtkIdType NumberOfCells;
00225 vtkIdType InsertLocation;
00226 vtkIdType TraversalLocation;
00227 vtkIdTypeArray *Ia;
00228
00229 private:
00230 vtkCellArray(const vtkCellArray&);
00231 void operator=(const vtkCellArray&);
00232 };
00233
00234
00235
00236 inline vtkIdType vtkCellArray::InsertNextCell(vtkIdType npts,
00237 const vtkIdType* pts)
00238 {
00239 vtkIdType i = this->Ia->GetMaxId() + 1;
00240 vtkIdType *ptr = this->Ia->WritePointer(i, npts+1);
00241
00242 for ( *ptr++ = npts, i = 0; i < npts; i++)
00243 {
00244 *ptr++ = *pts++;
00245 }
00246
00247 this->NumberOfCells++;
00248 this->InsertLocation += npts + 1;
00249
00250 return this->NumberOfCells - 1;
00251 }
00252
00253
00254 inline vtkIdType vtkCellArray::InsertNextCell(vtkIdList *pts)
00255 {
00256 vtkIdType npts = pts->GetNumberOfIds();
00257 vtkIdType i = this->Ia->GetMaxId() + 1;
00258 vtkIdType *ptr = this->Ia->WritePointer(i,npts+1);
00259
00260 for ( *ptr++ = npts, i = 0; i < npts; i++)
00261 {
00262 *ptr++ = pts->GetId(i);
00263 }
00264
00265 this->NumberOfCells++;
00266 this->InsertLocation += npts + 1;
00267
00268 return this->NumberOfCells - 1;
00269 }
00270
00271
00272 inline vtkIdType vtkCellArray::InsertNextCell(int npts)
00273 {
00274 this->InsertLocation = this->Ia->InsertNextValue(npts) + 1;
00275 this->NumberOfCells++;
00276
00277 return this->NumberOfCells - 1;
00278 }
00279
00280
00281 inline void vtkCellArray::InsertCellPoint(vtkIdType id)
00282 {
00283 this->Ia->InsertValue(this->InsertLocation++, id);
00284 }
00285
00286
00287 inline void vtkCellArray::UpdateCellCount(int npts)
00288 {
00289 this->Ia->SetValue(this->InsertLocation-npts-1, npts);
00290 }
00291
00292
00293 inline vtkIdType vtkCellArray::InsertNextCell(vtkCell *cell)
00294 {
00295 vtkIdType npts = cell->GetNumberOfPoints();
00296 vtkIdType i = this->Ia->GetMaxId() + 1;
00297 vtkIdType *ptr = this->Ia->WritePointer(i,npts+1);
00298
00299 for ( *ptr++ = npts, i = 0; i < npts; i++)
00300 {
00301 *ptr++ = cell->PointIds->GetId(i);
00302 }
00303
00304 this->NumberOfCells++;
00305 this->InsertLocation += npts + 1;
00306
00307 return this->NumberOfCells - 1;
00308 }
00309
00310
00311 inline void vtkCellArray::Reset()
00312 {
00313 this->NumberOfCells = 0;
00314 this->InsertLocation = 0;
00315 this->TraversalLocation = 0;
00316 this->Ia->Reset();
00317 }
00318
00319
00320 inline int vtkCellArray::GetNextCell(vtkIdType& npts, vtkIdType* &pts)
00321 {
00322 if ( this->Ia->GetMaxId() >= 0 &&
00323 this->TraversalLocation <= this->Ia->GetMaxId() )
00324 {
00325 npts = this->Ia->GetValue(this->TraversalLocation++);
00326 pts = this->Ia->GetPointer(this->TraversalLocation);
00327 this->TraversalLocation += npts;
00328 return 1;
00329 }
00330 else
00331 {
00332 return 0;
00333 }
00334 }
00335
00336
00337 inline void vtkCellArray::GetCell(vtkIdType loc, vtkIdType &npts,
00338 vtkIdType* &pts)
00339 {
00340 npts = this->Ia->GetValue(loc++);
00341 pts = this->Ia->GetPointer(loc);
00342 }
00343
00344
00345 inline void vtkCellArray::ReverseCell(vtkIdType loc)
00346 {
00347 int i;
00348 vtkIdType tmp;
00349 vtkIdType npts=this->Ia->GetValue(loc);
00350 vtkIdType *pts=this->Ia->GetPointer(loc+1);
00351 for (i=0; i < (npts/2); i++)
00352 {
00353 tmp = pts[i];
00354 pts[i] = pts[npts-i-1];
00355 pts[npts-i-1] = tmp;
00356 }
00357 }
00358
00359
00360 inline void vtkCellArray::ReplaceCell(vtkIdType loc, int npts,
00361 const vtkIdType *pts)
00362 {
00363 vtkIdType *oldPts=this->Ia->GetPointer(loc+1);
00364 for (int i=0; i < npts; i++)
00365 {
00366 oldPts[i] = pts[i];
00367 }
00368 }
00369
00370
00371 inline vtkIdType *vtkCellArray::WritePointer(const vtkIdType ncells,
00372 const vtkIdType size)
00373 {
00374 this->NumberOfCells = ncells;
00375 this->InsertLocation = 0;
00376 this->TraversalLocation = 0;
00377 return this->Ia->WritePointer(0,size);
00378 }
00379
00380 #endif