/*========================================================================= Program: Visualization Toolkit Module: vtkMutableDirectedGraph.cxx 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. -------------------------------------------------------------------------*/ #include "vtkMutableDirectedGraph.h" #include "vtkDataSetAttributes.h" #include "vtkGraphEdge.h" #include "vtkGraphInternals.h" #include "vtkObjectFactory.h" //------------------------------------------------------------------------------ // class vtkMutableDirectedGraph //------------------------------------------------------------------------------ vtkStandardNewMacro(vtkMutableDirectedGraph); //------------------------------------------------------------------------------ vtkMutableDirectedGraph::vtkMutableDirectedGraph() { this->GraphEdge = vtkGraphEdge::New(); } //------------------------------------------------------------------------------ vtkMutableDirectedGraph::~vtkMutableDirectedGraph() { this->GraphEdge->Delete(); } //------------------------------------------------------------------------------ vtkIdType vtkMutableDirectedGraph::SetNumberOfVertices(vtkIdType numVerts) { vtkIdType retval = -1; if (this->GetDistributedGraphHelper()) { vtkWarningMacro("SetNumberOfVertices will not work on distributed graphs."); return retval; } retval = static_cast(this->Internals->Adjacency.size()); this->Internals->Adjacency.resize(numVerts); return retval; } //------------------------------------------------------------------------------ vtkIdType vtkMutableDirectedGraph::AddVertex() { if (this->Internals->UsingPedigreeIds && this->GetDistributedGraphHelper() != nullptr) { vtkErrorMacro("Adding vertex without a pedigree ID into a distributed graph that uses pedigree " "IDs to name vertices"); } return this->AddVertex(nullptr); } //------------------------------------------------------------------------------ vtkIdType vtkMutableDirectedGraph::AddVertex(vtkVariantArray* propertyArr) { if (this->GetVertexData()->GetPedigreeIds() != nullptr) { this->Internals->UsingPedigreeIds = true; } vtkIdType vertex; this->AddVertexInternal(propertyArr, &vertex); return vertex; } //------------------------------------------------------------------------------ vtkIdType vtkMutableDirectedGraph::AddVertex(const vtkVariant& pedigreeId) { this->Internals->UsingPedigreeIds = true; vtkIdType vertex; this->AddVertexInternal(pedigreeId, &vertex); return vertex; } //------------------------------------------------------------------------------ vtkEdgeType vtkMutableDirectedGraph::AddEdge(vtkIdType u, vtkIdType v) { return this->AddEdge(u, v, nullptr); } //------------------------------------------------------------------------------ vtkEdgeType vtkMutableDirectedGraph::AddEdge(vtkIdType u, vtkIdType v, vtkVariantArray* propertyArr) { vtkEdgeType e; this->AddEdgeInternal(u, v, true, propertyArr, &e); return e; } //------------------------------------------------------------------------------ vtkEdgeType vtkMutableDirectedGraph::AddEdge( const vtkVariant& u, vtkIdType v, vtkVariantArray* propertyArr) { this->Internals->UsingPedigreeIds = true; vtkEdgeType e; this->AddEdgeInternal(u, v, true, propertyArr, &e); return e; } //------------------------------------------------------------------------------ vtkEdgeType vtkMutableDirectedGraph::AddEdge( vtkIdType u, const vtkVariant& v, vtkVariantArray* propertyArr) { this->Internals->UsingPedigreeIds = true; vtkEdgeType e; this->AddEdgeInternal(u, v, true, propertyArr, &e); return e; } //------------------------------------------------------------------------------ vtkEdgeType vtkMutableDirectedGraph::AddEdge( const vtkVariant& u, const vtkVariant& v, vtkVariantArray* propertyArr) { this->Internals->UsingPedigreeIds = true; vtkEdgeType e; this->AddEdgeInternal(u, v, true, propertyArr, &e); return e; } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddVertex() { if (this->Internals->UsingPedigreeIds && this->GetDistributedGraphHelper() != nullptr) { vtkErrorMacro("Adding vertex without a pedigree ID into a distributed graph that uses pedigree " "IDs to name vertices"); } this->LazyAddVertex(nullptr); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddVertex(vtkVariantArray* propertyArr) { if (this->GetVertexData()->GetPedigreeIds() != nullptr) { this->Internals->UsingPedigreeIds = true; } this->AddVertexInternal(propertyArr, nullptr); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddVertex(const vtkVariant& pedigreeId) { this->Internals->UsingPedigreeIds = true; this->AddVertexInternal(pedigreeId, nullptr); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddEdge(vtkIdType u, vtkIdType v, vtkVariantArray* propertyArr) { this->AddEdgeInternal(u, v, true, propertyArr, nullptr); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddEdge( const vtkVariant& u, vtkIdType v, vtkVariantArray* propertyArr) { this->Internals->UsingPedigreeIds = true; this->AddEdgeInternal(u, v, true, propertyArr, nullptr); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddEdge( vtkIdType u, const vtkVariant& v, vtkVariantArray* propertyArr) { this->Internals->UsingPedigreeIds = true; this->AddEdgeInternal(u, v, true, propertyArr, nullptr); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::LazyAddEdge( const vtkVariant& u, const vtkVariant& v, vtkVariantArray* propertyArr) { this->Internals->UsingPedigreeIds = true; this->AddEdgeInternal(u, v, true, propertyArr, nullptr); } //------------------------------------------------------------------------------ vtkGraphEdge* vtkMutableDirectedGraph::AddGraphEdge(vtkIdType u, vtkIdType v) { vtkEdgeType e = this->AddEdge(u, v); this->GraphEdge->SetSource(e.Source); this->GraphEdge->SetTarget(e.Target); this->GraphEdge->SetId(e.Id); return this->GraphEdge; } //------------------------------------------------------------------------------ vtkIdType vtkMutableDirectedGraph::AddChild(vtkIdType parent, vtkVariantArray* propertyArr /* = 0*/) { vtkIdType v = this->AddVertex(); this->AddEdge(parent, v, propertyArr); return v; } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::RemoveVertex(vtkIdType v) { this->RemoveVertexInternal(v, true); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::RemoveEdge(vtkIdType e) { this->RemoveEdgeInternal(e, true); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::RemoveVertices(vtkIdTypeArray* arr) { this->RemoveVerticesInternal(arr, true); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::RemoveEdges(vtkIdTypeArray* arr) { this->RemoveEdgesInternal(arr, true); } //------------------------------------------------------------------------------ void vtkMutableDirectedGraph::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); }