Skip to content

Commit d9e0f70

Browse files
committed
docs(examples): add more examples
1 parent b4275ca commit d9e0f70

File tree

2 files changed

+195
-0
lines changed

2 files changed

+195
-0
lines changed

examples/validation/issues/101.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# /// script
2+
# requires-python = ">=3.10"
3+
# dependencies = [
4+
# "trame",
5+
# "trame-vtklocal",
6+
# "trame-vtk",
7+
# "trame-vuetify",
8+
# "vtk>=9.6",
9+
# ]
10+
# ///
11+
12+
# Required for rendering initialization, not necessary for
13+
# local rendering, but doesn't hurt to include it
14+
import vtkmodules.vtkRenderingOpenGL2 # noqa
15+
from vtkmodules.vtkCommonColor import vtkNamedColors
16+
17+
# Required for interactor initialization
18+
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa
19+
from vtkmodules.vtkInteractionWidgets import vtkScalarBarWidget
20+
from vtkmodules.vtkRenderingAnnotation import vtkScalarBarActor
21+
from vtkmodules.vtkRenderingCore import (
22+
vtkColorTransferFunction,
23+
vtkRenderer,
24+
vtkRenderWindow,
25+
vtkRenderWindowInteractor,
26+
)
27+
28+
from trame.app import TrameApp
29+
from trame.ui.vuetify3 import VAppLayout
30+
from trame.widgets import vtklocal, vtk
31+
32+
33+
class App(TrameApp):
34+
def __init__(self, server=None, widget=True):
35+
super().__init__(server)
36+
37+
self.server.cli.add_argument("--no-widget", action="store_true")
38+
self.server.cli.add_argument("--wasm", action="store_true")
39+
args, _ = self.server.cli.parse_known_args()
40+
if args.no_widget:
41+
widget = False
42+
43+
self._setup_vtk(widget)
44+
self._build_ui(args.wasm)
45+
46+
def _setup_vtk(self, has_widget):
47+
renderer = vtkRenderer()
48+
renderWindow = vtkRenderWindow()
49+
renderWindow.AddRenderer(renderer)
50+
51+
renderWindowInteractor = vtkRenderWindowInteractor()
52+
renderWindowInteractor.SetRenderWindow(renderWindow)
53+
renderWindowInteractor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()
54+
55+
# Create lut
56+
colormin = vtkNamedColors().GetColor3d("blue")
57+
colormax = vtkNamedColors().GetColor3d("red")
58+
color = vtkColorTransferFunction()
59+
color.AddRGBPoint(0.0, *colormin)
60+
color.AddRGBPoint(1.0, *colormax)
61+
62+
# Create a scalar bar
63+
scalarBar = vtkScalarBarActor()
64+
scalarBar.SetTitle("Scalar Bar")
65+
scalarBar.SetNumberOfLabels(4)
66+
scalarBar.SetLookupTable(color)
67+
scalarBar.SetPosition(0.5, 0.5)
68+
69+
self.render_window = renderWindow
70+
self.widget = None
71+
72+
if has_widget:
73+
# create the scalar_bar_widget
74+
scalar_bar_widget = vtkScalarBarWidget()
75+
scalar_bar_widget.SetInteractor(renderWindowInteractor)
76+
scalar_bar_widget.SetScalarBarActor(scalarBar)
77+
scalar_bar_widget.On()
78+
self.widget = scalar_bar_widget
79+
else:
80+
renderer.AddActor2D(scalarBar)
81+
82+
def _build_ui(self, use_wasm):
83+
print(f"{use_wasm=}")
84+
with VAppLayout(self.server, full_height=True) as self.ui:
85+
if use_wasm:
86+
vtklocal.LocalView(self.render_window, ctx_name="view")
87+
if self.widget:
88+
self.ctx.view.register_vtk_object(self.widget)
89+
else:
90+
vtk.VtkRemoteView(
91+
self.render_window,
92+
ctx_name="view",
93+
interactive_ratio=1,
94+
)
95+
96+
97+
# -----------------------------------------------------------------------------
98+
# Main
99+
# -----------------------------------------------------------------------------
100+
101+
if __name__ == "__main__":
102+
app = App()
103+
app.server.start()

examples/validation/perf/lag.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import asyncio
2+
import time
3+
4+
import numpy as np
5+
import pandas as pd
6+
import plotly.express as px
7+
8+
from trame.app import TrameApp
9+
from trame.decorators import change
10+
from trame.ui.html import DivLayout
11+
from trame.widgets import client, html, plotly
12+
13+
14+
def now():
15+
return time.perf_counter()
16+
17+
18+
class LagApp(TrameApp):
19+
def __init__(self, server=None, buffer_size=100):
20+
super().__init__(server)
21+
self.index = 0
22+
self.buffer_size = buffer_size
23+
self.state.dt_array = [0 for _ in range(buffer_size)]
24+
25+
self.np_array = np.zeros((buffer_size,), dtype=np.uint8)
26+
27+
self.pending_tasks = set()
28+
self._build_ui()
29+
30+
def _build_ui(self):
31+
self.state.setdefault("animate", False)
32+
self.state.setdefault("timestamp", 0)
33+
self.state.setdefault("ct", 0)
34+
self.state.setdefault("max_dt", 0)
35+
self.state.setdefault("avg_dt", 0)
36+
37+
with DivLayout(self.server) as self.ui:
38+
client.ClientStateChange(value="timestamp", change="ct = $event")
39+
html.Button("Toggle animation", click="animate = !animate")
40+
html.Input(
41+
type="range",
42+
min=5,
43+
step=1,
44+
max=100,
45+
v_model_number=("wait_ms", 100),
46+
)
47+
html.Div(
48+
"{{ wait_ms }}ms - {{ (1000/wait_ms).toFixed(0) }} fps - {{ avg_dt }} / {{ max_dt }}"
49+
)
50+
# html.Div("{{ dt_array }}")
51+
# html.Div("{{ avg_dt }} / {{ max_dt }}")
52+
plotly.Figure(ctx_name="fig")
53+
54+
@change("animate")
55+
def animate(self, animate, **_):
56+
if animate:
57+
task = asyncio.create_task(self._animate())
58+
self.pending_tasks.add(task)
59+
task.add_done_callback(self.pending_tasks.discard)
60+
61+
@change("ct")
62+
def _on_client_time(self, ct, **_):
63+
st = now()
64+
dt = st - ct
65+
self.np_array[self.index] = min(255, round(1000 * dt))
66+
self.state.dt_array = self.np_array.tolist()
67+
self.state.max_dt = int(self.np_array.max())
68+
self.state.avg_dt = int(round(int(self.np_array.sum()) / self.buffer_size))
69+
70+
fig = px.violin(pd.DataFrame(self.np_array, columns=["dt"]), y="dt")
71+
fig.update_yaxes(range=[0, 20])
72+
self.ctx.fig.update(fig)
73+
74+
if self.index < self.buffer_size - 1:
75+
self.index += 1
76+
else:
77+
self.index = 0
78+
79+
async def _animate(self):
80+
while self.state.animate:
81+
await asyncio.sleep(self.state.wait_ms / 1000)
82+
with self.state as s:
83+
s.timestamp = now()
84+
85+
86+
def main():
87+
app = LagApp()
88+
app.server.start()
89+
90+
91+
if __name__ == "__main__":
92+
main()

0 commit comments

Comments
 (0)