Skip to content

ResamplePolyLine

Repository source: ResamplePolyLine

Description

This example resamples a polyline with a vtkCardinalSpline. The resampled line will have 10 times the number of points contained in the original polyline. If no XML file is provided, a random polyline is generated.

Other languages

See (Cxx)

Question

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

Code

ResamplePolyLine.py

#!/usr/bin/env python3

from pathlib import Path

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingFreeType
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonComputationalGeometry import vtkCardinalSpline
from vtkmodules.vtkCommonCore import (
    vtkMinimalStandardRandomSequence, vtkPoints
)
from vtkmodules.vtkCommonDataModel import (
    vtkCellArray,
    vtkPolyData)
from vtkmodules.vtkFiltersCore import vtkGlyph3D
from vtkmodules.vtkFiltersGeneral import vtkSplineFilter
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkIOXML import vtkXMLPolyDataReader
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderer,
    vtkRenderWindow,
    vtkRenderWindowInteractor
)


def get_program_parameters():
    import argparse
    description = 'Resample PolyLine.'
    epilogue = '''
    '''

    parser = argparse.ArgumentParser(description=description, epilog=epilogue,
                                     formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument('-f', '--file_name', default=None,
                        help='A polydata file containing the polyline with extension .vtp')
    args = parser.parse_args()
    return args.file_name


def main():
    colors = vtkNamedColors()

    file_name = get_program_parameters()
    if file_name:
        fn = Path(file_name)
        if not fn.is_file():
            print(f'{fn}\nNot found.')
            return
        else:
            reader = vtkXMLPolyDataReader(file_name=file_name)
            poly_data = reader.GetOutput()

    else:
        number_of_points = 10
        points = vtkPoints()
        random_sequence = vtkMinimalStandardRandomSequence(seed=8775070)
        for i in range(0, number_of_points):
            # Random position and radius.
            x = random_sequence.GetRangeValue(-1.0, 1.0)
            random_sequence.Next()
            y = random_sequence.GetRangeValue(-1.0, 1.0)
            random_sequence.Next()
            z = random_sequence.GetRangeValue(-1.0, 1.0)
            random_sequence.Next()
            points.InsertNextPoint(x, y, z)

        lines = vtkCellArray()
        lines.InsertNextCell(number_of_points)
        for i in range(0, number_of_points):
            lines.InsertCellPoint(i)

        poly_data = vtkPolyData(points=points, lines=lines)

    spline = vtkCardinalSpline(left_constraint=2, left_value=0.0, right_constraint=2, right_value=0.0)

    spline_filter = vtkSplineFilter(input_data=poly_data, spline=spline,
                                    number_of_subdivisions=poly_data.number_of_points * 10)

    spline_mapper = vtkPolyDataMapper()
    spline_filter >> spline_mapper

    spline_actor = vtkActor(mapper=spline_mapper)

    original_nodes = vtkSphereSource(radius=0.04, phi_resolution=10, theta_resolution=10)

    glyph_original = vtkGlyph3D(input_data=poly_data, source_data=original_nodes.update().output)

    new_nodes = vtkSphereSource(radius=0.02, phi_resolution=10, theta_resolution=10)

    glyph_new = vtkGlyph3D(source_data=new_nodes.update().output)
    spline_filter >> glyph_new
    glyph_new.SetSourceConnection(new_nodes.GetOutputPort())

    original_mapper = vtkPolyDataMapper()
    glyph_original >> original_mapper

    original_actor = vtkActor(mapper=original_mapper)
    original_actor.property.color = colors.GetColor3d('Banana')
    original_actor.property.opacity = 0.6

    new_mapper = vtkPolyDataMapper()
    glyph_new >> new_mapper

    new_actor = vtkActor(mapper=new_mapper)
    # new_actor.SetMapper(new_mapper)
    new_actor.property.color = colors.GetColor3d('Tomato')

    # A renderer and render window.
    renderer = vtkRenderer(background=colors.GetColor3d('SteelBlue'))

    render_window = vtkRenderWindow(window_name='ResamplePolyLine')
    render_window.AddRenderer(renderer)

    # An interactor.
    render_window_interactor = vtkRenderWindowInteractor()
    render_window_interactor.render_window = render_window

    # Add the actors to the scene.
    renderer.AddActor(original_actor)
    renderer.AddActor(new_actor)
    renderer.AddActor(spline_actor)

    render_window.Render()

    render_window_interactor.Start()


if __name__ == '__main__':
    main()