trame icon indicating copy to clipboard operation
trame copied to clipboard

vtkCompositePolyDataMapper can't work in VtkLocalView

Open Brandon-Xu opened this issue 10 months ago • 0 comments

I tried using the vtkCompositePolyDataMapper to show a pyvista.MultiBlock Object in VtkLocalView, but it reported a JavaScript error.

Can not forward events without a current renderer on the interactor

There is no problem using it in VtkRemoteView. Is this also an old issue? just wait for your new version in April?

import numpy as np

from trame.app import get_server
from trame.ui.vuetify3 import SinglePageLayout
from trame.widgets import vuetify3

import pyvista as pv
import vtk
from trame.widgets.vtk import VtkLocalView, VtkRemoteView
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch  # noqa
import vtkmodules.vtkRenderingOpenGL2  # noqa

pv.OFF_SCREEN = True

server = get_server()
state, ctrl = server.state, server.controller

blocks = pv.MultiBlock()
for i in range(3):
    sphere = pv.Sphere(center=(i, 0, 0))
    sphere["data1"] = np.full(sphere.n_points, i)
    sphere["data2"] = np.full(sphere.n_points, 5 - i)
    blocks.append(sphere)

renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)

renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindowInteractor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()

mapper = vtk.vtkCompositePolyDataMapper()
mapper.SetInputDataObject(blocks)

actor = vtk.vtkActor()
actor.SetMapper(mapper)

renderer.AddActor(actor)
renderer.ResetCamera()

# -----------------------------------------------------------------------------
# GUI
# -----------------------------------------------------------------------------

with SinglePageLayout(server) as layout:
    layout.title.set_text("Scalar Selection")
    layout.icon.click = ctrl.view_reset_camera

    with layout.content:
        with vuetify3.VContainer(fluid=True, classes="pa-0 fill-height"):
            # view = PyVistaLocalView(pl)
            # view = PyVistaRemoteView(pl)
            view = VtkLocalView(renderWindow)
            ctrl.view_update = view.update

server.start()

Brandon-Xu avatar Mar 29 '24 13:03 Brandon-Xu