Skip to content

Commit 540276c

Browse files
committed
tutorial material
0 parents  commit 540276c

21 files changed

Lines changed: 6852 additions & 0 deletions

00_setup/app.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from trame.layouts import SinglePage
2+
3+
# -----------------------------------------------------------------------------
4+
# GUI
5+
# -----------------------------------------------------------------------------
6+
7+
layout = SinglePage("Hello trame")
8+
layout.title.set_text("Hello trame")
9+
10+
# -----------------------------------------------------------------------------
11+
# Main
12+
# -----------------------------------------------------------------------------
13+
14+
if __name__ == "__main__":
15+
layout.start()

00_setup/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
vtk>=9.1.0
2+
trame

01_vtk/CarotidFlow.py

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
import os
2+
from trame.layouts import SinglePage
3+
from trame.html import vtk, vuetify
4+
5+
from vtkmodules.vtkCommonColor import vtkNamedColors
6+
from vtkmodules.vtkCommonCore import vtkLookupTable
7+
from vtkmodules.vtkFiltersCore import (
8+
vtkContourFilter,
9+
vtkGlyph3D,
10+
vtkMaskPoints,
11+
vtkThresholdPoints,
12+
)
13+
from vtkmodules.vtkFiltersModeling import vtkOutlineFilter
14+
from vtkmodules.vtkFiltersSources import vtkConeSource
15+
from vtkmodules.vtkIOLegacy import vtkStructuredPointsReader
16+
from vtkmodules.vtkRenderingCore import (
17+
vtkActor,
18+
vtkPolyDataMapper,
19+
vtkRenderer,
20+
vtkRenderWindow,
21+
vtkRenderWindowInteractor,
22+
)
23+
24+
# Required for interacter factory initialization
25+
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa
26+
27+
# Required for remote rendering factory initialization, not necessary for
28+
# local rendering, but doesn't hurt to include it
29+
import vtkmodules.vtkRenderingOpenGL2 # noqa
30+
31+
CURRENT_DIRECTORY = os.path.abspath(os.path.dirname(__file__))
32+
33+
# -----------------------------------------------------------------------------
34+
# VTK pipeline
35+
# -----------------------------------------------------------------------------
36+
37+
renderer = vtkRenderer()
38+
renderWindow = vtkRenderWindow()
39+
renderWindow.AddRenderer(renderer)
40+
41+
renderWindowInteractor = vtkRenderWindowInteractor()
42+
renderWindowInteractor.SetRenderWindow(renderWindow)
43+
renderWindowInteractor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()
44+
45+
# Read the data
46+
47+
reader = vtkStructuredPointsReader()
48+
reader.SetFileName(os.path.join(CURRENT_DIRECTORY, "../data/carotid.vtk"))
49+
50+
# Glyphs
51+
52+
threshold = vtkThresholdPoints()
53+
threshold.SetInputConnection(reader.GetOutputPort())
54+
threshold.ThresholdByUpper(200)
55+
56+
mask = vtkMaskPoints()
57+
mask.SetInputConnection(threshold.GetOutputPort())
58+
mask.SetOnRatio(5)
59+
60+
cone = vtkConeSource()
61+
cone.SetResolution(11)
62+
cone.SetHeight(1)
63+
cone.SetRadius(0.25)
64+
65+
cones = vtkGlyph3D()
66+
cones.SetInputConnection(mask.GetOutputPort())
67+
cones.SetSourceConnection(cone.GetOutputPort())
68+
cones.SetScaleFactor(0.4)
69+
cones.SetScaleModeToScaleByVector()
70+
71+
lut = vtkLookupTable()
72+
lut.SetHueRange(0.667, 0.0)
73+
lut.Build()
74+
75+
scalarRange = [0] * 2
76+
cones.Update()
77+
scalarRange[0] = cones.GetOutput().GetPointData().GetScalars().GetRange()[0]
78+
scalarRange[1] = cones.GetOutput().GetPointData().GetScalars().GetRange()[1]
79+
80+
vectorMapper = vtkPolyDataMapper()
81+
vectorMapper.SetInputConnection(cones.GetOutputPort())
82+
vectorMapper.SetScalarRange(scalarRange[0], scalarRange[1])
83+
vectorMapper.SetLookupTable(lut)
84+
85+
vectorActor = vtkActor()
86+
vectorActor.SetMapper(vectorMapper)
87+
88+
# Contours
89+
90+
iso = vtkContourFilter()
91+
iso.SetInputConnection(reader.GetOutputPort())
92+
iso.SetValue(0, 175)
93+
94+
isoMapper = vtkPolyDataMapper()
95+
isoMapper.SetInputConnection(iso.GetOutputPort())
96+
isoMapper.ScalarVisibilityOff()
97+
98+
isoActor = vtkActor()
99+
isoActor.SetMapper(isoMapper)
100+
isoActor.GetProperty().SetRepresentationToWireframe()
101+
isoActor.GetProperty().SetOpacity(0.25)
102+
103+
# Outline
104+
105+
colors = vtkNamedColors()
106+
107+
outline = vtkOutlineFilter()
108+
outline.SetInputConnection(reader.GetOutputPort())
109+
110+
outlineMapper = vtkPolyDataMapper()
111+
outlineMapper.SetInputConnection(outline.GetOutputPort())
112+
113+
outlineActor = vtkActor()
114+
outlineActor.SetMapper(outlineMapper)
115+
outlineActor.GetProperty().SetColor(colors.GetColor3d("White"))
116+
117+
# Add the actors to the renderer
118+
119+
renderer.AddActor(outlineActor)
120+
renderer.AddActor(vectorActor)
121+
renderer.AddActor(isoActor)
122+
renderer.ResetCamera()
123+
renderWindow.Render()
124+
125+
# -----------------------------------------------------------------------------
126+
# Functions
127+
# -----------------------------------------------------------------------------
128+
129+
130+
def update_view(**kwargs):
131+
html_view.update()
132+
133+
134+
# -----------------------------------------------------------------------------
135+
# GUI
136+
# -----------------------------------------------------------------------------
137+
138+
layout = SinglePage("Hello trame", on_ready=update_view)
139+
layout.title.set_text("Hello trame")
140+
141+
html_view = vtk.VtkLocalView(renderWindow)
142+
143+
layout.content.children += [
144+
vuetify.VContainer(
145+
fluid=True,
146+
classes="pa-0 fill-height",
147+
children=[html_view],
148+
)
149+
]
150+
151+
# -----------------------------------------------------------------------------
152+
# Main
153+
# -----------------------------------------------------------------------------
154+
155+
if __name__ == "__main__":
156+
layout.start()

