Skip to content

GraphAlgorithmFilter

vtk-examples/Cxx/Developers/GraphAlgorithmFilter

Description

This example demonstrates how to create a filter that takes a vtkGraph as input and produces a vtkGraph as output.

You will need the following in your CMakeLists.txt file:

find_package(VTK
 COMPONENTS
    CommonCore
    CommonDataModel
    CommonExecutionModel
    FiltersSources
    InfovisCore
)

Question

If you have a question about this example, please use the VTK Discourse Forum

Code

GraphAlgorithmFilter.cxx

#include <vtkGraph.h>
#include <vtkMutableDirectedGraph.h>
#include <vtkMutableUndirectedGraph.h>
#include <vtkNew.h>

#include "vtkTestGraphAlgorithmFilter.h"

void TestDirected();
void TestUndirected();

int main(int, char*[])
{
  TestDirected();
  TestUndirected();

  return EXIT_SUCCESS;
}

void TestDirected()
{

  vtkNew<vtkMutableDirectedGraph> g;
  vtkIdType v1 = g->AddVertex();
  vtkIdType v2 = g->AddVertex();

  g->AddEdge(v1, v2);
  std::cout << "Input type: " << g->GetClassName() << std::endl;

  vtkNew<vtkTestGraphAlgorithmFilter> filter;
  filter->SetInputData(g);
  filter->Update();

  std::cout << "Output type: " << filter->GetOutput()->GetClassName()
            << std::endl;
  std::cout << "Output has " << filter->GetOutput()->GetNumberOfVertices()
            << " vertices." << std::endl;
  std::cout << std::endl;
}

void TestUndirected()
{
  std::cout << "TestUndirected" << std::endl;
  vtkNew<vtkMutableUndirectedGraph> g;
  vtkIdType v1 = g->AddVertex();
  vtkIdType v2 = g->AddVertex();

  g->AddEdge(v1, v2);
  std::cout << "Input type: " << g->GetClassName() << std::endl;

  vtkNew<vtkTestGraphAlgorithmFilter> filter;
  filter->SetInputData(g);
  filter->Update();

  std::cout << "Output type: " << filter->GetOutput()->GetClassName()
            << std::endl;
  std::cout << "Output has " << filter->GetOutput()->GetNumberOfVertices()
            << " vertices." << std::endl;
}

vtkTestGraphAlgorithmFilter.h

#ifndef __vtkTestGraphAlgorithmFilter_h
#define __vtkTestGraphAlgorithmFilter_h

#include <vtkGraphAlgorithm.h>

class vtkTestGraphAlgorithmFilter : public vtkGraphAlgorithm
{
public:
  vtkTypeMacro(vtkTestGraphAlgorithmFilter, vtkGraphAlgorithm);
  static vtkTestGraphAlgorithmFilter* New();

protected:
  vtkTestGraphAlgorithmFilter()
  {
  }
  ~vtkTestGraphAlgorithmFilter()
  {
  }

  int RequestData(vtkInformation*, vtkInformationVector**,
                  vtkInformationVector*) override;

private:
  vtkTestGraphAlgorithmFilter(
      const vtkTestGraphAlgorithmFilter&);            // Not implemented.
  void operator=(const vtkTestGraphAlgorithmFilter&); // Not implemented.
};

#endif

vtkTestGraphAlgorithmFilter.cxx

#include "vtkTestGraphAlgorithmFilter.h"

#include <vtkDataObject.h>
#include <vtkInformation.h>
#include <vtkInformationVector.h>
#include <vtkMutableDirectedGraph.h>
#include <vtkMutableGraphHelper.h>
#include <vtkMutableUndirectedGraph.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkStreamingDemandDrivenPipeline.h>

vtkStandardNewMacro(vtkTestGraphAlgorithmFilter);

int vtkTestGraphAlgorithmFilter::RequestData(
    vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector,
    vtkInformationVector* outputVector)
{

  // get the info objects
  vtkInformation* inInfo = inputVector[0]->GetInformationObject(0);
  vtkInformation* outInfo = outputVector->GetInformationObject(0);

  // get the input and ouptut
  vtkGraph* input =
      dynamic_cast<vtkGraph*>(inInfo->Get(vtkDataObject::DATA_OBJECT()));

  vtkGraph* output =
      dynamic_cast<vtkGraph*>(outInfo->Get(vtkDataObject::DATA_OBJECT()));

  vtkNew<vtkMutableDirectedGraph> mdg;

  vtkNew<vtkMutableUndirectedGraph> mug;

  if (input->IsA("vtkMutableUndirectedGraph"))
  {
    vtkNew<vtkMutableUndirectedGraph> ug;
    ug->AddVertex();
    output->ShallowCopy(ug);
  }
  else if (input->IsA("vtkMutableDirectedGraph"))
  {
    vtkNew<vtkMutableDirectedGraph> dg;
    dg->AddVertex();
    output->ShallowCopy(dg);
  }

  std::cout << "Output is type: " << output->GetClassName() << std::endl;

  return 1;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(GraphAlgorithmFilter)

find_package(VTK COMPONENTS 
  CommonCore
  CommonDataModel
)

if (NOT VTK_FOUND)
  message(FATAL_ERROR "GraphAlgorithmFilter: Unable to find the VTK build folder.")
endif()

# Prevent a "command line is too long" failure in Windows.
set(CMAKE_NINJA_FORCE_RESPONSE_FILE "ON" CACHE BOOL "Force Ninja to use response files.")
add_executable(GraphAlgorithmFilter MACOSX_BUNDLE GraphAlgorithmFilter.cxx )
  target_link_libraries(GraphAlgorithmFilter PRIVATE ${VTK_LIBRARIES}
)
# vtk_module_autoinit is needed
vtk_module_autoinit(
  TARGETS GraphAlgorithmFilter
  MODULES ${VTK_LIBRARIES}
)

Download and Build GraphAlgorithmFilter

Click here to download GraphAlgorithmFilter and its CMakeLists.txt file. Once the tarball GraphAlgorithmFilter.tar has been downloaded and extracted,

cd GraphAlgorithmFilter/build

If VTK is installed:

cmake ..

If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:

cmake -DVTK_DIR:PATH=/home/me/vtk_build ..

Build the project:

make

and run it:

./GraphAlgorithmFilter

WINDOWS USERS

Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.