Skip to content

PolyDataConnectivityFilter SpecifiedRegion

vtk-examples/Cxx/PolyData/PolyDataConnectivityFilter_SpecifiedRegion


Description

This example creates two spheres and combines them together into one polydata. The [vtkPolyData](https://www.vtk.org/doc/nightly/html/classvtkPolyData.html#details)ConnectivityFilter is used to find the two spheres as they are separate regions (disconnected). If region 0 is selected, the small sphere is extracted. If region 1 is selected, the large sphere is extracted.

The original vtkPolyData is red, on top. The extracted region is yellow, on the bottom.

Note

Contrast this with PolyDataConnectivityFilter_LargestRegion.

Note

Contributed by: Jinyoung Hwang

Other languages

See (CSharp)

Question

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

Code

PolyDataConnectivityFilter_SpecifiedRegion.cxx

#include <vtkActor.h>
#include <vtkAppendPolyData.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataConnectivityFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>

#include <vtkNamedColors.h>

int main(int, char*[])
{
  vtkNew<vtkNamedColors> colors;

  vtkNew<vtkSphereSource> sphereSource1;
  sphereSource1->SetRadius(5);

  vtkNew<vtkSphereSource> sphereSource2;
  sphereSource2->SetRadius(10);
  sphereSource2->SetCenter(25, 0, 0);

  vtkNew<vtkAppendPolyData> appendFilter;
  appendFilter->AddInputConnection(sphereSource1->GetOutputPort());
  appendFilter->AddInputConnection(sphereSource2->GetOutputPort());

  vtkNew<vtkPolyDataConnectivityFilter> connectivityFilter;
  connectivityFilter->SetInputConnection(appendFilter->GetOutputPort());
  connectivityFilter->SetExtractionModeToSpecifiedRegions();
  connectivityFilter->AddSpecifiedRegion(0); // select the region to extract
                                             // here
  connectivityFilter->Update();

  // Create a mapper and actor for original data
  vtkNew<vtkPolyDataMapper> originalMapper;
  originalMapper->SetInputConnection(appendFilter->GetOutputPort());

  vtkNew<vtkActor> originalActor;
  originalActor->SetMapper(originalMapper);
  originalActor->GetProperty()->SetColor(
      colors->GetColor3d("Tomato").GetData());

  // create a mapper and actor for extracted data
  vtkNew<vtkPolyDataMapper> extractedMapper;
  extractedMapper->SetInputConnection(connectivityFilter->GetOutputPort());

  vtkNew<vtkActor> extractedActor;
  extractedActor->SetMapper(extractedMapper);
  extractedActor->GetProperty()->SetColor(
      colors->GetColor3d("Banana").GetData());
  extractedActor->SetPosition(0, -20, 0);

  // create a renderer
  vtkNew<vtkRenderer> renderer;
  renderer->AddActor(originalActor);
  renderer->AddActor(extractedActor);
  renderer->GradientBackgroundOn();
  renderer->SetBackground(colors->GetColor3d("Gold").GetData());
  renderer->SetBackground2(colors->GetColor3d("Silver").GetData());

  // create a render window
  vtkNew<vtkRenderWindow> renderWindow;
  renderWindow->AddRenderer(renderer);
  renderWindow->SetWindowName("PolyDataConnectivityFilter_SpecifiedRegion");

  // create an interactor
  vtkNew<vtkRenderWindowInteractor> interactor;
  interactor->SetRenderWindow(renderWindow);
  renderWindow->Render();
  interactor->Initialize();
  interactor->Start();

  return EXIT_SUCCESS;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(PolyDataConnectivityFilter_SpecifiedRegion)

find_package(VTK COMPONENTS 
  CommonColor
  CommonCore
  FiltersCore
  FiltersSources
  InteractionStyle
  RenderingContextOpenGL2
  RenderingCore
  RenderingFreeType
  RenderingGL2PSOpenGL2
  RenderingOpenGL2
)

if (NOT VTK_FOUND)
  message(FATAL_ERROR "PolyDataConnectivityFilter_SpecifiedRegion: 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(PolyDataConnectivityFilter_SpecifiedRegion MACOSX_BUNDLE PolyDataConnectivityFilter_SpecifiedRegion.cxx )
  target_link_libraries(PolyDataConnectivityFilter_SpecifiedRegion PRIVATE ${VTK_LIBRARIES}
)
# vtk_module_autoinit is needed
vtk_module_autoinit(
  TARGETS PolyDataConnectivityFilter_SpecifiedRegion
  MODULES ${VTK_LIBRARIES}
)

Download and Build PolyDataConnectivityFilter_SpecifiedRegion

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

cd PolyDataConnectivityFilter_SpecifiedRegion/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:

./PolyDataConnectivityFilter_SpecifiedRegion

WINDOWS USERS

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