VTK
dox/Common/DataModel/vtkCellIterator.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkCellIterator.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00015 
00040        }
00041 
00042      vtkIdList *pointIds = it->GetPointIds();
00043      /* Do screening on the point ids, maybe figure out scalar range and skip
00044         cells that do not lie in a certain range? */
00045 
00046      vtkPoints *points = it->GetPoints();
00047      /* Do work using the cell points, or ... */
00048 
00049      vtkGenericCell *cell = ...;
00050      it->GetCell(cell);
00051      /* ... do work with a vtkCell. */
00052      }
00053    it->Delete();
00054  }
00055  ~~~
00056 
00057  The example above pulls in bits of information as needed to filter out cells
00058  that aren't relevent. The least expensive lookups are performed first
00059  (cell type, then point ids, then points/full cell) to prevent wasted cycles
00060  fetching unnecessary data. Also note that at the end of the loop, the
00061  iterator must be deleted as these iterators are vtkObject subclasses.
00062 
00063     @par      Tests:
00064               @ref c2_vtk_t_vtkCellIterator "vtkCellIterator (Tests)"
00065 */
00066 
00067 #ifndef __vtkCellIterator_h
00068 #define __vtkCellIterator_h
00069 
00070 #include "vtkCommonDataModelModule.h" // For export macro
00071 #include "vtkObject.h"
00072 #include "vtkNew.h" // For vtkNew
00073 #include "vtkIdList.h" // For inline methods
00074 
00075 class vtkGenericCell;
00076 class vtkPoints;
00077 
00078 class VTKCOMMONDATAMODEL_EXPORT vtkCellIterator : public vtkObject
00079 {
00080 public:
00081   virtual void PrintSelf(ostream &os, vtkIndent indent);
00082   vtkAbstractTypeMacro(vtkCellIterator, vtkObject)
00083 
00085   void InitTraversal();
00086 
00088   void GoToNextCell();
00089 
00091   virtual bool IsDoneWithTraversal() = 0;
00092 
00096   int GetCellType();
00097 
00099   virtual vtkIdType GetCellId() = 0;
00100 
00103   vtkIdList *GetPointIds();
00104 
00108   vtkPoints *GetPoints();
00109 
00111   vtkIdList *GetFaces();
00112 
00116   void GetCell(vtkGenericCell *cell);
00117 
00120   vtkIdType GetNumberOfPoints();
00121 
00124   vtkIdType GetNumberOfFaces();
00125 
00126 protected:
00127   vtkCellIterator();
00128   ~vtkCellIterator();
00129 
00131   virtual void ResetToFirstCell() = 0;
00132 
00134   virtual void IncrementToNextCell() = 0;
00135 
00137   virtual void FetchCellType() = 0;
00138 
00141   virtual void FetchPointIds() = 0;
00142 
00145   virtual void FetchPoints() = 0;
00146 
00151   virtual void FetchFaces() { }
00152 
00153   int CellType;
00154   vtkPoints *Points;
00155   vtkIdList *PointIds;
00156   vtkIdList *Faces;
00157 
00158 private:
00159   vtkCellIterator(const vtkCellIterator &); // Not implemented.
00160   void operator=(const vtkCellIterator &);   // Not implemented.
00161 
00162   enum
00163     {
00164     UninitializedFlag = 0x0,
00165     CellTypeFlag = 0x1,
00166     PointIdsFlag = 0x2,
00167     PointsFlag = 0x4,
00168     FacesFlag = 0x8
00169     };
00170 
00171   void ResetCache()
00172   {
00173     this->CacheFlags = UninitializedFlag;
00174     this->ResetContainers();
00175   }
00176 
00177   void SetCache(unsigned char flags)
00178   {
00179     this->CacheFlags |= flags;
00180   }
00181 
00182   bool CheckCache(unsigned char flags)
00183   {
00184     return (this->CacheFlags & flags) == flags;
00185   }
00186 
00187   void ResetContainers();
00188 
00189   vtkNew<vtkPoints> PointsContainer;
00190   vtkNew<vtkIdList> PointIdsContainer;
00191   vtkNew<vtkIdList> FacesContainer;
00192   unsigned char CacheFlags;
00193 };
00194 
00195 //------------------------------------------------------------------------------
00196 inline void vtkCellIterator::InitTraversal()
00197 {
00198   this->ResetToFirstCell();
00199   this->ResetCache();
00200 }
00201 
00202 //------------------------------------------------------------------------------
00203 inline void vtkCellIterator::GoToNextCell()
00204 {
00205   this->IncrementToNextCell();
00206   this->ResetCache();
00207 }
00208 
00209 //------------------------------------------------------------------------------
00210 inline int vtkCellIterator::GetCellType()
00211 {
00212   if (!this->CheckCache(CellTypeFlag))
00213     {
00214     this->FetchCellType();
00215     this->SetCache(CellTypeFlag);
00216     }
00217   return this->CellType;
00218 }
00219 
00220 //------------------------------------------------------------------------------
00221 inline vtkIdList* vtkCellIterator::GetPointIds()
00222 {
00223   if (!this->CheckCache(PointIdsFlag))
00224     {
00225     this->FetchPointIds();
00226     this->SetCache(PointIdsFlag);
00227     }
00228   return this->PointIds;
00229 }
00230 
00231 //------------------------------------------------------------------------------
00232 inline vtkPoints* vtkCellIterator::GetPoints()
00233 {
00234   if (!this->CheckCache(PointsFlag))
00235     {
00236     this->FetchPoints();
00237     this->SetCache(PointsFlag);
00238     }
00239   return this->Points;
00240 }
00241 
00242 //------------------------------------------------------------------------------
00243 inline vtkIdList *vtkCellIterator::GetFaces()
00244 {
00245   if (!this->CheckCache(FacesFlag))
00246     {
00247     this->FetchFaces();
00248     this->SetCache(FacesFlag);
00249     }
00250   return this->Faces;
00251 }
00252 
00253 //------------------------------------------------------------------------------
00254 inline vtkIdType vtkCellIterator::GetNumberOfPoints()
00255 {
00256   if (!this->CheckCache(PointIdsFlag))
00257     {
00258     this->FetchPointIds();
00259     this->SetCache(PointIdsFlag);
00260     }
00261   return this->PointIds->GetNumberOfIds();
00262 }
00263 
00264 //------------------------------------------------------------------------------
00265 inline vtkIdType vtkCellIterator::GetNumberOfFaces()
00266 {
00267   if (!this->CheckCache(FacesFlag))
00268     {
00269     this->FetchFaces();
00270     this->SetCache(FacesFlag);
00271     }
00272   return this->Faces->GetNumberOfIds() != 0 ? this->Faces->GetId(0) : 0;
00273 }
00274 
00275 #endif //__vtkCellIterator_h