/*========================================================================= Program: Visualization Toolkit Module: TestDiagram.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. =========================================================================*/ #include "vtkBoostDividedEdgeBundling.h" #include "vtkDataSetAttributes.h" #include "vtkFloatArray.h" #include "vtkGraphItem.h" #include "vtkMutableDirectedGraph.h" #include "vtkNew.h" #include "vtkObjectFactory.h" #include "vtkPoints.h" #include "vtkStringArray.h" #include "vtkXMLTreeReader.h" #include "vtkViewTheme.h" #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkContext2D.h" #include "vtkContextInteractorStyle.h" #include "vtkContextItem.h" #include "vtkContextActor.h" #include "vtkContextScene.h" #include "vtkContextTransform.h" #include "vtkNew.h" #include "vtkRegressionTestImage.h" //---------------------------------------------------------------------------- void BuildSampleGraph(vtkMutableDirectedGraph* graph) { vtkNew points; graph->AddVertex(); points->InsertNextPoint(20, 40, 0); graph->AddVertex(); points->InsertNextPoint(20, 80, 0); graph->AddVertex(); points->InsertNextPoint(20, 120, 0); graph->AddVertex(); points->InsertNextPoint(20, 160, 0); graph->AddVertex(); points->InsertNextPoint(380, 40, 0); graph->AddVertex(); points->InsertNextPoint(380, 80, 0); graph->AddVertex(); points->InsertNextPoint(380, 120, 0); graph->AddVertex(); points->InsertNextPoint(380, 160, 0); graph->SetPoints(points); graph->AddEdge(0, 4); graph->AddEdge(0, 5); graph->AddEdge(1, 4); graph->AddEdge(1, 5); graph->AddEdge(2, 6); graph->AddEdge(2, 7); graph->AddEdge(3, 6); graph->AddEdge(3, 7); graph->AddEdge(4, 0); graph->AddEdge(5, 0); graph->AddEdge(6, 0); } //---------------------------------------------------------------------------- void BuildGraphMLGraph(vtkMutableDirectedGraph* graph, std::string file) { vtkNew reader; reader->SetFileName(file.c_str()); reader->ReadCharDataOn(); reader->Update(); vtkTree *tree = reader->GetOutput(); vtkStringArray *keyArr = vtkArrayDownCast( tree->GetVertexData()->GetAbstractArray("key")); vtkStringArray *sourceArr = vtkArrayDownCast( tree->GetVertexData()->GetAbstractArray("source")); vtkStringArray *targetArr = vtkArrayDownCast( tree->GetVertexData()->GetAbstractArray("target")); vtkStringArray *contentArr = vtkArrayDownCast( tree->GetVertexData()->GetAbstractArray(".chardata")); double x = 0.0; double y = 0.0; vtkIdType source = 0; vtkIdType target = 0; vtkNew points; graph->SetPoints(points); for (vtkIdType i = 0; i < tree->GetNumberOfVertices(); ++i) { vtkStdString k = keyArr->GetValue(i); if (k == "x") { x = vtkVariant(contentArr->GetValue(i)).ToDouble(); } if (k == "y") { y = vtkVariant(contentArr->GetValue(i)).ToDouble(); graph->AddVertex(); points->InsertNextPoint(x, y, 0.0); } vtkStdString s = sourceArr->GetValue(i); if (s != "") { source = vtkVariant(s).ToInt(); } vtkStdString t = targetArr->GetValue(i); if (t != "") { target = vtkVariant(t).ToInt(); graph->AddEdge(source, target); } } } //---------------------------------------------------------------------------- class vtkBundledGraphItem : public vtkGraphItem { public: static vtkBundledGraphItem *New(); vtkTypeMacro(vtkBundledGraphItem, vtkGraphItem); protected: vtkBundledGraphItem() { } ~vtkBundledGraphItem() { } virtual vtkColor4ub EdgeColor(vtkIdType line, vtkIdType point); virtual float EdgeWidth(vtkIdType line, vtkIdType point); }; //---------------------------------------------------------------------------- vtkStandardNewMacro(vtkBundledGraphItem); //---------------------------------------------------------------------------- vtkColor4ub vtkBundledGraphItem::EdgeColor(vtkIdType edgeIdx, vtkIdType pointIdx) { float fraction = static_cast(pointIdx) / (this->NumberOfEdgePoints(edgeIdx) - 1); return vtkColor4ub(fraction*255, 0, 255 - fraction*255, 255); } //---------------------------------------------------------------------------- float vtkBundledGraphItem::EdgeWidth(vtkIdType vtkNotUsed(lineIdx), vtkIdType vtkNotUsed(pointIdx)) { return 4.0f; } //---------------------------------------------------------------------------- int TestBoostDividedEdgeBundling(int argc, char* argv[]) { vtkNew graph; vtkNew bundle; BuildSampleGraph(graph); //BuildGraphMLGraph(graph, "airlines_flipped.graphml"); bundle->SetInputData(graph); bundle->Update(); vtkDirectedGraph *output = bundle->GetOutput(); vtkNew actor; vtkNew graphItem; graphItem->SetGraph(output); vtkNew trans; trans->SetInteractive(true); trans->AddItem(graphItem); actor->GetScene()->AddItem(trans); vtkNew renderer; renderer->SetBackground(1.0, 1.0, 1.0); vtkNew renderWindow; renderWindow->SetSize(400, 200); renderWindow->AddRenderer(renderer); renderer->AddActor(actor); vtkNew interactorStyle; interactorStyle->SetScene(actor->GetScene()); vtkNew interactor; interactor->SetInteractorStyle(interactorStyle); interactor->SetRenderWindow(renderWindow); renderWindow->SetMultiSamples(0); renderWindow->Render(); int retVal = vtkRegressionTestImage(renderWindow); if (retVal == vtkRegressionTester::DO_INTERACTOR) { renderWindow->Render(); interactor->Start(); retVal = vtkRegressionTester::PASSED; } return !retVal; }