Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

Common/vtkPolyData.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkPolyData.h,v $
00005   Language:  C++
00006 
00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even 
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00013      PURPOSE.  See the above copyright notice for more information.
00014 
00015 =========================================================================*/
00046 #ifndef __vtkPolyData_h
00047 #define __vtkPolyData_h
00048 
00049 #include "vtkPointSet.h"
00050 
00051 #include "vtkCellTypes.h" // Needed for inline methods
00052 #include "vtkCellLinks.h" // Needed for inline methods
00053 
00054 class vtkVertex;
00055 class vtkPolyVertex;
00056 class vtkLine;
00057 class vtkPolyLine;
00058 class vtkTriangle;
00059 class vtkQuad;
00060 class vtkPolygon;
00061 class vtkTriangleStrip;
00062 class vtkEmptyCell;
00063 
00064 class VTK_COMMON_EXPORT vtkPolyData : public vtkPointSet 
00065 {
00066 public:
00067   static vtkPolyData *New();
00068 
00069   vtkTypeRevisionMacro(vtkPolyData,vtkPointSet);
00070   void PrintSelf(ostream& os, vtkIndent indent);
00071 
00073   int GetDataObjectType() {return VTK_POLY_DATA;}
00074 
00077   void CopyStructure(vtkDataSet *ds);
00078 
00080 
00081   vtkIdType GetNumberOfCells();
00082   vtkCell *GetCell(vtkIdType cellId);
00083   void GetCell(vtkIdType cellId, vtkGenericCell *cell);
00084   int GetCellType(vtkIdType cellId);
00085   void GetCellBounds(vtkIdType cellId, float bounds[6]);
00086   void GetCellNeighbors(vtkIdType cellId, vtkIdList *ptIds,
00087                         vtkIdList *cellIds);
00089   
00091 
00095   void CopyCells(vtkPolyData *pd, vtkIdList *idList,
00096                  vtkPointLocator *locator = NULL);
00098   
00100   void GetCellPoints(vtkIdType cellId, vtkIdList *ptIds);
00101 
00104   void GetPointCells(vtkIdType ptId, vtkIdList *cellIds);
00105 
00107   void ComputeBounds();
00108   
00113   void Squeeze();
00114 
00116   int GetMaxCellSize();
00117 
00119   void SetVerts (vtkCellArray* v);
00120 
00123   vtkCellArray *GetVerts();
00124 
00126   void SetLines (vtkCellArray* l);
00127 
00130   vtkCellArray *GetLines();
00131 
00133   void SetPolys (vtkCellArray* p);
00134 
00137   vtkCellArray *GetPolys();
00138   
00140   void SetStrips (vtkCellArray* s);
00141 
00145   vtkCellArray *GetStrips();
00146 
00148 
00149   vtkIdType GetNumberOfVerts();
00150   vtkIdType GetNumberOfLines();
00151   vtkIdType GetNumberOfPolys();
00152   vtkIdType GetNumberOfStrips();
00154 
00159   void Allocate(vtkIdType numCells=1000, int extSize=1000);
00160 
00162 
00171   void Allocate(vtkPolyData *inPolyData, vtkIdType numCells=1000, 
00172                 int extSize=1000);
00174 
00181   int InsertNextCell(int type, int npts, vtkIdType *pts);
00182 
00189   int InsertNextCell(int type, vtkIdList *pts);
00190 
00193   void Reset();
00194 
00196   void BuildCells();
00197 
00203   void BuildLinks(int initialSize=0);
00204 
00208   void DeleteCells();
00209 
00211   void DeleteLinks();
00212   
00214 
00215   void GetPointCells(vtkIdType ptId, unsigned short& ncells,
00216                      vtkIdType* &cells);
00218 
00220 
00223   void GetCellEdgeNeighbors(vtkIdType cellId, vtkIdType p1, vtkIdType p2,
00224                             vtkIdList *cellIds);
00226 
00229   void GetCellPoints(vtkIdType cellId, vtkIdType& npts, vtkIdType* &pts);
00230 
00233   int IsTriangle(int v1, int v2, int v3);
00234 
00237   int IsEdge(int v1, int v2);
00238 
00241   int IsPointUsedByCell(vtkIdType ptId, vtkIdType cellId);
00242 
00248   void ReplaceCell(vtkIdType cellId, int npts, vtkIdType *pts);
00249 
00251 
00252   void ReplaceCellPoint(vtkIdType cellId, vtkIdType oldPtId,
00253                         vtkIdType newPtId);
00255   
00257   void ReverseCell(vtkIdType cellId);
00258 
00260 
00261   void DeletePoint(vtkIdType ptId);
00262   void DeleteCell(vtkIdType cellId);
00264 
00266 
00272   int InsertNextLinkedPoint(int numLinks); 
00273   int InsertNextLinkedPoint(float x[3], int numLinks); 
00275   
00279   int InsertNextLinkedCell(int type, int npts, vtkIdType *pts); 
00280 
00287   void ReplaceLinkedCell(vtkIdType cellId, int npts, vtkIdType *pts);
00288 
00294   void RemoveCellReference(vtkIdType cellId);
00295 
00301   void AddCellReference(vtkIdType cellId);
00302 
00308   void RemoveReferenceToCell(vtkIdType ptId, vtkIdType cellId);
00309 
00314   void AddReferenceToCell(vtkIdType ptId, vtkIdType cellId);
00315 
00318   void ResizeCellList(vtkIdType ptId, int size);
00319 
00321   virtual void Initialize();
00322 
00324 
00327   void SetUpdateExtent(int piece, int numPieces, int ghostLevel);
00328   void SetUpdateExtent(int piece, int numPieces)
00329     {this->SetUpdateExtent(piece, numPieces, 0);}
00330   void GetUpdateExtent(int &piece, int &numPieces, int &ghostLevel);
00332 
00334 
00335   vtkGetVector6Macro( UpdateExtent, int );
00337 
00339 
00343   void SetUpdateExtent( int x1, int x2, int y1, int y2, int z1, int z2 )
00344     { this->vtkPointSet::SetUpdateExtent( x1, x2, y1, y2, z1, z2 ); };
00345   void SetUpdateExtent( int ext[6] )
00346     { this->vtkPointSet::SetUpdateExtent( ext ); };
00348 
00350 
00352   vtkGetMacro( Piece, int );
00353   vtkGetMacro( NumberOfPieces, int );
00355 
00357 
00358   vtkGetMacro( GhostLevel, int );
00360   
00366   unsigned long GetActualMemorySize();
00367   
00369 
00370   void ShallowCopy(vtkDataObject *src);  
00371   void DeepCopy(vtkDataObject *src);
00373 
00376   void RemoveGhostCells(int level);
00377 
00378 protected:
00379   vtkPolyData();
00380   ~vtkPolyData();
00381 
00382   // constant cell objects returned by GetCell called.
00383   vtkVertex *Vertex;
00384   vtkPolyVertex *PolyVertex;
00385   vtkLine *Line;
00386   vtkPolyLine *PolyLine;
00387   vtkTriangle *Triangle;
00388   vtkQuad *Quad;
00389   vtkPolygon *Polygon;
00390   vtkTriangleStrip *TriangleStrip;
00391   vtkEmptyCell *EmptyCell;
00392   
00393   // points inherited
00394   // point data (i.e., scalars, vectors, normals, tcoords) inherited
00395   vtkCellArray *Verts;
00396   vtkCellArray *Lines;
00397   vtkCellArray *Polys;
00398   vtkCellArray *Strips;
00399 
00400   // dummy static member below used as a trick to simplify traversal
00401   static vtkCellArray *Dummy;
00402 
00403   // supporting structures for more complex topological operations
00404   // built only when necessary
00405   vtkCellTypes *Cells;
00406   vtkCellLinks *Links;
00407 
00408   // This method is called during an update.  
00409   // If the CropFilter is set, the user reqquested a piece which the 
00410   // source cannot generate, then it will break up the
00411   // data set in order to satisfy the request.
00412   virtual void Crop();
00413 
00414 
00415 private:
00416   // Hide these from the user and the compiler.
00417   
00419 
00420   void GetCellNeighbors(vtkIdType cellId, vtkIdList& ptIds, vtkIdList& cellIds)
00421     {this->GetCellNeighbors(cellId, &ptIds, &cellIds);}
00423 
00424 private:
00425   vtkPolyData(const vtkPolyData&);  // Not implemented.
00426   void operator=(const vtkPolyData&);  // Not implemented.
00427 };
00428 
00429 inline void vtkPolyData::GetPointCells(vtkIdType ptId, unsigned short& ncells, 
00430                                        vtkIdType* &cells)
00431 {
00432   ncells = this->Links->GetNcells(ptId);
00433   cells = this->Links->GetCells(ptId);
00434 }
00435 
00436 inline int vtkPolyData::IsTriangle(int v1, int v2, int v3)
00437 {
00438   unsigned short int n1;
00439   int i, j, tVerts[3];
00440   vtkIdType *cells, *tVerts2, n2;
00441   
00442   tVerts[0] = v1;
00443   tVerts[1] = v2;
00444   tVerts[2] = v3;
00445 
00446   for (i=0; i<3; i++) 
00447     {
00448     this->GetPointCells(tVerts[i], n1, cells);
00449     for (j=0; j<n1; j++) 
00450       {
00451       this->GetCellPoints(cells[j], n2, tVerts2);
00452       if ( (tVerts[0] == tVerts2[0] || tVerts[0] == tVerts2[1] ||
00453             tVerts[0] == tVerts2[2]) &&
00454            (tVerts[1] == tVerts2[0] || tVerts[1] == tVerts2[1] ||
00455             tVerts[1] == tVerts2[2]) &&
00456            (tVerts[2] == tVerts2[0] || tVerts[2] == tVerts2[1] ||
00457             tVerts[2] == tVerts2[2]) )
00458         {
00459         return 1;
00460         }
00461       }
00462     }
00463   return 0;
00464 }
00465 
00466 inline int vtkPolyData::IsPointUsedByCell(vtkIdType ptId, vtkIdType cellId)
00467 {
00468   vtkIdType *pts, npts;
00469   
00470   this->GetCellPoints(cellId, npts, pts);
00471   for (vtkIdType i=0; i < npts; i++)
00472     {
00473     if ( pts[i] == ptId )
00474       {
00475       return 1;
00476       }
00477     }
00478 
00479   return 0;
00480 }
00481 
00482 inline int vtkPolyData::IsEdge(int p1, int p2)
00483 {
00484   unsigned short int ncells;
00485   int i;
00486   vtkIdType *cells;
00487   
00488   this->GetPointCells(p1,ncells,cells);
00489   for (i=0; i < ncells; i++)
00490     {
00491     if ( this->IsPointUsedByCell(p2,cells[i]) )
00492       {
00493       return 1;
00494       }
00495     }
00496 
00497   return 0;
00498 }
00499 
00500 inline void vtkPolyData::DeletePoint(vtkIdType ptId)
00501 {
00502   this->Links->DeletePoint(ptId);
00503 }
00504 
00505 inline void vtkPolyData::DeleteCell(vtkIdType cellId)
00506 {
00507   this->Cells->DeleteCell(cellId);
00508 }
00509 
00510 inline void vtkPolyData::RemoveCellReference(vtkIdType cellId)
00511 {
00512   vtkIdType *pts, npts;
00513   
00514   this->GetCellPoints(cellId, npts, pts);
00515   for (vtkIdType i=0; i<npts; i++)
00516     {
00517     this->Links->RemoveCellReference(cellId, pts[i]);
00518     }
00519 }
00520 
00521 inline void vtkPolyData::AddCellReference(vtkIdType cellId)
00522 {
00523   vtkIdType *pts, npts;
00524   
00525   this->GetCellPoints(cellId, npts, pts);
00526   for (vtkIdType i=0; i<npts; i++)
00527     {
00528     this->Links->AddCellReference(cellId, pts[i]);
00529     }
00530 }
00531 
00532 inline void vtkPolyData::ResizeCellList(vtkIdType ptId, int size)
00533 {
00534   this->Links->ResizeCellList(ptId,size);
00535 }
00536 
00537 inline void vtkPolyData::ReplaceCellPoint(vtkIdType cellId, vtkIdType oldPtId,
00538                                           vtkIdType newPtId)
00539 {
00540   int i;
00541   vtkIdType *verts, nverts;
00542   
00543   this->GetCellPoints(cellId,nverts,verts);
00544   for ( i=0; i < nverts; i++ )
00545     {
00546     if ( verts[i] == oldPtId ) 
00547       {
00548       verts[i] = newPtId; // this is very nasty! direct write!
00549       return;
00550       }
00551     }
00552 }
00553 
00554 #endif
00555 
00556