/usr/include/vtk-7.1/vtkGraph.h is in libvtk7-dev 7.1.1+dfsg1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 | /*=========================================================================
Program: Visualization Toolkit
Module: vtkGraph.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/*-------------------------------------------------------------------------
Copyright 2008 Sandia Corporation.
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
the U.S. Government retains certain rights in this software.
-------------------------------------------------------------------------*/
/**
* @class vtkGraph
* @brief Base class for graph data types.
*
*
* vtkGraph is the abstract base class that provides all read-only API for graph
* data types. A graph consists of a collection of vertices and a
* collection of edges connecting pairs of vertices. The vtkDirectedGraph
* subclass represents a graph whose edges have inherent order from source
* vertex to target vertex, while vtkUndirectedGraph is a graph whose edges
* have no inherent ordering.
*
* Graph vertices may be traversed in two ways. In the current implementation,
* all vertices are assigned consecutive ids starting at zero, so they may
* be traversed in a simple for loop from 0 to graph->GetNumberOfVertices() - 1.
* You may alternately create a vtkVertexListIterator and call graph->GetVertices(it).
* it->Next() will return the id of the next vertex, while it->HasNext() indicates
* whether there are more vertices in the graph.
* This is the preferred method, since in the future graphs may support filtering
* or subsetting where the vertex ids may not be contiguous.
*
* Graph edges must be traversed through iterators. To traverse all edges
* in a graph, create an instance of vtkEdgeListIterator and call graph->GetEdges(it).
* it->Next() returns lightweight vtkEdgeType structures, which contain the public
* fields Id, Source and Target. Id is the identifier for the edge, which may
* be used to look up values in assiciated edge data arrays. Source and Target
* store the ids of the source and target vertices of the edge. Note that the
* edge list iterator DOES NOT necessarily iterate over edges in order of ascending
* id. To traverse edges from wrapper code (Python, Tcl, Java), use
* it->NextGraphEdge() instead of it->Next(). This will return a heavyweight,
* wrappable vtkGraphEdge object, which has the same fields as vtkEdgeType
* accessible through getter methods.
*
* To traverse all edges outgoing from a vertex, create a vtkOutEdgeIterator and
* call graph->GetOutEdges(v, it). it->Next() returns a lightweight vtkOutEdgeType
* containing the fields Id and Target. The source of the edge is always the
* vertex that was passed as an argument to GetOutEdges().
* Incoming edges may be similarly traversed with vtkInEdgeIterator, which returns
* vtkInEdgeType structures with Id and Source fields.
* Both vtkOutEdgeIterator and vtkInEdgeIterator also provide the wrapper functions
* NextGraphEdge() which return vtkGraphEdge objects.
*
* An additional iterator, vtkAdjacentVertexIterator can traverse outgoing vertices
* directly, instead needing to parse through edges. Initialize the iterator by
* calling graph->GetAdjacentVertices(v, it).
*
* vtkGraph has two instances of vtkDataSetAttributes for associated
* vertex and edge data. It also has a vtkPoints instance which may store
* x,y,z locations for each vertex. This is populated by filters such as
* vtkGraphLayout and vtkAssignCoordinates.
*
* All graph types share the same implementation, so the structure of one
* may be shared among multiple graphs, even graphs of different types.
* Structures from vtkUndirectedGraph and vtkMutableUndirectedGraph may be
* shared directly. Structures from vtkDirectedGraph, vtkMutableDirectedGraph,
* and vtkTree may be shared directly with the exception that setting a
* structure to a tree requires that a "is a tree" test passes.
*
* For graph types that are known to be compatible, calling ShallowCopy()
* or DeepCopy() will work as expected. When the outcome of a conversion
* is unknown (i.e. setting a graph to a tree), CheckedShallowCopy() and
* CheckedDeepCopy() exist which are identical to ShallowCopy() and DeepCopy(),
* except that instead of emitting an error for an incompatible structure,
* the function returns false. This allows you to programmatically check
* structure compatibility without causing error messages.
*
* To construct a graph, use vtkMutableDirectedGraph or
* vtkMutableUndirectedGraph. You may then use CheckedShallowCopy
* to set the contents of a mutable graph type into one of the non-mutable
* types vtkDirectedGraph, vtkUndirectedGraph.
* To construct a tree, use vtkMutableDirectedGraph, with directed edges
* which point from the parent to the child, then use CheckedShallowCopy
* to set the structure to a vtkTree.
*
* @warning
* All copy operations implement copy-on-write. The structures are initially
* shared, but if one of the graphs is modified, the structure is copied
* so that to the user they function as if they were deep copied. This means
* that care must be taken if different threads are accessing different graph
* instances that share the same structure. Race conditions may develop if
* one thread is modifying the graph at the same time that another graph is
* copying the structure.
*
* @par Vertex pedigree IDs:
* The vertices in a vtkGraph can be associated with pedigree IDs
* through GetVertexData()->SetPedigreeIds. In this case, there is a
* 1-1 mapping between pedigree Ids and vertices. One can query the
* vertex ID based on the pedigree ID using FindVertex, add new
* vertices by pedigree ID with AddVertex, and add edges based on the
* pedigree IDs of the source and target vertices. For example,
* AddEdge("Here", "There") will find (or add) vertices with pedigree
* ID "Here" and "There" and then introduce an edge from "Here" to
* "There".
*
* @par Vertex pedigree IDs:
* To configure the vtkGraph with a pedigree ID mapping, create a
* vtkDataArray that will store the pedigree IDs and set that array as
* the pedigree ID array for the vertices via
* GetVertexData()->SetPedigreeIds().
*
*
* @par Distributed graphs:
* vtkGraph instances can be distributed across multiple machines, to
* allow the construction and manipulation of graphs larger than a
* single machine could handle. A distributed graph will typically be
* distributed across many different nodes within a cluster, using the
* Message Passing Interface (MPI) to allow those cluster nodes to
* communicate.
*
* @par Distributed graphs:
* An empty vtkGraph can be made into a distributed graph by attaching
* an instance of a vtkDistributedGraphHelper via the
* SetDistributedGraphHelper() method. To determine whether a graph is
* distributed or not, call GetDistributedGraphHelper() and check
* whether the result is non-NULL. For a distributed graph, the number
* of processors across which the graph is distributed can be
* retrieved by extracting the value for the DATA_NUMBER_OF_PIECES key
* in the vtkInformation object (retrieved by GetInformation())
* associated with the graph. Similarly, the value corresponding to
* the DATA_PIECE_NUMBER key of the vtkInformation object describes
* which piece of the data this graph instance provides.
*
* @par Distributed graphs:
* Distributed graphs behave somewhat differently from non-distributed
* graphs, and will require special care. In a distributed graph, each
* of the processors will contain a subset of the vertices in the
* graph. That subset of vertices can be accessed via the
* vtkVertexListIterator produced by GetVertices().
* GetNumberOfVertices(), therefore, returns the number of vertices
* stored locally: it does not account for vertices stored on other
* processors. A vertex (or edge) is identified by both the rank of
* its owning processor and by its index within that processor, both
* of which are encoded within the vtkIdType value that describes that
* vertex (or edge). The owning processor is a value between 0 and
* P-1, where P is the number of processors across which the vtkGraph
* has been distributed. The local index will be a value between 0 and
* GetNumberOfVertices(), for vertices, or GetNumberOfEdges(), for
* edges, and can be used to access the local parts of distributed
* data arrays. When given a vtkIdType identifying a vertex, one can
* determine the owner of the vertex with
* vtkDistributedGraphHelper::GetVertexOwner() and the local index
* with vtkDistributedGraphHelper::GetVertexIndex(). With edges, the
* appropriate methods are vtkDistributedGraphHelper::GetEdgeOwner()
* and vtkDistributedGraphHelper::GetEdgeIndex(), respectively. To
* construct a vtkIdType representing either a vertex or edge given
* only its owner and local index, use
* vtkDistributedGraphHelper::MakeDistributedId().
*
* @par Distributed graphs:
* The edges in a distributed graph are always stored on the
* processors that own the vertices named by the edge. For example,
* given a directed edge (u, v), the edge will be stored in the
* out-edges list for vertex u on the processor that owns u, and in
* the in-edges list for vertex v on the processor that owns v. This
* "row-wise" decomposition of the graph means that, for any vertex
* that is local to a processor, that processor can look at all of the
* incoming and outgoing edges of the graph. Processors cannot,
* however, access the incoming or outgoing edge lists of vertex owned
* by other processors. Vertices owned by other processors will not be
* encountered when traversing the vertex list via GetVertices(), but
* may be encountered by traversing the in- and out-edge lists of
* local vertices or the edge list.
*
* @par Distributed graphs:
* Distributed graphs can have pedigree IDs for the vertices in the
* same way that non-distributed graphs can. In this case, the
* distribution of the vertices in the graph is based on pedigree
* ID. For example, a vertex with the pedigree ID "Here" might land on
* processor 0 while a vertex pedigree ID "There" would end up on
* processor 3. By default, the pedigree IDs themselves are hashed to
* give a random (and, hopefully, even) distribution of the
* vertices. However, one can provide a different vertex distribution
* function by calling
* vtkDistributedGraphHelper::SetVertexPedigreeIdDistribution. Once a
* distributed graph has pedigree IDs, the no-argument AddVertex()
* method can no longer be used. Additionally, once a vertex has a
* pedigree ID, that pedigree ID should not be changed unless the user
* can guarantee that the vertex distribution will still map that
* vertex to the same processor where it already resides.
*
* @sa
* vtkDirectedGraph vtkUndirectedGraph vtkMutableDirectedGraph
* vtkMutableUndirectedGraph vtkTree vtkDistributedGraphHelper
*
* @par Thanks:
* Thanks to Brian Wylie, Timothy Shead, Ken Moreland of Sandia National
* Laboratories and Douglas Gregor of Indiana University for designing these
* classes.
*/
#ifndef vtkGraph_h
#define vtkGraph_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkDataObject.h"
class vtkAdjacentVertexIterator;
class vtkCellArray;
class vtkEdgeListIterator;
class vtkDataSetAttributes;
class vtkDirectedGraph;
class vtkGraphEdge;
class vtkGraphEdgePoints;
class vtkDistributedGraphHelper;
class vtkGraphInternals;
class vtkIdTypeArray;
class vtkInEdgeIterator;
class vtkOutEdgeIterator;
class vtkPoints;
class vtkUndirectedGraph;
class vtkVertexListIterator;
class vtkVariant;
class vtkVariantArray;
// Forward declare some boost stuff even if boost wrappers
// are turned off.
namespace boost
{
class vtk_edge_iterator;
class vtk_out_edge_pointer_iterator;
class vtk_in_edge_pointer_iterator;
}
// Edge structures.
struct vtkEdgeBase
{
vtkEdgeBase() { }
vtkEdgeBase(vtkIdType id) :
Id(id) { }
vtkIdType Id;
};
struct vtkOutEdgeType : vtkEdgeBase
{
vtkOutEdgeType() { }
vtkOutEdgeType(vtkIdType t, vtkIdType id) :
vtkEdgeBase(id),
Target(t) { }
vtkIdType Target;
};
struct vtkInEdgeType : vtkEdgeBase
{
vtkInEdgeType() { }
vtkInEdgeType(vtkIdType s, vtkIdType id) :
vtkEdgeBase(id),
Source(s) { }
vtkIdType Source;
};
struct vtkEdgeType : vtkEdgeBase
{
vtkEdgeType() { }
vtkEdgeType(vtkIdType s, vtkIdType t, vtkIdType id) :
vtkEdgeBase(id),
Source(s),
Target(t) { }
vtkIdType Source;
vtkIdType Target;
};
class VTKCOMMONDATAMODEL_EXPORT vtkGraph : public vtkDataObject
{
public:
vtkTypeMacro(vtkGraph, vtkDataObject);
void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
//@{
/**
* Get the vertex or edge data.
*/
vtkGetObjectMacro(VertexData, vtkDataSetAttributes);
vtkGetObjectMacro(EdgeData, vtkDataSetAttributes);
//@}
/**
* Return what type of dataset this is.
*/
int GetDataObjectType() VTK_OVERRIDE {return VTK_GRAPH;}
/**
* Initialize to an empty graph.
*/
void Initialize() VTK_OVERRIDE;
//@{
/**
* These methods return the point (0,0,0) until the points structure
* is created, when it returns the actual point position. In a
* distributed graph, only the points for local vertices can be
* retrieved.
*/
double *GetPoint(vtkIdType ptId);
void GetPoint(vtkIdType ptId, double x[3]);
//@}
//@{
/**
* Returns the points array for this graph.
* If points is not yet constructed, generates and returns
* a new points array filled with (0,0,0) coordinates. In a
* distributed graph, only the points for local vertices can be
* retrieved or modified.
*/
vtkPoints* GetPoints();
virtual void SetPoints(vtkPoints *points);
//@}
/**
* Compute the bounds of the graph. In a distributed graph, this
* computes the bounds around the local part of the graph.
*/
void ComputeBounds();
//@{
/**
* Return a pointer to the geometry bounding box in the form
* (xmin,xmax, ymin,ymax, zmin,zmax). In a distributed graph, this
* computes the bounds around the local part of the graph.
*/
double *GetBounds();
void GetBounds(double bounds[6]);
//@}
/**
* The modified time of the graph.
*/
vtkMTimeType GetMTime() VTK_OVERRIDE;
/**
* Initializes the out edge iterator to iterate over
* all outgoing edges of vertex v. For an undirected graph,
* returns all incident edges. In a distributed graph, the vertex
* v must be local to this processor.
*/
virtual void GetOutEdges(vtkIdType v, vtkOutEdgeIterator *it);
/**
* The total of all incoming and outgoing vertices for vertex v.
* For undirected graphs, this is simply the number of edges incident
* to v. In a distributed graph, the vertex v must be local to this
* processor.
*/
virtual vtkIdType GetDegree(vtkIdType v);
/**
* The number of outgoing edges from vertex v.
* For undirected graphs, returns the same as GetDegree(). In a
* distributed graph, the vertex v must be local to this processor.
*/
virtual vtkIdType GetOutDegree(vtkIdType v);
/**
* Random-access method for retrieving outgoing edges from vertex v.
*/
virtual vtkOutEdgeType GetOutEdge(vtkIdType v, vtkIdType index);
/**
* Random-access method for retrieving outgoing edges from vertex v.
* The method fills the vtkGraphEdge instance with the id, source, and
* target of the edge. This method is provided for wrappers,
* GetOutEdge(vtkIdType, vtkIdType) is preferred.
*/
virtual void GetOutEdge(vtkIdType v, vtkIdType index, vtkGraphEdge* e);
/**
* Initializes the in edge iterator to iterate over
* all incoming edges to vertex v. For an undirected graph,
* returns all incident edges. In a distributed graph, the vertex
* v must be local to this processor.
*/
virtual void GetInEdges(vtkIdType v, vtkInEdgeIterator *it);
/**
* The number of incoming edges to vertex v.
* For undirected graphs, returns the same as GetDegree(). In a
* distributed graph, the vertex v must be local to this processor.
*/
virtual vtkIdType GetInDegree(vtkIdType v);
/**
* Random-access method for retrieving incoming edges to vertex v.
*/
virtual vtkInEdgeType GetInEdge(vtkIdType v, vtkIdType index);
/**
* Random-access method for retrieving incoming edges to vertex v.
* The method fills the vtkGraphEdge instance with the id, source, and
* target of the edge. This method is provided for wrappers,
* GetInEdge(vtkIdType, vtkIdType) is preferred.
*/
virtual void GetInEdge(vtkIdType v, vtkIdType index, vtkGraphEdge* e);
/**
* Initializes the adjacent vertex iterator to iterate over
* all outgoing vertices from vertex v. For an undirected graph,
* returns all adjacent vertices. In a distributed graph, the vertex
* v must be local to this processor.
*/
virtual void GetAdjacentVertices(vtkIdType v, vtkAdjacentVertexIterator *it);
/**
* Initializes the edge list iterator to iterate over all
* edges in the graph. Edges may not be traversed in order of
* increasing edge id. In a distributed graph, this returns edges
* that are stored locally.
*/
virtual void GetEdges(vtkEdgeListIterator *it);
/**
* The number of edges in the graph. In a distributed graph,
* this returns the number of edges stored locally.
*/
virtual vtkIdType GetNumberOfEdges();
/**
* Initializes the vertex list iterator to iterate over all
* vertices in the graph. In a distributed graph, the iterator
* traverses all local vertices.
*/
virtual void GetVertices(vtkVertexListIterator *it);
/**
* The number of vertices in the graph. In a distributed graph,
* returns the number of local vertices in the graph.
*/
virtual vtkIdType GetNumberOfVertices();
/**
* Sets the distributed graph helper of this graph, turning it into a
* distributed graph. This operation can only be executed on an empty
* graph.
*/
void SetDistributedGraphHelper(vtkDistributedGraphHelper *helper);
/**
* Retrieves the distributed graph helper for this graph
*/
vtkDistributedGraphHelper *GetDistributedGraphHelper();
/**
* Retrieve the vertex with the given pedigree ID. If successful,
* returns the ID of the vertex. Otherwise, either the vertex data
* does not have a pedigree ID array or there is no vertex with the
* given pedigree ID, so this function returns -1.
* If the graph is a distributed graph, this method will return the
* Distributed-ID of the vertex.
*/
vtkIdType FindVertex(const vtkVariant& pedigreeID);
/**
* Shallow copies the data object into this graph.
* If it is an incompatible graph, reports an error.
*/
void ShallowCopy(vtkDataObject *obj) VTK_OVERRIDE;
/**
* Deep copies the data object into this graph.
* If it is an incompatible graph, reports an error.
*/
void DeepCopy(vtkDataObject *obj) VTK_OVERRIDE;
/**
* Does a shallow copy of the topological information,
* but not the associated attributes.
*/
virtual void CopyStructure(vtkGraph *g);
/**
* Performs the same operation as ShallowCopy(),
* but instead of reporting an error for an incompatible graph,
* returns false.
*/
virtual bool CheckedShallowCopy(vtkGraph *g);
/**
* Performs the same operation as DeepCopy(),
* but instead of reporting an error for an incompatible graph,
* returns false.
*/
virtual bool CheckedDeepCopy(vtkGraph *g);
/**
* Reclaim unused memory.
*/
virtual void Squeeze();
//@{
/**
* Retrieve a graph from an information vector.
*/
static vtkGraph *GetData(vtkInformation *info);
static vtkGraph *GetData(vtkInformationVector *v, int i=0);
//@}
/**
* Reorder the outgoing vertices of a vertex.
* The vertex list must have the same elements as the current out edge
* list, just in a different order.
* This method does not change the topology of the graph.
* In a distributed graph, the vertex v must be local.
*/
void ReorderOutVertices(vtkIdType v, vtkIdTypeArray *vertices);
/**
* Returns true if both graphs point to the same adjacency structure.
* Can be used to test the copy-on-write feature of the graph.
*/
bool IsSameStructure(vtkGraph *other);
//@{
/**
* Retrieve the source and target vertices for an edge id.
* NOTE: The first time this is called, the graph will build
* a mapping array from edge id to source/target that is the
* same size as the number of edges in the graph. If you have
* access to a vtkOutEdgeType, vtkInEdgeType, vtkEdgeType, or
* vtkGraphEdge, you should directly use these structures
* to look up the source or target instead of this method.
*/
vtkIdType GetSourceVertex(vtkIdType e);
vtkIdType GetTargetVertex(vtkIdType e);
//@}
//@{
/**
* Get/Set the internal edge control points associated with each edge.
* The size of the pts array is 3*npts, and holds the x,y,z
* location of each edge control point.
*/
void SetEdgePoints(vtkIdType e, vtkIdType npts, double* pts);
void GetEdgePoints(vtkIdType e, vtkIdType& npts, double*& pts);
//@}
/**
* Get the number of edge points associated with an edge.
*/
vtkIdType GetNumberOfEdgePoints(vtkIdType e);
/**
* Get the x,y,z location of a point along edge e.
*/
double* GetEdgePoint(vtkIdType e, vtkIdType i);
/**
* Clear all points associated with an edge.
*/
void ClearEdgePoints(vtkIdType e);
/**
* Set an x,y,z location of a point along an edge.
* This assumes there is already a point at location i, and simply
* overwrites it.
*/
void SetEdgePoint(vtkIdType e, vtkIdType i, double x[3]);
void SetEdgePoint(vtkIdType e, vtkIdType i, double x, double y, double z)
{ double p[3] = {x, y, z}; this->SetEdgePoint(e, i, p); }
/**
* Adds a point to the end of the list of edge points for a certain edge.
*/
void AddEdgePoint(vtkIdType e, double x[3]);
void AddEdgePoint(vtkIdType e, double x, double y, double z)
{ double p[3] = {x, y, z}; this->AddEdgePoint(e, p); }
//@{
/**
* Copy the internal edge point data from another graph into this graph.
* Both graphs must have the same number of edges.
*/
void ShallowCopyEdgePoints(vtkGraph* g);
void DeepCopyEdgePoints(vtkGraph* g);
//@}
/**
* Returns the internal representation of the graph. If modifying is
* true, then the returned vtkGraphInternals object will be unique to
* this vtkGraph object.
*/
vtkGraphInternals *GetGraphInternals(bool modifying);
/**
* Fills a list of edge indices with the edges contained in the induced
* subgraph formed by the vertices in the vertex list.
*/
void GetInducedEdges(vtkIdTypeArray* verts, vtkIdTypeArray* edges);
/**
* Returns the attributes of the data object as a vtkFieldData.
* This returns non-null values in all the same cases as GetAttributes,
* in addition to the case of FIELD, which will return the field data
* for any vtkDataObject subclass.
*/
vtkFieldData* GetAttributesAsFieldData(int type) VTK_OVERRIDE;
/**
* Get the number of elements for a specific attribute type (VERTEX, EDGE, etc.).
*/
vtkIdType GetNumberOfElements(int type) VTK_OVERRIDE;
/**
* Dump the contents of the graph to standard output.
*/
void Dump();
/**
* Returns the Id of the edge between vertex a and vertex b.
* This is independent of directionality of the edge, that is,
* if edge A->B exists or if edge B->A exists, this function will
* return its Id. If multiple edges exist between a and b, here is no guarantee
* about which one will be returned.
* Returns -1 if no edge exists between a and b.
*/
vtkIdType GetEdgeId(vtkIdType a, vtkIdType b);
/**
* Convert the graph to a directed graph.
*/
bool ToDirectedGraph(vtkDirectedGraph* g);
/**
* Convert the graph to an undirected graph.
*/
bool ToUndirectedGraph(vtkUndirectedGraph* g);
protected:
vtkGraph();
~vtkGraph() VTK_OVERRIDE;
/**
* Protected method for adding vertices, optionally with properties,
* used by mutable subclasses. If vertex is non-null, it will be set
* to the newly-added (or found) vertex. Note that if propertyArr is
* non-null and the vertex data contains pedigree IDs, a vertex will
* only be added if there is no vertex with that pedigree ID.
*/
void AddVertexInternal(vtkVariantArray *propertyArr = 0,
vtkIdType *vertex = 0);
/**
* Adds a vertex with the given pedigree ID to the graph. If a vertex with
* this pedigree ID already exists, no new vertex is added, but the vertex
* argument is set to the ID of the existing vertex. Otherwise, a
* new vertex is added and its ID is provided.
*/
void AddVertexInternal(const vtkVariant& pedigree, vtkIdType *vertex);
//@{
/**
* Protected method for adding edges of a certain directedness used
* by mutable subclasses. If propertyArr is non-null, it specifies
* the properties to be attached to the newly-created edge. If
* non-null, edge will receive the newly-added edge.
*/
void AddEdgeInternal(vtkIdType u, vtkIdType v, bool directed,
vtkVariantArray *propertyArr, vtkEdgeType *edge);
void AddEdgeInternal(const vtkVariant& uPedigree, vtkIdType v, bool directed,
vtkVariantArray *propertyArr, vtkEdgeType *edge);
void AddEdgeInternal(vtkIdType u, const vtkVariant& vPedigree, bool directed,
vtkVariantArray *propertyArr, vtkEdgeType *edge);
void AddEdgeInternal(const vtkVariant& uPedigree, const vtkVariant& vPedigree,
bool directed, vtkVariantArray *propertyArr,
vtkEdgeType *edge);
//@}
/**
* Removes a vertex from the graph, along with any adjacent edges.
* This invalidates the id of the last vertex, since it is reassigned to v.
*/
void RemoveVertexInternal(vtkIdType v, bool directed);
/**
* Removes an edge from the graph.
* This invalidates the id of the last edge, since it is reassigned to e.
*/
void RemoveEdgeInternal(vtkIdType e, bool directed);
/**
* Removes a collection of vertices from the graph, along with any adjacent edges.
*/
void RemoveVerticesInternal(vtkIdTypeArray* arr, bool directed);
/**
* Removes a collection of edges from the graph.
*/
void RemoveEdgesInternal(vtkIdTypeArray* arr, bool directed);
/**
* Subclasses override this method to accept the structure
* based on their requirements.
*/
virtual bool IsStructureValid(vtkGraph *g) = 0;
/**
* Copy internal data structure.
*/
virtual void CopyInternal(vtkGraph *g, bool deep);
/**
* The adjacency list internals of this graph.
*/
vtkGraphInternals *Internals;
/**
* The distributed graph helper. Only non-NULL for distributed graphs.
*/
vtkDistributedGraphHelper *DistributedHelper;
/**
* Private method for setting internals.
*/
void SetInternals(vtkGraphInternals* internals);
/**
* The structure for holding the edge points.
*/
vtkGraphEdgePoints *EdgePoints;
/**
* Private method for setting edge points.
*/
void SetEdgePoints(vtkGraphEdgePoints* edgePoints);
/**
* If this instance does not own its internals, it makes a copy of the
* internals. This is called before any write operation.
*/
void ForceOwnership();
//@{
/**
* Fast access functions for iterators.
*/
virtual void GetOutEdges(vtkIdType v, const vtkOutEdgeType *& edges, vtkIdType & nedges);
virtual void GetInEdges(vtkIdType v, const vtkInEdgeType *& edges, vtkIdType & nedges);
//@}
/**
* Builds a mapping from edge id to source/target vertex id.
*/
void BuildEdgeList();
//@{
/**
* Friend iterator classes.
*/
friend class vtkAdjacentVertexIterator;
friend class vtkEdgeListIterator;
friend class vtkInEdgeIterator;
friend class vtkOutEdgeIterator;
friend class boost::vtk_edge_iterator;
friend class boost::vtk_in_edge_pointer_iterator;
friend class boost::vtk_out_edge_pointer_iterator;
//@}
//@{
/**
* The vertex and edge data.
*/
vtkDataSetAttributes *VertexData;
vtkDataSetAttributes *EdgeData;
//@}
/**
* (xmin,xmax, ymin,ymax, zmin,zmax) geometric bounds.
*/
double Bounds[6];
/**
* Time at which bounds were computed.
*/
vtkTimeStamp ComputeTime;
//@{
/**
* The vertex locations.
*/
vtkPoints *Points;
static double DefaultPoint[3];
//@}
//@{
/**
* The optional mapping from edge id to source/target ids.
*/
vtkGetObjectMacro(EdgeList, vtkIdTypeArray);
virtual void SetEdgeList(vtkIdTypeArray* list);
vtkIdTypeArray *EdgeList;
//@}
private:
vtkGraph(const vtkGraph&) VTK_DELETE_FUNCTION;
void operator=(const vtkGraph&) VTK_DELETE_FUNCTION;
};
bool VTKCOMMONDATAMODEL_EXPORT operator==(vtkEdgeBase e1, vtkEdgeBase e2);
bool VTKCOMMONDATAMODEL_EXPORT operator!=(vtkEdgeBase e1, vtkEdgeBase e2);
VTKCOMMONDATAMODEL_EXPORT ostream& operator<<(ostream& out, vtkEdgeBase e);
#endif
|