VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkPolyData.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 =========================================================================*/ 00063 #ifndef __vtkPolyData_h 00064 #define __vtkPolyData_h 00065 00066 #include "vtkPointSet.h" 00067 00068 #include "vtkCellTypes.h" // Needed for inline methods 00069 #include "vtkCellLinks.h" // Needed for inline methods 00070 00071 class vtkVertex; 00072 class vtkPolyVertex; 00073 class vtkLine; 00074 class vtkPolyLine; 00075 class vtkTriangle; 00076 class vtkQuad; 00077 class vtkPolygon; 00078 class vtkTriangleStrip; 00079 class vtkEmptyCell; 00080 00081 class VTK_FILTERING_EXPORT vtkPolyData : public vtkPointSet 00082 { 00083 public: 00084 static vtkPolyData *New(); 00085 00086 vtkTypeMacro(vtkPolyData,vtkPointSet); 00087 void PrintSelf(ostream& os, vtkIndent indent); 00088 00090 int GetDataObjectType() {return VTK_POLY_DATA;} 00091 00094 void CopyStructure(vtkDataSet *ds); 00095 00097 00098 vtkIdType GetNumberOfCells(); 00099 vtkCell *GetCell(vtkIdType cellId); 00100 void GetCell(vtkIdType cellId, vtkGenericCell *cell); 00101 int GetCellType(vtkIdType cellId); 00102 void GetCellBounds(vtkIdType cellId, double bounds[6]); 00103 void GetCellNeighbors(vtkIdType cellId, vtkIdList *ptIds, 00104 vtkIdList *cellIds); 00106 00108 00112 void CopyCells(vtkPolyData *pd, vtkIdList *idList, 00113 vtkPointLocator *locator = NULL); 00115 00117 void GetCellPoints(vtkIdType cellId, vtkIdList *ptIds); 00118 00121 void GetPointCells(vtkIdType ptId, vtkIdList *cellIds); 00122 00124 void ComputeBounds(); 00125 00130 void Squeeze(); 00131 00133 int GetMaxCellSize(); 00134 00136 void SetVerts (vtkCellArray* v); 00137 00140 vtkCellArray *GetVerts(); 00141 00143 void SetLines (vtkCellArray* l); 00144 00147 vtkCellArray *GetLines(); 00148 00150 void SetPolys (vtkCellArray* p); 00151 00154 vtkCellArray *GetPolys(); 00155 00157 void SetStrips (vtkCellArray* s); 00158 00162 vtkCellArray *GetStrips(); 00163 00165 00166 vtkIdType GetNumberOfVerts(); 00167 vtkIdType GetNumberOfLines(); 00168 vtkIdType GetNumberOfPolys(); 00169 vtkIdType GetNumberOfStrips(); 00171 00176 void Allocate(vtkIdType numCells=1000, int extSize=1000); 00177 00179 00188 void Allocate(vtkPolyData *inPolyData, vtkIdType numCells=1000, 00189 int extSize=1000); 00191 00198 int InsertNextCell(int type, int npts, vtkIdType *pts); 00199 00206 int InsertNextCell(int type, vtkIdList *pts); 00207 00210 void Reset(); 00211 00213 void BuildCells(); 00214 00220 void BuildLinks(int initialSize=0); 00221 00225 void DeleteCells(); 00226 00228 void DeleteLinks(); 00229 00231 00232 void GetPointCells(vtkIdType ptId, unsigned short& ncells, 00233 vtkIdType* &cells); 00235 00237 00240 void GetCellEdgeNeighbors(vtkIdType cellId, vtkIdType p1, vtkIdType p2, 00241 vtkIdList *cellIds); 00243 00246 void GetCellPoints(vtkIdType cellId, vtkIdType& npts, vtkIdType* &pts); 00247 00250 int IsTriangle(int v1, int v2, int v3); 00251 00257 int IsEdge(vtkIdType p1, vtkIdType p2); 00258 00261 int IsPointUsedByCell(vtkIdType ptId, vtkIdType cellId); 00262 00268 void ReplaceCell(vtkIdType cellId, int npts, vtkIdType *pts); 00269 00271 00272 void ReplaceCellPoint(vtkIdType cellId, vtkIdType oldPtId, 00273 vtkIdType newPtId); 00275 00277 void ReverseCell(vtkIdType cellId); 00278 00280 00281 void DeletePoint(vtkIdType ptId); 00282 void DeleteCell(vtkIdType cellId); 00284 00291 void RemoveDeletedCells(); 00292 00294 00300 int InsertNextLinkedPoint(int numLinks); 00301 int InsertNextLinkedPoint(double x[3], int numLinks); 00303 00307 int InsertNextLinkedCell(int type, int npts, vtkIdType *pts); 00308 00315 void ReplaceLinkedCell(vtkIdType cellId, int npts, vtkIdType *pts); 00316 00322 void RemoveCellReference(vtkIdType cellId); 00323 00329 void AddCellReference(vtkIdType cellId); 00330 00336 void RemoveReferenceToCell(vtkIdType ptId, vtkIdType cellId); 00337 00342 void AddReferenceToCell(vtkIdType ptId, vtkIdType cellId); 00343 00346 void ResizeCellList(vtkIdType ptId, int size); 00347 00349 virtual void Initialize(); 00350 00354 void GetUpdateExtent(int &piece, int &numPieces, int &ghostLevel); 00355 00357 00358 virtual int* GetUpdateExtent(); 00359 virtual void GetUpdateExtent(int& x0, int& x1, int& y0, int& y1, 00360 int& z0, int& z1); 00361 virtual void GetUpdateExtent(int extent[6]); 00363 00365 00366 virtual int GetPiece(); 00367 virtual int GetNumberOfPieces(); 00369 00371 virtual int GetGhostLevel(); 00372 00378 unsigned long GetActualMemorySize(); 00379 00381 00382 void ShallowCopy(vtkDataObject *src); 00383 void DeepCopy(vtkDataObject *src); 00385 00388 void RemoveGhostCells(int level); 00389 00390 //BTX 00392 00393 static vtkPolyData* GetData(vtkInformation* info); 00394 static vtkPolyData* GetData(vtkInformationVector* v, int i=0); 00395 //ETX 00397 00398 //BTX 00400 00414 enum 00415 { 00416 ERR_NO_SUCH_FIELD = -4, 00417 ERR_INCORRECT_FIELD = -3, 00418 ERR_NON_MANIFOLD_STAR = -2, 00419 REGULAR_POINT = -1, 00420 MINIMUM = 0, 00421 SADDLE = 1, 00422 MAXIMUM = 2 00423 }; 00424 //ETX 00425 int GetScalarFieldCriticalIndex (vtkIdType pointId, 00426 vtkDataArray *scalarField); 00427 int GetScalarFieldCriticalIndex (vtkIdType pointId, int fieldId); 00428 int GetScalarFieldCriticalIndex (vtkIdType pointId, const char* fieldName); 00430 00431 protected: 00432 vtkPolyData(); 00433 ~vtkPolyData(); 00434 00435 // constant cell objects returned by GetCell called. 00436 vtkVertex *Vertex; 00437 vtkPolyVertex *PolyVertex; 00438 vtkLine *Line; 00439 vtkPolyLine *PolyLine; 00440 vtkTriangle *Triangle; 00441 vtkQuad *Quad; 00442 vtkPolygon *Polygon; 00443 vtkTriangleStrip *TriangleStrip; 00444 vtkEmptyCell *EmptyCell; 00445 00446 // points inherited 00447 // point data (i.e., scalars, vectors, normals, tcoords) inherited 00448 vtkCellArray *Verts; 00449 vtkCellArray *Lines; 00450 vtkCellArray *Polys; 00451 vtkCellArray *Strips; 00452 00453 // dummy static member below used as a trick to simplify traversal 00454 static vtkCellArray *Dummy; 00455 00456 // supporting structures for more complex topological operations 00457 // built only when necessary 00458 vtkCellTypes *Cells; 00459 vtkCellLinks *Links; 00460 00461 // This method is called during an update. 00462 // If the CropFilter is set, the user reqquested a piece which the 00463 // source cannot generate, then it will break up the 00464 // data set in order to satisfy the request. 00465 virtual void Crop(); 00466 00467 00468 private: 00469 // Hide these from the user and the compiler. 00470 00472 00473 void GetCellNeighbors(vtkIdType cellId, vtkIdList& ptIds, vtkIdList& cellIds) 00474 {this->GetCellNeighbors(cellId, &ptIds, &cellIds);} 00476 00477 void Cleanup(); 00478 00479 private: 00480 vtkPolyData(const vtkPolyData&); // Not implemented. 00481 void operator=(const vtkPolyData&); // Not implemented. 00482 }; 00483 00484 inline void vtkPolyData::GetPointCells(vtkIdType ptId, unsigned short& ncells, 00485 vtkIdType* &cells) 00486 { 00487 ncells = this->Links->GetNcells(ptId); 00488 cells = this->Links->GetCells(ptId); 00489 } 00490 00491 inline int vtkPolyData::IsTriangle(int v1, int v2, int v3) 00492 { 00493 unsigned short int n1; 00494 int i, j, tVerts[3]; 00495 vtkIdType *cells, *tVerts2, n2; 00496 00497 tVerts[0] = v1; 00498 tVerts[1] = v2; 00499 tVerts[2] = v3; 00500 00501 for (i=0; i<3; i++) 00502 { 00503 this->GetPointCells(tVerts[i], n1, cells); 00504 for (j=0; j<n1; j++) 00505 { 00506 this->GetCellPoints(cells[j], n2, tVerts2); 00507 if ( (tVerts[0] == tVerts2[0] || tVerts[0] == tVerts2[1] || 00508 tVerts[0] == tVerts2[2]) && 00509 (tVerts[1] == tVerts2[0] || tVerts[1] == tVerts2[1] || 00510 tVerts[1] == tVerts2[2]) && 00511 (tVerts[2] == tVerts2[0] || tVerts[2] == tVerts2[1] || 00512 tVerts[2] == tVerts2[2]) ) 00513 { 00514 return 1; 00515 } 00516 } 00517 } 00518 return 0; 00519 } 00520 00521 inline int vtkPolyData::IsPointUsedByCell(vtkIdType ptId, vtkIdType cellId) 00522 { 00523 vtkIdType *pts, npts; 00524 00525 this->GetCellPoints(cellId, npts, pts); 00526 for (vtkIdType i=0; i < npts; i++) 00527 { 00528 if ( pts[i] == ptId ) 00529 { 00530 return 1; 00531 } 00532 } 00533 00534 return 0; 00535 } 00536 00537 inline void vtkPolyData::DeletePoint(vtkIdType ptId) 00538 { 00539 this->Links->DeletePoint(ptId); 00540 } 00541 00542 inline void vtkPolyData::DeleteCell(vtkIdType cellId) 00543 { 00544 this->Cells->DeleteCell(cellId); 00545 } 00546 00547 inline void vtkPolyData::RemoveCellReference(vtkIdType cellId) 00548 { 00549 vtkIdType *pts, npts; 00550 00551 this->GetCellPoints(cellId, npts, pts); 00552 for (vtkIdType i=0; i<npts; i++) 00553 { 00554 this->Links->RemoveCellReference(cellId, pts[i]); 00555 } 00556 } 00557 00558 inline void vtkPolyData::AddCellReference(vtkIdType cellId) 00559 { 00560 vtkIdType *pts, npts; 00561 00562 this->GetCellPoints(cellId, npts, pts); 00563 for (vtkIdType i=0; i<npts; i++) 00564 { 00565 this->Links->AddCellReference(cellId, pts[i]); 00566 } 00567 } 00568 00569 inline void vtkPolyData::ResizeCellList(vtkIdType ptId, int size) 00570 { 00571 this->Links->ResizeCellList(ptId,size); 00572 } 00573 00574 inline void vtkPolyData::ReplaceCellPoint(vtkIdType cellId, vtkIdType oldPtId, 00575 vtkIdType newPtId) 00576 { 00577 int i; 00578 vtkIdType *verts, nverts; 00579 00580 this->GetCellPoints(cellId,nverts,verts); 00581 for ( i=0; i < nverts; i++ ) 00582 { 00583 if ( verts[i] == oldPtId ) 00584 { 00585 verts[i] = newPtId; // this is very nasty! direct write! 00586 return; 00587 } 00588 } 00589 } 00590 00591 #endif 00592 00593