Common/vtkCellArray.h
Go to the documentation of this file.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_COMMON_EXPORT vtkCellArray : public vtkObject
00049 {
00050 public:
00051 vtkTypeRevisionMacro(vtkCellArray,vtkObject);
00052
00054 static vtkCellArray *New();
00055
00057
00058 int Allocate(const vtkIdType sz, const int ext=1000)
00059 {return this->Ia->Allocate(sz,ext);}
00061
00063
00064 void Initialize()
00065 {this->Ia->Initialize();}
00067
00069
00070 vtkIdType GetNumberOfCells()
00071 {return this->NumberOfCells;}
00073
00075
00081 vtkIdType EstimateSize(vtkIdType numCells, int maxPtsPerCell)
00082 {return numCells*(1+maxPtsPerCell);}
00084
00088 void InitTraversal() {this->TraversalLocation=0;};
00089
00093 int GetNextCell(vtkIdType& npts, vtkIdType* &pts);
00094
00096
00097 vtkIdType GetSize()
00098 {return this->Ia->GetSize();}
00100
00102
00105 vtkIdType GetNumberOfConnectivityEntries()
00106 {return this->Ia->GetMaxId()+1;}
00108
00111 void GetCell(vtkIdType loc, vtkIdType &npts, vtkIdType* &pts);
00112
00114 vtkIdType InsertNextCell(vtkCell *cell);
00115
00118 vtkIdType InsertNextCell(vtkIdType npts, vtkIdType* pts);
00119
00122 vtkIdType InsertNextCell(vtkIdList *pts);
00123
00128 vtkIdType InsertNextCell(int npts);
00129
00132 void InsertCellPoint(vtkIdType id);
00133
00136 void UpdateCellCount(int npts);
00137
00139
00141 vtkIdType GetInsertLocation(int npts)
00142 {return (this->InsertLocation - npts - 1);};
00144
00146
00147 vtkIdType GetTraversalLocation()
00148 {return this->TraversalLocation;}
00149 void SetTraversalLocation(vtkIdType loc)
00150 {this->TraversalLocation = loc;}
00152
00154
00156 vtkIdType GetTraversalLocation(vtkIdType npts)
00157 {return(this->TraversalLocation-npts-1);}
00159
00162 void ReverseCell(vtkIdType loc);
00163
00165 void ReplaceCell(vtkIdType loc, int npts, vtkIdType *pts);
00166
00169 int GetMaxCellSize();
00170
00172
00173 vtkIdType *GetPointer()
00174 {return this->Ia->GetPointer(0);}
00176
00180 vtkIdType *WritePointer(const vtkIdType ncells, const vtkIdType size);
00181
00189 void SetCells(vtkIdType ncells, vtkIdTypeArray *cells);
00190
00192 void DeepCopy(vtkCellArray *ca);
00193
00195
00196 vtkIdTypeArray* GetData()
00197 {return this->Ia;}
00199
00201 void Reset();
00202
00204
00205 void Squeeze()
00206 {this->Ia->Squeeze();}
00208
00215 unsigned long GetActualMemorySize();
00216
00217 protected:
00218 vtkCellArray();
00219 ~vtkCellArray();
00220
00221 vtkIdType NumberOfCells;
00222 vtkIdType InsertLocation;
00223 vtkIdType TraversalLocation;
00224 vtkIdTypeArray *Ia;
00225 private:
00226 vtkCellArray(const vtkCellArray&);
00227 void operator=(const vtkCellArray&);
00228 };
00229
00230
00231 inline vtkIdType vtkCellArray::InsertNextCell(vtkIdType npts, vtkIdType* pts)
00232 {
00233 vtkIdType i = this->Ia->GetMaxId() + 1;
00234 vtkIdType *ptr = this->Ia->WritePointer(i, npts+1);
00235
00236 for ( *ptr++ = npts, i = 0; i < npts; i++)
00237 {
00238 *ptr++ = *pts++;
00239 }
00240
00241 this->NumberOfCells++;
00242 this->InsertLocation += npts + 1;
00243
00244 return this->NumberOfCells - 1;
00245 }
00246
00247 inline vtkIdType vtkCellArray::InsertNextCell(vtkIdList *pts)
00248 {
00249 vtkIdType npts = pts->GetNumberOfIds();
00250 vtkIdType i = this->Ia->GetMaxId() + 1;
00251 vtkIdType *ptr = this->Ia->WritePointer(i,npts+1);
00252
00253 for ( *ptr++ = npts, i = 0; i < npts; i++)
00254 {
00255 *ptr++ = pts->GetId(i);
00256 }
00257
00258 this->NumberOfCells++;
00259 this->InsertLocation += npts + 1;
00260
00261 return this->NumberOfCells - 1;
00262 }
00263
00264 inline vtkIdType vtkCellArray::InsertNextCell(int npts)
00265 {
00266 this->InsertLocation = this->Ia->InsertNextValue(npts) + 1;
00267 this->NumberOfCells++;
00268
00269 return this->NumberOfCells - 1;
00270 }
00271
00272 inline void vtkCellArray::InsertCellPoint(vtkIdType id)
00273 {
00274 this->Ia->InsertValue(this->InsertLocation++, id);
00275 }
00276
00277 inline void vtkCellArray::UpdateCellCount(int npts)
00278 {
00279 this->Ia->SetValue(this->InsertLocation-npts-1, npts);
00280 }
00281
00282 inline vtkIdType vtkCellArray::InsertNextCell(vtkCell *cell)
00283 {
00284 int npts = cell->GetNumberOfPoints();
00285 vtkIdType i = this->Ia->GetMaxId() + 1;
00286 vtkIdType *ptr = this->Ia->WritePointer(i,npts+1);
00287
00288 for ( *ptr++ = npts, i = 0; i < npts; i++)
00289 {
00290 *ptr++ = cell->PointIds->GetId(i);
00291 }
00292
00293 this->NumberOfCells++;
00294 this->InsertLocation += npts + 1;
00295
00296 return this->NumberOfCells - 1;
00297 }
00298
00299
00300 inline void vtkCellArray::Reset()
00301 {
00302 this->NumberOfCells = 0;
00303 this->InsertLocation = 0;
00304 this->TraversalLocation = 0;
00305 this->Ia->Reset();
00306 }
00307
00308
00309 inline int vtkCellArray::GetNextCell(vtkIdType& npts, vtkIdType* &pts)
00310 {
00311 if ( this->Ia->GetMaxId() >= 0 &&
00312 this->TraversalLocation <= this->Ia->GetMaxId() )
00313 {
00314 npts = this->Ia->GetValue(this->TraversalLocation++);
00315 pts = this->Ia->GetPointer(this->TraversalLocation);
00316 this->TraversalLocation += npts;
00317 return 1;
00318 }
00319 else
00320 {
00321 return 0;
00322 }
00323 }
00324
00325 inline void vtkCellArray::GetCell(vtkIdType loc, vtkIdType &npts,
00326 vtkIdType* &pts)
00327 {
00328 npts=this->Ia->GetValue(loc++);
00329 pts=this->Ia->GetPointer(loc);
00330 }
00331
00332
00333 inline void vtkCellArray::ReverseCell(vtkIdType loc)
00334 {
00335 int i;
00336 vtkIdType tmp;
00337 vtkIdType npts=this->Ia->GetValue(loc);
00338 vtkIdType *pts=this->Ia->GetPointer(loc+1);
00339 for (i=0; i < (npts/2); i++)
00340 {
00341 tmp = pts[i];
00342 pts[i] = pts[npts-i-1];
00343 pts[npts-i-1] = tmp;
00344 }
00345 }
00346
00347 inline void vtkCellArray::ReplaceCell(vtkIdType loc, int npts, vtkIdType *pts)
00348 {
00349 vtkIdType *oldPts=this->Ia->GetPointer(loc+1);
00350 for (int i=0; i < npts; i++)
00351 {
00352 oldPts[i] = pts[i];
00353 }
00354 }
00355
00356 inline vtkIdType *vtkCellArray::WritePointer(const vtkIdType ncells,
00357 const vtkIdType size)
00358 {
00359 this->NumberOfCells = ncells;
00360 this->InsertLocation = 0;
00361 this->TraversalLocation = 0;
00362 return this->Ia->WritePointer(0,size);
00363 }
00364
00365 #endif