Skip to content

PipelineReuse

Repository source: PipelineReuse

Question

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

Code

PipelineReuse.py

#!/usr/bin/env python3

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersCore import (
    vtkAppendPolyData,
    vtkElevationFilter,
    vtkPolyDataNormals,
)
from vtkmodules.vtkFiltersSources import (
    vtkConeSource,
    vtkCylinderSource,
)
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderer,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
)


def main():
    colors = vtkNamedColors()

    p = (
            vtkElevationFilter(low_point=(0, -2.5, 0), high_point=(0, 3.5, 0))
            >> vtkPolyDataNormals()
    )

    cone = vtkConeSource(radius=5, resolution=8, height=3, direction=(0, 1, 0), center=(0, 2.0, 0))
    cylinder = vtkCylinderSource(radius=6, resolution=9, height=3, center=(0, -1, 0))

    append = vtkAppendPolyData()
    mapper = vtkPolyDataMapper()
    actor = vtkActor(mapper=mapper)

    # Here we use the pipeline in a functional way. This allows us to reuse the pipeline.
    # p(cone()) returns a data object detached from the pipeline so any changes to the pipeline
    # afterward would not be automatically propagated to the rendering pipeline.
    # Finally, we use an append filter to combine the cone and cylinder.
    (p(cone()), p(cylinder())) >> append >> mapper

    ren = vtkRenderer(background=colors.GetColor3d('DimGray'))
    ren.AddActor(actor)

    ren_win = vtkRenderWindow(size=[600, 600], window_name='PipelineReuse')
    ren_win.AddRenderer(ren)

    iren = vtkRenderWindowInteractor()
    iren.render_window = ren_win

    ren_win.Render()

    iren.Start()


if __name__ == '__main__':
    main()