diff --git a/.commitlintrc.js b/.commitlintrc.js new file mode 100644 index 0000000..69b4242 --- /dev/null +++ b/.commitlintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ["@commitlint/config-conventional"], +}; diff --git a/.externals.sha256 b/.externals.sha256 index a0ecdf5..1106637 100644 --- a/.externals.sha256 +++ b/.externals.sha256 @@ -1,2 +1,2 @@ -d6e1d6ca32dd252f4c46d1b5c7ab1225f66990da50215b9de91912bbf7aa97ed ./src/trame_vtk/tools/static_viewer.html -948b0cca167bc2e2315a4d1ef18eb23cbe5979c806fbb7f0b157ed7c0e5ed280 ./src/trame_vtk/modules/common/serve/trame-vtk.js +d40400185f1e260ceb298f7218c010be3c6bf86214c0692944ff37a81e5de51f ./src/trame_vtk/tools/static_viewer.html +6d3e20a67b32c8a10443b2df7a1e7b32a459b944cf6f630695e260b5406b4b57 ./src/trame_vtk/modules/common/serve/trame-vtk.js diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 3c13221..0000000 --- a/.flake8 +++ /dev/null @@ -1,14 +0,0 @@ -[flake8] - -# Just assume black did a good job with the line lengths -ignore = - E501 - -per-file-ignores = - # These directories will always contain "from ... import *" - trame/*:F401,F403 - examples/*:F401,F403 - -# Black sometimes conflicts with flake8 here -# Ignore white space after binary operator and assigning lambda expressions -extend-ignore = E203, W503, E731 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2e9a6de..e036dcd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,16 +34,21 @@ repos: - id: prettier types_or: [yaml, markdown, html, css, scss, javascript, json] args: [--prose-wrap=always] + exclude: | + (?x)^( + CHANGELOG.md| + src/trame_vtk/tools/static_viewer.html + )$ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.15.0" + rev: "v0.15.10" hooks: - id: ruff args: ["--fix", "--show-fixes"] - id: ruff-format - repo: https://github.com/codespell-project/codespell - rev: "v2.4.1" + rev: "v2.4.2" hooks: - id: codespell @@ -52,19 +57,13 @@ repos: hooks: - id: shellcheck - - repo: local - hooks: - - id: disallow-caps - name: Disallow improper capitalization - language: pygrep - entry: PyBind|Numpy|Cmake|CCache|Github|PyTest - exclude: .pre-commit-config.yaml - - repo: https://github.com/abravalheri/validate-pyproject rev: "v0.25" hooks: - id: validate-pyproject - additional_dependencies: ["validate-pyproject-schema-store[all]"] + additional_dependencies: + - validate-pyproject[all] + - validate-pyproject-schema-store - repo: https://github.com/python-jsonschema/check-jsonschema rev: "0.36.1" diff --git a/README.rst b/README.rst index 9ed0f14..6c62b6a 100644 --- a/README.rst +++ b/README.rst @@ -13,6 +13,8 @@ VTK integration in trame allows you to create rich visualization and data proces Several components are available so you can leverage VTK either for its data processing and/or rendering. trame lets you choose if you want to leverage Remote Rendering or if the client should do the rendering by leveraging vtk.js under the hood. +.. image:: https://raw.githubusercontent.com/Kitware/trame-vtk/master/trame-vtk.jpg + :alt: Example of trame-vtk usage Installing ----------------------------------------------------------- diff --git a/examples/pyvista/ambient.py b/examples/pyvista/ambient.py index cc0f90b..914a8a0 100644 --- a/examples/pyvista/ambient.py +++ b/examples/pyvista/ambient.py @@ -1,12 +1,12 @@ """Validate lighting and properties.""" +import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView, VtkRemoteView -import pyvista as pv - server = get_server() state, ctrl = server.state, server.controller @@ -30,7 +30,7 @@ @state.change("color") -def color(color="lightblue", **kwargs): +def color(color="lightblue", **_kwargs): actor.prop.color = color ctrl.view_update() @@ -56,36 +56,38 @@ def color(color="lightblue", **kwargs): style="max-width: 250px", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", + ), + ): + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" ): - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - local = VtkLocalView( - plotter.ren_win, - ) - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - remote = VtkRemoteView( - plotter.ren_win, - ) - - def view_update(**kwargs): - local.update(**kwargs) - remote.update(**kwargs) - - def view_reset_camera(**kwargs): - local.reset_camera(**kwargs) - remote.reset_camera(**kwargs) - - ctrl.view_update = view_update - ctrl.view_reset_camera = view_reset_camera - - ctrl.on_server_ready.add(view_update) + local = VtkLocalView( + plotter.ren_win, + ) + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" + ): + remote = VtkRemoteView( + plotter.ren_win, + ) + + def view_update(**kwargs): + local.update(**kwargs) + remote.update(**kwargs) + + def view_reset_camera(**kwargs): + local.reset_camera(**kwargs) + remote.reset_camera(**kwargs) + + ctrl.view_update = view_update + ctrl.view_reset_camera = view_reset_camera + + ctrl.on_server_ready.add(view_update) # hide footer layout.footer.hide() diff --git a/examples/pyvista/export_scene.py b/examples/pyvista/export_scene.py index d4d466d..2faaa65 100644 --- a/examples/pyvista/export_scene.py +++ b/examples/pyvista/export_scene.py @@ -2,13 +2,13 @@ https://kitware.github.io/vtk-js/examples/OfflineLocalView.html """ -from trame.app import get_server -from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify - import pyvista as pv from pyvista import examples from pyvista.trame import PyVistaLocalView +from trame.app import get_server +from trame.ui.vuetify import SinglePageLayout + +from trame.widgets import vuetify server = get_server() state, ctrl = server.state, server.controller @@ -39,16 +39,18 @@ def export_scene(): click="utils.download('scene-extract.vtksz', trigger('export'), 'application/octet-stream')", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="pa-0 ma-1 fill-height"): - view = PyVistaLocalView(plotter) - ctrl.view_export = view.export - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + vuetify.VCol(classes="pa-0 ma-1 fill-height"), + ): + view = PyVistaLocalView(plotter) + ctrl.view_export = view.export + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera if __name__ == "__main__": server.start() diff --git a/examples/pyvista/grid.py b/examples/pyvista/grid.py index 224b32a..1053020 100644 --- a/examples/pyvista/grid.py +++ b/examples/pyvista/grid.py @@ -1,5 +1,6 @@ from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import grid server = get_server() @@ -12,18 +13,20 @@ with SinglePageLayout(server) as layout: layout.title.set_text("Grid layout") - with layout.content: - with grid.GridLayout( + with ( + layout.content, + grid.GridLayout( layout=("layout", LAYOUT), - ): - grid.GridItem( - "{{ item.i }}", - v_for="item in layout", - key="item.i", - v_bind="item", - classes="pa-4", - style="border: solid 1px #333; background: rgba(128, 128, 128, 0.5);", - ) + ), + ): + grid.GridItem( + "{{ item.i }}", + v_for="item in layout", + key="item.i", + v_bind="item", + classes="pa-4", + style="border: solid 1px #333; background: rgba(128, 128, 128, 0.5);", + ) if __name__ == "__main__": server.start() diff --git a/examples/pyvista/lighting.py b/examples/pyvista/lighting.py index c3ce727..cd1dc84 100644 --- a/examples/pyvista/lighting.py +++ b/examples/pyvista/lighting.py @@ -1,12 +1,12 @@ """Validate lighting.""" +import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView, VtkRemoteView -import pyvista as pv - server = get_server() state, ctrl = server.state, server.controller @@ -39,36 +39,38 @@ with layout.toolbar: vuetify.VSpacer() - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", + ), + ): + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" ): - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - local = VtkLocalView( - plotter.ren_win, - ) - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - remote = VtkRemoteView( - plotter.ren_win, - ) - - def view_update(**kwargs): - local.update(**kwargs) - remote.update(**kwargs) - - def view_reset_camera(**kwargs): - local.reset_camera(**kwargs) - remote.reset_camera(**kwargs) - - ctrl.view_update = view_update - ctrl.view_reset_camera = view_reset_camera - - ctrl.on_server_ready.add(view_update) + local = VtkLocalView( + plotter.ren_win, + ) + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" + ): + remote = VtkRemoteView( + plotter.ren_win, + ) + + def view_update(**kwargs): + local.update(**kwargs) + remote.update(**kwargs) + + def view_reset_camera(**kwargs): + local.reset_camera(**kwargs) + remote.reset_camera(**kwargs) + + ctrl.view_update = view_update + ctrl.view_reset_camera = view_reset_camera + + ctrl.on_server_ready.add(view_update) # hide footer layout.footer.hide() diff --git a/examples/pyvista/picking.py b/examples/pyvista/picking.py index bacee74..fb65331 100644 --- a/examples/pyvista/picking.py +++ b/examples/pyvista/picking.py @@ -1,10 +1,10 @@ +import pyvista as pv from trame.app import get_server +from trame.assets.local import LocalFileManager from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkRemoteView -from trame.assets.local import LocalFileManager - -import pyvista as pv server = get_server() state, ctrl = server.state, server.controller @@ -46,7 +46,7 @@ def on_box_selection(event): ... @state.change("selection_mode") -def on_mode_change(selection_mode, **kwargs): +def on_mode_change(selection_mode, **_kwargs): # Use box for selection state.box_selection = selection_mode in [ "select_surface_point", @@ -100,22 +100,24 @@ def on_mode_change(selection_mode, **kwargs): width=ICON_SIZE, ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - # with vuetify.VCol(classes="fill-height"): - # view = VtkLocalView(plotter.ren_win) - # ctrl.view_update = view.update - # ctrl.view_reset_camera = view.reset_camera - # with vuetify.VCol(classes="fill-height"): - VtkRemoteView( - plotter.ren_win, - enable_picking=("send_mouse", False), - box_selection=("box_selection", False), - box_selection_change=(ctrl.on_selection_change, "[$event]"), - ) + ), + ): + # with vuetify.VCol(classes="fill-height"): + # view = VtkLocalView(plotter.ren_win) + # ctrl.view_update = view.update + # ctrl.view_reset_camera = view.reset_camera + # with vuetify.VCol(classes="fill-height"): + VtkRemoteView( + plotter.ren_win, + enable_picking=("send_mouse", False), + box_selection=("box_selection", False), + box_selection_change=(ctrl.on_selection_change, "[$event]"), + ) # hide footer layout.footer.hide() diff --git a/examples/pyvista/pump_bracket.py b/examples/pyvista/pump_bracket.py index 4aa5b8c..1573618 100644 --- a/examples/pyvista/pump_bracket.py +++ b/examples/pyvista/pump_bracket.py @@ -2,13 +2,13 @@ import matplotlib.pyplot as plt import numpy as np -from trame.app import asynchronous, get_server -from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify - import pyvista as pv from pyvista import examples from pyvista.trame.ui import plotter_ui +from trame.app import asynchronous, get_server +from trame.ui.vuetify import SinglePageLayout + +from trame.widgets import vuetify pv.OFF_SCREEN = True @@ -45,13 +45,13 @@ @state.change("cmap") -def update_cmap(cmap="viridis", **kwargs): +def update_cmap(cmap="viridis", **_kwargs): actor.mapper.lookup_table.cmap = cmap ctrl.view_update() @state.change("phase_index") -def update_phase(phase_index=0, **kwargs): +def update_phase(phase_index=0, **_kwargs): phase = phases[phase_index] # feel free to change this to visualize different mode shapes mode_shape = "disp_6" @@ -62,7 +62,7 @@ def update_phase(phase_index=0, **kwargs): @state.change("play") @asynchronous.task -async def update_play(**kwargs): +async def update_play(**_kwargs): while state.play: with state: if state.phase_index >= len(phases): diff --git a/examples/pyvista/push_camera_many_actors.py b/examples/pyvista/push_camera_many_actors.py index 2004111..c2b6292 100644 --- a/examples/pyvista/push_camera_many_actors.py +++ b/examples/pyvista/push_camera_many_actors.py @@ -1,9 +1,9 @@ # for remote view +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import html, vtk as vtk_widgets, vuetify from vtkmodules.vtkFiltersSources import vtkConeSource -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, @@ -11,7 +11,9 @@ vtkRenderWindow, vtkRenderWindowInteractor, ) -import vtkmodules.vtkRenderingOpenGL2 # noqa + +from trame.widgets import html, vuetify +from trame.widgets import vtk as vtk_widgets # ----------------------------------------------------------------------------- # Trame initialization @@ -82,32 +84,34 @@ def push_position(): vuetify.VBtn("Push camera", click=push_camera) vuetify.VBtn("Push position", click=push_position) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", style="display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr;", + ), + ): + with html.Div( + style="height: 100%;justify-self: stretch;", + ): + remote_view = vtk_widgets.VtkRemoteView( + renderWindow, + ref="view_remote", + ) + ctrl.view_update.add(remote_view.update) + ctrl.view_reset_camera.add(remote_view.reset_camera) + + with html.Div( + style="height: 100%;justify-self: stretch;", ): - with html.Div( - style="height: 100%;justify-self: stretch;", - ): - remote_view = vtk_widgets.VtkRemoteView( - renderWindow, - ref="view_remote", - ) - ctrl.view_update.add(remote_view.update) - ctrl.view_reset_camera.add(remote_view.reset_camera) - - with html.Div( - style="height: 100%;justify-self: stretch;", - ): - local_view = vtk_widgets.VtkLocalView( - renderWindow, - ref="view_local", - ) - ctrl.view_update.add(local_view.update) - ctrl.view_reset_camera.add(local_view.reset_camera) - ctrl.view_push_camera = local_view.push_camera + local_view = vtk_widgets.VtkLocalView( + renderWindow, + ref="view_local", + ) + ctrl.view_update.add(local_view.update) + ctrl.view_reset_camera.add(local_view.reset_camera) + ctrl.view_push_camera = local_view.push_camera # ----------------------------------------------------------------------------- diff --git a/examples/pyvista/ratios.py b/examples/pyvista/ratios.py index e227efe..a8fd1fe 100644 --- a/examples/pyvista/ratios.py +++ b/examples/pyvista/ratios.py @@ -1,10 +1,10 @@ +import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkRemoteView -import pyvista as pv - server = get_server() state, ctrl = server.state, server.controller @@ -32,14 +32,16 @@ with layout.toolbar: vuetify.VSpacer() - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = VtkRemoteView(plotter.ren_win, interactive_ratio=2, still_ratio=2) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + ): + view = VtkRemoteView(plotter.ren_win, interactive_ratio=2, still_ratio=2) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera # ----------------------------------------------------------------------------- # Main diff --git a/examples/pyvista/scalar_range.py b/examples/pyvista/scalar_range.py index 2e65ef5..53379b0 100644 --- a/examples/pyvista/scalar_range.py +++ b/examples/pyvista/scalar_range.py @@ -1,10 +1,10 @@ import numpy as np +import pyvista as pv +from pyvista.trame.ui import plotter_ui from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify -import pyvista as pv -from pyvista.trame.ui import plotter_ui +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -847,7 +847,9 @@ @state.change("scalar_range") -def set_scalar_range(scalar_range=mesh.get_data_range("foo"), **kwargs): +def set_scalar_range(scalar_range=None, **_kwargs): + if scalar_range is None: + scalar_range = mesh.get_data_range("foo") actor.mapper.scalar_range = scalar_range ctrl.view_update() @@ -875,13 +877,15 @@ def set_scalar_range(scalar_range=mesh.get_data_range("foo"), **kwargs): style="max-width: 400px", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - # Use PyVista UI template for Plotters - view = plotter_ui(pl, default_server_rendering=True) - ctrl.view_update = view.update + ), + ): + # Use PyVista UI template for Plotters + view = plotter_ui(pl, default_server_rendering=True) + ctrl.view_update = view.update server.start() diff --git a/examples/pyvista/silhouette.py b/examples/pyvista/silhouette.py index cfec3d5..ee46340 100644 --- a/examples/pyvista/silhouette.py +++ b/examples/pyvista/silhouette.py @@ -1,11 +1,11 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vtk as vtk_widgets, vuetify from vtkmodules.vtkFiltersHybrid import vtkPolyDataSilhouette from vtkmodules.vtkFiltersSources import vtkConeSource # VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, @@ -13,7 +13,9 @@ vtkRenderWindow, vtkRenderWindowInteractor, ) -import vtkmodules.vtkRenderingOpenGL2 # noqa + +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -65,7 +67,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view2_update() ctrl.view_update() @@ -118,29 +120,31 @@ def on_end_animation(cameraInfo): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="pa-0 fill-height"): - view = vtk_widgets.VtkLocalView( - renderWindow, - ref="local", - interactor_events=("vtk_events", ["EndAnimation"]), - EndAnimation=( - ctrl.view_on_end_animation, - "[$event.pokedRenderer.getActiveCamera().get()]", - ), - ) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vuetify.VCol(classes="pa-0 fill-height"): - vr = vtk_widgets.VtkRemoteView( - renderWindow, - ref="remote", - ) - ctrl.view2_update = vr.update + ), + ): + with vuetify.VCol(classes="pa-0 fill-height"): + view = vtk_widgets.VtkLocalView( + renderWindow, + ref="local", + interactor_events=("vtk_events", ["EndAnimation"]), + EndAnimation=( + ctrl.view_on_end_animation, + "[$event.pokedRenderer.getActiveCamera().get()]", + ), + ) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vuetify.VCol(classes="pa-0 fill-height"): + vr = vtk_widgets.VtkRemoteView( + renderWindow, + ref="remote", + ) + ctrl.view2_update = vr.update # ----------------------------------------------------------------------------- @@ -149,7 +153,7 @@ def on_end_animation(cameraInfo): def show(**kwargs): - from trame.app import jupyter + from trame.app import jupyter # noqa: PLC0415 jupyter.show(server, **kwargs) diff --git a/examples/pyvista/simple.py b/examples/pyvista/simple.py index b4f7386..2eed68b 100644 --- a/examples/pyvista/simple.py +++ b/examples/pyvista/simple.py @@ -1,9 +1,8 @@ -from trame.app import get_server -from trame.ui.vuetify import SinglePageLayout - import pyvista as pv from pyvista import examples from pyvista.trame.ui import plotter_ui +from trame.app import get_server +from trame.ui.vuetify import SinglePageLayout pv.OFF_SCREEN = True @@ -15,8 +14,7 @@ pl = pv.Plotter() pl.add_mesh(mesh) -with SinglePageLayout(server) as layout: - with layout.content: - view = plotter_ui(pl) +with SinglePageLayout(server) as layout, layout.content: + view = plotter_ui(pl) server.start() diff --git a/examples/pyvista/toggle_edge_lighting.py b/examples/pyvista/toggle_edge_lighting.py index af8c9d9..d1ee9e0 100644 --- a/examples/pyvista/toggle_edge_lighting.py +++ b/examples/pyvista/toggle_edge_lighting.py @@ -1,12 +1,12 @@ """Validate Int64 usage with VTK.js.""" +import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView, VtkRemoteView -import pyvista as pv - server = get_server() state, ctrl = server.state, server.controller @@ -38,17 +38,19 @@ def toggle_edges(): vuetify.VSpacer() vuetify.VBtn("Toggle edges", click=toggle_edges) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="fill-height"): - view = VtkLocalView(plotter.ren_win) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vuetify.VCol(classes="fill-height"): - VtkRemoteView(plotter.ren_win) + ), + ): + with vuetify.VCol(classes="fill-height"): + view = VtkLocalView(plotter.ren_win) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vuetify.VCol(classes="fill-height"): + VtkRemoteView(plotter.ren_win) # hide footer layout.footer.hide() diff --git a/examples/pyvista/toggle_edges_many_actors.py b/examples/pyvista/toggle_edges_many_actors.py index 4ff45d1..e6d2897 100644 --- a/examples/pyvista/toggle_edges_many_actors.py +++ b/examples/pyvista/toggle_edges_many_actors.py @@ -1,9 +1,9 @@ # for remote view +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vtk as vtk_widgets, vuetify from vtkmodules.vtkFiltersSources import vtkConeSource -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, @@ -11,7 +11,9 @@ vtkRenderWindow, vtkRenderWindowInteractor, ) -import vtkmodules.vtkRenderingOpenGL2 # noqa + +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -79,18 +81,20 @@ def toggle_edges(): vuetify.VSpacer() vuetify.VBtn("Toggle edges", click=toggle_edges) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - local_view = vtk_widgets.VtkLocalView( - renderWindow, - ref="view_local", - ) - ctrl.view_update = local_view.update - ctrl.view_reset_camera = local_view.reset_camera - ctrl.view_push_camera = local_view.push_camera + ), + ): + local_view = vtk_widgets.VtkLocalView( + renderWindow, + ref="view_local", + ) + ctrl.view_update = local_view.update + ctrl.view_reset_camera = local_view.reset_camera + ctrl.view_push_camera = local_view.push_camera # ----------------------------------------------------------------------------- diff --git a/examples/pyvista/volume.py b/examples/pyvista/volume.py index 3bbe6f0..f6dd6d8 100644 --- a/examples/pyvista/volume.py +++ b/examples/pyvista/volume.py @@ -1,9 +1,9 @@ +import pyvista as pv +from pyvista.trame import PyVistaLocalView from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify -import pyvista as pv -from pyvista.trame import PyVistaLocalView +from trame.widgets import vuetify server = get_server() server.client_type = "vue2" @@ -33,14 +33,16 @@ with layout.toolbar: vuetify.VSpacer() - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = PyVistaLocalView(plotter) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + ): + view = PyVistaLocalView(plotter) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera # hide footer layout.footer.hide() diff --git a/examples/validation/AddRemoveActors.py b/examples/validation/AddRemoveActors.py index 8ba490f..2f06390 100644 --- a/examples/validation/AddRemoveActors.py +++ b/examples/validation/AddRemoveActors.py @@ -1,20 +1,20 @@ +# for remote view +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersModeling import vtkOutlineFilter from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -# for remote view -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -75,7 +75,7 @@ def create_pipeline(source): @state.change("resolution") -def update_resolution(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_resolution(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -85,7 +85,7 @@ def update_reset_resolution(): @state.change("show_cone") -def update_cone(show_cone, **kwargs): +def update_cone(show_cone, **_kwargs): if show_cone: renderer.AddActor(cone_actor) else: @@ -94,7 +94,7 @@ def update_cone(show_cone, **kwargs): @state.change("show_sphere") -def update_sphere(show_sphere, **kwargs): +def update_sphere(show_sphere, **_kwargs): if show_sphere: renderer.AddActor(sphere_actor) else: @@ -144,22 +144,24 @@ def update_sphere(show_sphere, **kwargs): v_model=("show_sphere", True), label="Sphere", dense=True, hide_details=True ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkLocalView( - renderWindow, ref="view_local", v_if="use_local" - ) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - - view_remote = vtk_widgets.VtkRemoteView( - renderWindow, ref="view_remote", v_if="!use_local" - ) - ctrl.view_reset_camera.add(view_remote.reset_camera) - ctrl.view_update.add(view_remote.update) + ), + ): + view = vtk_widgets.VtkLocalView( + renderWindow, ref="view_local", v_if="use_local" + ) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + + view_remote = vtk_widgets.VtkRemoteView( + renderWindow, ref="view_remote", v_if="!use_local" + ) + ctrl.view_reset_camera.add(view_remote.reset_camera) + ctrl.view_update.add(view_remote.update) # ----------------------------------------------------------------------------- diff --git a/examples/validation/Animation.py b/examples/validation/Animation.py index c193309..7b04bc9 100644 --- a/examples/validation/Animation.py +++ b/examples/validation/Animation.py @@ -1,10 +1,10 @@ import asyncio -from trame.app import get_server, asynchronous +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 +from trame.app import asynchronous, get_server from trame.ui.vuetify3 import SinglePageLayout -from trame.widgets import vuetify3 as v3, vtk as vtk_widgets - from vtkmodules.vtkFiltersSources import vtkConeSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, @@ -12,8 +12,9 @@ vtkRenderWindow, vtkRenderWindowInteractor, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa + +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 as v3 renderer = vtkRenderer() renderWindow = vtkRenderWindow() @@ -84,17 +85,19 @@ def on_animation_change(mode, **_): style="max-width: 200px;", ) - with layout.content: - with v3.VContainer( + with ( + layout.content, + v3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteView( - renderWindow, interactive_quality=80, interactive_ratio=1 - ) - ctrl.view_update = view.update - ctrl.view_start_animation = view.start_animation - ctrl.view_stop_animation = view.stop_animation + ), + ): + view = vtk_widgets.VtkRemoteView( + renderWindow, interactive_quality=80, interactive_ratio=1 + ) + ctrl.view_update = view.update + ctrl.view_start_animation = view.start_animation + ctrl.view_stop_animation = view.stop_animation if __name__ == "__main__": server.start() diff --git a/examples/validation/AnimationPV.py b/examples/validation/AnimationPV.py index 6f361b5..280c1a4 100644 --- a/examples/validation/AnimationPV.py +++ b/examples/validation/AnimationPV.py @@ -1,10 +1,11 @@ import asyncio -from trame.app import get_server, asynchronous +from paraview import simple +from trame.app import asynchronous, get_server from trame.ui.vuetify3 import SinglePageLayout -from trame.widgets import vuetify3 as v3, paraview as pv_widgets -from paraview import simple +from trame.widgets import paraview as pv_widgets +from trame.widgets import vuetify3 as v3 server = get_server(client_type="vue3") state, ctrl = server.state, server.controller @@ -68,17 +69,17 @@ def on_animation_change(mode, **_): style="max-width: 200px;", ) - with layout.content: - with v3.VContainer( + with ( + layout.content, + v3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = pv_widgets.VtkRemoteView( - v, interactive_quality=80, interactive_ratio=1 - ) - ctrl.view_update = view.update - ctrl.view_start_animation = view.start_animation - ctrl.view_stop_animation = view.stop_animation + ), + ): + view = pv_widgets.VtkRemoteView(v, interactive_quality=80, interactive_ratio=1) + ctrl.view_update = view.update + ctrl.view_start_animation = view.start_animation + ctrl.view_stop_animation = view.stop_animation if __name__ == "__main__": server.start() diff --git a/examples/validation/AxesActor.py b/examples/validation/AxesActor.py index 50b98ee..3be0a8d 100644 --- a/examples/validation/AxesActor.py +++ b/examples/validation/AxesActor.py @@ -1,8 +1,10 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, vtk as vtk_widgets - +from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkFiltersSources import vtkConeSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 +from vtkmodules.vtkRenderingAnnotation import vtkAxesActor from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, @@ -10,10 +12,9 @@ vtkRenderWindow, vtkRenderWindowInteractor, ) -from vtkmodules.vtkRenderingAnnotation import vtkAxesActor -from vtkmodules.vtkCommonTransforms import vtkTransform -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa + +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify renderer = vtkRenderer() renderWindow = vtkRenderWindow() @@ -46,15 +47,17 @@ with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="pa-0 ma-1 fill-height"): - vtk_widgets.VtkLocalView(renderWindow) - with vuetify.VCol(classes="pa-0 ma-1 fill-height"): - vtk_widgets.VtkRemoteView(renderWindow, interactive_ratio=1) + ), + ): + with vuetify.VCol(classes="pa-0 ma-1 fill-height"): + vtk_widgets.VtkLocalView(renderWindow) + with vuetify.VCol(classes="pa-0 ma-1 fill-height"): + vtk_widgets.VtkRemoteView(renderWindow, interactive_ratio=1) if __name__ == "__main__": diff --git a/examples/validation/BigIntCoords.py b/examples/validation/BigIntCoords.py index ba7e958..9a4dee8 100644 --- a/examples/validation/BigIntCoords.py +++ b/examples/validation/BigIntCoords.py @@ -1,9 +1,9 @@ from pathlib import Path +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.html import DivLayout -from trame.widgets import vtk - +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkIOXML import vtkXMLRectilinearGridReader from vtkmodules.vtkRenderingCore import ( vtkActor, @@ -12,8 +12,8 @@ vtkRenderWindow, vtkRenderWindowInteractor, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa + +from trame.widgets import vtk DATA_FILE = (Path(__file__).parent.with_name("data") / "big-int-coord.vtr").resolve() diff --git a/examples/validation/CaptureImage.py b/examples/validation/CaptureImage.py index 1152c6b..1bdd957 100644 --- a/examples/validation/CaptureImage.py +++ b/examples/validation/CaptureImage.py @@ -1,20 +1,21 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.app.file_upload import ClientFile -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -52,7 +53,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -87,18 +88,20 @@ def save_image_on_server(screenshot_file): with vuetify.VBtn(icon=True, click=ctrl.view_capture_image): vuetify.VIcon("mdi-camera-outline") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteLocalView( - renderWindow, - on_remote_image_capture="utils.download('remote.png', $event)", - on_local_image_capture="utils.download('local.png', $event)", - ) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - ctrl.view_capture_image = view.capture_image + ), + ): + view = vtk_widgets.VtkRemoteLocalView( + renderWindow, + on_remote_image_capture="utils.download('remote.png', $event)", + on_local_image_capture="utils.download('local.png', $event)", + ) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + ctrl.view_capture_image = view.capture_image server.start() diff --git a/examples/validation/CaptureImageLocal.py b/examples/validation/CaptureImageLocal.py index ecd9862..818fb8a 100644 --- a/examples/validation/CaptureImageLocal.py +++ b/examples/validation/CaptureImageLocal.py @@ -1,20 +1,21 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.app.file_upload import ClientFile -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -52,7 +53,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() diff --git a/examples/validation/CaptureImageRemote.py b/examples/validation/CaptureImageRemote.py index 49faa80..f81ab21 100644 --- a/examples/validation/CaptureImageRemote.py +++ b/examples/validation/CaptureImageRemote.py @@ -1,20 +1,21 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.app.file_upload import ClientFile -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -52,7 +53,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() diff --git a/examples/validation/ColorByComponent.py b/examples/validation/ColorByComponent.py index b2745df..4e2764a 100644 --- a/examples/validation/ColorByComponent.py +++ b/examples/validation/ColorByComponent.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkSphereSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -60,7 +61,7 @@ @state.change("component_idx") -def color_by_array(component_idx, **kwargs): +def color_by_array(component_idx, **_kwargs): lut.SetVectorComponent(component_idx) ctrl.remote_view_update() ctrl.local_view_update() @@ -77,27 +78,29 @@ def color_by_array(component_idx, **kwargs): items=( "components", [ - dict(value=0, text="X"), - dict(value=1, text="Y"), - dict(value=2, text="Z"), + {"value": 0, "text": "X"}, + {"value": 1, "text": "Y"}, + {"value": 2, "text": "Z"}, ], ), dense=True, hide_details=True, ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="pa-0 fill-height"): - view = vtk_widgets.VtkLocalView(renderWindow, ref="local") - ctrl.local_view_update = view.update - ctrl.view_reset_camera.add(view.reset_camera) - with vuetify.VCol(classes="pa-0 fill-height"): - view = vtk_widgets.VtkRemoteView(renderWindow, ref="remote") - ctrl.remote_view_update = view.update - ctrl.view_reset_camera.add(view.reset_camera) + ), + ): + with vuetify.VCol(classes="pa-0 fill-height"): + view = vtk_widgets.VtkLocalView(renderWindow, ref="local") + ctrl.local_view_update = view.update + ctrl.view_reset_camera.add(view.reset_camera) + with vuetify.VCol(classes="pa-0 fill-height"): + view = vtk_widgets.VtkRemoteView(renderWindow, ref="remote") + ctrl.remote_view_update = view.update + ctrl.view_reset_camera.add(view.reset_camera) server.start() diff --git a/examples/validation/ColorByComponentPyVista.py b/examples/validation/ColorByComponentPyVista.py index c011bfc..2c4f13d 100644 --- a/examples/validation/ColorByComponentPyVista.py +++ b/examples/validation/ColorByComponentPyVista.py @@ -1,8 +1,9 @@ +import pyvista as pv from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout -import pyvista as pv +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify from trame_vtk.modules.vtk.serializers import encode_lut pv.OFF_SCREEN = True @@ -44,7 +45,7 @@ @state.change("component_idx") -def color_by_array(component_idx, **kwargs): +def color_by_array(component_idx, **_kwargs): lut.SetVectorModeToComponent() lut.SetVectorSize(3) lut.SetVectorComponent(component_idx) @@ -54,7 +55,7 @@ def color_by_array(component_idx, **kwargs): @state.change("cmap") -def color_preset(cmap, **kwargs): +def color_preset(cmap, **_kwargs): lut.cmap = cmap ctrl.remote_view_update() ctrl.local_view_update() @@ -71,9 +72,9 @@ def color_preset(cmap, **kwargs): items=( "components", [ - dict(value=0, text="X"), - dict(value=1, text="Y"), - dict(value=2, text="Z"), + {"value": 0, "text": "X"}, + {"value": 1, "text": "Y"}, + {"value": 2, "text": "Z"}, ], ), dense=True, @@ -92,19 +93,21 @@ def color_preset(cmap, **kwargs): hide_details=True, ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="pa-0 fill-height"): - view = vtk_widgets.VtkLocalView(plotter.render_window, ref="local") - ctrl.local_view_update = view.update - ctrl.view_reset_camera.add(view.reset_camera) - ctrl.view_push_camera.add(view.push_camera) - with vuetify.VCol(classes="pa-0 fill-height"): - view = vtk_widgets.VtkRemoteView(plotter.render_window, ref="remote") - ctrl.remote_view_update = view.update - ctrl.view_reset_camera.add(view.reset_camera) + ), + ): + with vuetify.VCol(classes="pa-0 fill-height"): + view = vtk_widgets.VtkLocalView(plotter.render_window, ref="local") + ctrl.local_view_update = view.update + ctrl.view_reset_camera.add(view.reset_camera) + ctrl.view_push_camera.add(view.push_camera) + with vuetify.VCol(classes="pa-0 fill-height"): + view = vtk_widgets.VtkRemoteView(plotter.render_window, ref="remote") + ctrl.remote_view_update = view.update + ctrl.view_reset_camera.add(view.reset_camera) server.start() diff --git a/examples/validation/ExportScene.py b/examples/validation/ExportScene.py index 6b026ad..e7be045 100644 --- a/examples/validation/ExportScene.py +++ b/examples/validation/ExportScene.py @@ -1,7 +1,5 @@ from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, vtk as vtk_widgets - from vtkmodules.vtkFiltersSources import vtkConeSource from vtkmodules.vtkRenderingCore import ( vtkActor, @@ -11,6 +9,9 @@ vtkRenderWindowInteractor, ) +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify + renderer = vtkRenderer() renderWindow = vtkRenderWindow() renderWindow.AddRenderer(renderer) @@ -40,7 +41,7 @@ def export_scene(): @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -71,16 +72,18 @@ def update_reset_resolution(): click="utils.download('scene-extract.vtksz', trigger('export'), 'application/octet-stream')", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="pa-0 ma-1 fill-height"): - view = vtk_widgets.VtkLocalView(renderWindow) - ctrl.view_export = view.export - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + vuetify.VCol(classes="pa-0 ma-1 fill-height"), + ): + view = vtk_widgets.VtkLocalView(renderWindow) + ctrl.view_export = view.export + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera if __name__ == "__main__": server.start() diff --git a/examples/validation/ManyViews.py b/examples/validation/ManyViews.py index 48ef884..9f1d0d3 100644 --- a/examples/validation/ManyViews.py +++ b/examples/validation/ManyViews.py @@ -1,20 +1,20 @@ +# for remote view +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, html, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersModeling import vtkOutlineFilter from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -# for remote view -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import html, vuetify +from trame.widgets import vtk as vtk_widgets # ----------------------------------------------------------------------------- # Trame initialization @@ -80,18 +80,18 @@ def create_vtk_view(color): renderer.ResetCamera() renderWindow.Render() - return dict( - render_window=renderWindow, - renderer=renderer, - sphere=sphere_source, - cone=cone_source, - cone_actor=cone_actor, - sphere_actor=sphere_actor, - show_cone=True, - show_sphere=True, - resolution=DEFAULT_RESOLUTION, - widget_on=True, - ) + return { + "render_window": renderWindow, + "renderer": renderer, + "sphere": sphere_source, + "cone": cone_source, + "cone_actor": cone_actor, + "sphere_actor": sphere_actor, + "show_cone": True, + "show_sphere": True, + "resolution": DEFAULT_RESOLUTION, + "widget_on": True, + } # Create 4 views @@ -114,7 +114,7 @@ def reset_active_view(): @state.change("active_view") -def active_view_change(active_view, **kwargs): +def active_view_change(active_view, **_kwargs): pipeline = VIEWS[active_view] state.show_cone = pipeline.get("show_cone") state.show_sphere = pipeline.get("show_sphere") @@ -123,12 +123,12 @@ def active_view_change(active_view, **kwargs): @state.change("widget_on") -def toggle_view(widget_on, active_view, **kwargs): +def toggle_view(widget_on, active_view, **_kwargs): state[f"widget_on_{active_view}"] = widget_on @state.change("resolution") -def update_resolution(resolution, active_view, **kwargs): +def update_resolution(resolution, active_view, **_kwargs): pipeline = VIEWS[active_view] pipeline.get("cone").SetResolution(resolution) pipeline["resolution"] = resolution @@ -140,7 +140,7 @@ def update_reset_resolution(): @state.change("show_cone") -def update_cone(active_view, show_cone, **kwargs): +def update_cone(active_view, show_cone, **_kwargs): pipeline = VIEWS[active_view] renderer = pipeline.get("renderer") cone_actor = pipeline.get("cone_actor") @@ -153,7 +153,7 @@ def update_cone(active_view, show_cone, **kwargs): @state.change("show_sphere") -def update_sphere(active_view, show_sphere, **kwargs): +def update_sphere(active_view, show_sphere, **_kwargs): pipeline = VIEWS[active_view] renderer = pipeline.get("renderer") sphere_actor = pipeline.get("sphere_actor") diff --git a/examples/validation/NoSize.py b/examples/validation/NoSize.py index b5a2f7a..d26b8e1 100644 --- a/examples/validation/NoSize.py +++ b/examples/validation/NoSize.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -85,13 +86,12 @@ hide_details=True, ) - with layout.content: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - with vuetify.VCol(classes="pa-0 fill-height"): - with vtk_widgets.VtkRemoteView(renderWindow, ref="v1") as view: - ctrl.view_reset_camera.add(view.reset_camera) - with vuetify.VCol(classes="pa-0 fill-height", v_show="show"): - with vtk_widgets.VtkRemoteView(renderWindow_v2, ref="v2") as view: - ctrl.view_reset_camera.add(view.reset_camera) + with layout.content, vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + with vuetify.VCol(classes="pa-0 fill-height"): + with vtk_widgets.VtkRemoteView(renderWindow, ref="v1") as view: + ctrl.view_reset_camera.add(view.reset_camera) + with vuetify.VCol(classes="pa-0 fill-height", v_show="show"): + with vtk_widgets.VtkRemoteView(renderWindow_v2, ref="v2") as view: + ctrl.view_reset_camera.add(view.reset_camera) server.start() diff --git a/examples/validation/PickingRemoteLocalView.py b/examples/validation/PickingRemoteLocalView.py index be15a2d..a246daa 100644 --- a/examples/validation/PickingRemoteLocalView.py +++ b/examples/validation/PickingRemoteLocalView.py @@ -1,22 +1,21 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.html import DivLayout -from trame.widgets import html, client, vtk as vtk_widgets - from vtkmodules.vtkCommonDataModel import vtkDataObject from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkHardwareSelector, + vtkPolyDataMapper, + vtkPropPicker, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, - vtkPropPicker, - vtkHardwareSelector, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa - +from trame.widgets import client, html +from trame.widgets import vtk as vtk_widgets from trame_vtk.modules.vtk.serializers.utils import reference_id INTERACTOR_SETTINGS_WITH_SELECT = [ diff --git a/examples/validation/PickingRemoteView.py b/examples/validation/PickingRemoteView.py index 80afbd2..25af699 100644 --- a/examples/validation/PickingRemoteView.py +++ b/examples/validation/PickingRemoteView.py @@ -1,21 +1,21 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server from trame.ui.html import DivLayout -from trame.widgets import html, client, vtk as vtk_widgets - from vtkmodules.vtkCommonDataModel import vtkDataObject from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkHardwareSelector, + vtkPolyDataMapper, + vtkPropPicker, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, - vtkPropPicker, - vtkHardwareSelector, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import client, html +from trame.widgets import vtk as vtk_widgets class PickingExample: diff --git a/examples/validation/PushCamera.py b/examples/validation/PushCamera.py index e7dae1e..d879b6d 100644 --- a/examples/validation/PushCamera.py +++ b/examples/validation/PushCamera.py @@ -1,19 +1,19 @@ +# for remote view +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, html, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -# for remote view -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import html, vuetify +from trame.widgets import vtk as vtk_widgets # ----------------------------------------------------------------------------- # Trame initialization @@ -57,7 +57,7 @@ @state.change("resolution") -def update_resolution(resolution, **kwargs): +def update_resolution(resolution, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -93,32 +93,34 @@ def push_camera(): style="max-width: 300px", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", style="display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr;", + ), + ): + with html.Div( + style="height: 100%;justify-self: stretch;", + ): + remote_view = vtk_widgets.VtkRemoteView( + renderWindow, + ref="view_remote", + ) + ctrl.view_update.add(remote_view.update) + ctrl.view_reset_camera.add(remote_view.reset_camera) + + with html.Div( + style="height: 100%;justify-self: stretch;", ): - with html.Div( - style="height: 100%;justify-self: stretch;", - ): - remote_view = vtk_widgets.VtkRemoteView( - renderWindow, - ref="view_remote", - ) - ctrl.view_update.add(remote_view.update) - ctrl.view_reset_camera.add(remote_view.reset_camera) - - with html.Div( - style="height: 100%;justify-self: stretch;", - ): - local_view = vtk_widgets.VtkLocalView( - renderWindow, - ref="view_local", - ) - ctrl.view_update.add(local_view.update) - ctrl.view_reset_camera.add(local_view.reset_camera) - ctrl.view_push_camera = local_view.push_camera + local_view = vtk_widgets.VtkLocalView( + renderWindow, + ref="view_local", + ) + ctrl.view_update.add(local_view.update) + ctrl.view_reset_camera.add(local_view.reset_camera) + ctrl.view_push_camera = local_view.push_camera # ----------------------------------------------------------------------------- diff --git a/examples/validation/PvConeLocal.py b/examples/validation/PvConeLocal.py index e892aed..de01cfe 100644 --- a/examples/validation/PvConeLocal.py +++ b/examples/validation/PvConeLocal.py @@ -1,11 +1,10 @@ # pvpython ./PvConeLocal.py --venv /path/to/venv import paraview.web.venv - +from paraview import simple from trame.app import get_server -from trame.widgets import vuetify, paraview from trame.ui.vuetify import SinglePageLayout -from paraview import simple +from trame.widgets import paraview, vuetify # ----------------------------------------------------------------------------- # Trame setup @@ -27,7 +26,7 @@ @state.change("resolution") -def update_cone(resolution, **kwargs): +def update_cone(resolution, **_kwargs): cone.Resolution = resolution ctrl.view_update() @@ -61,11 +60,10 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - html_view = paraview.VtkLocalView(view, ref="view") - ctrl.view_reset_camera = html_view.reset_camera - ctrl.view_update = html_view.update + with layout.content, vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + html_view = paraview.VtkLocalView(view, ref="view") + ctrl.view_reset_camera = html_view.reset_camera + ctrl.view_update = html_view.update # ----------------------------------------------------------------------------- # Main diff --git a/examples/validation/PvConeRemote.py b/examples/validation/PvConeRemote.py index f677533..1cda7e9 100644 --- a/examples/validation/PvConeRemote.py +++ b/examples/validation/PvConeRemote.py @@ -1,11 +1,10 @@ # pvpython ./PvConeRemote.py --venv /path/to/venv import paraview.web.venv - +from paraview import simple from trame.app import get_server -from trame.widgets import vuetify, paraview from trame.ui.vuetify import SinglePageLayout -from paraview import simple +from trame.widgets import paraview, vuetify # ----------------------------------------------------------------------------- # Trame setup @@ -27,7 +26,7 @@ @state.change("resolution") -def update_cone(resolution, **kwargs): +def update_cone(resolution, **_kwargs): cone.Resolution = resolution ctrl.view_update() @@ -61,11 +60,10 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - html_view = paraview.VtkRemoteView(view, ref="view") - ctrl.view_reset_camera = html_view.reset_camera - ctrl.view_update = html_view.update + with layout.content, vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + html_view = paraview.VtkRemoteView(view, ref="view") + ctrl.view_reset_camera = html_view.reset_camera + ctrl.view_update = html_view.update # ----------------------------------------------------------------------------- # Main diff --git a/examples/validation/PvConeRemoteLocal.py b/examples/validation/PvConeRemoteLocal.py index b73d51c..411437a 100644 --- a/examples/validation/PvConeRemoteLocal.py +++ b/examples/validation/PvConeRemoteLocal.py @@ -1,12 +1,11 @@ # pvpython ./PvConeRemoteLocal.py --venv /path/to/venv # pvpython ./PvConeRemote.py --venv /path/to/venv import paraview.web.venv - +from paraview import simple from trame.app import get_server -from trame.widgets import vuetify, paraview, html from trame.ui.vuetify import SinglePageLayout -from paraview import simple +from trame.widgets import html, paraview, vuetify # ----------------------------------------------------------------------------- # Trame setup @@ -28,7 +27,7 @@ @state.change("resolution") -def update_cone(resolution, **kwargs): +def update_cone(resolution, **_kwargs): cone.Resolution = resolution ctrl.view_update() @@ -73,13 +72,12 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - html_view = paraview.VtkRemoteLocalView( - view, mode=("rendering_mode", "local"), ref="view" - ) - ctrl.view_reset_camera = html_view.reset_camera - ctrl.view_update = html_view.update + with layout.content, vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + html_view = paraview.VtkRemoteLocalView( + view, mode=("rendering_mode", "local"), ref="view" + ) + ctrl.view_reset_camera = html_view.reset_camera + ctrl.view_update = html_view.update # ----------------------------------------------------------------------------- # Main diff --git a/examples/validation/PyVistaAxesGrid.py b/examples/validation/PyVistaAxesGrid.py index 12d3a90..9fdc128 100644 --- a/examples/validation/PyVistaAxesGrid.py +++ b/examples/validation/PyVistaAxesGrid.py @@ -4,13 +4,13 @@ is synchroniezed in addition to text colors. """ +import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView -import pyvista as pv - server = get_server() server.client_type = "vue2" state, ctrl = server.state, server.controller @@ -40,14 +40,16 @@ with layout.toolbar: vuetify.VSpacer() - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = VtkLocalView(plotter.ren_win) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + ): + view = VtkLocalView(plotter.ren_win) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera # hide footer layout.footer.hide() diff --git a/examples/validation/PyVistaAxesWidget.py b/examples/validation/PyVistaAxesWidget.py index e0cb388..58216f0 100644 --- a/examples/validation/PyVistaAxesWidget.py +++ b/examples/validation/PyVistaAxesWidget.py @@ -3,6 +3,7 @@ import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView, VtkRemoteView @@ -25,7 +26,7 @@ @state.change("show_widget") -def toggle_axes_widget(show_widget, **kwargs): +def toggle_axes_widget(show_widget, **_kwargs): if show_widget: plotter.renderer.show_axes() else: @@ -53,24 +54,26 @@ def toggle_axes_widget(show_widget, **kwargs): classes="my-0 py-0 ml-1", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="fill-height"): - view = VtkLocalView( - plotter.ren_win, ref="local" - ) # or widgets=[axes_widget] - ctrl.view_update.add(view.update) - ctrl.view_reset_camera.add(view.reset_camera) - ctrl.view_widgets_set = view.set_widgets - view.set_widgets([axes_widget]) # or at constructor - - with vuetify.VCol(classes="fill-height"): - view = VtkRemoteView(plotter.ren_win, ref="remote") - ctrl.view_update.add(view.update) - ctrl.view_reset_camera.add(view.reset_camera) + ), + ): + with vuetify.VCol(classes="fill-height"): + view = VtkLocalView( + plotter.ren_win, ref="local" + ) # or widgets=[axes_widget] + ctrl.view_update.add(view.update) + ctrl.view_reset_camera.add(view.reset_camera) + ctrl.view_widgets_set = view.set_widgets + view.set_widgets([axes_widget]) # or at constructor + + with vuetify.VCol(classes="fill-height"): + view = VtkRemoteView(plotter.ren_win, ref="remote") + ctrl.view_update.add(view.update) + ctrl.view_reset_camera.add(view.reset_camera) # hide footer layout.footer.hide() diff --git a/examples/validation/PyVistaAxesWidgetSubplot.py b/examples/validation/PyVistaAxesWidgetSubplot.py index a964cc3..219bf0c 100644 --- a/examples/validation/PyVistaAxesWidgetSubplot.py +++ b/examples/validation/PyVistaAxesWidgetSubplot.py @@ -3,6 +3,7 @@ import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView, VtkRemoteView @@ -32,7 +33,7 @@ @state.change("show_widget_a") -def toggle_axes_widget_a(show_widget_a, **kwargs): +def toggle_axes_widget_a(show_widget_a, **_kwargs): plotter.subplot(0, 0) if show_widget_a: plotter.renderer.show_axes() @@ -42,7 +43,7 @@ def toggle_axes_widget_a(show_widget_a, **kwargs): @state.change("show_widget_b") -def toggle_axes_widget_b(show_widget_b, **kwargs): +def toggle_axes_widget_b(show_widget_b, **_kwargs): plotter.subplot(0, 1) if show_widget_b: plotter.renderer.show_axes() @@ -80,21 +81,23 @@ def toggle_axes_widget_b(show_widget_b, **kwargs): classes="my-0 py-0 ml-1", ) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="fill-height"): - view = VtkLocalView(plotter.ren_win, ref="local") - ctrl.view_update.add(view.update) - ctrl.view_reset_camera.add(view.reset_camera) - view.set_widgets([axes_widget_0, axes_widget_1]) # or at constructor - - with vuetify.VCol(classes="fill-height"): - view = VtkRemoteView(plotter.ren_win, ref="remote") - ctrl.view_update.add(view.update) - ctrl.view_reset_camera.add(view.reset_camera) + ), + ): + with vuetify.VCol(classes="fill-height"): + view = VtkLocalView(plotter.ren_win, ref="local") + ctrl.view_update.add(view.update) + ctrl.view_reset_camera.add(view.reset_camera) + view.set_widgets([axes_widget_0, axes_widget_1]) # or at constructor + + with vuetify.VCol(classes="fill-height"): + view = VtkRemoteView(plotter.ren_win, ref="remote") + ctrl.view_update.add(view.update) + ctrl.view_reset_camera.add(view.reset_camera) # hide footer layout.footer.hide() diff --git a/examples/validation/PyVistaAxesWidgetSubplotLinked.py b/examples/validation/PyVistaAxesWidgetSubplotLinked.py index 716ac85..0ae4498 100644 --- a/examples/validation/PyVistaAxesWidgetSubplotLinked.py +++ b/examples/validation/PyVistaAxesWidgetSubplotLinked.py @@ -3,6 +3,7 @@ import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout + from trame.widgets import vuetify from trame.widgets.vtk import VtkLocalView, VtkRemoteView @@ -43,20 +44,22 @@ with layout.toolbar: vuetify.VSpacer() - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="fill-height"): - view = VtkLocalView( - plotter.ren_win, widgets=[axes_widget_0, axes_widget_1], ref="local" - ) - ctrl.view_update = view.update - ctrl.view_reset_camera.add(view.reset_camera) - with vuetify.VCol(classes="fill-height"): - view = VtkRemoteView(plotter.ren_win, ref="remote") - ctrl.view_reset_camera.add(view.reset_camera) + ), + ): + with vuetify.VCol(classes="fill-height"): + view = VtkLocalView( + plotter.ren_win, widgets=[axes_widget_0, axes_widget_1], ref="local" + ) + ctrl.view_update = view.update + ctrl.view_reset_camera.add(view.reset_camera) + with vuetify.VCol(classes="fill-height"): + view = VtkRemoteView(plotter.ren_win, ref="remote") + ctrl.view_reset_camera.add(view.reset_camera) # hide footer layout.footer.hide() diff --git a/examples/validation/PyVistaDynaLUT.py b/examples/validation/PyVistaDynaLUT.py index 1b0957b..51e7e1c 100644 --- a/examples/validation/PyVistaDynaLUT.py +++ b/examples/validation/PyVistaDynaLUT.py @@ -1,15 +1,15 @@ import matplotlib.pyplot as plt -from trame.app import get_server -from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify - import pyvista as pv from pyvista import examples from pyvista.trame.ui import plotter_ui +from trame.app import get_server +from trame.ui.vuetify import SinglePageLayout # Just for using this script in testing from trame_client.utils.testing import enable_testing +from trame.widgets import vuetify + pv.OFF_SCREEN = True server = enable_testing(get_server()) @@ -27,7 +27,7 @@ @state.change("cmap") -def update_cmap(cmap="viridis", **kwargs): +def update_cmap(cmap="viridis", **_kwargs): actor.mapper.lookup_table.cmap = cmap ctrl.view_update() diff --git a/examples/validation/PyVistaFirstStillRatio.py b/examples/validation/PyVistaFirstStillRatio.py index c5b3dd3..2a9e55e 100644 --- a/examples/validation/PyVistaFirstStillRatio.py +++ b/examples/validation/PyVistaFirstStillRatio.py @@ -1,7 +1,9 @@ import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, vtk as vtk_widgets + +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify server = get_server() server.client_type = "vue2" @@ -28,18 +30,20 @@ with layout.toolbar: vuetify.VSpacer() - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteView( - plotter.ren_win, - interactive_ratio=2, - still_ratio=2, - ) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + ): + view = vtk_widgets.VtkRemoteView( + plotter.ren_win, + interactive_ratio=2, + still_ratio=2, + ) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera if __name__ == "__main__": diff --git a/examples/validation/PyVistaInt64.py b/examples/validation/PyVistaInt64.py index abea10a..5cc2059 100644 --- a/examples/validation/PyVistaInt64.py +++ b/examples/validation/PyVistaInt64.py @@ -1,15 +1,16 @@ """Validate Int64 usage with VTK.js.""" -import pyvista as pv import numpy as np +import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, html -from trame.widgets.vtk import VtkLocalView, VtkRemoteView # Just for using this script in testing from trame_client.utils.testing import enable_testing +from trame.widgets import html, vuetify +from trame.widgets.vtk import VtkLocalView, VtkRemoteView + server = enable_testing(get_server(), "local_rendering_ready") server.client_type = "vue2" state, ctrl = server.state, server.controller @@ -39,20 +40,22 @@ vuetify.VSpacer() html.Div("{{ local_rendering_ready }}", classes="readyCount") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="fill-height"): - view = VtkLocalView( - plotter.ren_win, - on_ready="local_rendering_ready++", - ) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vuetify.VCol(classes="fill-height"): - VtkRemoteView(plotter.ren_win) + ), + ): + with vuetify.VCol(classes="fill-height"): + view = VtkLocalView( + plotter.ren_win, + on_ready="local_rendering_ready++", + ) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vuetify.VCol(classes="fill-height"): + VtkRemoteView(plotter.ren_win) # hide footer layout.footer.hide() diff --git a/examples/validation/PyVistaLookupTable.py b/examples/validation/PyVistaLookupTable.py index d3d5273..6dbd54f 100644 --- a/examples/validation/PyVistaLookupTable.py +++ b/examples/validation/PyVistaLookupTable.py @@ -3,11 +3,13 @@ import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, html, vtk as vtk_widgets # Just for using this script in testing from trame_client.utils.testing import enable_testing +from trame.widgets import html, vuetify +from trame.widgets import vtk as vtk_widgets + server = enable_testing(get_server(), "local_rendering_ready") server.client_type = "vue2" state, ctrl = server.state, server.controller @@ -38,37 +40,39 @@ vuetify.VSpacer() html.Div("{{ local_rendering_ready }}", classes="readyCount") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", + ), + ): + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" + ): + local = vtk_widgets.VtkLocalView( + plotter.ren_win, + on_ready="local_rendering_ready++", + ) + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" ): - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - local = vtk_widgets.VtkLocalView( - plotter.ren_win, - on_ready="local_rendering_ready++", - ) - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - remote = vtk_widgets.VtkRemoteView( - plotter.ren_win, - ) - - def view_update(**kwargs): - local.update(**kwargs) - remote.update(**kwargs) - - def view_reset_camera(**kwargs): - local.reset_camera(**kwargs) - remote.reset_camera(**kwargs) - - ctrl.view_update = view_update - ctrl.view_reset_camera = view_reset_camera - - ctrl.on_server_ready.add(view_update) + remote = vtk_widgets.VtkRemoteView( + plotter.ren_win, + ) + + def view_update(**kwargs): + local.update(**kwargs) + remote.update(**kwargs) + + def view_reset_camera(**kwargs): + local.reset_camera(**kwargs) + remote.reset_camera(**kwargs) + + ctrl.view_update = view_update + ctrl.view_reset_camera = view_reset_camera + + ctrl.on_server_ready.add(view_update) # hide footer layout.footer.hide() diff --git a/examples/validation/PyVistaVolumeRendering.py b/examples/validation/PyVistaVolumeRendering.py index 6456387..2c618bf 100644 --- a/examples/validation/PyVistaVolumeRendering.py +++ b/examples/validation/PyVistaVolumeRendering.py @@ -2,15 +2,17 @@ import os import sys + import pyvista as pv from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, html -from trame.widgets.vtk import VtkLocalView, VtkRemoteView # Just for using this script in testing from trame_client.utils.testing import enable_testing +from trame.widgets import html, vuetify +from trame.widgets.vtk import VtkLocalView, VtkRemoteView + if os.environ.get("PYTEST_CURRENT_TEST") or "--test" in sys.argv: server = enable_testing(get_server(), "local_rendering_ready") else: @@ -48,24 +50,26 @@ def update_local_rendering(): html.Div("{{ local_rendering_ready }}", classes="readyCount") vuetify.VBtn("Update", click=update_local_rendering) - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vuetify.VCol(classes="fill-height"): - view = VtkLocalView( - plotter.ren_win, - ref="local", - on_ready="local_rendering_ready++", - ) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vuetify.VCol(classes="fill-height"): - VtkRemoteView( - plotter.ren_win, - ref="remote", - ) + ), + ): + with vuetify.VCol(classes="fill-height"): + view = VtkLocalView( + plotter.ren_win, + ref="local", + on_ready="local_rendering_ready++", + ) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vuetify.VCol(classes="fill-height"): + VtkRemoteView( + plotter.ren_win, + ref="remote", + ) # hide footer layout.footer.hide() diff --git a/examples/validation/SwitchView.py b/examples/validation/SwitchView.py index 103ca6d..0ffbd86 100644 --- a/examples/validation/SwitchView.py +++ b/examples/validation/SwitchView.py @@ -2,11 +2,16 @@ import asyncio -from trame.app import get_server, asynchronous - +# Required for interactor initialization +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 +from trame.app import asynchronous, get_server from trame.ui.vuetify import VAppLayout -from trame.widgets import vtk, vuetify - +from vtkmodules.vtkCommonColor import vtkNamedColors +from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource +from vtkmodules.vtkInteractionStyle import ( + vtkInteractorStyleSwitch, # noqa: F401 + vtkInteractorStyleTrackballCamera, +) from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, @@ -15,15 +20,7 @@ vtkRenderWindowInteractor, ) -from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource -from vtkmodules.vtkCommonColor import vtkNamedColors -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera - - -# Required for interactor initialization -import vtkmodules.vtkRenderingOpenGL2 # noqa -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa - +from trame.widgets import vtk, vuetify # ----------------------------------------------------------------------------- # VTK pipeline @@ -116,15 +113,11 @@ def sphere(): @asynchronous.task -async def refresh_function(**kwargs): +async def refresh_function(**_kwargs): counter = 1 while True: with state: - if counter % 2 == 0: - ren_win = sphere_window - else: - ren_win = cone_window - + ren_win = sphere_window if (counter % 2 == 0) else cone_window view.replace_view(ren_win) ctrl.view_update() @@ -138,12 +131,11 @@ async def refresh_function(**kwargs): # ----------------------------------------------------------------------------- -with VAppLayout(server) as layout: - with layout.root: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - view = vtk.VtkLocalView(cone_window) - ctrl.view_update = view.update - ctrl.on_server_ready.add(refresh_function) +with VAppLayout(server) as layout, layout.root: + with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + view = vtk.VtkLocalView(cone_window) + ctrl.view_update = view.update + ctrl.on_server_ready.add(refresh_function) # ----------------------------------------------------------------------------- diff --git a/examples/validation/VolumeRendering.py b/examples/validation/VolumeRendering.py index 0d0a557..9c1b814 100644 --- a/examples/validation/VolumeRendering.py +++ b/examples/validation/VolumeRendering.py @@ -1,13 +1,13 @@ import vtk - from trame.app import get_server from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vuetify, html -from trame.widgets.vtk import VtkLocalView, VtkRemoteView # Just for using this script in testing from trame_client.utils.testing import enable_testing +from trame.widgets import html, vuetify +from trame.widgets.vtk import VtkLocalView, VtkRemoteView + server = enable_testing(get_server(), "local_rendering_ready") server.client_type = "vue2" state, ctrl = server.state, server.controller @@ -85,19 +85,21 @@ vuetify.VSpacer() html.Div("{{ local_rendering_ready }}", classes="readyCount") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", + ), + ): + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" + ): + local = VtkLocalView(renWin, on_ready="local_rendering_ready++") + with vuetify.VContainer( + fluid=True, classes="pa-0 fill-height", style="width: 50%;" ): - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - local = VtkLocalView(renWin, on_ready="local_rendering_ready++") - with vuetify.VContainer( - fluid=True, classes="pa-0 fill-height", style="width: 50%;" - ): - VtkRemoteView(renWin, ctx_name="remote") + VtkRemoteView(renWin, ctx_name="remote") # hide footer layout.footer.hide() diff --git a/examples/validation/VtkRayCast.py b/examples/validation/VtkRayCast.py old mode 100644 new mode 100755 index a78038d..6201c7f --- a/examples/validation/VtkRayCast.py +++ b/examples/validation/VtkRayCast.py @@ -1,25 +1,22 @@ #!/usr/bin/env python # Web imports -from trame.app import get_server -from trame.ui.vuetify import SinglePageLayout -from trame.widgets import vtk, vuetify - # ----------------------------------------------------------------------------- # Example: SimpleRayCast # taken from: https://kitware.github.io/vtk-examples/site/Python/ # ----------------------------------------------------------------------------- - # noinspection PyUnresolvedReferences -import vtkmodules.vtkInteractionStyle # noqa +import vtkmodules.vtkInteractionStyle # noqa: F401 +from trame.app import get_server +from trame.ui.vuetify import SinglePageLayout from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonDataModel import vtkPiecewiseFunction from vtkmodules.vtkIOLegacy import vtkStructuredPointsReader from vtkmodules.vtkRenderingCore import ( vtkColorTransferFunction, + vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkRenderer, vtkVolume, vtkVolumeProperty, ) @@ -27,9 +24,11 @@ # noinspection PyUnresolvedReferences from vtkmodules.vtkRenderingVolumeOpenGL2 import ( - vtkOpenGLRayCastImageDisplayHelper, # noqa + vtkOpenGLRayCastImageDisplayHelper, # noqa: F401 ) +from trame.widgets import vtk, vuetify + # FIXME DATA_FILE = "/Users/sebastien.jourdain/Documents/code/web/trame-suite/trame-tutorial/data/ironProt.vtk" @@ -105,13 +104,15 @@ with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - # view = vtk.VtkRemoteView(renWin) - view = vtk.VtkLocalView(renWin) + ), + ): + # view = vtk.VtkRemoteView(renWin) + view = vtk.VtkLocalView(renWin) # ----------------------------------------------------------------------------- diff --git a/examples/vue2/cone-client.py b/examples/vue2/cone-client.py index a31373a..dce455f 100644 --- a/examples/vue2/cone-client.py +++ b/examples/vue2/cone-client.py @@ -1,7 +1,9 @@ from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- @@ -38,18 +40,20 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vtk_widgets.VtkView() as view: - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vtk_widgets.VtkGeometryRepresentation(): - vtk_widgets.VtkAlgorithm( - vtk_class="vtkConeSource", state=("{ resolution }",) - ) + ), + vtk_widgets.VtkView() as view, + ): + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vtk_widgets.VtkGeometryRepresentation(): + vtk_widgets.VtkAlgorithm( + vtk_class="vtkConeSource", state=("{ resolution }",) + ) server.start() diff --git a/examples/vue2/cone-local.py b/examples/vue2/cone-local.py index 6897b38..25abd25 100644 --- a/examples/vue2/cone-local.py +++ b/examples/vue2/cone-local.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -51,7 +52,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -79,13 +80,15 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + 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 + ), + ): + view = vtk_widgets.VtkLocalView(renderWindow) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera server.start() diff --git a/examples/vue2/cone-remote.py b/examples/vue2/cone-remote.py index e156abb..fe5097d 100644 --- a/examples/vue2/cone-remote.py +++ b/examples/vue2/cone-remote.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify # ----------------------------------------------------------------------------- # Trame initialization @@ -51,7 +52,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -79,13 +80,15 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteView(renderWindow) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + ): + view = vtk_widgets.VtkRemoteView(renderWindow) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera server.start() diff --git a/examples/vue2/cone-toggle.py b/examples/vue2/cone-toggle.py index 0567cb7..515eafc 100644 --- a/examples/vue2/cone-toggle.py +++ b/examples/vue2/cone-toggle.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import html, vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import html, vuetify +from trame.widgets import vtk as vtk_widgets # ----------------------------------------------------------------------------- # Trame initialization @@ -51,7 +52,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -89,15 +90,17 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteLocalView(renderWindow, mode=("mode",)) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - view.push_remote_camera_on_end_interaction() + ), + ): + view = vtk_widgets.VtkRemoteLocalView(renderWindow, mode=("mode",)) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + view.push_remote_camera_on_end_interaction() server.start() diff --git a/examples/vue2/pv-cone-toggle.py b/examples/vue2/pv-cone-toggle.py index f1a7d91..9b08707 100644 --- a/examples/vue2/pv-cone-toggle.py +++ b/examples/vue2/pv-cone-toggle.py @@ -1,9 +1,9 @@ -import paraview.web.venv # noqa +from paraview import simple from trame.app import get_server -from trame.widgets import html, vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout -from paraview import simple +from trame.widgets import html, vuetify +from trame.widgets import vtk as vtk_widgets # ----------------------------------------------------------------------------- # Trame initialization @@ -27,7 +27,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone.Resolution = resolution ctrl.view_update() @@ -65,15 +65,17 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - html_view = vtk_widgets.VtkRemoteLocalView(view, mode=("mode",)) - ctrl.view_update = html_view.update - ctrl.view_reset_camera = html_view.reset_camera - html_view.push_remote_camera_on_end_interaction() + ), + ): + html_view = vtk_widgets.VtkRemoteLocalView(view, mode=("mode",)) + ctrl.view_update = html_view.update + ctrl.view_reset_camera = html_view.reset_camera + html_view.push_remote_camera_on_end_interaction() server.start() diff --git a/examples/vue2/vtkjs-mesh.py b/examples/vue2/vtkjs-mesh.py index cf3040a..0d23bd4 100644 --- a/examples/vue2/vtkjs-mesh.py +++ b/examples/vue2/vtkjs-mesh.py @@ -1,9 +1,10 @@ from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkImagingCore import vtkRTAnalyticSource +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- @@ -15,18 +16,17 @@ with SinglePageLayout(server) as layout: layout.icon.click = ctrl.view_reset_camera - with layout.content: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - with vtk_widgets.VtkView() as view: - ctrl.view_reset_camera = view.reset_camera - with vtk_widgets.VtkGeometryRepresentation( - color_data_range=("[20, 280]",), - ): - vtk_widgets.VtkMesh( - "wavelet", - dataset=vtkRTAnalyticSource(), - field_to_keep="RTData", - ) + with layout.content, vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + with vtk_widgets.VtkView() as view: + ctrl.view_reset_camera = view.reset_camera + with vtk_widgets.VtkGeometryRepresentation( + color_data_range=("[20, 280]",), + ): + vtk_widgets.VtkMesh( + "wavelet", + dataset=vtkRTAnalyticSource(), + field_to_keep="RTData", + ) server.start() diff --git a/examples/vue2/vtkjs-pipeline.py b/examples/vue2/vtkjs-pipeline.py index 792cd4e..8cd07cf 100644 --- a/examples/vue2/vtkjs-pipeline.py +++ b/examples/vue2/vtkjs-pipeline.py @@ -1,7 +1,9 @@ from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- diff --git a/examples/vue2/vtkjs-polydata.py b/examples/vue2/vtkjs-polydata.py index 272789b..b685632 100644 --- a/examples/vue2/vtkjs-polydata.py +++ b/examples/vue2/vtkjs-polydata.py @@ -1,9 +1,10 @@ from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- @@ -19,7 +20,7 @@ @state.change("resolution") -def update_cone(resolution, **kwargs): +def update_cone(resolution, **_kwargs): cone_generator.SetResolution(resolution) ctrl.mesh_update() @@ -46,19 +47,19 @@ def update_reset_resolution(): with vuetify.VBtn(icon=True, click=update_reset_resolution): vuetify.VIcon("mdi-undo-variant") - with layout.content: - with vuetify.VContainer( + with ( + layout.content, + vuetify.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vtk_widgets.VtkView() as view: - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vtk_widgets.VtkGeometryRepresentation(): - html_polydata = vtk_widgets.VtkPolyData( - "cone", dataset=cone_generator - ) - ctrl.mesh_update = html_polydata.update + ), + vtk_widgets.VtkView() as view, + ): + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vtk_widgets.VtkGeometryRepresentation(): + html_polydata = vtk_widgets.VtkPolyData("cone", dataset=cone_generator) + ctrl.mesh_update = html_polydata.update server.start() diff --git a/examples/vue3/cone-client.py b/examples/vue3/cone-client.py index 4da2256..c281b91 100644 --- a/examples/vue3/cone-client.py +++ b/examples/vue3/cone-client.py @@ -1,7 +1,9 @@ from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- @@ -39,19 +41,21 @@ def update_reset_resolution(): with vuetify3.VBtn(icon=True, click=update_reset_resolution): vuetify3.VIcon("mdi-undo-variant") - with layout.content: - with vuetify3.VContainer( + with ( + layout.content, + vuetify3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vtk_widgets.VtkView() as view: - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vtk_widgets.VtkGeometryRepresentation(): - vtk_widgets.VtkAlgorithm( - vtk_class="vtkConeSource", - state=("{ resolution }",), - ) + ), + vtk_widgets.VtkView() as view, + ): + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vtk_widgets.VtkGeometryRepresentation(): + vtk_widgets.VtkAlgorithm( + vtk_class="vtkConeSource", + state=("{ resolution }",), + ) server.start() diff --git a/examples/vue3/cone-local.py b/examples/vue3/cone-local.py index 3b1980a..25724a2 100644 --- a/examples/vue3/cone-local.py +++ b/examples/vue3/cone-local.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 # ----------------------------------------------------------------------------- # Trame initialization @@ -51,7 +52,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -80,13 +81,15 @@ def update_reset_resolution(): with vuetify3.VBtn(icon=True, click=update_reset_resolution): vuetify3.VIcon("mdi-undo-variant") - with layout.content: - with vuetify3.VContainer( + with ( + layout.content, + vuetify3.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 + ), + ): + view = vtk_widgets.VtkLocalView(renderWindow) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera server.start() diff --git a/examples/vue3/cone-remote.py b/examples/vue3/cone-remote.py index bc7e8cf..e8d6c07 100644 --- a/examples/vue3/cone-remote.py +++ b/examples/vue3/cone-remote.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 # ----------------------------------------------------------------------------- # Trame initialization @@ -51,7 +52,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -81,13 +82,15 @@ def update_reset_resolution(): with vuetify3.VBtn(icon=True, click=update_reset_resolution): vuetify3.VIcon("mdi-undo-variant") - with layout.content: - with vuetify3.VContainer( + with ( + layout.content, + vuetify3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteView(renderWindow) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera + ), + ): + view = vtk_widgets.VtkRemoteView(renderWindow) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera server.start() diff --git a/examples/vue3/cone-toggle.py b/examples/vue3/cone-toggle.py index 5b6b573..096c757 100644 --- a/examples/vue3/cone-toggle.py +++ b/examples/vue3/cone-toggle.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import html, vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import html, vuetify3 +from trame.widgets import vtk as vtk_widgets # ----------------------------------------------------------------------------- # Trame initialization @@ -51,7 +52,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -91,14 +92,16 @@ def update_reset_resolution(): with vuetify3.VBtn(icon=True, click=update_reset_resolution): vuetify3.VIcon("mdi-undo-variant") - with layout.content: - with vuetify3.VContainer( + with ( + layout.content, + vuetify3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - view = vtk_widgets.VtkRemoteLocalView(renderWindow, mode=("mode",)) - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - view.push_remote_camera_on_end_interaction() + ), + ): + view = vtk_widgets.VtkRemoteLocalView(renderWindow, mode=("mode",)) + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + view.push_remote_camera_on_end_interaction() server.start() diff --git a/examples/vue3/cone-webxr.py b/examples/vue3/cone-webxr.py index a9c3334..1fc50cf 100644 --- a/examples/vue3/cone-webxr.py +++ b/examples/vue3/cone-webxr.py @@ -1,19 +1,20 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkRenderingCore import ( + vtkActor, + vtkPolyDataMapper, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkPolyDataMapper, - vtkActor, ) -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 # ----------------------------------------------------------------------------- # Trame initialization @@ -53,7 +54,7 @@ @state.change("resolution") -def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs): +def update_cone(resolution=DEFAULT_RESOLUTION, **_kwargs): cone_source.SetResolution(resolution) ctrl.view_update() @@ -88,24 +89,26 @@ def toggle_xr(): with vuetify3.VBtn(icon=True, click=toggle_xr): vuetify3.VIcon("mdi-virtual-reality") - with layout.content: - with vuetify3.VContainer( + with ( + layout.content, + vuetify3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vtk_widgets.VtkLocalView(renderWindow) as view: - ctrl.view_update = view.update + ), + vtk_widgets.VtkLocalView(renderWindow) as view, + ): + ctrl.view_update = view.update - def on_enter_xr(): - state.xr_active = True + def on_enter_xr(): + state.xr_active = True - def on_exit_xr(): - state.xr_active = False + def on_exit_xr(): + state.xr_active = False - webxr_helper = vtk_widgets.VtkWebXRHelper( - draw_controllers_ray=True, enter_xr=on_enter_xr, exit_xr=on_exit_xr - ) - ctrl.start_xr = webxr_helper.start_xr - ctrl.stop_xr = webxr_helper.stop_xr + webxr_helper = vtk_widgets.VtkWebXRHelper( + draw_controllers_ray=True, enter_xr=on_enter_xr, exit_xr=on_exit_xr + ) + ctrl.start_xr = webxr_helper.start_xr + ctrl.stop_xr = webxr_helper.stop_xr server.start() diff --git a/examples/vue3/vtkjs-mesh.py b/examples/vue3/vtkjs-mesh.py index 3f8577e..2e53f8f 100644 --- a/examples/vue3/vtkjs-mesh.py +++ b/examples/vue3/vtkjs-mesh.py @@ -1,9 +1,10 @@ from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout - from vtkmodules.vtkImagingCore import vtkRTAnalyticSource +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- diff --git a/examples/vue3/vtkjs-pipeline.py b/examples/vue3/vtkjs-pipeline.py index 80ee35e..e538220 100644 --- a/examples/vue3/vtkjs-pipeline.py +++ b/examples/vue3/vtkjs-pipeline.py @@ -1,7 +1,9 @@ from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- diff --git a/examples/vue3/vtkjs-polydata.py b/examples/vue3/vtkjs-polydata.py index 656a807..226c82f 100644 --- a/examples/vue3/vtkjs-polydata.py +++ b/examples/vue3/vtkjs-polydata.py @@ -1,9 +1,10 @@ from trame.app import get_server -from trame.widgets import vuetify3, vtk as vtk_widgets from trame.ui.vuetify3 import SinglePageLayout - from vtkmodules.vtkFiltersSources import vtkConeSource +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify3 + # ----------------------------------------------------------------------------- # Trame initialization # ----------------------------------------------------------------------------- @@ -19,7 +20,7 @@ @state.change("resolution") -def update_cone(resolution, **kwargs): +def update_cone(resolution, **_kwargs): cone_generator.SetResolution(resolution) ctrl.mesh_update() @@ -49,19 +50,19 @@ def update_reset_resolution(): with vuetify3.VBtn(icon=True, click=update_reset_resolution): vuetify3.VIcon("mdi-undo-variant") - with layout.content: - with vuetify3.VContainer( + with ( + layout.content, + vuetify3.VContainer( fluid=True, classes="pa-0 fill-height", - ): - with vtk_widgets.VtkView() as view: - ctrl.view_update = view.update - ctrl.view_reset_camera = view.reset_camera - with vtk_widgets.VtkGeometryRepresentation(): - html_polydata = vtk_widgets.VtkPolyData( - "cone", dataset=cone_generator - ) - ctrl.mesh_update = html_polydata.update + ), + vtk_widgets.VtkView() as view, + ): + ctrl.view_update = view.update + ctrl.view_reset_camera = view.reset_camera + with vtk_widgets.VtkGeometryRepresentation(): + html_polydata = vtk_widgets.VtkPolyData("cone", dataset=cone_generator) + ctrl.mesh_update = html_polydata.update server.start() diff --git a/examples/widgets/clip.py b/examples/widgets/clip.py index 46c2db0..64ba6a8 100644 --- a/examples/widgets/clip.py +++ b/examples/widgets/clip.py @@ -1,25 +1,24 @@ +import vtkmodules.vtkRenderingOpenGL2 # noqa: F401 from trame.app import get_server -from trame.widgets import vuetify, vtk as vtk_widgets from trame.ui.vuetify import SinglePageLayout - -# VTK factory initialization -from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa -import vtkmodules.vtkRenderingOpenGL2 # noqa - +from vtkmodules.vtkCommonDataModel import vtkPlane from vtkmodules.vtkFiltersGeneral import vtkClipDataSet from vtkmodules.vtkFiltersModeling import vtkOutlineFilter from vtkmodules.vtkImagingCore import vtkRTAnalyticSource -from vtkmodules.vtkCommonDataModel import vtkPlane + +# VTK factory initialization +from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa: F401 from vtkmodules.vtkInteractionWidgets import vtkImplicitPlaneWidget2 from vtkmodules.vtkRenderingCore import ( vtkActor, vtkDataSetMapper, + vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, - vtkRenderer, ) - +from trame.widgets import vtk as vtk_widgets +from trame.widgets import vuetify from trame_vtk.modules.vtk.widget import WidgetManager # ----------------------------------------------------------------------------- @@ -77,12 +76,12 @@ plane_widget = widget_manager.add_widget(vtkImplicitPlaneWidget2) -def on_widget_interaction(*args): +def on_widget_interaction(*_args): if state.live_update: plane_widget.GetPlane(clip_plane) -def on_widget_done(*args): +def on_widget_done(*_args): plane_widget.GetPlane(clip_plane) @@ -102,7 +101,7 @@ def on_widget_done(*args): @state.change("show_widget") -def on_widget_show(show_widget, **kwargs): +def on_widget_show(show_widget, **_kwargs): if show_widget: plane_widget.enable() else: @@ -134,14 +133,13 @@ def on_widget_show(show_widget, **kwargs): with vuetify.VBtn(icon=True, click=ctrl.view_reset_camera): vuetify.VIcon("mdi-crop-free") - with layout.content: - with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): - view = vtk_widgets.VtkRemoteView( - render_window, - interactive_ratio=1, - ) - ctrl.view_reset_camera = view.reset_camera - ctrl.view_update = view.update + with layout.content, vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): + view = vtk_widgets.VtkRemoteView( + render_window, + interactive_ratio=1, + ) + ctrl.view_reset_camera = view.reset_camera + ctrl.view_update = view.update if __name__ == "__main__": diff --git a/pyproject.toml b/pyproject.toml index 646bd5e..746f569 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,13 @@ classifiers = [ ] [project.optional-dependencies] -dev = ["pre-commit", "ruff", "pytest", "pytest-asyncio", "coverage", "nox"] +dev = [ + "pre-commit", + "ruff", + "pytest >=6", + "pytest-cov >=3", + "nox", +] [build-system] requires = ["hatchling"] @@ -30,6 +36,8 @@ build-backend = "hatchling.build" [tool.hatch.build] include = [ "/src/**/*.py", + "/src/**/*.js", + "/src/**/*.css", "/src/**/*.html", "/src/trame_vtk/modules/common/serve/**", ] @@ -37,41 +45,63 @@ include = [ [tool.hatch.build.targets.wheel] packages = ["src/trame_vtk", "src/trame"] -[tool.semantic_release] -version_toml = ["pyproject.toml:project.version"] -build_command = """ - python -m venv .venv - source .venv/bin/activate - pip install -U pip build - python -m build . -""" - [tool.semantic_release.publish] dist_glob_patterns = ["dist/*"] upload_to_vcs_release = true [tool.ruff] -line-length = 88 -indent-width = 4 -target-version = "py39" [tool.ruff.lint] -select = ["E", "W", "F"] -ignore = ["E402"] -fixable = ["ALL"] -unfixable = [] +extend-select = [ + "ARG", # flake8-unused-arguments + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "EM", # flake8-errmsg + "EXE", # flake8-executable + "G", # flake8-logging-format + "I", # isort + "ICN", # flake8-import-conventions + "NPY", # NumPy specific rules + "PD", # pandas-vet + "PGH", # pygrep-hooks + "PIE", # flake8-pie + "PL", # pylint + "PT", # flake8-pytest-style + "PTH", # flake8-use-pathlib + "RET", # flake8-return + "RUF", # Ruff-specific + "SIM", # flake8-simplify + "T20", # flake8-print + "UP", # pyupgrade + "YTT", # flake8-2020 +] +ignore = [ + "PLR09", # Too many <...> + "PLR2004", # Magic value used in comparison + "ISC001", # Conflicts with formatter +] +isort.required-imports = [] +[tool.ruff.lint.per-file-ignores] +"tests/**" = ["T20"] +"examples/**" = ["T20", "SIM117"] +"noxfile.py" = ["T20"] +"src/**" = ["SIM117"] -[tool.ruff.format] -quote-style = "double" -indent-style = "space" -skip-magic-trailing-comma = false -line-ending = "auto" -docstring-code-format = true +[tool.semantic_release] +version_toml = [ + "pyproject.toml:project.version", +] +version_variables = [ + "src/trame_vtk/__init__.py:__version__", +] -# This only has an effect when the `docstring-code-format` setting is -# enabled. -docstring-code-line-length = "dynamic" +build_command = """ + python -m pip install -e '.[build]' + uv lock --upgrade-package "$PACKAGE_NAME" + git add uv.lock + uv build +""" [tool.ruff.lint.pycodestyle] max-line-length = 120 diff --git a/src/trame/widgets/paraview.py b/src/trame/widgets/paraview.py index 3bd89aa..7967a43 100644 --- a/src/trame/widgets/paraview.py +++ b/src/trame/widgets/paraview.py @@ -2,7 +2,7 @@ def initialize(server): - from trame_vtk.modules import common, paraview + from trame_vtk.modules import common, paraview # noqa: PLC0415 server.enable_module(common) server.enable_module(paraview) diff --git a/src/trame/widgets/vtk.py b/src/trame/widgets/vtk.py index 2e9ff8e..5b0b6bc 100644 --- a/src/trame/widgets/vtk.py +++ b/src/trame/widgets/vtk.py @@ -2,7 +2,7 @@ def initialize(server): - from trame_vtk.modules import common, vtk + from trame_vtk.modules import common, vtk # noqa: PLC0415 server.enable_module(common) server.enable_module(vtk) diff --git a/src/trame_vtk/__init__.py b/src/trame_vtk/__init__.py index 42e3261..c4afd89 100644 --- a/src/trame_vtk/__init__.py +++ b/src/trame_vtk/__init__.py @@ -8,7 +8,5 @@ def reference_id(ref): try: return ref.__this__[1:17] except Exception: - id_str = str(ref)[-12:-1] - # print('====> fallback ID %s for %s' % (id_str, ref)) - return id_str + return str(ref)[-12:-1] return "0x0" diff --git a/src/trame_vtk/modules/common/__init__.py b/src/trame_vtk/modules/common/__init__.py index bf78c7a..5634cd3 100644 --- a/src/trame_vtk/modules/common/__init__.py +++ b/src/trame_vtk/modules/common/__init__.py @@ -2,7 +2,6 @@ from trame_vtk import __version__ - # Compute local path to serve serve_path = str(Path(__file__).with_name("serve").resolve()) serve_directory = f"__trame_vtk_{__version__}" diff --git a/src/trame_vtk/modules/common/serve/trame-vtk.js b/src/trame_vtk/modules/common/serve/trame-vtk.js index ee2878b..890da5d 100644 --- a/src/trame_vtk/modules/common/serve/trame-vtk.js +++ b/src/trame_vtk/modules/common/serve/trame-vtk.js @@ -3848,7 +3848,7 @@ Input: `+this.err.str)},u.prototype[Symbol.iterator]=function(){return this._ind `,offset:0,width:0,allowEmptyTags:!1,indentTextOnlyNodes:!1,spaceBeforeSlash:!1}),x}return o(h,f),h.prototype.serialize=function(v){return this._refs={suppressPretty:!1,emptyNode:!1,markup:""},v.nodeType!==u.NodeType.Document||this._writerOptions.headless||this.declaration(this._builderOptions.version,this._builderOptions.encoding,this._builderOptions.standalone),this.serializeNode(v,this._writerOptions.wellFormed),this._writerOptions.prettyPrint&&this._refs.markup.slice(-this._writerOptions.newline.length)===this._writerOptions.newline&&(this._refs.markup=this._refs.markup.slice(0,-this._writerOptions.newline.length)),this._refs.markup},h.prototype.declaration=function(v,m,x){this._beginLine(),this._refs.markup+='",this._endLine()},h.prototype.docType=function(v,m,x){this._beginLine(),this._refs.markup+=m&&x?"':m?"':x?"':"",this._endLine()},h.prototype.openTagBegin=function(v){this._beginLine(),this._refs.markup+="<"+v},h.prototype.openTagEnd=function(v,m,x){if(this._refs.suppressPretty=!1,this._refs.emptyNode=!1,this._writerOptions.prettyPrint&&!m&&!x){for(var y=!0,d=!0,g=this.currentNode.firstChild,C=0,S=0;g;){if(p.Guard.isExclusiveTextNode(g))S++;else{if(!p.Guard.isCDATASectionNode(g)){y=!1,d=!1;break}C++}g.data!==""&&(d=!1),g=g.nextSibling}this._refs.suppressPretty=!this._writerOptions.indentTextOnlyNodes&&y&&(C<=1&&S===0||C===0),this._refs.emptyNode=d}(x||m||this._refs.emptyNode)&&this._writerOptions.allowEmptyTags?this._refs.markup+=">":this._refs.markup+=x?" />":m||this._refs.emptyNode?this._writerOptions.spaceBeforeSlash?" />":"/>":">",this._endLine()},h.prototype.closeTag=function(v){this._refs.emptyNode||(this._beginLine(),this._refs.markup+=""),this._refs.suppressPretty=!1,this._refs.emptyNode=!1,this._endLine()},h.prototype.attribute=function(v,m){var x=v+'="'+m+'"';this._writerOptions.prettyPrint&&this._writerOptions.width>0&&this._refs.markup.length-this._lengthToLastNewline+1+x.length>this._writerOptions.width?(this._endLine(),this._beginLine(),this._refs.markup+=this._indent(1)+x):this._refs.markup+=" "+x},h.prototype.text=function(v){v!==""&&(this._beginLine(),this._refs.markup+=v,this._endLine())},h.prototype.cdata=function(v){v!==""&&(this._beginLine(),this._refs.markup+="",this._endLine())},h.prototype.comment=function(v){this._beginLine(),this._refs.markup+="",this._endLine()},h.prototype.instruction=function(v,m){this._beginLine(),this._refs.markup+="",this._endLine()},h.prototype._beginLine=function(){this._writerOptions.prettyPrint&&!this._refs.suppressPretty&&(this._refs.markup+=this._indent(this._writerOptions.offset+this.level))},h.prototype._endLine=function(){this._writerOptions.prettyPrint&&!this._refs.suppressPretty&&(this._refs.markup+=this._writerOptions.newline,this._lengthToLastNewline=this._refs.markup.length)},h.prototype._indent=function(v){if(v<=0)return"";if(this._indentation[v]!==void 0)return this._indentation[v];var m=this._writerOptions.indent.repeat(v);return this._indentation[v]=m,m},h}(c.BaseWriter);n.XMLWriter=l},function(a,n,r){var i=r(47),o=r(35);a.exports="".repeat||function(s){var u=String(o(this)),c="",p=i(s);if(p<0||p==1/0)throw RangeError("Wrong number of repetitions");for(;p>0;(p>>>=1)&&(u+=u))1&p&&(c+=u);return c}},function(a,n,r){r(31),r(32),r(33),r(19),r(178),r(20),r(22),r(23);var i,o=this&&this.__extends||(i=function(l,f){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(h,v){h.__proto__=v}||function(h,v){for(var m in v)v.hasOwnProperty(m)&&(h[m]=v[m])})(l,f)},function(l,f){function h(){this.constructor=l}i(l,f),l.prototype=f===null?Object.create(f):(h.prototype=f.prototype,new h)}),s=this&&this.__values||function(l){var f=typeof Symbol=="function"&&Symbol.iterator,h=f&&l[f],v=0;if(h)return h.call(l);if(l&&typeof l.length=="number")return{next:function(){return l&&v>=l.length&&(l=void 0),{value:l&&l[v++],done:!l}}};throw new TypeError(f?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var u=r(67),c=r(2),p=function(l){function f(h,v){var m=l.call(this,h)||this;return m._writerOptions=c.applyDefaults(v,{wellFormed:!1,prettyPrint:!1,indent:" ",newline:` `,offset:0,group:!1,verbose:!1}),m}return o(f,l),f.prototype.serialize=function(h){var v=c.applyDefaults(this._writerOptions,{format:"object",wellFormed:!1}),m=new u.ObjectWriter(this._builderOptions,v).serialize(h);return this._beginLine(this._writerOptions,0)+this._convertObject(m,this._writerOptions)},f.prototype._convertObject=function(h,v,m){var x,y,d=this;m===void 0&&(m=0);var g="",C=this._isLeafNode(h);if(c.isArray(h)){g+="[";var S=h.length,T=0;try{for(var w=s(h),_=w.next();!_.done;_=w.next()){var E=_.value;g+=this._endLine(v,m+1)+this._beginLine(v,m+1)+this._convertObject(E,v,m+1),T0?new Array(m).join(h.indent):""},f.prototype._endLine=function(h,v){return h.prettyPrint?h.newline:""},f.prototype._key=function(h){return'"'+h+'":'},f.prototype._val=function(h){return JSON.stringify(h)},f.prototype._isLeafNode=function(h){return this._descendantCount(h)<=1},f.prototype._descendantCount=function(h,v){var m=this;return v===void 0&&(v=0),c.isArray(h)?c.forEachArray(h,function(x){return v+=m._descendantCount(x,v)},this):c.isObject(h)?c.forEachObject(h,function(x,y){return v+=m._descendantCount(y,v)},this):v++,v},f}(r(50).BaseWriter);n.JSONWriter=p},function(a,n,r){r(31),r(32),r(33),r(19),r(178),r(89),r(20),r(22),r(23);var i,o=this&&this.__extends||(i=function(l,f){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(h,v){h.__proto__=v}||function(h,v){for(var m in v)v.hasOwnProperty(m)&&(h[m]=v[m])})(l,f)},function(l,f){function h(){this.constructor=l}i(l,f),l.prototype=f===null?Object.create(f):(h.prototype=f.prototype,new h)}),s=this&&this.__values||function(l){var f=typeof Symbol=="function"&&Symbol.iterator,h=f&&l[f],v=0;if(h)return h.call(l);if(l&&typeof l.length=="number")return{next:function(){return l&&v>=l.length&&(l=void 0),{value:l&&l[v++],done:!l}}};throw new TypeError(f?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var u=r(67),c=r(2),p=function(l){function f(h,v){var m=l.call(this,h)||this;if(m._writerOptions=c.applyDefaults(v,{wellFormed:!1,indent:" ",newline:` `,offset:0,group:!1,verbose:!1}),m._writerOptions.indent.length<2)throw new Error("YAML indententation string must be at least two characters long.");if(m._writerOptions.offset<0)throw new Error("YAML offset should be zero or a positive number.");return m}return o(f,l),f.prototype.serialize=function(h){var v=c.applyDefaults(this._writerOptions,{format:"object",wellFormed:!1}),m=new u.ObjectWriter(this._builderOptions,v).serialize(h),x=this._beginLine(this._writerOptions,0)+"---"+this._endLine(this._writerOptions)+this._convertObject(m,this._writerOptions,0);return x.slice(-this._writerOptions.newline.length)===this._writerOptions.newline&&(x=x.slice(0,-this._writerOptions.newline.length)),x},f.prototype._convertObject=function(h,v,m,x){var y,d,g=this;x===void 0&&(x=!1);var C="";if(c.isArray(h))try{for(var S=s(h),T=S.next();!T.done;T=S.next()){var w=T.value;C+=this._beginLine(v,m,!0),c.isObject(w)?c.isEmpty(w)?C+='""'+this._endLine(v):C+=this._convertObject(w,v,m,!0):C+=this._val(w)+this._endLine(v)}}catch(_){y={error:_}}finally{try{T&&!T.done&&(d=S.return)&&d.call(S)}finally{if(y)throw y.error}}else c.forEachObject(h,function(_,E){x?(C+=g._key(_),x=!1):C+=g._beginLine(v,m)+g._key(_),c.isObject(E)?c.isEmpty(E)?C+=' ""'+g._endLine(v):C+=g._endLine(v)+g._convertObject(E,v,m+1):C+=" "+g._val(E)+g._endLine(v)},this);return C},f.prototype._beginLine=function(h,v,m){m===void 0&&(m=!1);var x=h.offset+v+1,y=new Array(x).join(h.indent);return m?y.substr(0,y.length-2)+"-"+y.substr(-1,1):y},f.prototype._endLine=function(h){return h.newline},f.prototype._key=function(h){return'"'+h+'":'},f.prototype._val=function(h){return JSON.stringify(h)},f}(r(50).BaseWriter);n.YAMLWriter=p},function(a,n,r){Object.defineProperty(n,"__esModule",{value:!0}),r(110).dom.setFeatures(!0);var i=r(110);n.DOMImplementation=i.DOMImplementation;var o=r(272);n.DOMParser=o.DOMParser;var s=r(275);n.XMLSerializer=s.XMLSerializer},function(a,n,r){Object.defineProperty(n,"__esModule",{value:!0});var i=r(3),o=r(0),s=function(){function u(){}return u.prototype.before=function(){for(var c=[],p=0;p=p.length&&(p=void 0),{value:p&&p[h++],done:!p}}};throw new TypeError(l?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var o=r(6),s=r(3),u=r(7),c=function(){function p(l){this._nodeList=[],this._recordQueue=[],this._callback=l;var f=o.dom.window;u.set.append(f._mutationObservers,this)}return p.prototype.observe=function(l,f){var h,v;if((f=f||{childList:!1,subtree:!1}).attributeOldValue===void 0&&f.attributeFilter===void 0||f.attributes!==void 0||(f.attributes=!0),f.characterDataOldValue!==void 0&&f.characterData===void 0&&(f.characterData=!0),!f.childList&&!f.attributes&&!f.characterData)throw new TypeError;if(f.attributeOldValue&&!f.attributes)throw new TypeError;if(f.attributeFilter!==void 0&&!f.attributes)throw new TypeError;if(f.characterDataOldValue&&!f.characterData)throw new TypeError;var m=!1,x=f,y=function(S){var T,w;if(S.observer===d){m=!0;try{for(var _=(T=void 0,i(d._nodeList)),E=_.next();!E.done;E=_.next()){var D=E.value;u.list.remove(D._registeredObserverList,function(O){return s.Guard.isTransientRegisteredObserver(O)&&O.source===S})}}catch(O){T={error:O}}finally{try{E&&!E.done&&(w=_.return)&&w.call(_)}finally{if(T)throw T.error}}S.options=x}},d=this;try{for(var g=i(l._registeredObserverList),C=g.next();!C.done;C=g.next())y(C.value)}catch(S){h={error:S}}finally{try{C&&!C.done&&(v=g.return)&&v.call(g)}finally{if(h)throw h.error}}m||(l._registeredObserverList.push({observer:this,options:f}),this._nodeList.push(l))},p.prototype.disconnect=function(){var l,f,h=this;try{for(var v=i(this._nodeList),m=v.next();!m.done;m=v.next()){var x=m.value;u.list.remove(x._registeredObserverList,function(y){return y.observer===h})}}catch(y){l={error:y}}finally{try{m&&!m.done&&(f=v.return)&&f.call(v)}finally{if(l)throw l.error}}this._recordQueue=[]},p.prototype.takeRecords=function(){var l=this._recordQueue;return this._recordQueue=[],l},p}();n.MutationObserverImpl=c},function(a,n,r){Object.defineProperty(n,"__esModule",{value:!0});var i=r(3),o=function(){function s(){}return Object.defineProperty(s.prototype,"previousElementSibling",{get:function(){for(var u=i.Cast.asNode(this)._previousSibling;u;){if(i.Guard.isElementNode(u))return u;u=u._previousSibling}return null},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"nextElementSibling",{get:function(){for(var u=i.Cast.asNode(this)._nextSibling;u;){if(i.Guard.isElementNode(u))return u;u=u._nextSibling}return null},enumerable:!0,configurable:!0}),s}();n.NonDocumentTypeChildNodeImpl=o},function(a,n,r){Object.defineProperty(n,"__esModule",{value:!0});var i=r(3),o=r(0),s=function(){function u(){}return u.prototype.getElementById=function(c){for(var p=o.tree_getFirstDescendantNode(i.Cast.asNode(this),!1,!1,function(l){return i.Guard.isElementNode(l)});p!==null;){if(p._uniqueIdentifier===c)return p;p=o.tree_getNextDescendantNode(i.Cast.asNode(this),p,!1,!1,function(l){return i.Guard.isElementNode(l)})}return null},u}();n.NonElementParentNodeImpl=s},function(a,n,r){var i=this&&this.__values||function(c){var p=typeof Symbol=="function"&&Symbol.iterator,l=p&&c[p],f=0;if(l)return l.call(c);if(c&&typeof c.length=="number")return{next:function(){return c&&f>=c.length&&(c=void 0),{value:c&&c[f++],done:!c}}};throw new TypeError(p?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var o=r(3),s=r(0),u=function(){function c(){}return Object.defineProperty(c.prototype,"children",{get:function(){return s.create_htmlCollection(o.Cast.asNode(this))},enumerable:!0,configurable:!0}),Object.defineProperty(c.prototype,"firstElementChild",{get:function(){for(var p=o.Cast.asNode(this)._firstChild;p;){if(o.Guard.isElementNode(p))return p;p=p._nextSibling}return null},enumerable:!0,configurable:!0}),Object.defineProperty(c.prototype,"lastElementChild",{get:function(){for(var p=o.Cast.asNode(this)._lastChild;p;){if(o.Guard.isElementNode(p))return p;p=p._previousSibling}return null},enumerable:!0,configurable:!0}),Object.defineProperty(c.prototype,"childElementCount",{get:function(){var p,l,f=0;try{for(var h=i(o.Cast.asNode(this)._children),v=h.next();!v.done;v=h.next()){var m=v.value;o.Guard.isElementNode(m)&&f++}}catch(x){p={error:x}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(p)throw p.error}}return f},enumerable:!0,configurable:!0}),c.prototype.prepend=function(){for(var p=[],l=0;l0)&&!(x=d.next()).done;)g.push(x.value)}catch(C){y={error:C}}finally{try{x&&!x.done&&(m=d.return)&&m.call(d)}finally{if(y)throw y.error}}return g},o=this&&this.__values||function(h){var v=typeof Symbol=="function"&&Symbol.iterator,m=v&&h[v],x=0;if(m)return m.call(h);if(h&&typeof h.length=="number")return{next:function(){return h&&x>=h.length&&(h=void 0),{value:h&&h[x++],done:!h}}};throw new TypeError(v?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var s=r(180),u=r(111),c=r(7),p=r(0),l=r(69),f=function(){function h(){}return h.prototype.parse=function(v){for(var m,x,y,d,g=new s.XMLStringLexer(v,{skipWhitespaceOnlyText:!0}),C=p.create_document(),S=C,T=g.nextToken();T.type!==u.TokenType.EOF;){switch(T.type){case u.TokenType.Declaration:var w=T;if(w.version!=="1.0")throw new Error("Invalid xml version: "+w.version);break;case u.TokenType.DocType:var _=T;if(!p.xml_isPubidChar(_.pubId))throw new Error("DocType public identifier does not match PubidChar construct.");if(!p.xml_isLegalChar(_.sysId)||_.sysId.indexOf('"')!==-1&&_.sysId.indexOf("'")!==-1)throw new Error("DocType system identifier contains invalid characters.");S.appendChild(C.implementation.createDocumentType(_.name,_.pubId,_.sysId));break;case u.TokenType.CDATA:var E=T;if(!p.xml_isLegalChar(E.data)||E.data.indexOf("]]>")!==-1)throw new Error("CDATA contains invalid characters.");S.appendChild(C.createCDATASection(E.data));break;case u.TokenType.Comment:var D=T;if(!p.xml_isLegalChar(D.data)||D.data.indexOf("--")!==-1||D.data.endsWith("-"))throw new Error("Comment data contains invalid characters.");S.appendChild(C.createComment(D.data));break;case u.TokenType.PI:var O=T;if(O.target.indexOf(":")!==-1||/^xml$/i.test(O.target))throw new Error("Processing instruction target contains invalid characters.");if(!p.xml_isLegalChar(O.data)||O.data.indexOf("?>")!==-1)throw new Error("Processing instruction data contains invalid characters.");S.appendChild(C.createProcessingInstruction(O.target,O.data));break;case u.TokenType.Text:var b=T;if(!p.xml_isLegalChar(b.data))throw new Error("Text data contains invalid characters.");S.appendChild(C.createTextNode(this._decodeText(b.data)));break;case u.TokenType.Element:var R=T,N=i(p.namespace_extractQName(R.name),2),L=N[0],B=N[1];if(B.indexOf(":")!==-1||!p.xml_isName(B))throw new Error("Node local name contains invalid characters.");if(L==="xmlns")throw new Error("An element cannot have the 'xmlns' prefix.");var P=S.lookupNamespaceURI(L),F={};try{for(var k=(m=void 0,o(R.attributes)),G=k.next();!G.done;G=k.next()){var W=i(G.value,2),H=W[0],X=W[1];if(H==="xmlns")P=X;else{var Y=i(p.namespace_extractQName(H),2),q=Y[0],Q=Y[1];q==="xmlns"&&(Q===L&&(P=X),F[Q]=X)}}}catch(z){m={error:z}}finally{try{G&&!G.done&&(x=k.return)&&x.call(k)}finally{if(m)throw m.error}}var ae=P!==null?C.createElementNS(P,R.name):C.createElement(R.name);S.appendChild(ae);var ne=new l.LocalNameSet;try{for(var ee=(y=void 0,o(R.attributes)),V=ee.next();!V.done;V=ee.next()){var M=i(V.value,2),I=(H=M[0],X=M[1],i(p.namespace_extractQName(H),2)),U=(q=I[0],Q=I[1],null);if(q==="xmlns"||q===null&&Q==="xmlns"?U=c.namespace.XMLNS:(U=ae.lookupNamespaceURI(q))!==null&&ae.isDefaultNamespace(U)?U=null:U===null&&q!==null&&(U=F[q]||null),ne.has(U,Q))throw new Error("Element contains duplicate attributes.");if(ne.set(U,Q),U===c.namespace.XMLNS&&X===c.namespace.XMLNS)throw new Error("XMLNS namespace is reserved.");if(Q.indexOf(":")!==-1||!p.xml_isName(Q))throw new Error("Attribute local name contains invalid characters.");if(q==="xmlns"&&X==="")throw new Error("Empty XML namespace is not allowed.");U!==null?ae.setAttributeNS(U,H,this._decodeAttributeValue(X)):ae.setAttribute(H,this._decodeAttributeValue(X))}}catch(z){y={error:z}}finally{try{V&&!V.done&&(d=ee.return)&&d.call(ee)}finally{if(y)throw y.error}}R.selfClosing||(S=ae);break;case u.TokenType.ClosingTag:if(T.name!==S.nodeName)throw new Error("Closing tag name does not match opening tag name.");S._parent&&(S=S._parent)}T=g.nextToken()}return C},h.prototype._decodeText=function(v){return v==null?v:v.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")},h.prototype._decodeAttributeValue=function(v){return v==null?v:v.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")},h}();n.XMLParserImpl=f},function(a,n,r){Object.defineProperty(n,"__esModule",{value:!0});var i=r(276);n.XMLSerializer=i.XMLSerializerImpl},function(a,n,r){var i=this&&this.__values||function(h){var v=typeof Symbol=="function"&&Symbol.iterator,m=v&&h[v],x=0;if(m)return m.call(h);if(h&&typeof h.length=="number")return{next:function(){return h&&x>=h.length&&(h=void 0),{value:h&&h[x++],done:!h}}};throw new TypeError(v?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var o=r(1),s=r(69),u=r(95),c=r(9),p=r(7),l=r(0),f=function(){function h(){}return h.prototype.serializeToString=function(v){return this._xmlSerialization(v,!1)},h.prototype._xmlSerialization=function(v,m){if(v._nodeDocument===void 0||v._nodeDocument._hasNamespaces){var x=new u.NamespacePrefixMap;x.set("xml",p.namespace.XML);try{return this._serializeNodeNS(v,null,x,{value:1},m)}catch{throw new c.InvalidStateError}}else try{return this._serializeNode(v,m)}catch{throw new c.InvalidStateError}},h.prototype._serializeNodeNS=function(v,m,x,y,d){switch(v.nodeType){case o.NodeType.Element:return this._serializeElementNS(v,m,x,y,d);case o.NodeType.Document:return this._serializeDocumentNS(v,m,x,y,d);case o.NodeType.Comment:return this._serializeComment(v,d);case o.NodeType.Text:return this._serializeText(v,d);case o.NodeType.DocumentFragment:return this._serializeDocumentFragmentNS(v,m,x,y,d);case o.NodeType.DocumentType:return this._serializeDocumentType(v,d);case o.NodeType.ProcessingInstruction:return this._serializeProcessingInstruction(v,d);case o.NodeType.CData:return this._serializeCData(v,d);default:throw new Error("Unknown node type: "+v.nodeType)}},h.prototype._serializeNode=function(v,m){switch(v.nodeType){case o.NodeType.Element:return this._serializeElement(v,m);case o.NodeType.Document:return this._serializeDocument(v,m);case o.NodeType.Comment:return this._serializeComment(v,m);case o.NodeType.Text:return this._serializeText(v,m);case o.NodeType.DocumentFragment:return this._serializeDocumentFragment(v,m);case o.NodeType.DocumentType:return this._serializeDocumentType(v,m);case o.NodeType.ProcessingInstruction:return this._serializeProcessingInstruction(v,m);case o.NodeType.CData:return this._serializeCData(v,m);default:throw new Error("Unknown node type: "+v.nodeType)}},h.prototype._serializeElementNS=function(v,m,x,y,d){var g,C;if(d&&(v.localName.indexOf(":")!==-1||!l.xml_isName(v.localName)))throw new Error("Node local name contains invalid characters (well-formed required).");var S="<",T="",w=!1,_=!1,E=x.copy(),D={},O=this._recordNamespaceInformation(v,E,D),b=m,R=v.namespaceURI;if(b===R)O!==null&&(_=!0),S+=T=R===p.namespace.XML?"xml:"+v.localName:v.localName;else{var N=v.prefix,L=null;if(N===null&&R===O||(L=E.get(N,R)),N==="xmlns"){if(d)throw new Error("An element cannot have the 'xmlns' prefix (well-formed required).");L=N}L!==null?(T=L+":"+v.localName,O!==null&&O!==p.namespace.XML&&(b=O||null),S+=T):N!==null?(N in D&&(N=this._generatePrefix(R,E,y)),E.set(N,R),S+=T+=N+":"+v.localName,S+=" xmlns:"+N+'="'+this._serializeAttributeValue(R,d)+'"',O!==null&&(b=O||null)):O===null||O!==null&&O!==R?(_=!0,b=R,S+=T+=v.localName,S+=' xmlns="'+this._serializeAttributeValue(R,d)+'"'):(b=R,S+=T+=v.localName)}S+=this._serializeAttributesNS(v,E,y,D,_,d);var B=R===p.namespace.HTML;if(B&&v.childNodes.length===0&&h._VoidElementNames.has(v.localName)?(S+=" /",w=!0):B||v.childNodes.length!==0||(S+="/",w=!0),S+=">",w)return S;if(!(B&&v.localName==="template"))try{for(var P=i(v._children||v.childNodes),F=P.next();!F.done;F=P.next()){var k=F.value;S+=this._serializeNodeNS(k,b,E,y,d)}}catch(G){g={error:G}}finally{try{F&&!F.done&&(C=P.return)&&C.call(P)}finally{if(g)throw g.error}}return S+=""},h.prototype._serializeDocumentNS=function(v,m,x,y,d){var g,C;if(d&&v.documentElement===null)throw new Error("Missing document element (well-formed required).");var S="";try{for(var T=i(v._children||v.childNodes),w=T.next();!w.done;w=T.next()){var _=w.value;S+=this._serializeNodeNS(_,m,x,y,d)}}catch(E){g={error:E}}finally{try{w&&!w.done&&(C=T.return)&&C.call(T)}finally{if(g)throw g.error}}return S},h.prototype._serializeComment=function(v,m){if(m&&(!l.xml_isLegalChar(v.data)||v.data.indexOf("--")!==-1||v.data.endsWith("-")))throw new Error("Comment data contains invalid characters (well-formed required).");return""},h.prototype._serializeText=function(v,m){if(m&&!l.xml_isLegalChar(v.data))throw new Error("Text data contains invalid characters (well-formed required).");for(var x="",y=0;y"?">":d}return x},h.prototype._serializeDocumentFragmentNS=function(v,m,x,y,d){var g,C,S="";try{for(var T=i(v._children||v.childNodes),w=T.next();!w.done;w=T.next()){var _=w.value;S+=this._serializeNodeNS(_,m,x,y,d)}}catch(E){g={error:E}}finally{try{w&&!w.done&&(C=T.return)&&C.call(T)}finally{if(g)throw g.error}}return S},h.prototype._serializeDocumentType=function(v,m){if(m&&!l.xml_isPubidChar(v.publicId))throw new Error("DocType public identifier does not match PubidChar construct (well-formed required).");if(m&&(!l.xml_isLegalChar(v.systemId)||v.systemId.indexOf('"')!==-1&&v.systemId.indexOf("'")!==-1))throw new Error("DocType system identifier contains invalid characters (well-formed required).");return v.publicId&&v.systemId?"':v.publicId?"':v.systemId?"':""},h.prototype._serializeProcessingInstruction=function(v,m){if(m&&(v.target.indexOf(":")!==-1||/^xml$/i.test(v.target)))throw new Error("Processing instruction target contains invalid characters (well-formed required).");if(m&&(!l.xml_isLegalChar(v.data)||v.data.indexOf("?>")!==-1))throw new Error("Processing instruction data contains invalid characters (well-formed required).");return""},h.prototype._serializeCData=function(v,m){if(m&&v.data.indexOf("]]>")!==-1)throw new Error("CDATA contains invalid characters (well-formed required).");return""},h.prototype._serializeAttributesNS=function(v,m,x,y,d,g){var C,S,T="",w=g?new s.LocalNameSet:void 0;try{for(var _=i(v.attributes),E=_.next();!E.done;E=_.next()){var D=E.value;if(d||g||D.namespaceURI!==null){if(g&&w&&w.has(D.namespaceURI,D.localName))throw new Error("Element contains duplicate attributes (well-formed required).");g&&w&&w.set(D.namespaceURI,D.localName);var O=D.namespaceURI,b=null;if(O!==null)if(b=m.get(D.prefix,O),O===p.namespace.XMLNS){if(D.value===p.namespace.XML||D.prefix===null&&d||D.prefix!==null&&(!(D.localName in y)||y[D.localName]!==D.value)&&m.has(D.localName,D.value))continue;if(g&&D.value===p.namespace.XMLNS)throw new Error("XMLNS namespace is reserved (well-formed required).");if(g&&D.value==="")throw new Error("Namespace prefix declarations cannot be used to undeclare a namespace (well-formed required).");D.prefix==="xmlns"&&(b="xmlns")}else b===null&&(T+=" xmlns:"+(b=D.prefix===null||m.hasPrefix(D.prefix)&&!m.has(D.prefix,O)?this._generatePrefix(O,m,x):D.prefix)+'="'+this._serializeAttributeValue(O,g)+'"');if(T+=" ",b!==null&&(T+=b+":"),g&&(D.localName.indexOf(":")!==-1||!l.xml_isName(D.localName)||D.localName==="xmlns"&&O===null))throw new Error("Attribute local name contains invalid characters (well-formed required).");T+=D.localName+'="'+this._serializeAttributeValue(D.value,g)+'"'}else T+=" "+D.localName+'="'+this._serializeAttributeValue(D.value,g)+'"'}}catch(R){C={error:R}}finally{try{E&&!E.done&&(S=_.return)&&S.call(_)}finally{if(C)throw C.error}}return T},h.prototype._recordNamespaceInformation=function(v,m,x){var y,d,g=null;try{for(var C=i(v.attributes),S=C.next();!S.done;S=C.next()){var T=S.value,w=T.namespaceURI,_=T.prefix;if(w===p.namespace.XMLNS){if(_===null){g=T.value;continue}var E=T.localName,D=T.value;if(D===p.namespace.XML||(D===""&&(D=null),m.has(E,D)))continue;m.set(E,D),x[E]=D||""}}}catch(O){y={error:O}}finally{try{S&&!S.done&&(d=C.return)&&d.call(C)}finally{if(y)throw y.error}}return g},h.prototype._generatePrefix=function(v,m,x){var y="ns"+x.value;return x.value++,m.set(y,v),y},h.prototype._serializeAttributeValue=function(v,m){if(m&&v!==null&&!l.xml_isLegalChar(v))throw new Error("Invalid characters in attribute value.");if(v===null)return"";for(var x="",y=0;y"?">":d}return x},h.prototype._serializeElement=function(v,m){var x,y;if(m&&(v.localName.indexOf(":")!==-1||!l.xml_isName(v.localName)))throw new Error("Node local name contains invalid characters (well-formed required).");var d=!1,g=v.localName,C="<"+g;if(C+=this._serializeAttributes(v,m),v._children.size===0&&(C+="/",d=!0),C+=">",d)return C;try{for(var S=i(v._children),T=S.next();!T.done;T=S.next()){var w=T.value;C+=this._serializeNode(w,m)}}catch(_){x={error:_}}finally{try{T&&!T.done&&(y=S.return)&&y.call(S)}finally{if(x)throw x.error}}return C+=""},h.prototype._serializeDocument=function(v,m){var x,y;if(m&&v.documentElement===null)throw new Error("Missing document element (well-formed required).");var d="";try{for(var g=i(v._children),C=g.next();!C.done;C=g.next()){var S=C.value;d+=this._serializeNode(S,m)}}catch(T){x={error:T}}finally{try{C&&!C.done&&(y=g.return)&&y.call(g)}finally{if(x)throw x.error}}return d},h.prototype._serializeDocumentFragment=function(v,m){var x,y,d="";try{for(var g=i(v._children),C=g.next();!C.done;C=g.next()){var S=C.value;d+=this._serializeNode(S,m)}}catch(T){x={error:T}}finally{try{C&&!C.done&&(y=g.return)&&y.call(g)}finally{if(x)throw x.error}}return d},h.prototype._serializeAttributes=function(v,m){var x,y,d="",g=m?{}:void 0;try{for(var C=i(v.attributes),S=C.next();!S.done;S=C.next()){var T=S.value;if(m&&g&&T.localName in g)throw new Error("Element contains duplicate attributes (well-formed required).");if(m&&g&&(g[T.localName]=!0),m&&(T.localName.indexOf(":")!==-1||!l.xml_isName(T.localName)))throw new Error("Attribute local name contains invalid characters (well-formed required).");d+=" "+T.localName+'="'+this._serializeAttributeValue(T.value,m)+'"'}}catch(w){x={error:w}}finally{try{S&&!S.done&&(y=C.return)&&y.call(C)}finally{if(x)throw x.error}}return d},h._VoidElementNames=new Set(["area","base","basefont","bgsound","br","col","embed","frame","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"]),h}();n.XMLSerializerImpl=f},function(a,n,r){Object.defineProperty(n,"__esModule",{value:!0});var i=r(278);n.XMLReader=i.XMLReader;var o=r(112);n.ObjectReader=o.ObjectReader;var s=r(281);n.JSONReader=s.JSONReader;var u=r(282);n.YAMLReader=u.YAMLReader},function(a,n,r){r(31),r(32),r(33),r(19),r(65),r(20),r(22),r(23);var i,o=this&&this.__extends||(i=function(m,x){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(y,d){y.__proto__=d}||function(y,d){for(var g in d)d.hasOwnProperty(g)&&(y[g]=d[g])})(m,x)},function(m,x){function y(){this.constructor=m}i(m,x),m.prototype=x===null?Object.create(x):(y.prototype=x.prototype,new y)}),s=this&&this.__read||function(m,x){var y=typeof Symbol=="function"&&m[Symbol.iterator];if(!y)return m;var d,g,C=y.call(m),S=[];try{for(;(x===void 0||x-- >0)&&!(d=C.next()).done;)S.push(d.value)}catch(T){g={error:T}}finally{try{d&&!d.done&&(y=C.return)&&y.call(C)}finally{if(g)throw g.error}}return S},u=this&&this.__values||function(m){var x=typeof Symbol=="function"&&Symbol.iterator,y=x&&m[x],d=0;if(y)return y.call(m);if(m&&typeof m.length=="number")return{next:function(){return m&&d>=m.length&&(m=void 0),{value:m&&m[d++],done:!m}}};throw new TypeError(x?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(n,"__esModule",{value:!0});var c=r(180),p=r(111),l=r(1),f=r(7),h=r(0),v=function(m){function x(){return m!==null&&m.apply(this,arguments)||this}return o(x,m),x.prototype._parse=function(y,d){for(var g,C,S,T,w=new c.XMLStringLexer(d,{skipWhitespaceOnlyText:this._builderOptions.skipWhitespaceOnlyText}),_=y,E=y,D=w.nextToken();D.type!==p.TokenType.EOF;){switch(D.type){case p.TokenType.Declaration:var O=D,b=this.sanitize(O.version);if(b!=="1.0")throw new Error("Invalid xml version: "+b);var R={version:b};O.encoding&&(R.encoding=this.sanitize(O.encoding)),O.standalone&&(R.standalone=this.sanitize(O.standalone)==="yes"),E.set(R);break;case p.TokenType.DocType:var N=D;E=this.docType(E,this.sanitize(N.name),this.sanitize(N.pubId),this.sanitize(N.sysId))||E;break;case p.TokenType.CDATA:var L=D;E=this.cdata(E,this.sanitize(L.data))||E;break;case p.TokenType.Comment:var B=D;E=this.comment(E,this.sanitize(B.data))||E;break;case p.TokenType.PI:var P=D;E=this.instruction(E,this.sanitize(P.target),this.sanitize(P.data))||E;break;case p.TokenType.Text:if(E.node.nodeType===l.NodeType.Document)break;var F=D;E=this.text(E,this._decodeText(this.sanitize(F.data)))||E;break;case p.TokenType.Element:var k=D,G=this.sanitize(k.name),W=s(h.namespace_extractQName(G),1)[0],H=E.node.lookupNamespaceURI(W),X={};try{for(var Y=(g=void 0,u(k.attributes)),q=Y.next();!q.done;q=Y.next()){var Q=s(q.value,2),ae=Q[0],ne=Q[1];if(ae=this.sanitize(ae),ne=this.sanitize(ne),ae==="xmlns")H=ne;else{var ee=s(h.namespace_extractQName(ae),2),V=ee[0],M=ee[1];V==="xmlns"&&(M===W&&(H=ne),X[M]=ne)}}}catch(re){g={error:re}}finally{try{q&&!q.done&&(C=Y.return)&&C.call(Y)}finally{if(g)throw g.error}}var I=H!==null?this.element(E,H,G):this.element(E,void 0,G);if(I===void 0)break;E.node===y.node&&(_=I);try{for(var U=(S=void 0,u(k.attributes)),z=U.next();!z.done;z=U.next()){var j=s(z.value,2);ae=j[0],ne=j[1],ae=this.sanitize(ae),ne=this.sanitize(ne);var $=s(h.namespace_extractQName(ae),2),J=(V=$[0],M=$[1],null);V==="xmlns"||V===null&&M==="xmlns"?J=f.namespace.XMLNS:(J=I.node.lookupNamespaceURI(V))!==null&&I.node.isDefaultNamespace(J)?J=null:J===null&&V!==null&&(J=X[V]||null),J!==null?this.attribute(I,J,ae,this._decodeAttributeValue(ne)):this.attribute(I,void 0,ae,this._decodeAttributeValue(ne))}}catch(re){S={error:re}}finally{try{z&&!z.done&&(T=U.return)&&T.call(U)}finally{if(S)throw S.error}}k.selfClosing||(E=I);break;case p.TokenType.ClosingTag:E.node.parentNode&&(E=E.up())}D=w.nextToken()}return _},x}(r(75).BaseReader);n.XMLReader=v},function(a,n,r){var i=r(4),o=r(280);i({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(a,n,r){var i=r(16),o=r(8),s=r(61),u=r(85),c=r(79),p=r(27),l=r(41),f=Object.assign,h=Object.defineProperty;a.exports=!f||o(function(){if(i&&f({b:1},f(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var v={},m={},x=Symbol();return v[x]=7,"abcdefghijklmnopqrst".split("").forEach(function(y){m[y]=y}),f({},v)[x]!=7||s(f({},m)).join("")!="abcdefghijklmnopqrst"})?function(v,m){for(var x=p(v),y=arguments.length,d=1,g=u.f,C=c.f;y>d;)for(var S,T=l(arguments[d++]),w=g?s(T).concat(g(T)):s(T),_=w.length,E=0;_>E;)S=w[E++],i&&!C.call(T,S)||(x[S]=T[S]);return x}:f},function(a,n,r){var i,o=this&&this.__extends||(i=function(c,p){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,f){l.__proto__=f}||function(l,f){for(var h in f)f.hasOwnProperty(h)&&(l[h]=f[h])})(c,p)},function(c,p){function l(){this.constructor=c}i(c,p),c.prototype=p===null?Object.create(p):(l.prototype=p.prototype,new l)});Object.defineProperty(n,"__esModule",{value:!0});var s=r(112),u=function(c){function p(){return c!==null&&c.apply(this,arguments)||this}return o(p,c),p.prototype._parse=function(l,f){return new s.ObjectReader(this._builderOptions).parse(l,JSON.parse(f))},p}(r(75).BaseReader);n.JSONReader=u},function(a,n,r){var i,o=this&&this.__extends||(i=function(l,f){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(h,v){h.__proto__=v}||function(h,v){for(var m in v)v.hasOwnProperty(m)&&(h[m]=v[m])})(l,f)},function(l,f){function h(){this.constructor=l}i(l,f),l.prototype=f===null?Object.create(f):(h.prototype=f.prototype,new h)});Object.defineProperty(n,"__esModule",{value:!0});var s=r(112),u=r(75),c=r(283),p=function(l){function f(){return l!==null&&l.apply(this,arguments)||this}return o(f,l),f.prototype._parse=function(h,v){var m=c.safeLoad(v);if(m===void 0)throw new Error("Unable to parse YAML document.");return new s.ObjectReader(this._builderOptions).parse(h,m)},f}(u.BaseReader);n.YAMLReader=p},function(a,n,r){var i=r(284);a.exports=i},function(a,n,r){var i=r(285),o=r(304);function s(u){return function(){throw new Error("Function "+u+" is deprecated and cannot be used.")}}a.exports.Type=r(10),a.exports.Schema=r(39),a.exports.FAILSAFE_SCHEMA=r(113),a.exports.JSON_SCHEMA=r(182),a.exports.CORE_SCHEMA=r(181),a.exports.DEFAULT_SAFE_SCHEMA=r(54),a.exports.DEFAULT_FULL_SCHEMA=r(76),a.exports.load=i.load,a.exports.loadAll=i.loadAll,a.exports.safeLoad=i.safeLoad,a.exports.safeLoadAll=i.safeLoadAll,a.exports.dump=o.dump,a.exports.safeDump=o.safeDump,a.exports.YAMLException=r(53),a.exports.MINIMAL_SCHEMA=r(113),a.exports.SAFE_SCHEMA=r(54),a.exports.DEFAULT_SCHEMA=r(76),a.exports.scan=s("scan"),a.exports.parse=s("parse"),a.exports.compose=s("compose"),a.exports.addConstructor=s("addConstructor")},function(a,n,r){var i=r(38),o=r(53),s=r(286),u=r(54),c=r(76),p=Object.prototype.hasOwnProperty,l=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,f=/[\x85\u2028\u2029]/,h=/[,\[\]\{\}]/,v=/^(?:!|!!|![a-z\-]+!)$/i,m=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function x(M){return Object.prototype.toString.call(M)}function y(M){return M===10||M===13}function d(M){return M===9||M===32}function g(M){return M===9||M===32||M===10||M===13}function C(M){return M===44||M===91||M===93||M===123||M===125}function S(M){var I;return 48<=M&&M<=57?M-48:97<=(I=32|M)&&I<=102?I-97+10:-1}function T(M){return M===48?"\0":M===97?"\x07":M===98?"\b":M===116||M===9?" ":M===110?` -`:M===118?"\v":M===102?"\f":M===114?"\r":M===101?"\x1B":M===32?" ":M===34?'"':M===47?"/":M===92?"\\":M===78?"…":M===95?" ":M===76?"\u2028":M===80?"\u2029":""}function w(M){return M<=65535?String.fromCharCode(M):String.fromCharCode(55296+(M-65536>>10),56320+(M-65536&1023))}for(var _=new Array(256),E=new Array(256),D=0;D<256;D++)_[D]=T(D)?1:0,E[D]=T(D);function O(M,I){this.input=M,this.filename=I.filename||null,this.schema=I.schema||c,this.onWarning=I.onWarning||null,this.legacy=I.legacy||!1,this.json=I.json||!1,this.listener=I.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=M.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function b(M,I){return new o(I,new s(M.filename,M.input,M.position,M.line,M.position-M.lineStart))}function R(M,I){throw b(M,I)}function N(M,I){M.onWarning&&M.onWarning.call(null,b(M,I))}var L={YAML:function(M,I,U){var z,j,$;M.version!==null&&R(M,"duplication of %YAML directive"),U.length!==1&&R(M,"YAML directive accepts exactly one argument"),(z=/^([0-9]+)\.([0-9]+)$/.exec(U[0]))===null&&R(M,"ill-formed argument of the YAML directive"),j=parseInt(z[1],10),$=parseInt(z[2],10),j!==1&&R(M,"unacceptable YAML version of the document"),M.version=U[0],M.checkLineBreaks=$<2,$!==1&&$!==2&&N(M,"unsupported YAML version of the document")},TAG:function(M,I,U){var z,j;U.length!==2&&R(M,"TAG directive accepts exactly two arguments"),z=U[0],j=U[1],v.test(z)||R(M,"ill-formed tag handle (first argument) of the TAG directive"),p.call(M.tagMap,z)&&R(M,'there is a previously declared suffix for "'+z+'" tag handle'),m.test(j)||R(M,"ill-formed tag prefix (second argument) of the TAG directive"),M.tagMap[z]=j}};function B(M,I,U,z){var j,$,J,re;if(I1&&(M.result+=i.repeat(` +`:M===118?"\v":M===102?"\f":M===114?"\r":M===101?"\x1B":M===32?" ":M===34?'"':M===47?"/":M===92?"\\":M===78?"…":M===95?" ":M===76?"\u2028":M===80?"\u2029":""}function w(M){return M<=65535?String.fromCharCode(M):String.fromCharCode(55296+(M-65536>>10),56320+(M-65536&1023))}for(var _=new Array(256),E=new Array(256),D=0;D<256;D++)_[D]=T(D)?1:0,E[D]=T(D);function O(M,I){this.input=M,this.filename=I.filename||null,this.schema=I.schema||c,this.onWarning=I.onWarning||null,this.legacy=I.legacy||!1,this.json=I.json||!1,this.listener=I.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=M.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function b(M,I){return new o(I,new s(M.filename,M.input,M.position,M.line,M.position-M.lineStart))}function R(M,I){throw b(M,I)}function N(M,I){M.onWarning&&M.onWarning.call(null,b(M,I))}var L={YAML:function(M,I,U){var z,j,$;M.version!==null&&R(M,"duplication of %YAML directive"),U.length!==1&&R(M,"YAML directive accepts exactly one argument"),(z=/^([0-9]+)\.([0-9]+)$/.exec(U[0]))===null&&R(M,"ill-formed argument of the YAML directive"),j=parseInt(z[1],10),$=parseInt(z[2],10),j!==1&&R(M,"unacceptable YAML version of the document"),M.version=U[0],M.checkLineBreaks=$<2,$!==1&&$!==2&&N(M,"unsupported YAML version of the document")},TAG:function(M,I,U){var z,j;U.length!==2&&R(M,"TAG directive accepts exactly two arguments"),z=U[0],j=U[1],v.test(z)||R(M,"ill-formed tag handle (first argument) of the TAG directive"),p.call(M.tagMap,z)&&R(M,'there is a previously declared suffix for "'+z+'" tag handle'),m.test(j)||R(M,"ill-formed tag prefix (second argument) of the TAG directive"),M.tagMap[z]=j}};function B(M,I,U,z){var j,$,J,re;if(I1&&(M.result+=i.repeat(` `,I-1))}function X(M,I){var U,z,j=M.tag,$=M.anchor,J=[],re=!1;for(M.anchor!==null&&(M.anchorMap[M.anchor]=J),z=M.input.charCodeAt(M.position);z!==0&&z===45&&g(M.input.charCodeAt(M.position+1));)if(re=!0,M.position++,G(M,!0,-1)&&M.lineIndent<=I)J.push(null),z=M.input.charCodeAt(M.position);else if(U=M.line,Q(M,I,3,!1,!0),J.push(M.result),G(M,!0,-1),z=M.input.charCodeAt(M.position),(M.line===U||M.lineIndent>I)&&z!==0)R(M,"bad indentation of a sequence entry");else if(M.lineIndentI?ke=1:M.lineIndent===I?ke=0:M.lineIndentI?ke=1:M.lineIndent===I?ke=0:M.lineIndentDe)&&(Q(K,De,4,!0,te)&&(it?wt=K.result:Ft=K.result),it||(F(K,Se,Be,Ie,wt,Ft,ce,he),Ie=wt=Ft=null),G(K,!0,-1),fe=K.input.charCodeAt(K.position)),K.lineIndent>De&&fe!==0)R(K,"bad indentation of a mapping entry");else if(K.lineIndent=0))break;te===0?R(K,"bad explicit indentation width of a block scalar; it cannot be less than one"):Ve?R(K,"repeat of an indentation width identifier"):(Se=De+te-1,Ve=!0)}if(d(ce)){do ce=K.input.charCodeAt(++K.position);while(d(ce));if(ce===35)do ce=K.input.charCodeAt(++K.position);while(!y(ce)&&ce!==0)}for(;ce!==0;){for(k(K),K.lineIndent=0,ce=K.input.charCodeAt(K.position);(!Ve||K.lineIndentSe&&(Se=K.lineIndent),y(ce))Be++;else{if(K.lineIndent=0&&(d=d.replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g,function(C,S,T){var w=parseInt(S||T,16);return w>1114111&&g.throwUnexpectedToken(l.Messages.InvalidRegExp),w<=65535?String.fromCharCode(w):"￿"}).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"￿"));try{RegExp(d)}catch{this.throwUnexpectedToken(l.Messages.InvalidRegExp)}try{return new RegExp(x,y)}catch{return null}},m.prototype.scanRegExpBody=function(){var x=this.source[this.index];c.assert(x==="/","Regular expression literal must start with a slash");for(var y=this.source[this.index++],d=!1,g=!1;!this.eof();)if(y+=x=this.source[this.index++],x==="\\")x=this.source[this.index++],p.Character.isLineTerminator(x.charCodeAt(0))&&this.throwUnexpectedToken(l.Messages.UnterminatedRegExp),y+=x;else if(p.Character.isLineTerminator(x.charCodeAt(0)))this.throwUnexpectedToken(l.Messages.UnterminatedRegExp);else if(d)x==="]"&&(d=!1);else{if(x==="/"){g=!0;break}x==="["&&(d=!0)}return g||this.throwUnexpectedToken(l.Messages.UnterminatedRegExp),y.substr(1,y.length-2)},m.prototype.scanRegExpFlags=function(){for(var x="";!this.eof();){var y=this.source[this.index];if(!p.Character.isIdentifierPart(y.charCodeAt(0)))break;if(++this.index,y!=="\\"||this.eof())x+=y;else if((y=this.source[this.index])==="u"){++this.index;var d=this.index,g=this.scanHexEscape("u");if(g!==null)for(x+=g;d=55296&&x<57343&&p.Character.isIdentifierStart(this.codePointAt(this.index))?this.scanIdentifier():this.scanPunctuator()},m}();s.Scanner=v},function(o,s){Object.defineProperty(s,"__esModule",{value:!0}),s.TokenName={},s.TokenName[1]="Boolean",s.TokenName[2]="",s.TokenName[3]="Identifier",s.TokenName[4]="Keyword",s.TokenName[5]="Null",s.TokenName[6]="Numeric",s.TokenName[7]="Punctuator",s.TokenName[8]="String",s.TokenName[9]="RegularExpression",s.TokenName[10]="Template"},function(o,s){Object.defineProperty(s,"__esModule",{value:!0}),s.XHTMLEntities={quot:'"',amp:"&",apos:"'",gt:">",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",times:"×",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",divide:"÷",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",frasl:"⁄",euro:"€",image:"ℑ",weierp:"℘",real:"ℜ",trade:"™",alefsym:"ℵ",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lArr:"⇐",uArr:"⇑",rArr:"⇒",dArr:"⇓",hArr:"⇔",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦",lang:"⟨",rang:"⟩"}},function(o,s,u){Object.defineProperty(s,"__esModule",{value:!0});var c=u(10),p=u(12),l=u(13),f=function(){function v(){this.values=[],this.curly=this.paren=-1}return v.prototype.beforeFunctionExpression=function(m){return["(","{","[","in","typeof","instanceof","new","return","case","delete","throw","void","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=",",","+","-","*","**","/","%","++","--","<<",">>",">>>","&","|","^","!","~","&&","||","?",":","===","==",">=","<=","<",">","!=","!=="].indexOf(m)>=0},v.prototype.isRegexStart=function(){var m=this.values[this.values.length-1],x=m!==null;switch(m){case"this":case"]":x=!1;break;case")":var y=this.values[this.paren-1];x=y==="if"||y==="while"||y==="for"||y==="with";break;case"}":if(x=!1,this.values[this.curly-3]==="function")x=!!(d=this.values[this.curly-4])&&!this.beforeFunctionExpression(d);else if(this.values[this.curly-4]==="function"){var d;x=!(d=this.values[this.curly-5])||!this.beforeFunctionExpression(d)}}return x},v.prototype.push=function(m){m.type===7||m.type===4?(m.value==="{"?this.curly=this.values.length:m.value==="("&&(this.paren=this.values.length),this.values.push(m.value)):this.values.push(null)},v}(),h=function(){function v(m,x){this.errorHandler=new c.ErrorHandler,this.errorHandler.tolerant=!!x&&typeof x.tolerant=="boolean"&&x.tolerant,this.scanner=new p.Scanner(m,this.errorHandler),this.scanner.trackComment=!!x&&typeof x.comment=="boolean"&&x.comment,this.trackRange=!!x&&typeof x.range=="boolean"&&x.range,this.trackLoc=!!x&&typeof x.loc=="boolean"&&x.loc,this.buffer=[],this.reader=new f}return v.prototype.errors=function(){return this.errorHandler.errors},v.prototype.getNextToken=function(){if(this.buffer.length===0){var m=this.scanner.scanComments();if(this.scanner.trackComment)for(var x=0;x=0&&(d=d.replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g,function(C,S,T){var w=parseInt(S||T,16);return w>1114111&&g.throwUnexpectedToken(l.Messages.InvalidRegExp),w<=65535?String.fromCharCode(w):"￿"}).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"￿"));try{RegExp(d)}catch{this.throwUnexpectedToken(l.Messages.InvalidRegExp)}try{return new RegExp(x,y)}catch{return null}},m.prototype.scanRegExpBody=function(){var x=this.source[this.index];c.assert(x==="/","Regular expression literal must start with a slash");for(var y=this.source[this.index++],d=!1,g=!1;!this.eof();)if(y+=x=this.source[this.index++],x==="\\")x=this.source[this.index++],p.Character.isLineTerminator(x.charCodeAt(0))&&this.throwUnexpectedToken(l.Messages.UnterminatedRegExp),y+=x;else if(p.Character.isLineTerminator(x.charCodeAt(0)))this.throwUnexpectedToken(l.Messages.UnterminatedRegExp);else if(d)x==="]"&&(d=!1);else{if(x==="/"){g=!0;break}x==="["&&(d=!0)}return g||this.throwUnexpectedToken(l.Messages.UnterminatedRegExp),y.substr(1,y.length-2)},m.prototype.scanRegExpFlags=function(){for(var x="";!this.eof();){var y=this.source[this.index];if(!p.Character.isIdentifierPart(y.charCodeAt(0)))break;if(++this.index,y!=="\\"||this.eof())x+=y;else if((y=this.source[this.index])==="u"){++this.index;var d=this.index,g=this.scanHexEscape("u");if(g!==null)for(x+=g;d=55296&&x<57343&&p.Character.isIdentifierStart(this.codePointAt(this.index))?this.scanIdentifier():this.scanPunctuator()},m}();s.Scanner=v},function(o,s){Object.defineProperty(s,"__esModule",{value:!0}),s.TokenName={},s.TokenName[1]="Boolean",s.TokenName[2]="",s.TokenName[3]="Identifier",s.TokenName[4]="Keyword",s.TokenName[5]="Null",s.TokenName[6]="Numeric",s.TokenName[7]="Punctuator",s.TokenName[8]="String",s.TokenName[9]="RegularExpression",s.TokenName[10]="Template"},function(o,s){Object.defineProperty(s,"__esModule",{value:!0}),s.XHTMLEntities={quot:'"',amp:"&",apos:"'",gt:">",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",times:"×",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",divide:"÷",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",frasl:"⁄",euro:"€",image:"ℑ",weierp:"℘",real:"ℜ",trade:"™",alefsym:"ℵ",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lArr:"⇐",uArr:"⇑",rArr:"⇒",dArr:"⇓",hArr:"⇔",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦",lang:"⟨",rang:"⟩"}},function(o,s,u){Object.defineProperty(s,"__esModule",{value:!0});var c=u(10),p=u(12),l=u(13),f=function(){function v(){this.values=[],this.curly=this.paren=-1}return v.prototype.beforeFunctionExpression=function(m){return["(","{","[","in","typeof","instanceof","new","return","case","delete","throw","void","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=",",","+","-","*","**","/","%","++","--","<<",">>",">>>","&","|","^","!","~","&&","||","?",":","===","==",">=","<=","<",">","!=","!=="].indexOf(m)>=0},v.prototype.isRegexStart=function(){var m=this.values[this.values.length-1],x=m!==null;switch(m){case"this":case"]":x=!1;break;case")":var y=this.values[this.paren-1];x=y==="if"||y==="while"||y==="for"||y==="with";break;case"}":if(x=!1,this.values[this.curly-3]==="function")x=!!(d=this.values[this.curly-4])&&!this.beforeFunctionExpression(d);else if(this.values[this.curly-4]==="function"){var d;x=!(d=this.values[this.curly-5])||!this.beforeFunctionExpression(d)}}return x},v.prototype.push=function(m){m.type===7||m.type===4?(m.value==="{"?this.curly=this.values.length:m.value==="("&&(this.paren=this.values.length),this.values.push(m.value)):this.values.push(null)},v}(),h=function(){function v(m,x){this.errorHandler=new c.ErrorHandler,this.errorHandler.tolerant=!!x&&typeof x.tolerant=="boolean"&&x.tolerant,this.scanner=new p.Scanner(m,this.errorHandler),this.scanner.trackComment=!!x&&typeof x.comment=="boolean"&&x.comment,this.trackRange=!!x&&typeof x.range=="boolean"&&x.range,this.trackLoc=!!x&&typeof x.loc=="boolean"&&x.loc,this.buffer=[],this.reader=new f}return v.prototype.errors=function(){return this.errorHandler.errors},v.prototype.getNextToken=function(){if(this.buffer.length===0){var m=this.scanner.scanComments();if(this.scanner.trackComment)for(var x=0;x0?N.charCodeAt(k-1):null,ae=ae&&g(G,W)}else{for(k=0;kP&&N[Q+1]!==" ",Q=k);else if(!d(G))return 5;W=k>0?N.charCodeAt(k-1):null,ae=ae&&g(G,W)}Y=Y||q&&k-Q-1>P&&N[Q+1]!==" "}return X||Y?B>9&&C(N)?5:Y?4:3:ae&&!F(N)?1:2}function T(N,L,B,P){N.dump=function(){if(L.length===0)return"''";if(!N.noCompatMode&&f.indexOf(L)!==-1)return"'"+L+"'";var F=N.indent*Math.max(1,B),k=N.lineWidth===-1?-1:Math.max(Math.min(N.lineWidth,40),N.lineWidth-F),G=P||N.flowLevel>-1&&B>=N.flowLevel;switch(S(L,G,N.indent,k,function(W){return function(H,X){var Y,q;for(Y=0,q=H.implicitTypes.length;Y"+w(L,N.indent)+_(m(function(W,H){for(var X,Y,q=/(\n+)([^\n]*)/g,Q=(ne=W.indexOf(` diff --git a/src/trame_vtk/modules/paraview/LICENSE.md b/src/trame_vtk/modules/paraview/LICENSE.md index 3876673..93a2b49 100644 --- a/src/trame_vtk/modules/paraview/LICENSE.md +++ b/src/trame_vtk/modules/paraview/LICENSE.md @@ -1,6 +1,6 @@ -Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc. -Sandia National Laboratories, New Mexico PO Box 5800 Albuquerque, NM 87185 -Kitware Inc., 28 Corporate Drive, Clifton Park, NY 12065, USA +Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc. Sandia National +Laboratories, New Mexico PO Box 5800 Albuquerque, NM 87185 Kitware Inc., 28 +Corporate Drive, Clifton Park, NY 12065, USA Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive license for use of this work by or on behalf of the U.S. Government. @@ -8,14 +8,14 @@ for use of this work by or on behalf of the U.S. Government. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, this +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -* Neither the name of Kitware nor the names of any contributors may be used to +- Neither the name of Kitware nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. @@ -28,4 +28,4 @@ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/trame_vtk/modules/paraview/__init__.py b/src/trame_vtk/modules/paraview/__init__.py index 232c996..e617baa 100644 --- a/src/trame_vtk/modules/paraview/__init__.py +++ b/src/trame_vtk/modules/paraview/__init__.py @@ -18,8 +18,10 @@ def __init__(self, trame_server): self._hybrid_views = {} try: # defer need to paraview to support --www usecase - from paraview import servermanager - from paraview.modules.vtkPVClientWeb import vtkPVWebApplication + from paraview import servermanager # noqa: PLC0415 + from paraview.modules.vtkPVClientWeb import ( # noqa: PLC0415 + vtkPVWebApplication, + ) except ImportError: logger.exception("*** ERROR: ParaView is not available!") else: @@ -68,7 +70,7 @@ def scene( new_state=False, widgets=None, orientation_axis=0, - **kwargs, + **_kwargs, ): # flush data without requiring a render/picture tmp = view_proxy.SuppressRendering @@ -89,7 +91,7 @@ def scene( scene_state.setdefault("extra", {})["resetCamera"] = 1 return scene_state - def export(self, render_window, widgets=None, orientation_axis=0, **kwargs): + def export(self, render_window, widgets=None, orientation_axis=0, **_kwargs): return self._trame_server.protocol_call( "viewport.geometry.view.get.export", self.id(render_window), @@ -168,7 +170,7 @@ def view(self, view_proxy, name="view", **kwargs): def configure_protocol(self, protocol): self._root_protocol = protocol - from .protocols import ( + from .protocols import ( # noqa: PLC0415 ParaViewWebLocalRendering, ParaViewWebMouseHandler, ParaViewWebPublishImageDelivery, @@ -189,7 +191,7 @@ def configure_protocol(self, protocol): self._root_protocol.registerLinkProtocol(ParaViewWebLocalRendering()) # Mimic client interactor on server side - from .core import apply_default_interaction_settings + from .core import apply_default_interaction_settings # noqa: PLC0415 apply_default_interaction_settings() @@ -203,14 +205,14 @@ def add_hybrid_view( still_ratio=1, still_quality=98, force_replace=False, - **kwargs, + **_kwargs, ): if name in self._hybrid_views: if force_replace: self._hybrid_views[name].replace_view(view) else: - print(f"A view with name ({name}) is already registered") - print(" => returning previous one") + print(f"A view with name ({name}) is already registered") # noqa: T201 + print(" => returning previous one") # noqa: T201 return self._hybrid_views[name] view_helper = HybridView( @@ -237,8 +239,7 @@ def remove_hybrid_view(self, name): HELPERS_PER_SERVER = {} -def setup(trame_server, **kwargs): - global HELPERS_PER_SERVER +def setup(trame_server, **_kwargs): HELPERS_PER_SERVER[trame_server.name] = Helper(trame_server) diff --git a/src/trame_vtk/modules/paraview/protocols/__init__.py b/src/trame_vtk/modules/paraview/protocols/__init__.py index 8f84bf6..38d8944 100644 --- a/src/trame_vtk/modules/paraview/protocols/__init__.py +++ b/src/trame_vtk/modules/paraview/protocols/__init__.py @@ -3,7 +3,6 @@ from .publish_image_delivery import ParaViewWebPublishImageDelivery from .view_port import ParaViewWebViewPort - __all__ = [ "ParaViewWebLocalRendering", "ParaViewWebMouseHandler", diff --git a/src/trame_vtk/modules/paraview/protocols/local_rendering.py b/src/trame_vtk/modules/paraview/protocols/local_rendering.py index 69d81a9..6fd539b 100644 --- a/src/trame_vtk/modules/paraview/protocols/local_rendering.py +++ b/src/trame_vtk/modules/paraview/protocols/local_rendering.py @@ -2,19 +2,19 @@ from wslink import register as export_rpc from trame_vtk.modules.vtk.serializers import ( - reference_id, + SynchronizationContext, + extract_array_hash, initialize_serializers, + reference_id, serialize, serialize_widget, - extract_array_hash, - SynchronizationContext, ) from .web_protocol import ParaViewWebProtocol class ParaViewWebLocalRendering(ParaViewWebProtocol): - def __init__(self, **kwargs): + def __init__(self, **_kwargs): super().__init__() initialize_serializers() self.context = SynchronizationContext() @@ -35,7 +35,7 @@ def get_array(self, data_hash, binary=False): def add_view_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = s_view.GetGlobalIDAsString() @@ -68,7 +68,7 @@ def observer_callback(*_, **__): def remove_view_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = s_view.GetGlobalIDAsString() @@ -77,7 +77,7 @@ def remove_view_observer(self, view_id): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["observerCount"] -= 1 @@ -96,11 +96,11 @@ def get_view_state( new_subscription=False, widgets=None, orientation_axis=0, - **kwargs, + **_kwargs, ): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} self.context.set_ignore_last_dependencies(new_subscription) @@ -151,4 +151,4 @@ def get_standalone_state(self, view_id, widgets=None, orientation_axis=0, **kwar **entry, content=self.context.get_cached_data_array(data_hash, False) ) - return dict(hashes=hashes, scene=scene_description) + return {"hashes": hashes, "scene": scene_description} diff --git a/src/trame_vtk/modules/paraview/protocols/mouse_handler.py b/src/trame_vtk/modules/paraview/protocols/mouse_handler.py index e23b082..ed9be3b 100644 --- a/src/trame_vtk/modules/paraview/protocols/mouse_handler.py +++ b/src/trame_vtk/modules/paraview/protocols/mouse_handler.py @@ -1,12 +1,11 @@ -from wslink import register as export_rpc - from vtkmodules.vtkWebCore import vtkWebInteractionEvent +from wslink import register as export_rpc from .web_protocol import ParaViewWebProtocol class ParaViewWebMouseHandler(ParaViewWebProtocol): - def __init__(self, **kwargs): + def __init__(self, **_kwargs): super().__init__() self.last_action = "up" diff --git a/src/trame_vtk/modules/paraview/protocols/publish_image_delivery.py b/src/trame_vtk/modules/paraview/protocols/publish_image_delivery.py index 7cb4d2d..a5ee1d0 100644 --- a/src/trame_vtk/modules/paraview/protocols/publish_image_delivery.py +++ b/src/trame_vtk/modules/paraview/protocols/publish_image_delivery.py @@ -1,13 +1,13 @@ import base64 import math import time +from contextlib import suppress from paraview import simple +from vtkmodules.vtkWebCore import vtkWebInteractionEvent from wslink import register as export_rpc from wslink import schedule_callback -from vtkmodules.vtkWebCore import vtkWebInteractionEvent - from .web_protocol import ParaViewWebProtocol @@ -19,7 +19,7 @@ def apply_modifiers(event, interactor): class ParaViewWebPublishImageDelivery(ParaViewWebProtocol): - def __init__(self, decode=True, **kwargs): + def __init__(self, decode=True, **_kwargs): super().__init__() self.tracking_views = {} self.last_stale_time = {} @@ -141,8 +141,7 @@ def animate(self, render_all_views=True): next_animate_time -= time.time() - if self.target_frame_rate > self.max_frame_rate: - self.target_frame_rate = self.max_frame_rate + self.target_frame_rate = min(self.target_frame_rate, self.max_frame_rate) if next_animate_time < 0: if next_animate_time < -1.0: @@ -155,7 +154,7 @@ def animate(self, render_all_views=True): schedule_callback(0.001, lambda: self.animate(not render_all_views)) else: # Keep animating at the best rate we can - schedule_callback(0.001, lambda: self.animate()) + schedule_callback(0.001, self.animate) else: # We have time so let's render all if ( @@ -163,7 +162,7 @@ def animate(self, render_all_views=True): and next_animate_time > 0.005 ): self.target_frame_rate += 1.0 - schedule_callback(next_animate_time, lambda: self.animate()) + schedule_callback(next_animate_time, self.animate) @export_rpc("viewport.image.animation.fps.max") def set_max_frame_rate(self, fps=30): @@ -231,14 +230,14 @@ def still_render(self, options): """ RPC Callback to render a view and obtain the rendered image. """ - begin_time = int(round(time.time() * 1000)) + begin_time = round(time.time() * 1000) view_id = str(options["view"]) view = self.get_view(view_id) # If no view id provided, skip rendering if not view_id: - print("No view") - print(options) + print("No view") # noqa: T201 + print(options) # noqa: T201 return None # Make sure request match our selected view @@ -286,10 +285,9 @@ def still_render(self, options): app = self.app if t == 0: app.InvalidateCache(view.SMProxy) - if self.decode: - still_render = app.StillRenderToString - else: - still_render = app.StillRenderToBuffer + still_render = ( + app.StillRenderToString if self.decode else app.StillRenderToBuffer + ) reply_image = still_render(view.SMProxy, t, quality) # Check that we are getting image size we have set if not wait until we @@ -328,7 +326,7 @@ def still_render(self, options): # Convert the vtkUnsignedCharArray into a bytes object, required by Autobahn websockets reply["image"] = memoryview(reply_image).tobytes() if reply_image else None - end_time = int(round(time.time() * 1000)) + end_time = round(time.time() * 1000) reply["workTime"] = end_time - begin_time return reply @@ -337,7 +335,7 @@ def still_render(self, options): def add_render_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = s_view.GetGlobalIDAsString() @@ -378,7 +376,7 @@ def remove_render_observer(self, view_id): try: s_view = self.get_view(view_id) except Exception: - print("no view with ID %s available in remove_render_observer" % view_id) + print(f"no view with ID {view_id} available in remove_render_observer") # noqa: T201 real_view_id = s_view.GetGlobalIDAsString() if s_view else view_id @@ -387,7 +385,7 @@ def remove_render_observer(self, view_id): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["observerCount"] -= 1 @@ -401,7 +399,7 @@ def remove_render_observer(self, view_id): @export_rpc("viewport.image.push.quality.get") def get_view_quality(self, view_id): - response = dict(quality=1, ratio=1) + response = {"quality": 1, "ratio": 1} s_view = self.get_view(view_id) if s_view: @@ -417,7 +415,7 @@ def get_view_quality(self, view_id): def set_view_quality(self, view_id, quality, ratio=1, update_linked_view=True): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = s_view.GetGlobalIDAsString() observer_info = None @@ -425,7 +423,7 @@ def set_view_quality(self, view_id, quality, ratio=1, update_linked_view=True): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["quality"] = quality observer_info["ratio"] = ratio @@ -455,7 +453,7 @@ def set_view_size(self, view_id, width, height): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = s_view.GetGlobalIDAsString() observer_info = None @@ -463,7 +461,7 @@ def set_view_size(self, view_id, width, height): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["originalSize"] = (int(width + 0.5), int(height + 0.5)) @@ -473,7 +471,7 @@ def set_view_size(self, view_id, width, height): def enable_view(self, view_id, enabled): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = s_view.GetGlobalIDAsString() observer_info = None @@ -481,7 +479,7 @@ def enable_view(self, view_id, enabled): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["enabled"] = enabled @@ -491,7 +489,7 @@ def enable_view(self, view_id, enabled): def invalidate_cache(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} self.app.InvalidateCache(s_view.SMProxy) self.app.InvokeEvent("UpdateEvent") @@ -510,9 +508,8 @@ def validate_view_links(self): view_list = [self.get_view(vid) for vid in self.linked_views] ref_view = view_list.pop(0) for view in view_list: - link_name = "%s_%s" % ( - ref_view.GetGlobalIDAsString(), - view.GetGlobalIDAsString(), + link_name = ( + f"{ref_view.GetGlobalIDAsString()}_{view.GetGlobalIDAsString()}" ) simple.AddCameraLink(ref_view, view, link_name) self.link_names.append(link_name) @@ -528,10 +525,8 @@ def update_view_link(self, view_id=None, link_state=False): if link_state: self.linked_views.append(view_id) else: - try: + with suppress(Exception): self.linked_views.remove(view_id) - except Exception: - pass # self.validate_view_links() if len(self.linked_views) > 1: diff --git a/src/trame_vtk/modules/paraview/protocols/view_port.py b/src/trame_vtk/modules/paraview/protocols/view_port.py index e91bcf6..28b85dd 100644 --- a/src/trame_vtk/modules/paraview/protocols/view_port.py +++ b/src/trame_vtk/modules/paraview/protocols/view_port.py @@ -1,3 +1,5 @@ +from contextlib import suppress + from paraview import simple from wslink import register as export_rpc @@ -5,7 +7,7 @@ class ParaViewWebViewPort(ParaViewWebProtocol): - def __init__(self, scale=1.0, max_width=2560, max_height=1440, **kwargs): + def __init__(self, scale=1.0, max_width=2560, max_height=1440, **_kwargs): super().__init__() self.scale = scale self.max_width = max_width @@ -20,10 +22,8 @@ def reset_camera(self, view_id): view = self.get_view(view_id) simple.Render(view) simple.ResetCamera(view) - try: + with suppress(AttributeError): view.CenterOfRotation = view.CameraFocalPoint - except AttributeError: - pass self.app.InvalidateCache(view.SMProxy) self.app.InvokeEvent("UpdateEvent") diff --git a/src/trame_vtk/modules/paraview/protocols/web_protocol.py b/src/trame_vtk/modules/paraview/protocols/web_protocol.py index bd882b5..581df85 100644 --- a/src/trame_vtk/modules/paraview/protocols/web_protocol.py +++ b/src/trame_vtk/modules/paraview/protocols/web_protocol.py @@ -1,4 +1,5 @@ import os +from pathlib import Path from paraview import simple from paraview.servermanager import vtkSMTransferFunctionManager @@ -41,13 +42,14 @@ def get_view(self, vid): view = simple.GetActiveView() if not view: - raise Exception(f"no view provided: {vid}") + error_message = f"no view provided: {vid}" + raise Exception(error_message) return view def debug(self, msg): if self.debug_mode: - print(msg) + print(msg) # noqa: T201 def set_base_directory(self, base_path): self.override_data_dir_key = None @@ -58,7 +60,7 @@ def set_base_directory(self, base_path): if base_path.find("|") < 0: if base_path.find("=") >= 0: base_pair = base_path.split("=") - if os.path.exists(base_pair[1]): + if Path(base_pair[1]).exists(): self.base_directory = base_pair[1] self.override_data_dir_key = base_pair[0] else: @@ -68,7 +70,7 @@ def set_base_directory(self, base_path): base_dirs = base_path.split("|") for base_dir in base_dirs: base_pair = base_dir.split("=") - if os.path.exists(base_pair[1]): + if Path(base_pair[1]).exists(): self.base_directory_map[base_pair[0]] = os.path.normpath( base_pair[1] ) @@ -90,15 +92,15 @@ def get_absolute_path(self, relative_path): if self.multi_root: rel_path_parts = relative_path.replace("\\", "/").split("/") real_base_path = self.base_directory_map[rel_path_parts[0]] - absolute_path = os.path.join(real_base_path, *rel_path_parts[1:]) + absolute_path = Path.joinpath(real_base_path, *rel_path_parts[1:]) else: - absolute_path = os.path.join(self.base_directory, relative_path) + absolute_path = Path(self.base_directory) / relative_path cleaned_path = os.path.normpath(absolute_path) # Make sure the cleaned_path is part of the allowed ones if self.multi_root: - for key, value in self.base_directory_map.items(): + for _key, value in self.base_directory_map.items(): if cleaned_path.startswith(value): return cleaned_path elif cleaned_path.startswith(self.base_directory): diff --git a/src/trame_vtk/modules/vtk/LICENSE.md b/src/trame_vtk/modules/vtk/LICENSE.md index 4470a08..54da221 100644 --- a/src/trame_vtk/modules/vtk/LICENSE.md +++ b/src/trame_vtk/modules/vtk/LICENSE.md @@ -1,34 +1,33 @@ -/*========================================================================= +/\*========================================================================= - Program: Visualization Toolkit - Module: Copyright.txt +Program: Visualization Toolkit Module: Copyright.txt -Copyright (c) 1993-2015 Ken Martin, Will Schroeder, Bill Lorensen -All rights reserved. +Copyright (c) 1993-2015 Ken Martin, Will Schroeder, Bill Lorensen All rights +reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. - * Neither name of Ken Martin, Will Schroeder, or Bill Lorensen nor the names - of any contributors may be used to endorse or promote products derived - from this software without specific prior written permission. +- Neither name of Ken Martin, Will Schroeder, or Bill Lorensen nor the names of + any contributors may be used to endorse or promote products derived from this + software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -=========================================================================*/ \ No newline at end of file +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================\*/ diff --git a/src/trame_vtk/modules/vtk/__init__.py b/src/trame_vtk/modules/vtk/__init__.py index 97e7cd6..c23a775 100644 --- a/src/trame_vtk/modules/vtk/__init__.py +++ b/src/trame_vtk/modules/vtk/__init__.py @@ -1,7 +1,7 @@ -import warnings import importlib import os import sys +import warnings from .core import HybridView from .serializers import mesh as vtk_mesh @@ -11,7 +11,7 @@ sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) HAS_VTK = True except ImportError: - warnings.warn("VTK is not installed.") + warnings.warn("VTK is not installed.", stacklevel=2) HAS_VTK = False try: @@ -30,7 +30,7 @@ """ -def has_capabilities(*features): +def has_capabilities(*_features): if not HAS_VTK_WEB: raise ImportError(IMPROPER_VTK_MSG) @@ -76,7 +76,7 @@ def scene( new_state=False, widgets=None, orientation_axis=0, - **kwargs, + **_kwargs, ): scene_state = self._trame_server.protocol_call( "viewport.geometry.view.get.state", @@ -89,7 +89,7 @@ def scene( scene_state.setdefault("extra", {})["resetCamera"] = 1 return scene_state - def export(self, render_window, widgets=None, orientation_axis=0, **kwargs): + def export(self, render_window, widgets=None, orientation_axis=0, **_kwargs): return self._trame_server.protocol_call( "viewport.geometry.view.get.export", self.id(render_window), @@ -166,7 +166,7 @@ def view(self, view, name="view", **kwargs): def configure_protocol(self, protocol): self._root_protocol = protocol - from .protocols import ( + from .protocols import ( # noqa: PLC0415 vtkWebLocalRendering, vtkWebMouseHandler, vtkWebPublishImageDelivery, @@ -196,14 +196,14 @@ def add_hybrid_view( still_ratio=1, still_quality=98, force_replace=False, - **kwargs, + **_kwargs, ): if name in self._hybrid_views: if force_replace: self._hybrid_views[name].replace_view(view) else: - print(f"A view with name ({name}) is already registered") - print(" => returning previous one") + print(f"A view with name ({name}) is already registered") # noqa: T201 + print(" => returning previous one") # noqa: T201 return self._hybrid_views[name] view_helper = HybridView( @@ -234,8 +234,7 @@ def reload_app(self): HELPERS_PER_SERVER = {} -def setup(trame_server, **kwargs): - global HELPERS_PER_SERVER +def setup(trame_server, **_kwargs): if HAS_VTK_WEB: HELPERS_PER_SERVER[trame_server.name] = Helper(trame_server) diff --git a/src/trame_vtk/modules/vtk/protocols/local_rendering.py b/src/trame_vtk/modules/vtk/protocols/local_rendering.py index 39e8439..5f974df 100644 --- a/src/trame_vtk/modules/vtk/protocols/local_rendering.py +++ b/src/trame_vtk/modules/vtk/protocols/local_rendering.py @@ -1,12 +1,12 @@ from wslink import register as export_rpc from ..serializers import ( - reference_id, + SynchronizationContext, + extract_array_hash, initialize_serializers, + reference_id, serialize, serialize_widget, - extract_array_hash, - SynchronizationContext, ) from .web_protocol import vtkWebProtocol @@ -18,7 +18,7 @@ class vtkWebLocalRendering(vtkWebProtocol): client-side rendering capability we have in vtk.js """ - def __init__(self, **kwargs): + def __init__(self, **_kwargs): super().__init__() initialize_serializers() self.context = SynchronizationContext() @@ -39,7 +39,7 @@ def get_array(self, data_hash, binary=False): def add_view_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = self.app.GetObjectIdMap().GetGlobalId(s_view) @@ -71,7 +71,7 @@ def observer_callback(*_, **__): def remove_view_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = self.app.GetObjectIdMap().GetGlobalId(s_view) @@ -80,7 +80,7 @@ def remove_view_observer(self, view_id): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["observerCount"] -= 1 @@ -99,11 +99,11 @@ def get_view_state( new_subscription=False, widgets=None, orientation_axis=0, - **kwargs, + **_kwargs, ): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} self.context.set_ignore_last_dependencies(new_subscription) @@ -156,4 +156,4 @@ def get_standalone_state(self, view_id, widgets=None, orientation_axis=0, **kwar **entry, content=self.context.get_cached_data_array(data_hash, False) ) - return dict(hashes=hashes, scene=scene_description) + return {"hashes": hashes, "scene": scene_description} diff --git a/src/trame_vtk/modules/vtk/protocols/mouse_handler.py b/src/trame_vtk/modules/vtk/protocols/mouse_handler.py index 86f6d6b..3178b03 100644 --- a/src/trame_vtk/modules/vtk/protocols/mouse_handler.py +++ b/src/trame_vtk/modules/vtk/protocols/mouse_handler.py @@ -1,16 +1,15 @@ +import importlib import math import os -import importlib import sys vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) -from vtk_module.vtkWebCore import vtkWebInteractionEvent - -from wslink import register as export_rpc +from vtk_module.vtkWebCore import vtkWebInteractionEvent # noqa: E402 +from wslink import register as export_rpc # noqa: E402 -from .web_protocol import vtkWebProtocol +from .web_protocol import vtkWebProtocol # noqa: E402 def apply_modifiers(event, interactor): diff --git a/src/trame_vtk/modules/vtk/protocols/publish_image_delivery.py b/src/trame_vtk/modules/vtk/protocols/publish_image_delivery.py index 474f11a..f158404 100644 --- a/src/trame_vtk/modules/vtk/protocols/publish_image_delivery.py +++ b/src/trame_vtk/modules/vtk/protocols/publish_image_delivery.py @@ -105,22 +105,21 @@ def animate(self): next_animate_time -= time.time() - if self.target_frame_rate > self.max_frame_rate: - self.target_frame_rate = self.max_frame_rate + self.target_frame_rate = min(self.target_frame_rate, self.max_frame_rate) if next_animate_time < 0: if next_animate_time < -1.0: self.target_frame_rate = 1 if self.target_frame_rate > self.min_frame_rate: self.target_frame_rate -= 1.0 - schedule_callback(0.001, lambda: self.animate()) + schedule_callback(0.001, self.animate) else: if ( self.target_frame_rate < self.max_frame_rate and next_animate_time > 0.005 ): self.target_frame_rate += 1.0 - schedule_callback(next_animate_time, lambda: self.animate()) + schedule_callback(next_animate_time, self.animate) @export_rpc("viewport.image.animation.fps.max") def set_max_frame_rate(self, fps=30): @@ -161,7 +160,7 @@ def still_render(self, options): """ RPC Callback to render a view and obtain the rendered image. """ - begin_time = int(round(time.time() * 1000)) + begin_time = round(time.time() * 1000) view = self.get_view(options["view"]) if not view: # The view has been deleted, we can not render it... @@ -193,10 +192,9 @@ def still_render(self, options): app = self.app if t == 0: app.InvalidateCache(view) - if self.decode: - still_render = app.StillRenderToString - else: - still_render = app.StillRenderToBuffer + still_render = ( + app.StillRenderToString if self.decode else app.StillRenderToBuffer + ) reply_image = still_render(view, t, quality) # Check that we are getting image size we have set if not wait until we @@ -229,7 +227,7 @@ def still_render(self, options): # Convert the vtkUnsignedCharArray into a bytes object, required by Autobahn websockets reply["image"] = memoryview(reply_image).tobytes() if reply_image else None - end_time = int(round(time.time() * 1000)) + end_time = round(time.time() * 1000) reply["workTime"] = end_time - begin_time return reply @@ -238,7 +236,7 @@ def still_render(self, options): def add_render_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = str(self.get_global_id(s_view)) @@ -276,7 +274,7 @@ def stop_callback(*_, **__): def remove_render_observer(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = str(self.get_global_id(s_view)) @@ -285,7 +283,7 @@ def remove_render_observer(self, view_id): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["observerCount"] -= 1 @@ -298,7 +296,7 @@ def remove_render_observer(self, view_id): @export_rpc("viewport.image.push.quality.get") def get_view_quality(self, view_id): - response = dict(quality=1, ratio=1) + response = {"quality": 1, "ratio": 1} s_view = self.get_view(view_id) if s_view: @@ -314,7 +312,7 @@ def get_view_quality(self, view_id): def set_view_quality(self, view_id, quality, ratio=1): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = str(self.get_global_id(s_view)) observer_info = None @@ -322,7 +320,7 @@ def set_view_quality(self, view_id, quality, ratio=1): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["quality"] = quality observer_info["ratio"] = ratio @@ -344,7 +342,7 @@ def set_view_quality(self, view_id, quality, ratio=1): def set_view_size(self, view_id, width, height): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = str(self.get_global_id(s_view)) observer_info = None @@ -352,7 +350,7 @@ def set_view_size(self, view_id, width, height): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["originalSize"] = [width, height] @@ -362,7 +360,7 @@ def set_view_size(self, view_id, width, height): def enable_view(self, view_id, enabled): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} real_view_id = str(self.get_global_id(s_view)) observer_info = None @@ -370,7 +368,7 @@ def enable_view(self, view_id, enabled): observer_info = self.tracking_views[real_view_id] if not observer_info: - return {"error": "Unable to find subscription for view %s" % real_view_id} + return {"error": f"Unable to find subscription for view {real_view_id}"} observer_info["enabled"] = enabled @@ -380,7 +378,7 @@ def enable_view(self, view_id, enabled): def invalidate_cache(self, view_id): s_view = self.get_view(view_id) if not s_view: - return {"error": "Unable to get view with id %s" % view_id} + return {"error": f"Unable to get view with id {view_id}"} self.app.InvalidateCache(s_view) self.app.InvokeEvent("UpdateEvent") diff --git a/src/trame_vtk/modules/vtk/protocols/view_port.py b/src/trame_vtk/modules/vtk/protocols/view_port.py index 6e28e85..feec086 100644 --- a/src/trame_vtk/modules/vtk/protocols/view_port.py +++ b/src/trame_vtk/modules/vtk/protocols/view_port.py @@ -21,7 +21,7 @@ def reset_camera(self, view_id): return str(self.get_global_id(view)) @export_rpc("viewport.axes.orientation.visibility.update") - def update_orientation_axes_visibility(self, view_id, show_axis): + def update_orientation_axes_visibility(self, view_id, _show_axis): """ RPC callback to show/hide OrientationAxis. """ @@ -34,7 +34,7 @@ def update_orientation_axes_visibility(self, view_id, show_axis): return str(self.get_global_id(view)) @export_rpc("viewport.axes.center.visibility.update") - def update_center_axes_visibility(self, view_id, show_axis): + def update_center_axes_visibility(self, view_id, _show_axis): """ RPC callback to show/hide CenterAxesVisibility. """ diff --git a/src/trame_vtk/modules/vtk/protocols/web_protocol.py b/src/trame_vtk/modules/vtk/protocols/web_protocol.py index d52e5c0..8ba7d0b 100644 --- a/src/trame_vtk/modules/vtk/protocols/web_protocol.py +++ b/src/trame_vtk/modules/vtk/protocols/web_protocol.py @@ -50,7 +50,8 @@ def get_view(self, vid): # Use active view is none provided. v = self.app.GetObjectIdMap().GetActiveObject("VIEW") if not v: - raise Exception("no view provided: %s" % vid) + exception_message = f"no view provided: {vid}" + raise Exception(exception_message) return v diff --git a/src/trame_vtk/modules/vtk/serializers/__init__.py b/src/trame_vtk/modules/vtk/serializers/__init__.py index 63679ef..f1117e2 100644 --- a/src/trame_vtk/modules/vtk/serializers/__init__.py +++ b/src/trame_vtk/modules/vtk/serializers/__init__.py @@ -1,13 +1,12 @@ import logging import os +from .export import extract_array_hash +from .initialize import encode_lut, initialize_serializers, skip_light from .mesh import mesh -from .initialize import initialize_serializers from .serialize import serialize, serialize_widget -from .export import extract_array_hash from .synchronization_context import SynchronizationContext from .utils import reference_id -from .initialize import encode_lut, skip_light logger = logging.getLogger(__name__) # By default, only show critical messages for serializers @@ -24,14 +23,14 @@ def configure_serializer(**options): __all__ = [ + "SynchronizationContext", "configure_serializer", "encode_lut", - "skip_light", - "reference_id", + "extract_array_hash", "initialize_serializers", "mesh", + "reference_id", "serialize", - "SynchronizationContext", "serialize_widget", - "extract_array_hash", + "skip_light", ] diff --git a/src/trame_vtk/modules/vtk/serializers/actors.py b/src/trame_vtk/modules/vtk/serializers/actors.py index b6e70e2..99fa313 100644 --- a/src/trame_vtk/modules/vtk/serializers/actors.py +++ b/src/trame_vtk/modules/vtk/serializers/actors.py @@ -1,9 +1,9 @@ import logging +from .cache import cache_properties, get_cached_property from .registry import class_name from .serialize import serialize from .utils import reference_id, rgb_float_to_hex, wrap_id -from .cache import cache_properties, get_cached_property logger = logging.getLogger(__name__) @@ -229,7 +229,7 @@ def scalar_bar_actor_serializer(parent, actor, actor_id, context, depth): prop = actor.GetProperty() else: if context.debug_all: - print("This scalar_bar_actor does not have a GetProperty method") + print("This scalar_bar_actor does not have a GetProperty method") # noqa: T201 if prop: prop_id = reference_id(prop) @@ -298,7 +298,7 @@ def scalar_bar_actor_serializer(parent, actor, actor_id, context, depth): # ----------------------------------------------------------------------------- -def axes_actor_serializer(parent, actor, actor_id, context, depth): +def axes_actor_serializer(parent, actor, actor_id, context, _depth): actor_visibility = actor.GetVisibility() if not actor_visibility: @@ -373,15 +373,15 @@ def axes_actor_serializer(parent, actor, actor_id, context, depth): "shaftRadius": 0.01 if shaft_type else cylinder_radius, # 0.03, "invert": 0, }, - "xAxisColor": list( - map(lambda x: int(x * 255), actor.GetXAxisTipProperty().GetColor()) - ), - "yAxisColor": list( - map(lambda x: int(x * 255), actor.GetYAxisTipProperty().GetColor()) - ), - "zAxisColor": list( - map(lambda x: int(x * 255), actor.GetZAxisTipProperty().GetColor()) - ), + "xAxisColor": [ + int(x * 255) for x in actor.GetXAxisTipProperty().GetColor() + ], + "yAxisColor": [ + int(x * 255) for x in actor.GetYAxisTipProperty().GetColor() + ], + "zAxisColor": [ + int(x * 255) for x in actor.GetZAxisTipProperty().GetColor() + ], }, ), } diff --git a/src/trame_vtk/modules/vtk/serializers/cache.py b/src/trame_vtk/modules/vtk/serializers/cache.py index da3c635..8a24488 100644 --- a/src/trame_vtk/modules/vtk/serializers/cache.py +++ b/src/trame_vtk/modules/vtk/serializers/cache.py @@ -2,8 +2,7 @@ def remove_from_cache(obj_id): - if obj_id in PROP_CACHE: - del PROP_CACHE[obj_id] + PROP_CACHE.pop(obj_id, None) def get_cached_property(obj_id, prop): diff --git a/src/trame_vtk/modules/vtk/serializers/data.py b/src/trame_vtk/modules/vtk/serializers/data.py index c8019e6..d951f38 100644 --- a/src/trame_vtk/modules/vtk/serializers/data.py +++ b/src/trame_vtk/modules/vtk/serializers/data.py @@ -1,26 +1,34 @@ +import importlib import logging - import os -import importlib import sys vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) -from vtk_module.vtkFiltersGeometry import vtkCompositeDataGeometryFilter -from vtk_module.vtkFiltersGeometry import vtkDataSetSurfaceFilter +from vtk_module.vtkFiltersGeometry import ( # noqa: E402 + vtkCompositeDataGeometryFilter, + vtkDataSetSurfaceFilter, +) -from .helpers import extract_required_fields, get_array_description -from .registry import class_name -from .serialize import serialize -from .utils import reference_id, wrap_id, get_js_array_type +from .helpers import extract_required_fields, get_array_description # noqa: E402 +from .registry import class_name # noqa: E402 +from .serialize import serialize # noqa: E402 +from .utils import get_js_array_type, reference_id, wrap_id # noqa: E402 logger = logging.getLogger(__name__) def polydata_serializer( - parent, dataset, dataset_id, context, depth, requested_fields=["Normals", "TCoords"] + parent, + dataset, + dataset_id, + context, + _depth, + requested_fields=None, ): + if requested_fields is None: + requested_fields = ["Normals", "TCoords"] if dataset and dataset.GetPoints(): properties = {} @@ -92,8 +100,10 @@ def merge_to_polydata_serializer( data_object_id, context, depth, - requested_fields=["Normals", "TCoords"], + requested_fields=None, ): + if requested_fields is None: + requested_fields = ["Normals", "TCoords"] dataset = None if data_object.IsA("vtkCompositeDataSet"): @@ -120,7 +130,12 @@ def merge_to_polydata_serializer( def imagedata_serializer( - parent, dataset, dataset_id, context, depth, requested_fields=["Normals", "TCoords"] + parent, + dataset, + dataset_id, + context, + _depth, + requested_fields, # noqa: ARG001 ): if hasattr(dataset, "GetDirectionMatrix"): direction = [dataset.GetDirectionMatrix().GetElement(0, i) for i in range(9)] diff --git a/src/trame_vtk/modules/vtk/serializers/export.py b/src/trame_vtk/modules/vtk/serializers/export.py index 8eac946..481cfa6 100644 --- a/src/trame_vtk/modules/vtk/serializers/export.py +++ b/src/trame_vtk/modules/vtk/serializers/export.py @@ -9,11 +9,11 @@ def handle_property(hash_list, prop_value): if "vtkClass" in prop_value and "hash" in prop_value: hash_list.append( - dict( - hash=prop_value.get("hash"), - type=prop_value.get("dataType"), - vtk=prop_value.get("vtkClass"), - ) + { + "hash": prop_value.get("hash"), + "type": prop_value.get("dataType"), + "vtk": prop_value.get("vtkClass"), + } ) diff --git a/src/trame_vtk/modules/vtk/serializers/helpers.py b/src/trame_vtk/modules/vtk/serializers/helpers.py index a8a8699..fc8454e 100644 --- a/src/trame_vtk/modules/vtk/serializers/helpers.py +++ b/src/trame_vtk/modules/vtk/serializers/helpers.py @@ -10,10 +10,7 @@ def is_array_in(array, arrays): - for a in arrays: - if a is array: - return True - return False + return any(a is array for a in arrays) def data_table_to_list(data_table): @@ -106,8 +103,10 @@ def get_array_description(array, context, **kwargs): def extract_required_fields( - extracted_fields, parent, dataset, context, requested_fields=["Normals", "TCoords"] + extracted_fields, parent, dataset, context, requested_fields=None ): + if requested_fields is None: + requested_fields = ["Normals", "TCoords"] arrays_to_export = [] export_all = "*" in requested_fields # Identify arrays to export diff --git a/src/trame_vtk/modules/vtk/serializers/initialize.py b/src/trame_vtk/modules/vtk/serializers/initialize.py index 1832777..5b708f3 100644 --- a/src/trame_vtk/modules/vtk/serializers/initialize.py +++ b/src/trame_vtk/modules/vtk/serializers/initialize.py @@ -7,8 +7,8 @@ scalar_bar_actor_serializer, ) from .data import ( - imagedata_serializer, generic_volume_serializer, + imagedata_serializer, merge_to_polydata_serializer, polydata_serializer, ) @@ -25,30 +25,51 @@ from .registry import register_instance_serializer, register_js_class from .render_windows import ( camera_serializer, - renderer_serializer, render_window_serializer, + renderer_serializer, ) from .textures import texture_serializer logger = logging.getLogger(__name__) -CONVERT_LUT = False -SKIP_LIGHT = False + +class LUTConfig: + """Configuration globale pour les sérialiseurs VTK""" + + def __init__(self): + self._convert_lut = False + self._skip_light = False + + @property + def convert_lut(self): + return self._convert_lut + + @convert_lut.setter + def convert_lut(self, value): + self._convert_lut = value + + @property + def skip_light(self): + return self._skip_light + + @skip_light.setter + def skip_light(self, value): + self._skip_light = value + + +vtk_config = LUTConfig() def encode_lut(value=True): - global CONVERT_LUT - CONVERT_LUT = value + vtk_config.convert_lut = value def skip_light(value=True): - global SKIP_LIGHT - SKIP_LIGHT = value + vtk_config.skip_light = value def lookup_table_serializer_selector(*args, **kwargs): - global CONVERT_LUT - if CONVERT_LUT: + if vtk_config.convert_lut: return lookup_table_serializer2(*args, **kwargs) return lookup_table_serializer(*args, **kwargs) @@ -133,7 +154,7 @@ def initialize_serializers(): ], # Lights light_serializer: [] - if SKIP_LIGHT + if vtk_config.skip_light else [ "vtkLight", "vtkPVLight", @@ -167,15 +188,14 @@ def initialize_serializers(): } for serializer, names in serializers.items(): - if not isinstance(names, (list, tuple)): - names = [names] + names_list = [names] if not isinstance(names, (list, tuple)) else names - for name in names: + for name in names_list: register_instance_serializer(name, serializer) for js_class, vtk_classes in js_classes.items(): - if not isinstance(vtk_classes, (list, tuple)): - vtk_classes = [vtk_classes] - - for vtk_class in vtk_classes: + vtk_classes_list = ( + [vtk_classes] if not isinstance(vtk_classes, (list, tuple)) else vtk_classes + ) + for vtk_class in vtk_classes_list: register_js_class(vtk_class, js_class) diff --git a/src/trame_vtk/modules/vtk/serializers/lights.py b/src/trame_vtk/modules/vtk/serializers/lights.py index 671cbf3..47434b9 100644 --- a/src/trame_vtk/modules/vtk/serializers/lights.py +++ b/src/trame_vtk/modules/vtk/serializers/lights.py @@ -1,6 +1,6 @@ +from .cache import cache_properties from .registry import class_name from .utils import reference_id -from .cache import cache_properties def light_type_to_string(value): @@ -15,13 +15,13 @@ def light_type_to_string(value): """ if value == 1: return "HeadLight" - elif value == 2: + if value == 2: return "CameraLight" return "SceneLight" -def light_serializer(parent, instance, obj_id, context, depth): +def light_serializer(parent, instance, obj_id, context, _depth): return { "parent": reference_id(parent), "id": obj_id, diff --git a/src/trame_vtk/modules/vtk/serializers/lookup_tables.py b/src/trame_vtk/modules/vtk/serializers/lookup_tables.py index 8ecdc51..905964f 100644 --- a/src/trame_vtk/modules/vtk/serializers/lookup_tables.py +++ b/src/trame_vtk/modules/vtk/serializers/lookup_tables.py @@ -1,19 +1,20 @@ -import os import importlib +import os import sys +from contextlib import suppress -vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") -sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) - -from vtk_module.vtkRenderingCore import vtkColorTransferFunction - +from .cache import cache_properties from .helpers import data_table_to_list, linspace from .registry import class_name from .utils import reference_id -from .cache import cache_properties + +vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") +sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) + +from vtk_module.vtkRenderingCore import vtkColorTransferFunction # noqa: E402 -def lookup_table_serializer(parent, lookup_table, lookup_table_id, context, depth): +def lookup_table_serializer(parent, lookup_table, lookup_table_id, context, _depth): # No children in this case, so no additions to bindings and return empty list # But we do need to add instance @@ -21,10 +22,8 @@ def lookup_table_serializer(parent, lookup_table, lookup_table_id, context, dept lookup_table_hue_range = [0.5, 0] if hasattr(lookup_table, "GetHueRange"): - try: + with suppress(Exception): lookup_table.GetHueRange(lookup_table_hue_range) - except Exception: - pass lut_sat_range = lookup_table.GetSaturationRange() table = data_table_to_list(lookup_table.GetTable()) @@ -37,8 +36,8 @@ def lookup_table_serializer(parent, lookup_table, lookup_table_id, context, dept "nanColor": lookup_table.GetNanColor(), "belowRangeColor": lookup_table.GetBelowRangeColor(), "aboveRangeColor": lookup_table.GetAboveRangeColor(), - "useAboveRangeColor": True if lookup_table.GetUseAboveRangeColor() else False, - "useBelowRangeColor": True if lookup_table.GetUseBelowRangeColor() else False, + "useAboveRangeColor": bool(lookup_table.GetUseAboveRangeColor()), + "useBelowRangeColor": bool(lookup_table.GetUseBelowRangeColor()), "alpha": lookup_table.GetAlpha(), "vectorSize": lookup_table.GetVectorSize(), "vectorComponent": lookup_table.GetVectorComponent(), @@ -92,7 +91,7 @@ def lookup_table_serializer2(parent, lookup_table, lookup_table_id, context, dep return None -def color_transfer_function_serializer(parent, instance, obj_id, context, depth): +def color_transfer_function_serializer(parent, instance, obj_id, context, _depth): nodes = [] for i in range(instance.GetSize()): # x, r, g, b, midpoint, sharpness @@ -153,7 +152,7 @@ def discretizable_color_transfer_function_serializer( return ctf -def pwf_serializer(parent, instance, obj_id, context, depth): +def pwf_serializer(parent, instance, obj_id, context, _depth): nodes = [] for i in range(instance.GetSize()): diff --git a/src/trame_vtk/modules/vtk/serializers/mappers.py b/src/trame_vtk/modules/vtk/serializers/mappers.py index b3b07e9..ef9783b 100644 --- a/src/trame_vtk/modules/vtk/serializers/mappers.py +++ b/src/trame_vtk/modules/vtk/serializers/mappers.py @@ -1,16 +1,17 @@ +import importlib import logging import os -import importlib import sys -vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") -sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) -from vtk_module.vtkFiltersGeometry import vtkDataSetSurfaceFilter - +from .cache import cache_properties from .registry import class_name from .serialize import serialize from .utils import reference_id, wrap_id -from .cache import cache_properties + +vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") +sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) + +from vtk_module.vtkFiltersGeometry import vtkDataSetSurfaceFilter # noqa: E402 logger = logging.getLogger(__name__) @@ -27,9 +28,8 @@ def generic_mapper_serializer(parent, mapper, mapper_id, context, depth): if hasattr(mapper, "GetInputDataObject"): mapper.GetInputAlgorithm().Update() data_object = mapper.GetInputDataObject(0, 0) - else: - if context.debug_all: - print("This mapper does not have GetInputDataObject method") + elif context.debug_all: + print("This mapper does not have GetInputDataObject method") # noqa: T201 if data_object: if data_object.IsA("vtkDataSet"): @@ -38,7 +38,7 @@ def generic_mapper_serializer(parent, mapper, mapper_id, context, depth): alg.Update() data_object = alg.GetOutput() - data_object_id = "%s-dataset" % mapper_id + data_object_id = f"{mapper_id}-dataset" data_object_instance = serialize( mapper, data_object, data_object_id, context, depth + 1 ) @@ -51,9 +51,8 @@ def generic_mapper_serializer(parent, mapper, mapper_id, context, depth): if hasattr(mapper, "GetLookupTable"): lookup_table = mapper.GetLookupTable() - else: - if context.debug_all: - print("This mapper does not have GetLookupTable method") + elif context.debug_all: + print("This mapper does not have GetLookupTable method") # noqa: T201 if lookup_table: lookup_table_id = reference_id(lookup_table) @@ -120,7 +119,7 @@ def generic_volume_mapper_serializer(parent, mapper, mapper_id, context, depth): logger.debug("This mapper does not have GetInputDataObject method") if data_object: - data_object_id = "%s-dataset" % mapper_id + data_object_id = f"{mapper_id}-dataset" data_object_instance = serialize( mapper, data_object, data_object_id, context, depth + 1 ) @@ -130,10 +129,11 @@ def generic_volume_mapper_serializer(parent, mapper, mapper_id, context, depth): calls.append(["setInputData", [wrap_id(data_object_id)]]) if data_object_instance: - if hasattr(mapper, "GetImageSampleDistance"): - image_sample_distance = mapper.GetImageSampleDistance() - else: - image_sample_distance = 1.0 + image_sample_distance = ( + mapper.GetImageSampleDistance() + if hasattr(mapper, "GetImageSampleDistance") + else 1.0 + ) return { "parent": reference_id(parent), "id": mapper_id, diff --git a/src/trame_vtk/modules/vtk/serializers/mesh.py b/src/trame_vtk/modules/vtk/serializers/mesh.py index dff46d4..3edfd04 100644 --- a/src/trame_vtk/modules/vtk/serializers/mesh.py +++ b/src/trame_vtk/modules/vtk/serializers/mesh.py @@ -1,15 +1,15 @@ import base64 - -import numpy as np -import os import importlib +import os import sys +import numpy as np + vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) -from vtk_module.util.numpy_support import vtk_to_numpy -from vtk_module.vtkFiltersGeometry import vtkDataSetSurfaceFilter +from vtk_module.util.numpy_support import vtk_to_numpy # noqa: E402 +from vtk_module.vtkFiltersGeometry import vtkDataSetSurfaceFilter # noqa: E402 def mesh(dataset, field_to_keep=None, point_arrays=None, cell_arrays=None): @@ -84,24 +84,24 @@ def mesh(dataset, field_to_keep=None, point_arrays=None, cell_arrays=None): def mesh_array(array): - if array: - return b64_encode_numpy(vtk_to_numpy(array.GetData())) + return b64_encode_numpy(vtk_to_numpy(array.GetData())) if array else None def data_array(data_array, location="PointData", name=None): - if data_array: - data_range = data_array.GetRange(-1) - nb_comp = data_array.GetNumberOfComponents() - values = vtk_to_numpy(data_array) - js_types = to_js_type[str(values.dtype)] - return { - "name": name if name else data_array.GetName(), - "values": b64_encode_numpy(values), - "numberOfComponents": nb_comp, - "type": js_types, - "location": location, - "dataRange": data_range, - } + if data_array is None: + return None + data_range = data_array.GetRange(-1) + nb_comp = data_array.GetNumberOfComponents() + values = vtk_to_numpy(data_array) + js_types = to_js_type[str(values.dtype)] + return { + "name": name if name else data_array.GetName(), + "values": b64_encode_numpy(values), + "numberOfComponents": nb_comp, + "type": js_types, + "location": location, + "dataRange": data_range, + } def field_data(field_data, names, location="PointData"): @@ -170,9 +170,9 @@ def b64_encode_numpy(obj): dtype = obj.dtype if dtype.kind == "f": return np_encode(obj) - elif dtype.kind == "b": + if dtype.kind == "b": return np_encode(obj, np.uint8) - elif dtype.kind in ["u", "i"]: + if dtype.kind in ["u", "i"]: # Try to see if we can downsize the array max_value = np.amax(obj) min_value = np.amin(obj) diff --git a/src/trame_vtk/modules/vtk/serializers/properties.py b/src/trame_vtk/modules/vtk/serializers/properties.py index e5e8538..7149fde 100644 --- a/src/trame_vtk/modules/vtk/serializers/properties.py +++ b/src/trame_vtk/modules/vtk/serializers/properties.py @@ -1,10 +1,10 @@ +from .cache import cache_properties from .registry import class_name from .serialize import serialize from .utils import reference_id, wrap_id -from .cache import cache_properties -def property_serializer(parent, prop_obj, prop_obj_id, context, depth): +def property_serializer(parent, prop_obj, prop_obj_id, context, _depth): representation = ( prop_obj.GetRepresentation() if hasattr(prop_obj, "GetRepresentation") else 2 ) diff --git a/src/trame_vtk/modules/vtk/serializers/render_windows.py b/src/trame_vtk/modules/vtk/serializers/render_windows.py index a4eb9c0..a267c7e 100644 --- a/src/trame_vtk/modules/vtk/serializers/render_windows.py +++ b/src/trame_vtk/modules/vtk/serializers/render_windows.py @@ -31,7 +31,7 @@ def renderer_serializer(parent, instance, obj_id, context, depth): view_prop_ids.append(view_prop_id) calls += context.build_dependency_call_list( - "%s-props" % obj_id, view_prop_ids, "addViewProp", "removeViewProp" + f"{obj_id}-props", view_prop_ids, "addViewProp", "removeViewProp" ) # Lights @@ -46,7 +46,7 @@ def renderer_serializer(parent, instance, obj_id, context, depth): lights_ids.append(light_id) calls += context.build_dependency_call_list( - "%s-lights" % obj_id, lights_ids, "addLight", "removeLight" + f"{obj_id}-lights", lights_ids, "addLight", "removeLight" ) if len(dependencies) > 1: @@ -86,7 +86,7 @@ def renderer_serializer(parent, instance, obj_id, context, depth): # ----------------------------------------------------------------------------- -def camera_serializer(parent, instance, obj_id, context, depth): +def camera_serializer(parent, instance, obj_id, _context, _depth): return { "parent": reference_id(parent), "id": obj_id, diff --git a/src/trame_vtk/modules/vtk/serializers/serialize.py b/src/trame_vtk/modules/vtk/serializers/serialize.py index 0b4f3da..e3dcc72 100644 --- a/src/trame_vtk/modules/vtk/serializers/serialize.py +++ b/src/trame_vtk/modules/vtk/serializers/serialize.py @@ -1,8 +1,9 @@ import logging + import vtk from .cache import remove_from_cache -from .registry import class_name, SERIALIZERS +from .registry import SERIALIZERS, class_name from .widgets import handle_widget __all__ = ["serialize", "serialize_widget"] @@ -16,10 +17,10 @@ def serialize(parent, instance, instance_id, context, depth): instance_type = class_name(instance) - serializer = SERIALIZERS[instance_type] if instance_type in SERIALIZERS else None + serializer = SERIALIZERS.get(instance_type, None) if instance_id not in DELETE_CALLBACKS: instance.AddObserver( - vtk.vtkCommand.DeleteEvent, lambda *a, **k: remove(instance_id) + vtk.vtkCommand.DeleteEvent, lambda *_a, **_k: remove(instance_id) ) DELETE_CALLBACKS.append(instance_id) @@ -28,7 +29,7 @@ def serialize(parent, instance, instance_id, context, depth): if instance_type not in NO_SERIALIZER_FOR_INSTANCE: # Only print the warning once for each type of serializer - logger.warning(f"!!!No serializer for {instance_type} with id {instance_id}") + logger.warning("!!!No serializer for %s with id %s", instance_type, instance_id) NO_SERIALIZER_FOR_INSTANCE[instance_type] = instance_id return None diff --git a/src/trame_vtk/modules/vtk/serializers/synchronization_context.py b/src/trame_vtk/modules/vtk/serializers/synchronization_context.py index 35e4c6f..96a2744 100644 --- a/src/trame_vtk/modules/vtk/serializers/synchronization_context.py +++ b/src/trame_vtk/modules/vtk/serializers/synchronization_context.py @@ -1,17 +1,21 @@ +import importlib import io import logging -import time -import zipfile import os -import importlib import sys +import time +import zipfile + +from .utils import base64_encode, wrap_id vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) -from vtk_module.vtkCommonCore import vtkTypeUInt32Array, vtkFloatArray, vtkDoubleArray - -from .utils import base64_encode, wrap_id +from vtk_module.vtkCommonCore import ( # noqa: E402 + vtkDoubleArray, + vtkFloatArray, + vtkTypeUInt32Array, +) logger = logging.getLogger(__name__) @@ -119,6 +123,6 @@ def build_dependency_call_list(self, idstr, new_list, add_method, remove_method) def zip_compression(name, data): with io.BytesIO() as in_memory: with zipfile.ZipFile(in_memory, mode="w") as zf: - zf.writestr("data/%s" % name, data, zipfile.ZIP_DEFLATED) + zf.writestr(f"data/{name}", data, zipfile.ZIP_DEFLATED) in_memory.seek(0) return in_memory.read() diff --git a/src/trame_vtk/modules/vtk/serializers/textures.py b/src/trame_vtk/modules/vtk/serializers/textures.py index e05d136..d518bda 100644 --- a/src/trame_vtk/modules/vtk/serializers/textures.py +++ b/src/trame_vtk/modules/vtk/serializers/textures.py @@ -20,7 +20,7 @@ def texture_serializer(parent, texture, texture_id, context, depth): logger.debug("This texture does not have GetInput method") if data_object: - data_object_id = "%s-texture" % texture_id + data_object_id = f"{texture_id}-texture" data_object_instance = serialize( texture, data_object, data_object_id, context, depth + 1 ) diff --git a/src/trame_vtk/modules/vtk/serializers/utils.py b/src/trame_vtk/modules/vtk/serializers/utils.py index 06db1b1..10ceeed 100644 --- a/src/trame_vtk/modules/vtk/serializers/utils.py +++ b/src/trame_vtk/modules/vtk/serializers/utils.py @@ -1,6 +1,5 @@ import base64 import hashlib -import sys def rgb_float_to_hex(r, g, b): @@ -49,14 +48,9 @@ def base64_encode(x): def hash_data_array(data_array): - if sys.version_info < (3, 9): - hashed_bit = hashlib.md5(memoryview(data_array)).hexdigest() - else: - hashed_bit = hashlib.md5( - memoryview(data_array), usedforsecurity=False - ).hexdigest() + hashed_bit = hashlib.md5(memoryview(data_array), usedforsecurity=False).hexdigest() type_code = array_types_mapping[data_array.GetDataType()] - return "%s_%d%s" % (hashed_bit, data_array.GetNumberOfValues(), type_code) + return f"{hashed_bit}_{data_array.GetNumberOfValues()}{type_code}" def get_js_array_type(data_array): @@ -64,7 +58,7 @@ def get_js_array_type(data_array): def wrap_id(id_str): - return "instance:${%s}" % id_str + return f"instance:${{{id_str}}}" def reference_id(ref): @@ -72,7 +66,5 @@ def reference_id(ref): try: return ref.__this__[1:17] except Exception: - id_str = str(ref)[-12:-1] - # print('====> fallback ID %s for %s' % (id_str, ref)) - return id_str + return str(ref)[-12:-1] return "0x0" diff --git a/src/trame_vtk/modules/vtk/serializers/widgets.py b/src/trame_vtk/modules/vtk/serializers/widgets.py index 1468d80..40412f8 100644 --- a/src/trame_vtk/modules/vtk/serializers/widgets.py +++ b/src/trame_vtk/modules/vtk/serializers/widgets.py @@ -1,4 +1,5 @@ import logging + from .utils import reference_id logger = logging.getLogger(__name__) @@ -50,4 +51,4 @@ def handle_widget(map_to_update, widget): SERIALIZERS[class_name](map_to_update, widget) elif class_name not in UNKNOWN_CLASSES: UNKNOWN_CLASSES.add(class_name) - logger.warning(f"!!!No widget serializer for {class_name}") + logger.warning("!!!No widget serializer for %s", class_name) diff --git a/src/trame_vtk/modules/vtk/widget.py b/src/trame_vtk/modules/vtk/widget.py index 575c0f4..9c2f043 100644 --- a/src/trame_vtk/modules/vtk/widget.py +++ b/src/trame_vtk/modules/vtk/widget.py @@ -1,19 +1,18 @@ -from typing import Type, Callable, Dict, Optional -from functools import partialmethod -import os import importlib +import os import sys +from functools import partialmethod +from typing import Callable, Optional vtk_module_name = os.environ.get("VTK_MODULE_NAME", "vtkmodules") sys.modules["vtk_module"] = importlib.import_module(vtk_module_name) -from vtk_module.vtkInteractionWidgets import ( +from vtk_module.vtkCommonCore import vtkCommand # noqa: E402 +from vtk_module.vtkInteractionWidgets import ( # noqa: E402 vtkAbstractWidget, vtkWidgetRepresentation, ) -from vtk_module.vtkCommonCore import vtkCommand - EventCallback = Callable[[vtkCommand.EventIds, Optional["VtkWidget"]], None] @@ -27,7 +26,7 @@ def wrapped_callback(*args, **kwargs): class VtkWidget: def __init__(self, w: vtkAbstractWidget): self._w = w - self._listeners: Dict[vtkCommand.EventIds, Dict[EventCallback, int]] = {} + self._listeners: dict[vtkCommand.EventIds, dict[EventCallback, int]] = {} @property def vtk_widget(self) -> vtkAbstractWidget: @@ -40,10 +39,9 @@ def vtk_representation(self) -> vtkWidgetRepresentation: def __getattr__(self, name: str): if hasattr(self.vtk_widget, name): return getattr(self.vtk_widget, name) - elif hasattr(self.vtk_representation, name): + if hasattr(self.vtk_representation, name): return getattr(self.vtk_representation, name) - else: - return super().__getattribute__(name) + return super().__getattribute__(name) def enable(self): self._w.On() @@ -110,8 +108,8 @@ def _to_snake_case(s: str) -> str: ) -WidgetParam = vtkAbstractWidget | Type[vtkAbstractWidget] -RepresentationParam = vtkWidgetRepresentation | Type[vtkWidgetRepresentation] +WidgetParam = vtkAbstractWidget | type[vtkAbstractWidget] +RepresentationParam = vtkWidgetRepresentation | type[vtkWidgetRepresentation] class WidgetManager: @@ -137,9 +135,8 @@ def add_widget( elif isinstance(r, vtkWidgetRepresentation): raw_representation = r elif r is not None: - raise TypeError( - "The r parameter should be one of: vtkWidgetRepresentation | Type[vtkWidgetRepresentation]" - ) + msg = "The r parameter should be one of: vtkWidgetRepresentation | Type[vtkWidgetRepresentation]" + raise TypeError(msg) if isinstance(w, type) and issubclass(w, vtkAbstractWidget): raw_widget = w() @@ -147,15 +144,12 @@ def add_widget( elif isinstance(w, vtkAbstractWidget): raw_widget = w else: - raise TypeError( - "The w parameter should be one of: vtkAbstractWidget | Type[vtkAbstractWidget]" - ) + msg = "The w parameter should be one of: vtkAbstractWidget | Type[vtkAbstractWidget]" + raise TypeError(msg) if raw_representation is not None: raw_widget.SetRepresentation(raw_representation) raw_widget.SetInteractor(self._interactor) - widget = VtkWidget(raw_widget) - - return widget + return VtkWidget(raw_widget) diff --git a/src/trame_vtk/tools/static_viewer.html b/src/trame_vtk/tools/static_viewer.html index 395d1d6..89af575 100644 --- a/src/trame_vtk/tools/static_viewer.html +++ b/src/trame_vtk/tools/static_viewer.html @@ -14,7 +14,4531 @@ - diff --git a/src/trame_vtk/tools/vtksz2html.py b/src/trame_vtk/tools/vtksz2html.py index 9dd83dc..cfcbc09 100644 --- a/src/trame_vtk/tools/vtksz2html.py +++ b/src/trame_vtk/tools/vtksz2html.py @@ -14,12 +14,12 @@ def data_to_base64(data: bytes): def write_html(data: bytes, output: TextIO): base64Content = data_to_base64(data) - with open(HTML_VIEWER_PATH, mode="r", encoding="utf-8") as srcHtml: + with Path.open(HTML_VIEWER_PATH, encoding="utf-8") as srcHtml: for line in srcHtml: if "" in line: output.write("\n") @@ -27,7 +27,7 @@ def write_html(data: bytes, output: TextIO): def embed_data_to_viewer_file(data: bytes, output_file: Path): - with open(output_file, mode="w", encoding="utf-8") as dstHtml: + with Path.open(output_file, mode="w", encoding="utf-8") as dstHtml: write_html(data, dstHtml) @@ -47,13 +47,14 @@ def main(): input_file = Path(args.input) if not input_file.exists(): - raise FileNotFoundError(f"Input file {input_file.name} not found.") + msg = f"Input file {input_file.name} not found." + raise FileNotFoundError(msg) input = Path(input_file) output = input.with_name(f"{input.name}.html") - with open(input, "rb") as data: - data = data.read() + with Path.open(input, "rb") as f: + data = f.read() embed_data_to_viewer_file(data, output) diff --git a/src/trame_vtk/widgets/vtk/__init__.py b/src/trame_vtk/widgets/vtk/__init__.py index 64ea421..b26dd11 100644 --- a/src/trame_vtk/widgets/vtk/__init__.py +++ b/src/trame_vtk/widgets/vtk/__init__.py @@ -1,37 +1,37 @@ from .common import ( - VtkView, - VtkRemoteView, - VtkLocalView, - VtkRemoteLocalView, VtkAlgorithm, VtkCellData, VtkDataArray, VtkFieldData, VtkGeometryRepresentation, VtkGlyphRepresentation, + VtkLocalView, VtkMesh, VtkPointData, VtkPolyData, VtkReader, + VtkRemoteLocalView, + VtkRemoteView, VtkShareDataset, + VtkView, VtkWebXRHelper, ) __all__ = [ - "VtkView", - "VtkRemoteView", - "VtkLocalView", - "VtkRemoteLocalView", "VtkAlgorithm", "VtkCellData", "VtkDataArray", "VtkFieldData", "VtkGeometryRepresentation", "VtkGlyphRepresentation", + "VtkLocalView", "VtkMesh", "VtkPointData", "VtkPolyData", "VtkReader", + "VtkRemoteLocalView", + "VtkRemoteView", "VtkShareDataset", + "VtkView", "VtkWebXRHelper", ] diff --git a/src/trame_vtk/widgets/vtk/common.py b/src/trame_vtk/widgets/vtk/common.py index a228eca..2967f97 100644 --- a/src/trame_vtk/widgets/vtk/common.py +++ b/src/trame_vtk/widgets/vtk/common.py @@ -5,11 +5,11 @@ from trame_client.widgets.core import AbstractElement -from trame_vtk.modules import common from trame_vtk import reference_id +from trame_vtk.modules import common try: - import zlib # noqa + import zlib # noqa: F401 ZIP_COMPRESSION = zipfile.ZIP_DEFLATED except ImportError: @@ -21,15 +21,14 @@ def activate_module_for(helper, server, vtk_or_paraview_obj): return helper if vtk_or_paraview_obj.IsA("vtkSMRemoteObject"): - from trame_vtk.modules import paraview + from trame_vtk.modules import paraview # noqa: PLC0415 server.enable_module(paraview) return paraview.get_helper(server) - else: - from trame_vtk.modules import vtk + from trame_vtk.modules import vtk # noqa: PLC0415 - server.enable_module(vtk) - return vtk.get_helper(server) + server.enable_module(vtk) + return vtk.get_helper(server) class HtmlElement(AbstractElement): @@ -369,7 +368,9 @@ class VtkRemoteLocalView(HtmlElement): _next_id = 0 - def __init__(self, view, enable_rendering=True, widgets=[], **kwargs): + def __init__(self, view, enable_rendering=True, widgets=None, **kwargs): + if widgets is None: + widgets = [] super().__init__("vtk-remote-local-view", **kwargs) self._helper = None self._helper = activate_module_for(self._helper, self.server, view) @@ -493,7 +494,7 @@ def push_remote_camera_on_end_interaction(self): self.__view.GetInteractor().AddObserver(45, self._push_camera) def update_geometry( - self, reset_camera=False, widgets=None, orientation_axis=0, **kwargs + self, _reset_camera=False, widgets=None, orientation_axis=0, **_kwargs ): """ Force update to geometry @@ -520,7 +521,9 @@ def update_geometry( ) self.server.state[self.__scene_id] = full_state - def export_geometry(self, widgets=None, orientation_axis=0, format="zip", **kwargs): + def export_geometry( + self, widgets=None, orientation_axis=0, format="zip", **_kwargs + ): """Export standalone scene for OfflineViewer :param format: Can be either be "zip" or "json". @@ -531,7 +534,7 @@ def export_geometry(self, widgets=None, orientation_axis=0, format="zip", **kwar widgets = self._widgets if not self.server.protocol: - return + return None encoded_data = self._helper.export( self.__view, @@ -550,6 +553,8 @@ def export_geometry(self, widgets=None, orientation_axis=0, format="zip", **kwar return zip_buffer.getvalue() + return None + def update_image(self, reset_camera=False): """ Force update to image @@ -557,13 +562,13 @@ def update_image(self, reset_camera=False): if self.server.protocol: self._helper.push_image(self.__view, reset_camera) - def set_local_rendering(self, local=True, **kwargs): + def set_local_rendering(self, local=True, **_kwargs): self.server.state[self.__mode_key] = "local" if local else "remote" - def set_remote_rendering(self, remote=True, **kwargs): + def set_remote_rendering(self, remote=True, **_kwargs): self.server.state[self.__mode_key] = "remote" if remote else "local" - def update(self, reset_camera=False, widgets=None, orientation_axis=0, **kwargs): + def update(self, reset_camera=False, widgets=None, orientation_axis=0, **_kwargs): # need to do both to keep things in sync if self.__rendering: self.update_image(reset_camera) @@ -580,10 +585,10 @@ def update(self, reset_camera=False, widgets=None, orientation_axis=0, **kwargs) self._helper.camera(self.__view), ) - def _push_camera(self, *args, **kwargs): + def _push_camera(self, *_args, **_kwargs): self.push_camera() - def push_camera(self, camera=None, center_of_rotation=None, **kwargs): + def push_camera(self, camera=None, center_of_rotation=None, **_kwargs): if camera is None: if hasattr(self.__view, "GetRenderers"): # VTK camera = self.__view.GetRenderers().GetFirstRenderer().GetActiveCamera() @@ -593,14 +598,14 @@ def push_camera(self, camera=None, center_of_rotation=None, **kwargs): if camera is None: return - camera_params = dict( - position=camera.GetPosition(), - focalPoint=camera.GetFocalPoint(), - viewUp=camera.GetViewUp(), - parallelProjection=camera.GetParallelProjection(), - parallelScale=camera.GetParallelScale(), - viewAngle=camera.GetViewAngle(), - ) + camera_params = { + "position": camera.GetPosition(), + "focalPoint": camera.GetFocalPoint(), + "viewUp": camera.GetViewUp(), + "parallelProjection": camera.GetParallelProjection(), + "parallelScale": camera.GetParallelScale(), + "viewAngle": camera.GetViewAngle(), + } if center_of_rotation is not None: camera_params["centerOfRotation"] = center_of_rotation @@ -611,7 +616,7 @@ def push_camera(self, camera=None, center_of_rotation=None, **kwargs): camera_params, ) - def replace_view(self, new_view, **kwargs): + def replace_view(self, new_view, **_kwargs): self.server.state[self.__view_key_id] = self._helper.id(new_view) _mode = self.server.state[self.__mode_key] self.__view = new_view @@ -621,10 +626,10 @@ def replace_view(self, new_view, **kwargs): self.update() self.resize() - def reset_camera(self, **kwargs): + def reset_camera(self, **_kwargs): self.server.js_call(ref=self.__ref, method="resetCamera") - def resize(self, **kwargs): + def resize(self, **_kwargs): self.server.js_call(ref=self.__ref, method="resize") @property @@ -634,7 +639,9 @@ def view(self): """ return self.__wrapped_view - def capture_image(self, format="image/png", opts={}): + def capture_image(self, format="image/png", opts=None): + if opts is None: + opts = {} self.server.js_call( self.__ref, "captureImage", @@ -755,7 +762,7 @@ def __init__(self, view, ref=None, **kwargs): "EndInteraction", ] - def update(self, **kwargs): + def update(self, **_kwargs): """ Force image to be pushed to client """ @@ -785,19 +792,21 @@ def stop_animation(self): self._helper.stop_animation(self.__view) self.update() - def reset_camera(self, **kwargs): + def reset_camera(self, **_kwargs): self.server.js_call(ref=self.__ref, method="resetCamera") - def replace_view(self, new_view, **kwargs): + def replace_view(self, new_view, **_kwargs): self.__view = new_view self.server.state[self.__view_key_id] = self._helper.id(new_view) self.update() self.resize() - def resize(self, **kwargs): + def resize(self, **_kwargs): self.server.js_call(ref=self.__ref, method="resize") - def capture_image(self, format="image/png", opts={}): + def capture_image(self, format="image/png", opts=None): + if opts is None: + opts = {} self.server.js_call( self.__ref, "captureImage", @@ -856,7 +865,9 @@ class VtkLocalView(HtmlElement): _next_id = 0 - def __init__(self, view, ref=None, widgets=[], **kwargs): + def __init__(self, view, ref=None, widgets=None, **kwargs): + if widgets is None: + widgets = [] super().__init__("vtk-local-view", **kwargs) self._helper = activate_module_for(None, self.server, view) self._helper.has_capabilities("web") @@ -938,7 +949,7 @@ def set_widgets(self, value): self._widgets = value self.update() - def update(self, widgets=None, orientation_axis=0, **kwargs): + def update(self, widgets=None, orientation_axis=0, **_kwargs): """ Force geometry to be pushed """ @@ -964,7 +975,7 @@ def update(self, widgets=None, orientation_axis=0, **kwargs): ) self.server.state[self.__scene_id] = full_state - def export(self, widgets=None, orientation_axis=0, format="zip", **kwargs): + def export(self, widgets=None, orientation_axis=0, format="zip", **_kwargs): """Export standalone scene for OfflineViewer :param format: Can be either be "zip" or "json". @@ -975,7 +986,7 @@ def export(self, widgets=None, orientation_axis=0, format="zip", **kwargs): widgets = self._widgets if not self.server.protocol: - return + return None encoded_data = self._helper.export( self.__view, @@ -994,23 +1005,25 @@ def export(self, widgets=None, orientation_axis=0, format="zip", **kwargs): return zip_buffer.getvalue() - def reset_camera(self, **kwargs): + return None + + def reset_camera(self, **_kwargs): """ Move camera to center actors within the frame """ self.server.js_call(ref=self.__ref, method="resetCamera") - def replace_view(self, new_view, **kwargs): + def replace_view(self, new_view, **_kwargs): self.__view = new_view self.server.js_call( self.__ref, "setSynchronizedViewId", self._helper.id(new_view) ) self.update() - def resize(self, **kwargs): + def resize(self, **_kwargs): self.server.js_call(ref=self.__ref, method="resize") - def push_camera(self, camera=None, center_of_rotation=None, **kwargs): + def push_camera(self, camera=None, center_of_rotation=None, **_kwargs): if camera is None: if hasattr(self.__view, "GetRenderers"): # VTK camera = self.__view.GetRenderers().GetFirstRenderer().GetActiveCamera() @@ -1020,14 +1033,14 @@ def push_camera(self, camera=None, center_of_rotation=None, **kwargs): if camera is None: return - camera_params = dict( - position=camera.GetPosition(), - focalPoint=camera.GetFocalPoint(), - viewUp=camera.GetViewUp(), - parallelProjection=camera.GetParallelProjection(), - parallelScale=camera.GetParallelScale(), - viewAngle=camera.GetViewAngle(), - ) + camera_params = { + "position": camera.GetPosition(), + "focalPoint": camera.GetFocalPoint(), + "viewUp": camera.GetViewUp(), + "parallelProjection": camera.GetParallelProjection(), + "parallelScale": camera.GetParallelScale(), + "viewAngle": camera.GetViewAngle(), + } if center_of_rotation is not None: camera_params["centerOfRotation"] = center_of_rotation @@ -1038,7 +1051,9 @@ def push_camera(self, camera=None, center_of_rotation=None, **kwargs): camera_params, ) - def capture_image(self, format="image/png", opts={}): + def capture_image(self, format="image/png", opts=None): + if opts is None: + opts = {} self.server.js_call( self.__ref, "captureImage", @@ -1122,7 +1137,7 @@ def __init__(self, children=None, ref=None, **kwargs): "EndInteraction", ] - def reset_camera(self, **kwargs): + def reset_camera(self, **_): """ Move camera to center actors within the frame """ diff --git a/tests/conftest.py b/tests/conftest.py index b74bfa9..61c7b43 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,6 @@ -import pytest from pathlib import Path + +import pytest from trame_client.utils.testing import FixtureHelper ROOT_PATH = Path(__file__).parent.parent.absolute() diff --git a/tests/refs/test_rendering_volume/ref2.png b/tests/refs/test_rendering_volume/ref2.png index bf526f4..0311139 100644 Binary files a/tests/refs/test_rendering_volume/ref2.png and b/tests/refs/test_rendering_volume/ref2.png differ diff --git a/tests/requirements.txt b/tests/requirements.txt index b43f121..b8ae6a2 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,8 +1,8 @@ coverage pytest-asyncio pytest-playwright -pyvista[all]==0.45.2 +pyvista[all]==0.47.3 trame trame-client[test] trame-vuetify -vtk==9.4.2 +vtk==9.6.1 diff --git a/tests/test_big_int.py b/tests/test_big_int.py index f583dfc..e4fdd4b 100644 --- a/tests/test_big_int.py +++ b/tests/test_big_int.py @@ -1,9 +1,8 @@ -from pathlib import Path import time +from pathlib import Path -from playwright.sync_api import expect, sync_playwright import pytest - +from playwright.sync_api import expect, sync_playwright from trame_client.utils.testing import ( assert_screenshot_matches, assert_snapshot_matches, diff --git a/tests/test_export.py b/tests/test_export.py index fbc1f78..7d74ecc 100644 --- a/tests/test_export.py +++ b/tests/test_export.py @@ -1,6 +1,7 @@ +import asyncio from pathlib import Path + import pytest -import asyncio import pyvista as pv from pyvista import examples diff --git a/tests/test_gc.py b/tests/test_gc.py index 4de0567..0ee57c7 100644 --- a/tests/test_gc.py +++ b/tests/test_gc.py @@ -3,8 +3,8 @@ import pytest import pyvista as pv - from trame.app import get_server + from trame.widgets import vtk as vtk_widgets # pytest_plugins = ('pytest_asyncio',) diff --git a/tests/test_import.py b/tests/test_import.py index 73683d9..2832b32 100644 --- a/tests/test_import.py +++ b/tests/test_import.py @@ -1,2 +1,2 @@ def test_import(): - from trame.widgets.vtk import VtkAlgorithm # noqa: F401 + from trame.widgets.vtk import VtkAlgorithm # noqa: PLC0415, F401 diff --git a/tests/test_remote_rendering.py b/tests/test_remote_rendering.py index bfc2f04..49a8702 100644 --- a/tests/test_remote_rendering.py +++ b/tests/test_remote_rendering.py @@ -1,9 +1,8 @@ -from pathlib import Path import time +from pathlib import Path -from playwright.sync_api import expect, sync_playwright import pytest - +from playwright.sync_api import expect, sync_playwright from trame_client.utils.testing import ( assert_screenshot_matches, assert_snapshot_matches, diff --git a/tests/test_volume_rendering.py b/tests/test_volume_rendering.py index 05fa10a..1c77568 100644 --- a/tests/test_volume_rendering.py +++ b/tests/test_volume_rendering.py @@ -1,9 +1,8 @@ -from pathlib import Path import time +from pathlib import Path -from playwright.sync_api import expect, sync_playwright import pytest - +from playwright.sync_api import expect, sync_playwright from trame_client.utils.testing import ( assert_screenshot_matches, assert_snapshot_matches, diff --git a/trame-vtk.jpg b/trame-vtk.jpg new file mode 100644 index 0000000..5e18216 Binary files /dev/null and b/trame-vtk.jpg differ