Skip to content

ExtractSelection

vtk-examples/Python/PolyData/ExtractSelection

Description

This example creates 50 random points and extracts 10 of them (the points with ids 10-19).

Also demonstrated is how to invert the selection.

The three actors in the render window display from left to right:

  • all the points
  • the selected points
  • the points not selected.

Other languages

See (Cxx)

Question

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

Code

ExtractSelection.py

#!/usr/bin/env python3

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkIdTypeArray
from vtkmodules.vtkCommonDataModel import (
    vtkSelection,
    vtkSelectionNode,
    vtkUnstructuredGrid
)
from vtkmodules.vtkFiltersExtraction import vtkExtractSelection
from vtkmodules.vtkFiltersSources import vtkPointSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkCamera,
    vtkDataSetMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)


def main(argv):
    colors = vtkNamedColors()

    point_source = vtkPointSource()

    point_source.SetNumberOfPoints(50)
    point_source.Update()

    print('There are', point_source.GetOutput().GetNumberOfPoints(), 'input points.')

    ids = vtkIdTypeArray()
    ids.SetNumberOfComponents(1)

    # Set values.
    for i in range(10, 20):
        ids.InsertNextValue(i)

    selection_node = vtkSelectionNode()
    selection_node.SetFieldType(vtkSelectionNode.POINT)
    selection_node.SetContentType(vtkSelectionNode.INDICES)
    selection_node.SetSelectionList(ids)

    selection = vtkSelection()
    selection.AddNode(selection_node)

    extract_selection = vtkExtractSelection()
    extract_selection.SetInputConnection(0, point_source.GetOutputPort())
    extract_selection.SetInputData(1, selection)
    extract_selection.Update()

    # In selection.
    selected = vtkUnstructuredGrid()
    selected.ShallowCopy(extract_selection.GetOutput())

    print('There are', selected.GetNumberOfPoints(), 'points and', selected.GetNumberOfCells(),
          'cells in the selection.')

    # Get points that are NOT in the selection.
    selection_node.GetProperties().Set(vtkSelectionNode().INVERSE(), 1)  # invert the selection.
    extract_selection.Update()

    not_selected = vtkUnstructuredGrid()
    not_selected.ShallowCopy(extract_selection.GetOutput())

    print('There are', not_selected.GetNumberOfPoints(), 'points and', not_selected.GetNumberOfCells(),
          'cells NOT in the selection.')

    input_mapper = vtkDataSetMapper()
    input_mapper.SetInputConnection(point_source.GetOutputPort())
    input_actor = vtkActor()
    input_actor.SetMapper(input_mapper)
    input_actor.GetProperty().SetColor(colors.GetColor3d("MidnightBlue"))
    input_actor.GetProperty().SetPointSize(5)

    selected_mapper = vtkDataSetMapper()
    selected_mapper.SetInputData(selected)

    selected_actor = vtkActor()
    selected_actor.SetMapper(selected_mapper)
    selected_actor.GetProperty().SetColor(colors.GetColor3d("MidnightBlue"))
    selected_actor.GetProperty().SetPointSize(5)

    not_selected_mapper = vtkDataSetMapper()
    not_selected_mapper.SetInputData(not_selected)

    not_selected_actor = vtkActor()
    not_selected_actor.SetMapper(not_selected_mapper)
    not_selected_actor.GetProperty().SetColor(colors.GetColor3d("MidnightBlue"))
    not_selected_actor.GetProperty().SetPointSize(5)

    # There will be one render window.
    render_window = vtkRenderWindow()
    render_window.SetSize(900, 300)
    render_window.SetWindowName("ExtractSelectedIds")

    # And one interactor.
    interactor = vtkRenderWindowInteractor()
    interactor.SetRenderWindow(render_window)

    # Define viewport ranges.
    # (xmin, ymin, xmax, ymax)
    left_viewport = [0.0, 0.0, 0.33, 1.0]
    center_viewport = [0.33, 0.0, 0.66, 1.0]
    right_viewport = [0.66, 0.0, 1.0, 1.0]

    # Create a camera for all renderers.
    camera = vtkCamera()

    # Setup the renderers
    left_renderer = vtkRenderer()
    render_window.AddRenderer(left_renderer)
    left_renderer.SetViewport(left_viewport)
    left_renderer.SetBackground(colors.GetColor3d("BurlyWood"))
    left_renderer.SetActiveCamera(camera)

    center_renderer = vtkRenderer()
    render_window.AddRenderer(center_renderer)
    center_renderer.SetViewport(center_viewport)
    center_renderer.SetBackground(colors.GetColor3d("orchid_dark"))
    center_renderer.SetActiveCamera(camera)

    right_renderer = vtkRenderer()
    render_window.AddRenderer(right_renderer)
    right_renderer.SetViewport(right_viewport)
    right_renderer.SetBackground(colors.GetColor3d("CornflowerBlue"))
    right_renderer.SetActiveCamera(camera)

    left_renderer.AddActor(input_actor)
    center_renderer.AddActor(selected_actor)
    right_renderer.AddActor(not_selected_actor)

    left_renderer.ResetCamera()

    render_window.Render()
    interactor.Start()


if __name__ == '__main__':
    import sys

    main(sys.argv)