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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
r"""
Installation requirements:
pip install trame trame-vuetify trame-vtk
"""
import vtkmodules.vtkRenderingOpenGL2 # noqa
from vtkContourGeneratorFromZarr import vtkContourGeneratorFromZarr
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderer,
vtkRenderWindow,
vtkRenderWindowInteractor,
)
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
# -----------------------------------------------------------------------------
# Trame setup
# -----------------------------------------------------------------------------
server = get_server(client_type="vue2")
state, ctrl = server.state, server.controller
# -----------------------------------------------------------------------------
# set up class to process zarr
# -----------------------------------------------------------------------------
DEFAULT_LEVEL = 3
server.cli.add_argument("--data", help="directory to zarr files", dest="data")
args = server.cli.parse_args()
skin_generator = vtkContourGeneratorFromZarr(args.data)
skin_generator.contourForLevel(DEFAULT_LEVEL)
MAX_LEVEL = skin_generator.getMaxLevel()
# -----------------------------------------------------------------------------
# VTK pipeline
# -----------------------------------------------------------------------------
renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindowInteractor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(skin_generator.getContour().GetOutputPort())
actor = vtkActor()
actor.SetMapper(mapper)
renderer.AddActor(actor)
renderer.ResetCamera()
renderWindow.Render()
# -----------------------------------------------------------------------------
# Callbacks
# -----------------------------------------------------------------------------
state.points = 0
state.cells = 0
state.level = DEFAULT_LEVEL
@state.change("level")
def update_skin(level=DEFAULT_LEVEL, **kwargs):
nb_points, nb_cells = skin_generator.contourForLevel(level)
state.points = nb_points
state.cells = nb_cells
ctrl.view_update()
def update_reset_level():
state.level = DEFAULT_LEVEL
def increase_level():
if state.level < MAX_LEVEL:
state.level += 1
def decrease_level():
if 1 < state.level:
state.level -= 1
# -----------------------------------------------------------------------------
# GUI
# -----------------------------------------------------------------------------
state.trame__title = "Zarr Skin Generator Demo"
with SinglePageLayout(server) as layout:
layout.icon.click = "$refs.view.resetCamera()"
layout.title.set_text("Skin Generator")
with layout.toolbar:
vuetify.VSpacer()
vuetify.VBtn(
vuetify.VIcon("mdi-minus"),
x_small=True,
icon=True,
outlined=True,
click=decrease_level,
classes="mx-2",
)
vuetify.VBtn(
vuetify.VIcon("mdi-plus"),
x_small=True,
icon=True,
outlined=True,
click=increase_level,
classes="mx-2",
)
html.Div(
"Level({{ level }}) "
"- Points({{parseInt( points ).toLocaleString()}}) "
"- Cells({{parseInt( cells ).toLocaleString()}})",
style="min-width: 350px; text-align: right;",
)
vuetify.VDivider(vertical=True, classes="mx-2")
vuetify.VBtn(
icon=True,
click=update_reset_level,
children=[vuetify.VIcon("mdi-undo-variant")],
)
with layout.content:
with vuetify.VContainer(
fluid=True,
classes="pa-0 fill-height",
):
html_view = vtk_widgets.VtkRemoteView(renderWindow, ref="view")
ctrl.view_update = html_view.update
ctrl.view_reset_camera = html_view.reset_camera
# -----------------------------------------------------------------------------
# Main
# -----------------------------------------------------------------------------
if __name__ == "__main__":
server.start()
|