Main Page Class Hierarchy Alphabetical List Compound List File List Compound 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 =========================================================================*/
    00060 #ifndef __vtkPolyData_h
    00061 #define __vtkPolyData_h
    00062
    00063 #include "vtkPointSet.h"
    00064
    00065 #include "vtkCellTypes.h" // Needed for inline methods
    00066 #include "vtkCellLinks.h" // Needed for inline methods
    00067
    00068 class vtkVertex;
    00069 class vtkPolyVertex;
    00070 class vtkLine;
    00071 class vtkPolyLine;
    00072 class vtkTriangle;
    00073 class vtkQuad;
    00074 class vtkPolygon;
    00075 class vtkTriangleStrip;
    00076 class vtkEmptyCell;
    00077
    00078 class VTK_COMMON_EXPORT vtkPolyData : public vtkPointSet
    00079 {
    00080 public:
    00081   static vtkPolyData *New();
    00082
    00083   vtkTypeRevisionMacro(vtkPolyData,vtkPointSet);
    00084   void PrintSelf(ostream& os, vtkIndent indent);
    00085
    00087   int GetDataObjectType() {return VTK_POLY_DATA;}
    00088
    00091   void CopyStructure(vtkDataSet *ds);
    00092
    00094
    00095   vtkIdType GetNumberOfCells();
    00096   vtkCell *GetCell(vtkIdType cellId);
    00097   void GetCell(vtkIdType cellId, vtkGenericCell *cell);
    00098   int GetCellType(vtkIdType cellId);
    00099   void GetCellBounds(vtkIdType cellId, float bounds[6]);
    00100   void GetCellNeighbors(vtkIdType cellId, vtkIdList *ptIds,
    00101                         vtkIdList *cellIds);
    00103
    00105
    00109   void CopyCells(vtkPolyData *pd, vtkIdList *idList,
    00110                  vtkPointLocator *locator = NULL);
    00112
    00114   void GetCellPoints(vtkIdType cellId, vtkIdList *ptIds);
    00115
    00118   void GetPointCells(vtkIdType ptId, vtkIdList *cellIds);
    00119
    00121   void ComputeBounds();
    00122
    00127   void Squeeze();
    00128
    00130   int GetMaxCellSize();
    00131
    00133   void SetVerts (vtkCellArray* v);
    00134
    00137   vtkCellArray *GetVerts();
    00138
    00140   void SetLines (vtkCellArray* l);
    00141
    00144   vtkCellArray *GetLines();
    00145
    00147   void SetPolys (vtkCellArray* p);
    00148
    00151   vtkCellArray *GetPolys();
    00152
    00154   void SetStrips (vtkCellArray* s);
    00155
    00159   vtkCellArray *GetStrips();
    00160
    00162
    00163   vtkIdType GetNumberOfVerts();
    00164   vtkIdType GetNumberOfLines();
    00165   vtkIdType GetNumberOfPolys();
    00166   vtkIdType GetNumberOfStrips();
    00168
    00173   void Allocate(vtkIdType numCells=1000, int extSize=1000);
    00174
    00176
    00185   void Allocate(vtkPolyData *inPolyData, vtkIdType numCells=1000,
    00186                 int extSize=1000);
    00188
    00195   int InsertNextCell(int type, int npts, vtkIdType *pts);
    00196
    00203   int InsertNextCell(int type, vtkIdList *pts);
    00204
    00207   void Reset();
    00208
    00210   void BuildCells();
    00211
    00214   void BuildLinks();
    00215
    00219   void DeleteCells();
    00220
    00222   void DeleteLinks();
    00223
    00225
    00226   void GetPointCells(vtkIdType ptId, unsigned short& ncells,
    00227                      vtkIdType* &cells);
    00229
    00231
    00234   void GetCellEdgeNeighbors(vtkIdType cellId, vtkIdType p1, vtkIdType p2,
    00235                             vtkIdList *cellIds);
    00237
    00240   void GetCellPoints(vtkIdType cellId, vtkIdType& npts, vtkIdType* &pts);
    00241
    00244   int IsTriangle(int v1, int v2, int v3);
    00245
    00248   int IsEdge(int v1, int v2);
    00249
    00252   int IsPointUsedByCell(vtkIdType ptId, vtkIdType cellId);
    00253
    00259   void ReplaceCell(vtkIdType cellId, int npts, vtkIdType *pts);
    00260
    00262
    00263   void ReplaceCellPoint(vtkIdType cellId, vtkIdType oldPtId,
    00264                         vtkIdType newPtId);
    00266
    00268   void ReverseCell(vtkIdType cellId);
    00269
    00271
    00272   void DeletePoint(vtkIdType ptId);
    00273   void DeleteCell(vtkIdType cellId);
    00275
    00280   int InsertNextLinkedPoint(float x[3], int numLinks);
    00281
    00285   int InsertNextLinkedCell(int type, int npts, vtkIdType *pts);
    00286
    00293   void ReplaceLinkedCell(vtkIdType cellId, int npts, vtkIdType *pts);
    00294
    00300   void RemoveCellReference(vtkIdType cellId);
    00301
    00307   void AddCellReference(vtkIdType cellId);
    00308
    00314   void RemoveReferenceToCell(vtkIdType ptId, vtkIdType cellId);
    00315
    00320   void AddReferenceToCell(vtkIdType ptId, vtkIdType cellId);
    00321
    00324   void ResizeCellList(vtkIdType ptId, int size);
    00325
    00327   virtual void Initialize();
    00328
    00330
    00333   void SetUpdateExtent(int piece, int numPieces, int ghostLevel);
    00334   void SetUpdateExtent(int piece, int numPieces)
    00335     {this->SetUpdateExtent(piece, numPieces, 0);}
    00336   void GetUpdateExtent(int &piece, int &numPieces, int &ghostLevel);
    00338
    00340
    00341   vtkGetVector6Macro( UpdateExtent, int );
    00343
    00345
    00349   void SetUpdateExtent( int x1, int x2, int y1, int y2, int z1, int z2 )
    00350     { this->vtkPointSet::SetUpdateExtent( x1, x2, y1, y2, z1, z2 ); };
    00351   void SetUpdateExtent( int ext[6] )
    00352     { this->vtkPointSet::SetUpdateExtent( ext ); };
    00354
    00356
    00358   vtkGetMacro( Piece, int );
    00359   vtkGetMacro( NumberOfPieces, int );
    00361
    00363
    00364   vtkGetMacro( GhostLevel, int );
    00366
    00372   unsigned long GetActualMemorySize();
    00373
    00375
    00376   void ShallowCopy(vtkDataObject *src);
    00377   void DeepCopy(vtkDataObject *src);
    00379
    00382   void RemoveGhostCells(int level);
    00383
    00384 protected:
    00385   vtkPolyData();
    00386   ~vtkPolyData();
    00387
    00388   // constant cell objects returned by GetCell called.
    00389   vtkVertex *Vertex;
    00390   vtkPolyVertex *PolyVertex;
    00391   vtkLine *Line;
    00392   vtkPolyLine *PolyLine;
    00393   vtkTriangle *Triangle;
    00394   vtkQuad *Quad;
    00395   vtkPolygon *Polygon;
    00396   vtkTriangleStrip *TriangleStrip;
    00397   vtkEmptyCell *EmptyCell;
    00398
    00399   // points inherited
    00400   // point data (i.e., scalars, vectors, normals, tcoords) inherited
    00401   vtkCellArray *Verts;
    00402   vtkCellArray *Lines;
    00403   vtkCellArray *Polys;
    00404   vtkCellArray *Strips;
    00405
    00406   // dummy static member below used as a trick to simplify traversal
    00407   static vtkCellArray *Dummy;
    00408
    00409   // supporting structures for more complex topological operations
    00410   // built only when necessary
    00411   vtkCellTypes *Cells;
    00412   vtkCellLinks *Links;
    00413
    00414   // This method is called during an update.
    00415   // If the CropFilter is set, the user reqquested a piece which the
    00416   // source cannot generate, then it will break up the
    00417   // data set in order to satisfy the request.
    00418   virtual void Crop();
    00419
    00420
    00421 private:
    00422   // Hide these from the user and the compiler.
    00423
    00425
    00426   void GetCellNeighbors(vtkIdType cellId, vtkIdList& ptIds, vtkIdList& cellIds)
    00427     {this->GetCellNeighbors(cellId, &ptIds, &cellIds);}
    00429
    00430 private:
    00431   vtkPolyData(const vtkPolyData&);  // Not implemented.
    00432   void operator=(const vtkPolyData&);  // Not implemented.
    00433 };
    00434
    00435 inline void vtkPolyData::GetPointCells(vtkIdType ptId, unsigned short& ncells,
    00436                                        vtkIdType* &cells)
    00437 {
    00438   ncells = this->Links->GetNcells(ptId);
    00439   cells = this->Links->GetCells(ptId);
    00440 }
    00441
    00442 inline int vtkPolyData::IsTriangle(int v1, int v2, int v3)
    00443 {
    00444   unsigned short int n1;
    00445   int i, j, tVerts[3];
    00446   vtkIdType *cells, *tVerts2, n2;
    00447
    00448   tVerts[0] = v1;
    00449   tVerts[1] = v2;
    00450   tVerts[2] = v3;
    00451
    00452   for (i=0; i<3; i++)
    00453     {
    00454     this->GetPointCells(tVerts[i], n1, cells);
    00455     for (j=0; j<n1; j++)
    00456       {
    00457       this->GetCellPoints(cells[j], n2, tVerts2);
    00458       if ( (tVerts[0] == tVerts2[0] || tVerts[0] == tVerts2[1] ||
    00459             tVerts[0] == tVerts2[2]) &&
    00460            (tVerts[1] == tVerts2[0] || tVerts[1] == tVerts2[1] ||
    00461             tVerts[1] == tVerts2[2]) &&
    00462            (tVerts[2] == tVerts2[0] || tVerts[2] == tVerts2[1] ||
    00463             tVerts[2] == tVerts2[2]) )
    00464         {
    00465         return 1;
    00466         }
    00467       }
    00468     }
    00469   return 0;
    00470 }
    00471
    00472 inline int vtkPolyData::IsPointUsedByCell(vtkIdType ptId, vtkIdType cellId)
    00473 {
    00474   vtkIdType *pts, npts;
    00475
    00476   this->GetCellPoints(cellId, npts, pts);
    00477   for (vtkIdType i=0; i < npts; i++)
    00478     {
    00479     if ( pts[i] == ptId )
    00480       {
    00481       return 1;
    00482       }
    00483     }
    00484
    00485   return 0;
    00486 }
    00487
    00488 inline int vtkPolyData::IsEdge(int p1, int p2)
    00489 {
    00490   unsigned short int ncells;
    00491   int i;
    00492   vtkIdType *cells;
    00493
    00494   this->GetPointCells(p1,ncells,cells);
    00495   for (i=0; i < ncells; i++)
    00496     {
    00497     if ( this->IsPointUsedByCell(p2,cells[i]) )
    00498       {
    00499       return 1;
    00500       }
    00501     }
    00502
    00503   return 0;
    00504 }
    00505
    00506 inline void vtkPolyData::DeletePoint(vtkIdType ptId)
    00507 {
    00508   this->Links->DeletePoint(ptId);
    00509 }
    00510
    00511 inline void vtkPolyData::DeleteCell(vtkIdType cellId)
    00512 {
    00513   this->Cells->DeleteCell(cellId);
    00514 }
    00515
    00516 inline void vtkPolyData::RemoveCellReference(vtkIdType cellId)
    00517 {
    00518   vtkIdType *pts, npts;
    00519
    00520   this->GetCellPoints(cellId, npts, pts);
    00521   for (vtkIdType i=0; i<npts; i++)
    00522     {
    00523     this->Links->RemoveCellReference(cellId, pts[i]);
    00524     }
    00525 }
    00526
    00527 inline void vtkPolyData::AddCellReference(vtkIdType cellId)
    00528 {
    00529   vtkIdType *pts, npts;
    00530
    00531   this->GetCellPoints(cellId, npts, pts);
    00532   for (vtkIdType i=0; i<npts; i++)
    00533     {
    00534     this->Links->AddCellReference(cellId, pts[i]);
    00535     }
    00536 }
    00537
    00538 inline void vtkPolyData::ResizeCellList(vtkIdType ptId, int size)
    00539 {
    00540   this->Links->ResizeCellList(ptId,size);
    00541 }
    00542
    00543 inline void vtkPolyData::ReplaceCellPoint(vtkIdType cellId, vtkIdType oldPtId,
    00544                                           vtkIdType newPtId)
    00545 {
    00546   int i;
    00547   vtkIdType *verts, nverts;
    00548
    00549   this->GetCellPoints(cellId,nverts,verts);
    00550   for ( i=0; i < nverts; i++ )
    00551     {
    00552     if ( verts[i] == oldPtId )
    00553       {
    00554       verts[i] = newPtId; // this is very nasty! direct write!
    00555       return;
    00556       }
    00557     }
    00558 }
    00559
    00560 #endif
    00561
    00562