01_vtk/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# VTK Tutorial
2+
3+
You can learn to build these applications in the tutorial [here](https://kitware.github.io/trame/docs/tutorial.html).
4+
5+
<p style="float: left;">
6+
<img src="../../../docs/content/examples/SimpleRayCast.jpg" width="400">
7+
<img src="../../../docs/content/examples/CarotidFlow.jpg" width="400">
8+
</p>
9+
10+

01_vtk/SimpleRayCast.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#!/usr/bin/env python
2+
3+
# Web imports
4+
import os
5+
from trame.layouts import SinglePage
6+
from trame.html import vtk, vuetify
7+
8+
# -----------------------------------------------------------------------------
9+
# Example: SimpleRayCast
10+
# taken from: https://kitware.github.io/vtk-examples/site/Python/
11+
# -----------------------------------------------------------------------------
12+
13+
# noinspection PyUnresolvedReferences
14+
import vtkmodules.vtkInteractionStyle
15+
from vtkmodules.vtkCommonColor import vtkNamedColors
16+
from vtkmodules.vtkCommonDataModel import vtkPiecewiseFunction
17+
from vtkmodules.vtkIOLegacy import vtkStructuredPointsReader
18+
from vtkmodules.vtkRenderingCore import (
19+
vtkColorTransferFunction,
20+
vtkRenderWindow,
21+
vtkRenderWindowInteractor,
22+
vtkRenderer,
23+
vtkVolume,
24+
vtkVolumeProperty,
25+
)
26+
from vtkmodules.vtkRenderingVolume import vtkFixedPointVolumeRayCastMapper
27+
28+
# noinspection PyUnresolvedReferences
29+
from vtkmodules.vtkRenderingVolumeOpenGL2 import vtkOpenGLRayCastImageDisplayHelper
30+
31+
32+
CURRENT_DIRECTORY = os.path.abspath(os.path.dirname(__file__))
33+
34+
# -----------------------------------------------------------------------------
35+
# VTK pipeline
36+
# -----------------------------------------------------------------------------
37+
38+
colors = vtkNamedColors()
39+
40+
# This is a simple volume rendering example that
41+
# uses a vtkFixedPointVolumeRayCastMapper
42+
43+
# Create the standard renderer, render window
44+
# and interactor.
45+
ren1 = vtkRenderer()
46+
47+
renWin = vtkRenderWindow()
48+
renWin.AddRenderer(ren1)
49+
50+
iren = vtkRenderWindowInteractor()
51+
iren.SetRenderWindow(renWin)
52+
iren.GetInteractorStyle().SetCurrentStyleToTrackballCamera() # +++
53+
54+
# Create the reader for the data.
55+
reader = vtkStructuredPointsReader()
56+
reader.SetFileName(os.path.join(CURRENT_DIRECTORY, "../data/ironProt.vtk"))
57+
58+
# Create transfer mapping scalar value to opacity.
59+
opacityTransferFunction = vtkPiecewiseFunction()
60+
opacityTransferFunction.AddPoint(20, 0.0)
61+
opacityTransferFunction.AddPoint(255, 0.2)
62+
63+
# Create transfer mapping scalar value to color.
64+
colorTransferFunction = vtkColorTransferFunction()
65+
colorTransferFunction.AddRGBPoint(0.0, 0.0, 0.0, 0.0)
66+
colorTransferFunction.AddRGBPoint(64.0, 1.0, 0.0, 0.0)
67+
colorTransferFunction.AddRGBPoint(128.0, 0.0, 0.0, 1.0)
68+
colorTransferFunction.AddRGBPoint(192.0, 0.0, 1.0, 0.0)
69+
colorTransferFunction.AddRGBPoint(255.0, 0.0, 0.2, 0.0)
70+
71+
# The property describes how the data will look.
72+
volumeProperty = vtkVolumeProperty()
73+
volumeProperty.SetColor(colorTransferFunction)
74+
volumeProperty.SetScalarOpacity(opacityTransferFunction)
75+
volumeProperty.ShadeOn()
76+
volumeProperty.SetInterpolationTypeToLinear()
77+
78+
# The mapper / ray cast function know how to render the data.
79+
volumeMapper = vtkFixedPointVolumeRayCastMapper()
80+
volumeMapper.SetInputConnection(reader.GetOutputPort())
81+
82+
# The volume holds the mapper and the property and
83+
# can be used to position/orient the volume.
84+
volume = vtkVolume()
85+
volume.SetMapper(volumeMapper)
86+
volume.SetProperty(volumeProperty)
87+
88+
ren1.AddVolume(volume)
89+
ren1.SetBackground(colors.GetColor3d("Wheat"))
90+
ren1.GetActiveCamera().Azimuth(45)
91+
ren1.GetActiveCamera().Elevation(30)
92+
ren1.ResetCameraClippingRange()
93+
ren1.ResetCamera()
94+
95+
# -----------------------------------------------------------------------------
96+
# Web Application setup
97+
# -----------------------------------------------------------------------------
98+
99+
layout = SinglePage("Hello trame")
100+
layout.title.set_text("Hello trame")
101+
102+
# html_view = vtk.VtkRemoteView(renWin)
103+
html_view = vtk.VtkLocalView(renWin)
104+
105+
layout.content.children += [
106+
vuetify.VContainer(
107+
fluid=True,
108+
classes="pa-0 fill-height",
109+
children=[html_view],
110+
)
111+
]
112+
113+
layout.on_ready = html_view.update
114+
115+
if __name__ == "__main__":
116+
layout.start()

01_vtk/app.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from trame.layouts import SinglePage
2+
from trame.html import vtk, vuetify
3+
4+
from vtkmodules.vtkFiltersSources import vtkConeSource
5+
from vtkmodules.vtkRenderingCore import (
6+
vtkActor,
7+
vtkPolyDataMapper,
8+
vtkRenderer,
9+
vtkRenderWindow,
10+
vtkRenderWindowInteractor,
11+
)
12+
13+
# Required for interacter factory initialization
14+
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa
15+
16+
# Required for remote rendering factory initialization, not necessary for
17+
# local rendering, but doesn't hurt to include it
18+
19+
import vtkmodules.vtkRenderingOpenGL2 # noqa
20+
21+
22+
# -----------------------------------------------------------------------------
23+
# VTK pipeline
24+
# -----------------------------------------------------------------------------
25+
26+
renderer = vtkRenderer()
27+
renderWindow = vtkRenderWindow()
28+
renderWindow.AddRenderer(renderer)
29+
30+
renderWindowInteractor = vtkRenderWindowInteractor()
31+
renderWindowInteractor.SetRenderWindow(renderWindow)
32+
renderWindowInteractor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()
33+
34+
cone_source = vtkConeSource()
35+
mapper = vtkPolyDataMapper()
36+
mapper.SetInputConnection(cone_source.GetOutputPort())
37+
actor = vtkActor()
38+
actor.SetMapper(mapper)
39+
40+
renderer.AddActor(actor)
41+
renderer.ResetCamera()
42+
43+
# -----------------------------------------------------------------------------
44+
# Functions
45+
# -----------------------------------------------------------------------------
46+
47+
48+
def update_view(**kwargs):
49+
html_view.update()
50+
51+
52+
# -----------------------------------------------------------------------------
53+
# GUI
54+
# -----------------------------------------------------------------------------
55+
56+
layout = SinglePage("Hello trame", on_ready=update_view)
57+
layout.title.set_text("Hello trame")
58+
59+
html_view = vtk.VtkLocalView(renderWindow)
60+
61+
layout.content.children += [
62+
vuetify.VContainer(
63+
fluid=True,
64+
classes="pa-0 fill-height",
65+
children=[html_view],
66+
)
67+
]
68+
69+
# -----------------------------------------------------------------------------
70+
# Main
71+
# -----------------------------------------------------------------------------
72+
73+
if __name__ == "__main__":
74+
layout.start()

0 commit comments

Comments
 (0)