Commit efd0c9bd authored by Duggan, John's avatar Duggan, John
Browse files

Merge branch '3-fix-disconnection-during-render' into 'main'

Move add_volume call to background thread

Closes #3

See merge request ndip/trame-apps/ct-scan-visualizer!2
parents a3ade350 806536cc
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
"""PyVista plotter for CT scans."""

from asyncio import create_task
from asyncio import get_running_loop
from concurrent.futures import ThreadPoolExecutor
from time import time
from typing import Any, Optional

from pyvista import Plotter, themes
from pyvista.trame.ui import get_viewer
from trame.app import asynchronous
from trame_server.core import Server
from trame_server.state import State

@@ -24,6 +26,7 @@ class VisualizationPanel:
        self.vm.render_bind.connect(self.render)

        self.plotter = self.create_plotter()
        self.loading = False
        self.create_ui()

    @property
@@ -46,15 +49,22 @@ class VisualizationPanel:
        view = get_viewer(self.plotter)
        view.ui(mode="server", style="height: 66vh;")

    async def render_in_background(self) -> None:
    def render_in_background(self) -> None:
        start = time()
        self.plotter.add_volume(
            self.vm.get_volume(), clim=self.vm.get_clim(), mapper="gpu", opacity=self.vm.get_opacity()
            self.vm.get_volume(), clim=self.vm.get_clim(), mapper="gpu", opacity=self.vm.get_opacity(), render=False
        )
        self.plotter.view_isometric(self.plotter)
        print(f"PyVista volume rendering: {time() - start:.2f}s", flush=True)
        print(f"Added volume to scene: {time() - start:.2f}s", flush=True)

        self.vm.update_view()
    @asynchronous.task
    async def render(self, _: Optional[Any] = None) -> None:
        loop = get_running_loop()

        with ThreadPoolExecutor() as executor:
            await loop.run_in_executor(executor, self.render_in_background)

    def render(self, _: Optional[Any] = None) -> None:
        self.render_thread = create_task(self.render_in_background())
        start = time()
        self.plotter.render()
        self.plotter.view_isometric()  # type: ignore
        self.vm.update_view()
        print(f"PyVista rendering: {time() - start:.2f}s", flush=True)