00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 vtkDirectedGraph;
00225 class vtkGraphEdge;
00226 class vtkGraphEdgePoints;
00227 class vtkDistributedGraphHelper;
00228 class vtkGraphInternals;
00229 class vtkIdTypeArray;
00230 class vtkInEdgeIterator;
00231 class vtkOutEdgeIterator;
00232 class vtkPoints;
00233 class vtkUndirectedGraph;
00234 class vtkVertexListIterator;
00235 class vtkVariant;
00236 class vtkVariantArray;
00237
00238
00239
00240
00241 namespace boost
00242 {
00243 class vtk_edge_iterator;
00244 class vtk_out_edge_pointer_iterator;
00245 class vtk_in_edge_pointer_iterator;
00246 }
00247
00248
00249 struct vtkEdgeBase
00250 {
00251 vtkEdgeBase() { }
00252 vtkEdgeBase(vtkIdType id) :
00253 Id(id) { }
00254 vtkIdType Id;
00255 };
00256
00257 struct vtkOutEdgeType : vtkEdgeBase
00258 {
00259 vtkOutEdgeType() { }
00260 vtkOutEdgeType(vtkIdType t, vtkIdType id) :
00261 vtkEdgeBase(id),
00262 Target(t) { }
00263 vtkIdType Target;
00264 };
00265
00266 struct vtkInEdgeType : vtkEdgeBase
00267 {
00268 vtkInEdgeType() { }
00269 vtkInEdgeType(vtkIdType s, vtkIdType id) :
00270 vtkEdgeBase(id),
00271 Source(s) { }
00272 vtkIdType Source;
00273 };
00274
00275 struct vtkEdgeType : vtkEdgeBase
00276 {
00277 vtkEdgeType() { }
00278 vtkEdgeType(vtkIdType s, vtkIdType t, vtkIdType id) :
00279 vtkEdgeBase(id),
00280 Source(s),
00281 Target(t) { }
00282 vtkIdType Source;
00283 vtkIdType Target;
00284 };
00285
00286
00287 class VTK_FILTERING_EXPORT vtkGraph : public vtkDataObject
00288 {
00289 public:
00290 vtkTypeMacro(vtkGraph, vtkDataObject);
00291 void PrintSelf(ostream& os, vtkIndent indent);
00292
00294
00295 vtkGetObjectMacro(VertexData, vtkDataSetAttributes);
00296 vtkGetObjectMacro(EdgeData, vtkDataSetAttributes);
00298
00300 virtual int GetDataObjectType() {return VTK_GRAPH;}
00301
00303 virtual void Initialize();
00304
00306
00309 double *GetPoint(vtkIdType ptId);
00310 void GetPoint(vtkIdType ptId, double x[3]);
00312
00314
00318 vtkPoints* GetPoints();
00319 virtual void SetPoints(vtkPoints *points);
00321
00324 void ComputeBounds();
00325
00327
00330 double *GetBounds();
00331 void GetBounds(double bounds[6]);
00333
00335 unsigned long int GetMTime();
00336
00340 virtual void GetOutEdges(vtkIdType v, vtkOutEdgeIterator *it);
00341
00345 virtual vtkIdType GetDegree(vtkIdType v);
00346
00350 virtual vtkIdType GetOutDegree(vtkIdType v);
00351
00352
00354
00355 virtual vtkOutEdgeType GetOutEdge(vtkIdType v, vtkIdType index);
00356
00358
00363 virtual void GetOutEdge(vtkIdType v, vtkIdType index, vtkGraphEdge* e);
00364
00368 virtual void GetInEdges(vtkIdType v, vtkInEdgeIterator *it);
00369
00373 virtual vtkIdType GetInDegree(vtkIdType v);
00374
00375
00377
00378 virtual vtkInEdgeType GetInEdge(vtkIdType v, vtkIdType index);
00379
00381
00386 virtual void GetInEdge(vtkIdType v, vtkIdType index, vtkGraphEdge* e);
00387
00392 virtual void GetAdjacentVertices(vtkIdType v, vtkAdjacentVertexIterator *it);
00393
00397 virtual void GetEdges(vtkEdgeListIterator *it);
00398
00401 virtual vtkIdType GetNumberOfEdges();
00402
00406 virtual void GetVertices(vtkVertexListIterator *it);
00407
00410 virtual vtkIdType GetNumberOfVertices();
00411
00412
00416 void SetDistributedGraphHelper(vtkDistributedGraphHelper *helper);
00417
00419
00420 vtkDistributedGraphHelper *GetDistributedGraphHelper();
00421
00423
00430 vtkIdType FindVertex(const vtkVariant& pedigreeID);
00431
00434 virtual void ShallowCopy(vtkDataObject *obj);
00435
00438 virtual void DeepCopy(vtkDataObject *obj);
00439
00442 virtual void CopyStructure(vtkGraph *g);
00443
00446 virtual bool CheckedShallowCopy(vtkGraph *g);
00447
00450 virtual bool CheckedDeepCopy(vtkGraph *g);
00451
00453 virtual void Squeeze();
00454
00455
00457
00458 static vtkGraph *GetData(vtkInformation *info);
00459 static vtkGraph *GetData(vtkInformationVector *v, int i=0);
00460
00462
00467 void ReorderOutVertices(vtkIdType v, vtkIdTypeArray *vertices);
00468
00471 bool IsSameStructure(vtkGraph *other);
00472
00474
00480 vtkIdType GetSourceVertex(vtkIdType e);
00481 vtkIdType GetTargetVertex(vtkIdType e);
00483
00484
00486
00489 void SetEdgePoints(vtkIdType e, vtkIdType npts, double* pts);
00490 void GetEdgePoints(vtkIdType e, vtkIdType& npts, double*& pts);
00491
00493
00495 vtkIdType GetNumberOfEdgePoints(vtkIdType e);
00496
00498 double* GetEdgePoint(vtkIdType e, vtkIdType i);
00499
00501 void ClearEdgePoints(vtkIdType e);
00502
00504
00506 void SetEdgePoint(vtkIdType e, vtkIdType i, double x[3]);
00507 void SetEdgePoint(vtkIdType e, vtkIdType i, double x, double y, double z)
00508 { double p[3] = {x, y, z}; this->SetEdgePoint(e, i, p); }
00510
00512
00514 void AddEdgePoint(vtkIdType e, double x[3]);
00515 void AddEdgePoint(vtkIdType e, double x, double y, double z)
00516 { double p[3] = {x, y, z}; this->AddEdgePoint(e, p); }
00518
00520
00522 void ShallowCopyEdgePoints(vtkGraph* g);
00523 void DeepCopyEdgePoints(vtkGraph* g);
00525
00529 vtkGraphInternals *GetGraphInternals(bool modifying);
00530
00533 void GetInducedEdges(vtkIdTypeArray* verts, vtkIdTypeArray* edges);
00534
00539 virtual vtkFieldData* GetAttributesAsFieldData(int type);
00540
00543 virtual vtkIdType GetNumberOfElements(int type);
00544
00546 void Dump();
00547
00554 vtkIdType GetEdgeId(vtkIdType a, vtkIdType b);
00555
00557 bool ToDirectedGraph(vtkDirectedGraph* g);
00558
00560 bool ToUndirectedGraph(vtkUndirectedGraph* g);
00561
00562 protected:
00563
00564 vtkGraph();
00565 ~vtkGraph();
00566
00568
00573 void AddVertexInternal(vtkVariantArray *propertyArr = 0,
00574 vtkIdType *vertex = 0);
00576
00581 void AddVertexInternal(const vtkVariant& pedigree, vtkIdType *vertex);
00582
00584
00588 void AddEdgeInternal(vtkIdType u, vtkIdType v, bool directed,
00589 vtkVariantArray *propertyArr, vtkEdgeType *edge);
00590 void AddEdgeInternal(const vtkVariant& uPedigree, vtkIdType v, bool directed,
00591 vtkVariantArray *propertyArr, vtkEdgeType *edge);
00592 void AddEdgeInternal(vtkIdType u, const vtkVariant& vPedigree, bool directed,
00593 vtkVariantArray *propertyArr, vtkEdgeType *edge);
00594 void AddEdgeInternal(const vtkVariant& uPedigree, const vtkVariant& vPedigree,
00595 bool directed, vtkVariantArray *propertyArr,
00596 vtkEdgeType *edge);
00598
00601 void RemoveVertexInternal(vtkIdType v, bool directed);
00602
00605 void RemoveEdgeInternal(vtkIdType e, bool directed);
00606
00609 void RemoveVerticesInternal(vtkIdTypeArray* arr, bool directed);
00610
00612
00613 void RemoveEdgesInternal(vtkIdTypeArray* arr, bool directed);
00614
00616
00619 virtual bool IsStructureValid(vtkGraph *g) = 0;
00620
00622 virtual void CopyInternal(vtkGraph *g, bool deep);
00623
00625 vtkGraphInternals *Internals;
00626
00628 vtkDistributedGraphHelper *DistributedHelper;
00629
00631 void SetInternals(vtkGraphInternals* internals);
00632
00634 vtkGraphEdgePoints *EdgePoints;
00635
00637 void SetEdgePoints(vtkGraphEdgePoints* edgePoints);
00638
00641 void ForceOwnership();
00642
00644
00645 virtual void GetOutEdges(vtkIdType v, const vtkOutEdgeType *& edges, vtkIdType & nedges);
00646 virtual void GetInEdges(vtkIdType v, const vtkInEdgeType *& edges, vtkIdType & nedges);
00648
00650 void BuildEdgeList();
00651
00652
00654
00655 friend class vtkAdjacentVertexIterator;
00656 friend class vtkEdgeListIterator;
00657 friend class vtkInEdgeIterator;
00658 friend class vtkOutEdgeIterator;
00659 friend class boost::vtk_edge_iterator;
00660 friend class boost::vtk_in_edge_pointer_iterator;
00661 friend class boost::vtk_out_edge_pointer_iterator;
00662
00664
00666
00667 vtkDataSetAttributes *VertexData;
00668 vtkDataSetAttributes *EdgeData;
00670
00672 double Bounds[6];
00673
00675 vtkTimeStamp ComputeTime;
00676
00678
00679 vtkPoints *Points;
00680 static double DefaultPoint[3];
00682
00684
00685 vtkGetObjectMacro(EdgeList, vtkIdTypeArray);
00686 virtual void SetEdgeList(vtkIdTypeArray* list);
00687 vtkIdTypeArray *EdgeList;
00688
00689 private:
00690 vtkGraph(const vtkGraph&);
00691 void operator=(const vtkGraph&);
00692 };
00694
00695
00696 bool VTK_FILTERING_EXPORT operator==(vtkEdgeBase e1, vtkEdgeBase e2);
00697 bool VTK_FILTERING_EXPORT operator!=(vtkEdgeBase e1, vtkEdgeBase e2);
00698 VTK_FILTERING_EXPORT ostream& operator<<(ostream& out, vtkEdgeBase e);
00699
00700
00701 #endif