VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkGraph.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 /*------------------------------------------------------------------------- 00016 Copyright 2008 Sandia Corporation. 00017 Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00018 the U.S. Government retains certain rights in this software. 00019 -------------------------------------------------------------------------*/ 00215 #ifndef __vtkGraph_h 00216 #define __vtkGraph_h 00217 00218 #include "vtkDataObject.h" 00219 00220 class vtkAdjacentVertexIterator; 00221 class vtkCellArray; 00222 class vtkEdgeListIterator; 00223 class vtkDataSetAttributes; 00224 class vtkGraphEdge; 00225 class vtkGraphEdgePoints; 00226 class vtkDistributedGraphHelper; 00227 class vtkGraphInternals; 00228 class vtkIdTypeArray; 00229 class vtkInEdgeIterator; 00230 class vtkOutEdgeIterator; 00231 class vtkPoints; 00232 class vtkVertexListIterator; 00233 class vtkVariant; 00234 class vtkVariantArray; 00235 00236 //BTX 00237 // Forward declare some boost stuff even if boost wrappers 00238 // are turned off. 00239 namespace boost 00240 { 00241 class vtk_edge_iterator; 00242 class vtk_out_edge_pointer_iterator; 00243 class vtk_in_edge_pointer_iterator; 00244 } 00245 00246 // Edge structures. 00247 struct vtkEdgeBase 00248 { 00249 vtkEdgeBase() { } 00250 vtkEdgeBase(vtkIdType id) : 00251 Id(id) { } 00252 vtkIdType Id; 00253 }; 00254 00255 struct vtkOutEdgeType : vtkEdgeBase 00256 { 00257 vtkOutEdgeType() { } 00258 vtkOutEdgeType(vtkIdType t, vtkIdType id) : 00259 vtkEdgeBase(id), 00260 Target(t) { } 00261 vtkIdType Target; 00262 }; 00263 00264 struct vtkInEdgeType : vtkEdgeBase 00265 { 00266 vtkInEdgeType() { } 00267 vtkInEdgeType(vtkIdType s, vtkIdType id) : 00268 vtkEdgeBase(id), 00269 Source(s) { } 00270 vtkIdType Source; 00271 }; 00272 00273 struct vtkEdgeType : vtkEdgeBase 00274 { 00275 vtkEdgeType() { } 00276 vtkEdgeType(vtkIdType s, vtkIdType t, vtkIdType id) : 00277 vtkEdgeBase(id), 00278 Source(s), 00279 Target(t) { } 00280 vtkIdType Source; 00281 vtkIdType Target; 00282 }; 00283 //ETX 00284 00285 class VTK_FILTERING_EXPORT vtkGraph : public vtkDataObject 00286 { 00287 public: 00288 vtkTypeMacro(vtkGraph, vtkDataObject); 00289 void PrintSelf(ostream& os, vtkIndent indent); 00290 00292 00293 vtkGetObjectMacro(VertexData, vtkDataSetAttributes); 00294 vtkGetObjectMacro(EdgeData, vtkDataSetAttributes); 00296 00298 virtual int GetDataObjectType() {return VTK_GRAPH;} 00299 00301 virtual void Initialize(); 00302 00304 00307 double *GetPoint(vtkIdType ptId); 00308 void GetPoint(vtkIdType ptId, double x[3]); 00310 00312 00316 vtkPoints* GetPoints(); 00317 virtual void SetPoints(vtkPoints *points); 00319 00322 void ComputeBounds(); 00323 00325 00328 double *GetBounds(); 00329 void GetBounds(double bounds[6]); 00331 00333 unsigned long int GetMTime(); 00334 00338 virtual void GetOutEdges(vtkIdType v, vtkOutEdgeIterator *it); 00339 00343 virtual vtkIdType GetDegree(vtkIdType v); 00344 00348 virtual vtkIdType GetOutDegree(vtkIdType v); 00349 00350 //BTX 00352 00353 virtual vtkOutEdgeType GetOutEdge(vtkIdType v, vtkIdType index); 00354 //ETX 00356 00361 virtual void GetOutEdge(vtkIdType v, vtkIdType index, vtkGraphEdge* e); 00362 00366 virtual void GetInEdges(vtkIdType v, vtkInEdgeIterator *it); 00367 00371 virtual vtkIdType GetInDegree(vtkIdType v); 00372 00373 //BTX 00375 00376 virtual vtkInEdgeType GetInEdge(vtkIdType v, vtkIdType index); 00377 //ETX 00379 00384 virtual void GetInEdge(vtkIdType v, vtkIdType index, vtkGraphEdge* e); 00385 00390 virtual void GetAdjacentVertices(vtkIdType v, vtkAdjacentVertexIterator *it); 00391 00395 virtual void GetEdges(vtkEdgeListIterator *it); 00396 00399 virtual vtkIdType GetNumberOfEdges(); 00400 00404 virtual void GetVertices(vtkVertexListIterator *it); 00405 00408 virtual vtkIdType GetNumberOfVertices(); 00409 00410 // BTX 00414 void SetDistributedGraphHelper(vtkDistributedGraphHelper *helper); 00415 00417 00418 vtkDistributedGraphHelper *GetDistributedGraphHelper(); 00419 //ETX 00421 00422 //BTX 00424 00430 vtkIdType FindVertex(const vtkVariant& pedigreeID); 00431 //ETX 00433 00436 virtual void ShallowCopy(vtkDataObject *obj); 00437 00440 virtual void DeepCopy(vtkDataObject *obj); 00441 00444 virtual void CopyStructure(vtkGraph *g); 00445 00448 virtual bool CheckedShallowCopy(vtkGraph *g); 00449 00452 virtual bool CheckedDeepCopy(vtkGraph *g); 00453 00455 virtual void Squeeze(); 00456 00457 //BTX 00459 00460 static vtkGraph *GetData(vtkInformation *info); 00461 static vtkGraph *GetData(vtkInformationVector *v, int i=0); 00462 //ETX 00464 00469 void ReorderOutVertices(vtkIdType v, vtkIdTypeArray *vertices); 00470 00473 bool IsSameStructure(vtkGraph *other); 00474 00476 00482 vtkIdType GetSourceVertex(vtkIdType e); 00483 vtkIdType GetTargetVertex(vtkIdType e); 00485 00486 //BTX 00488 00491 void SetEdgePoints(vtkIdType e, vtkIdType npts, double* pts); 00492 void GetEdgePoints(vtkIdType e, vtkIdType& npts, double*& pts); 00493 //ETX 00495 00497 vtkIdType GetNumberOfEdgePoints(vtkIdType e); 00498 00500 double* GetEdgePoint(vtkIdType e, vtkIdType i); 00501 00503 void ClearEdgePoints(vtkIdType e); 00504 00506 00508 void SetEdgePoint(vtkIdType e, vtkIdType i, double x[3]); 00509 void SetEdgePoint(vtkIdType e, vtkIdType i, double x, double y, double z) 00510 { double p[3] = {x, y, z}; this->SetEdgePoint(e, i, p); } 00512 00514 00516 void AddEdgePoint(vtkIdType e, double x[3]); 00517 void AddEdgePoint(vtkIdType e, double x, double y, double z) 00518 { double p[3] = {x, y, z}; this->AddEdgePoint(e, p); } 00520 00522 00524 void ShallowCopyEdgePoints(vtkGraph* g); 00525 void DeepCopyEdgePoints(vtkGraph* g); 00527 00531 vtkGraphInternals *GetGraphInternals(bool modifying); 00532 00535 void GetInducedEdges(vtkIdTypeArray* verts, vtkIdTypeArray* edges); 00536 00541 virtual vtkFieldData* GetAttributesAsFieldData(int type); 00542 00545 virtual vtkIdType GetNumberOfElements(int type); 00546 00548 void Dump(); 00549 00550 protected: 00551 //BTX 00552 vtkGraph(); 00553 ~vtkGraph(); 00554 00556 00561 void AddVertexInternal(vtkVariantArray *propertyArr = 0, 00562 vtkIdType *vertex = 0); 00564 00569 void AddVertexInternal(const vtkVariant& pedigree, vtkIdType *vertex); 00570 00572 00576 void AddEdgeInternal(vtkIdType u, vtkIdType v, bool directed, 00577 vtkVariantArray *propertyArr, vtkEdgeType *edge); 00578 void AddEdgeInternal(const vtkVariant& uPedigree, vtkIdType v, bool directed, 00579 vtkVariantArray *propertyArr, vtkEdgeType *edge); 00580 void AddEdgeInternal(vtkIdType u, const vtkVariant& vPedigree, bool directed, 00581 vtkVariantArray *propertyArr, vtkEdgeType *edge); 00582 void AddEdgeInternal(const vtkVariant& uPedigree, const vtkVariant& vPedigree, 00583 bool directed, vtkVariantArray *propertyArr, 00584 vtkEdgeType *edge); 00586 00589 void RemoveVertexInternal(vtkIdType v, bool directed); 00590 00593 void RemoveEdgeInternal(vtkIdType e, bool directed); 00594 00597 void RemoveVerticesInternal(vtkIdTypeArray* arr, bool directed); 00598 00600 00601 void RemoveEdgesInternal(vtkIdTypeArray* arr, bool directed); 00602 //ETX 00604 00607 virtual bool IsStructureValid(vtkGraph *g) = 0; 00608 00610 virtual void CopyInternal(vtkGraph *g, bool deep); 00611 00613 vtkGraphInternals *Internals; 00614 00616 vtkDistributedGraphHelper *DistributedHelper; 00617 00619 void SetInternals(vtkGraphInternals* internals); 00620 00622 vtkGraphEdgePoints *EdgePoints; 00623 00625 void SetEdgePoints(vtkGraphEdgePoints* edgePoints); 00626 00629 void ForceOwnership(); 00630 00632 00633 virtual void GetOutEdges(vtkIdType v, const vtkOutEdgeType *& edges, vtkIdType & nedges); 00634 virtual void GetInEdges(vtkIdType v, const vtkInEdgeType *& edges, vtkIdType & nedges); 00636 00638 void BuildEdgeList(); 00639 00641 00642 friend class vtkAdjacentVertexIterator; 00643 friend class vtkEdgeListIterator; 00644 friend class vtkInEdgeIterator; 00645 friend class vtkOutEdgeIterator; 00646 friend class boost::vtk_edge_iterator; 00647 friend class boost::vtk_in_edge_pointer_iterator; 00648 friend class boost::vtk_out_edge_pointer_iterator; 00649 //ETX 00651 00653 00654 vtkDataSetAttributes *VertexData; 00655 vtkDataSetAttributes *EdgeData; 00657 00659 double Bounds[6]; 00660 00662 vtkTimeStamp ComputeTime; 00663 00665 00666 vtkPoints *Points; 00667 static double DefaultPoint[3]; 00669 00671 00672 vtkGetObjectMacro(EdgeList, vtkIdTypeArray); 00673 virtual void SetEdgeList(vtkIdTypeArray* list); 00674 vtkIdTypeArray *EdgeList; 00675 //ETX 00677 private: 00678 vtkGraph(const vtkGraph&); // Not implemented. 00679 void operator=(const vtkGraph&); // Not implemented. 00680 }; 00681 00682 //BTX 00683 bool VTK_FILTERING_EXPORT operator==(vtkEdgeBase e1, vtkEdgeBase e2); 00684 bool VTK_FILTERING_EXPORT operator!=(vtkEdgeBase e1, vtkEdgeBase e2); 00685 VTK_FILTERING_EXPORT ostream& operator<<(ostream& out, vtkEdgeBase e); 00686 //ETX 00687 00688 #endif