File: 269.py

package info (click to toggle)
python-trame 3.12.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 101,620 kB
  • sloc: python: 13,515; sh: 183; javascript: 93; makefile: 7
file content (83 lines) | stat: -rw-r--r-- 2,565 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import vtkmodules.vtkRenderingOpenGL2  # noqa
from vtkmodules.vtkFiltersSources import vtkConeSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderer,
    vtkRenderWindow,
)

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

USING_WITH = True
server = get_server(client_type="vue2")
ctrl = server.controller


class Cone:
    def __init__(self, server, name):
        self.server = server
        self.name = name

        self.rw = vtkRenderWindow()
        renderer = vtkRenderer()
        self.rw.AddRenderer(renderer)
        cone_source = vtkConeSource()
        mapper = vtkPolyDataMapper()
        mapper.SetInputConnection(cone_source.GetOutputPort())
        actor = vtkActor()
        actor.SetMapper(mapper)
        renderer.AddActor(actor)
        renderer.ResetCamera()

        self.ui()

    @property
    def state(self):
        return self.server.state

    @property
    def ctrl(self):
        return self.server.controller

    def ui(self, **kwargs):
        with vtk_widgets.VtkLocalView(self.rw, ref=f"view_{self.name}") as view:
            html.Div(
                self.name,
                style="position: absolute; left: 10px; top: 10px; z-index: 100; color: white;",
            )
            self.ctrl.view_update = view.update
            self.ctrl.view_reset_camera = view.reset_camera


# ---------------------------------------------------------
# Main UI
# ---------------------------------------------------------

with SinglePageLayout(server) as layout:
    with layout.toolbar:
        layout.title.set_text("Active Tab: {{ active_tab }}")
        layout.title.style = "min-width: 200px;"
        vuetify.VSpacer()
        with vuetify.VTabs(v_model=("active_tab", 0), right=True):
            for i in range(5):
                vuetify.VTab(f"Cone {i + 1}")

    with layout.content:
        with vuetify.VContainer(classes="fill-height", fluid=True):
            with vuetify.VTabsItems(
                value=("active_tab",), style="width: 100%; height: 100%;"
            ):
                for i in range(5):
                    with vuetify.VTabItem(
                        value=(i,), style="width: 100%; height: 100%;"
                    ):
                        # html.Div(f"Instance {i + 1}", style="background: red; width: 100%; height: 100%;")
                        Cone(server, f"cone_{i + 1}")


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