Help on simple vtkLocalView camera update

Hi,

I found a thread from August Update camera in trame vtkLocalView where a user asked about updating the camera, and @Sebastien_Jourdain seemed to have an answer that worked for them - to use widget.push_camera()or widget.update(push_camera=True). I am using their same code and trying to add this function in, but I’m having no luck. Can someone help show me where/how to add this function?

Thanks in advance.

from trame.app import get_server
from trame.ui.vuetify3 import SinglePageLayout
from trame.widgets import vtk as vtk_widgets
from trame.widgets import vuetify3 as vuetify

# VTK imports
from vtkmodules.vtkFiltersSources import vtkConeSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderer,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
)

# -----------------------------------------------------------------------------
# VTK setup
# -----------------------------------------------------------------------------

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

renderWindowInteractor = vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

cone_source = vtkConeSource()
mapper = vtkPolyDataMapper()
actor = vtkActor()
mapper.SetInputConnection(cone_source.GetOutputPort())
actor.SetMapper(mapper)
renderer.AddActor(actor)
renderer.ResetCamera()
renderWindow.Render()

# -----------------------------------------------------------------------------
# Trame setup
# -----------------------------------------------------------------------------

server = get_server(client_type="vue3")
state, ctrl = server.state, server.controller

# -----------------------------------------------------------------------------
# Callbacks
# -----------------------------------------------------------------------------


@ctrl.set("view_x")
def set_camera_view_x():
    camera = renderer.GetActiveCamera()
    camera.SetPosition(1, 0, 0)
    camera.SetFocalPoint(0, 0, 0)
    camera.SetViewUp(0, 0, 1)
    renderer.ResetCamera()
    renderer.ResetCameraClippingRange()
    renderer.UpdateLightsGeometryToFollowCamera()
    renderWindow.Render()
    ctrl.view_update()


@ctrl.set("view_y")
def set_camera_view_y():
    camera = renderer.GetActiveCamera()
    camera.SetPosition(0, 1, 0)
    camera.SetFocalPoint(0, 0, 0)
    camera.SetViewUp(0, 0, 1)
    renderer.ResetCamera()
    renderer.ResetCameraClippingRange()
    renderer.UpdateLightsGeometryToFollowCamera()
    renderWindow.Render()
    ctrl.view_update()


@ctrl.set("view_z")
def set_camera_view_z():
    camera = renderer.GetActiveCamera()
    camera.SetPosition(0, 0, 1)
    camera.SetFocalPoint(0, 0, 0)
    camera.SetViewUp(0, 1, 0)
    renderer.ResetCamera()
    renderer.ResetCameraClippingRange()
    renderer.UpdateLightsGeometryToFollowCamera()
    renderWindow.Render()
    ctrl.view_update()


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

with SinglePageLayout(server) as layout:
    layout.title.set_text("VTK Cone Geometry - Camera Views")

    with layout.toolbar:
        vuetify.VSpacer()
        vuetify.VBtn("X View", click=ctrl.view_x)
        vuetify.VBtn("Y View", click=ctrl.view_y)
        vuetify.VBtn("Z View", click=ctrl.view_z)

    with layout.content:
        with vuetify.VContainer(
            fluid=True,
            classes="pa-0 fill-height",
        ):
            view = vtk_widgets.VtkLocalView(renderWindow)
            ctrl.view_update = view.update
            ctrl.view_reset_camera = view.reset_camera

#
# -----------------------------------------------------------------------------
# Main
# -----------------------------------------------------------------------------

if __name__ == "__main__":
    server.start()
from trame.app import TrameApp
from trame.ui.vuetify3 import SinglePageLayout
from trame.widgets import vtk as vtk_widgets
from trame.widgets import vuetify3 as vuetify
from vtkmodules.vtkFiltersSources import vtkConeSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderer,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
)


class Viz:
    def __init__(self):
        renderer = vtkRenderer()
        renderWindow = vtkRenderWindow()
        renderWindow.AddRenderer(renderer)
        renderWindow.OffScreenRenderingOn()

        renderWindowInteractor = vtkRenderWindowInteractor()
        renderWindowInteractor.SetRenderWindow(renderWindow)

        cone_source = vtkConeSource()
        mapper = vtkPolyDataMapper()
        actor = vtkActor()
        mapper.SetInputConnection(cone_source.GetOutputPort())
        actor.SetMapper(mapper)
        renderer.AddActor(actor)
        renderer.ResetCamera()

        self.renderer = renderer
        self.cone = cone_source
        self.view = renderWindow

    def reset_camera_x(self):
        camera = self.renderer.GetActiveCamera()
        camera.SetPosition(1, 0, 0)
        camera.SetFocalPoint(0, 0, 0)
        camera.SetViewUp(0, 0, 1)
        self.renderer.ResetCamera()
        self.renderer.ResetCameraClippingRange()
        self.renderer.UpdateLightsGeometryToFollowCamera()

    def reset_camera_y(self):
        camera = self.renderer.GetActiveCamera()
        camera.SetPosition(0, 1, 0)
        camera.SetFocalPoint(0, 0, 0)
        camera.SetViewUp(0, 0, 1)
        self.renderer.ResetCamera()
        self.renderer.ResetCameraClippingRange()
        self.renderer.UpdateLightsGeometryToFollowCamera()

    def reset_camera_z(self):
        camera = self.renderer.GetActiveCamera()
        camera.SetPosition(0, 0, 1)
        camera.SetFocalPoint(0, 0, 0)
        camera.SetViewUp(0, 1, 0)
        self.renderer.ResetCamera()
        self.renderer.ResetCameraClippingRange()
        self.renderer.UpdateLightsGeometryToFollowCamera()

    @property
    def resets(self):
        return (self.reset_camera_x, self.reset_camera_y, self.reset_camera_z)


class WebApp(TrameApp):
    def __init__(self, server=None):
        super().__init__(server)
        self.viz = Viz()
        self._build_ui()

    def reset_view(self, axis):
        self.viz.resets[axis]()
        self.ctx.view.push_camera()

    def _build_ui(self):
        with SinglePageLayout(self.server) as self.ui:
            self.ui.title.set_text("VTK Cone Geometry - Camera Views")

            with self.ui.toolbar:
                vuetify.VSpacer()
                vuetify.VBtn("X View", click=(self.reset_view, "[0]"))
                vuetify.VBtn("Y View", click=(self.reset_view, "[1]"))
                vuetify.VBtn("Z View", click=(self.reset_view, "[2]"))

            with self.ui.content:
                with vuetify.VContainer(
                    fluid=True,
                    classes="pa-0 fill-height",
                ):
                    vtk_widgets.VtkLocalView(
                        self.viz.view,
                        ctx_name="view",
                    )


if __name__ == "__main__":
    app = WebApp()
    app.server.start()