Skip to content

LabeledMesh

Repository source: LabeledMesh

Description

This example was translated into C++ from its TCL counterpart by Jake Nickel from the University of Iowa. It demonstrates the use of vtkLabeledDataMapper. This class is used for displaying numerical data from an underlying data set. In the case of this example, the underlying data are the point and cell ids.

Note

This original source code for this example is here.

Other languages

See (Cxx)

Question

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

Code

LabeledMesh.py

#!/usr/bin/env python3

from dataclasses import dataclass

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingFreeType
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkPoints
from vtkmodules.vtkCommonDataModel import vtkCellArray
from vtkmodules.vtkCommonDataModel import vtkPolyData
from vtkmodules.vtkFiltersCore import (
    vtkCellCenters,
    vtkGenerateIds
)
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkRenderingCore import (
    vtkActor, vtkActor2D,
    vtkPolyDataMapper, vtkPolyDataMapper2D,
    vtkRenderer,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkSelectVisiblePoints
)
from vtkmodules.vtkRenderingLabel import vtkLabeledDataMapper


def main():
    colors = vtkNamedColors()

    # Create a selection window.
    # We will display the point and cell ids that lie within this window.
    xmin = 200
    x_length = 100
    xmax = xmin + x_length
    ymin = 200
    y_length = 100
    ymax = ymin + y_length
    selection = (xmin, xmax, ymin, ymax)

    pts = vtkPoints()
    pts.InsertPoint(0, xmin, ymin, 0)
    pts.InsertPoint(1, xmax, ymin, 0)
    pts.InsertPoint(2, xmax, ymax, 0)
    pts.InsertPoint(3, xmin, ymax, 0)

    rect = vtkCellArray()
    rect.InsertNextCell(5)
    rect.InsertCellPoint(0)
    rect.InsertCellPoint(1)
    rect.InsertCellPoint(2)
    rect.InsertCellPoint(3)
    rect.InsertCellPoint(0)

    select_rect = vtkPolyData(points=pts, lines=rect)

    rect_mapper = vtkPolyDataMapper2D(input_data=select_rect)

    rect_actor = vtkActor2D(mapper=rect_mapper)
    rect_actor.property.color = colors.GetColor3d('Black')

    # Create a sphere and its associated mapper and actor.
    sphere = vtkSphereSource()
    sphere_mapper = vtkPolyDataMapper()
    sphere >> sphere_mapper

    sphere_actor = vtkActor(mapper=sphere_mapper)
    sphere_actor.property.color = colors.GetColor3d('BurlyWood')

    # Generate data arrays containing point and cell ids.
    ids = vtkGenerateIds(point_ids=True, cell_ids=True, field_data=True)
    sphere >> ids

    # Create the renderer here because vtkSelectVisiblePoints needs it.
    ren = vtkRenderer(use_hidden_line_removal=True, background=colors.GetColor3d('SlateGray'))

    # Create labels for points
    vis_pts = vtkSelectVisiblePoints(renderer=ren, selection_window=True, selection=selection)

    # Create the mapper to display the point ids.  Specify the
    # format to use for the labels.  Also create the associated actor.
    # Note: We need to change the field_data_name because the point ID array
    #       default name has changed in vtkGenerateIds.
    ldm = vtkLabeledDataMapper(label_mode=LabeledDataMapper.LabelMode.VTK_LABEL_FIELD_DATA,
                               field_data_name='vtkPointIds')
    ids >> vis_pts >> ldm

    point_labels = vtkActor2D(mapper=ldm)
    point_labels.property.color = colors.GetColor3d('Yellow')

    # Create labels for cells
    cc = vtkCellCenters()

    vis_cells = vtkSelectVisiblePoints(renderer=ren, selection_window=True, selection=selection)

    # Create the mapper to display the cell ids.  Specify the
    # format to use for the labels.  Also create the associated actor.
    cell_mapper = vtkLabeledDataMapper(label_mode=LabeledDataMapper.LabelMode.VTK_LABEL_FIELD_DATA)
    ids >> cc >> vis_cells >> cell_mapper
    cell_mapper.label_text_property.color = colors.GetColor3d('DarkGreen')

    cell_labels = vtkActor2D(mapper=cell_mapper)

    # Create the RenderWindow and RenderWindowInteractor
    ren_win = vtkRenderWindow(size=(500, 500), window_name='LabeledMesh')
    ren_win.AddRenderer(ren)

    iren = vtkRenderWindowInteractor()
    iren.render_window = ren_win

    # Add the actors to the renderer set the background and size render
    ren.AddActor(sphere_actor)
    ren.AddActor2D(rect_actor)
    ren.AddActor2D(point_labels)
    ren.AddActor2D(cell_labels)

    ren_win.Render()

    data = {'Visible Points': vis_pts, 'Visible Cells': vis_cells, 'Points': pts, 'Render Window': ren_win}

    # Move the selection window across the data set.
    move_window(data, x_length, y_length)

    # Put the selection window in the center of the render window.
    # This works because the xmin = ymin = 200, x_length = y_length = 100, and
    # the render window size is 500 x 500.
    place_window(data, selection)

    iren.Initialize()
    iren.Start()


def place_window(data, selection):
    data['Visible Points'].selection = selection
    data['Visible Cells'].selection = selection

    xmin = selection[0]
    ymin = selection[2]
    data['Points'].InsertPoint(0, xmin, ymin, 0)
    data['Points'].InsertPoint(1, xmin, ymin, 0)
    data['Points'].InsertPoint(2, xmin, ymin, 0)
    data['Points'].InsertPoint(3, xmin, ymin, 0)

    # Call Modified because InsertPoints does not modify vtkPoints
    # (for performance reasons).
    data['Points'].Modified()

    data['Render Window'].Render()


def move_window(data, xLength, yLength):
    for y in range(100, 300, 25):
        for x in range(100, 300, 25):
            selection = (x, x + xLength, y, y + yLength)
            place_window(data, selection)


@dataclass(frozen=True)
class LabeledDataMapper:
    @dataclass(frozen=True)
    class LabelMode:
        VTK_LABEL_IDS: int = 0
        VTK_LABEL_SCALARS: int = 1
        VTK_LABEL_VECTORS: int = 2
        VTK_LABEL_NORMALS: int = 3
        VTK_LABEL_TCOORDS: int = 4
        VTK_LABEL_TENSORS: int = 5
        VTK_LABEL_FIELD_DATA: int = 6


if __name__ == '__main__':
    main()