GraphAlgorithmFilter
Repository source: 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.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;
}
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
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.