Skip to content

Commit 60cda60

Browse files
committed
Improve code style
1 parent 7df72b2 commit 60cda60

File tree

5 files changed

+158
-136
lines changed

5 files changed

+158
-136
lines changed

demos/slice-rendering/app.py

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,15 @@
22
import random
33

44
import dash
5-
import dash_vtk
65
import dash_bootstrap_components as dbc
76
import dash_html_components as html
87
import dash_core_components as dcc
98
from dash.dependencies import Input, Output, State
109

10+
import dash_vtk
11+
from dash_vtk.utils import to_volume_state
12+
1113
import vtk
12-
from vtk.util.numpy_support import vtk_to_numpy
13-
14-
# Numpy to JS TypedArray
15-
to_js_type = {
16-
'int8': 'Int8Array',
17-
'uint8': 'Uint8Array',
18-
'int16': 'Int16Array',
19-
'uint16': 'Uint16Array',
20-
'float32': 'Float32Array',
21-
'float64': 'Float64Array',
22-
}
2314

2415
# Data file path
2516
demo_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -30,12 +21,7 @@
3021
reader.SetFileName(head_vti)
3122
reader.Update()
3223

33-
image_data = reader.GetOutput()
34-
dimensions = image_data.GetDimensions()
35-
spacing = image_data.GetSpacing()
36-
origin = image_data.GetOrigin()
37-
scalars = vtk_to_numpy(image_data.GetPointData().GetScalars())
38-
js_type = to_js_type[str(scalars.dtype)]
24+
volume_state = to_volume_state(reader.GetOutput())
3925

4026
def custom_card(children):
4127
return dbc.Card(
@@ -72,22 +58,7 @@ def custom_card(children):
7258
cameraParallelProjection=False,
7359
background=[.9, .9, 1],
7460
children=[
75-
dash_vtk.ShareDataSet(
76-
dash_vtk.ImageData(
77-
dimensions=dimensions,
78-
spacing=spacing,
79-
origin=origin,
80-
children=[
81-
dash_vtk.PointData([
82-
dash_vtk.DataArray(
83-
registration="setScalars",
84-
values=scalars,
85-
type=js_type,
86-
)
87-
])
88-
],
89-
)
90-
),
61+
dash_vtk.ShareDataSet(dash_vtk.Volume(state=volume_state)),
9162
dash_vtk.SliceRepresentation(
9263
id="slice-repr-i",
9364
iSlice=128,

demos/usage-vtk-cfd/app.py

Lines changed: 94 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,110 @@
11
import os
22
import random
3-
import vtk
43

5-
import dash
6-
import dash_vtk
7-
from dash_vtk.utils import to_mesh_state, presets
84

5+
import dash
96
import dash_bootstrap_components as dbc
107
import dash_html_components as html
118
import dash_core_components as dcc
129

1310
from dash.dependencies import Input, Output, State
1411

12+
import dash_vtk
13+
from dash_vtk.utils import to_mesh_state, preset_as_options
1514

16-
def toDropOption(name):
17-
return { 'label': name, 'value': name}
15+
import vtk
1816

1917
# -----------------------------------------------------------------------------
2018
# VTK Pipeline
2119
# -----------------------------------------------------------------------------
2220

23-
# Figure out file path to load
24-
data_basedir = os.path.join(os.path.dirname(__file__), 'data')
25-
bike_filename = os.path.join(data_basedir, 'bike.vtp')
26-
tunnel_filename = os.path.join(data_basedir, 'tunnel.vtu')
21+
class Viz():
22+
def __init__(self, data_directory):
23+
self.color_range = [0, 1]
24+
bike_filename = os.path.join(data_directory, 'bike.vtp')
25+
tunnel_filename = os.path.join(data_directory, 'tunnel.vtu')
26+
27+
# Seeds settings
28+
self.resolution = 10
29+
self.point1 = [-0.4, 0, 0.05]
30+
self.point2 = [-0.4, 0, 1.5]
31+
32+
# VTK Pipeline setup
33+
bikeReader = vtk.vtkXMLPolyDataReader()
34+
bikeReader.SetFileName(bike_filename)
35+
bikeReader.Update()
36+
self.bike_mesh = to_mesh_state(bikeReader.GetOutput())
2737

28-
# Seed positions
29-
point1 = [-0.4, 0, 0.05]
30-
point2 = [-0.4, 0, 1.5]
38+
tunnelReader = vtk.vtkXMLUnstructuredGridReader()
39+
tunnelReader.SetFileName(tunnel_filename)
40+
tunnelReader.Update()
3141

32-
# VTK Pipeline setup
33-
bikeReader = vtk.vtkXMLPolyDataReader()
34-
bikeReader.SetFileName(bike_filename)
35-
bikeReader.Update()
42+
self.lineSeed = vtk.vtkLineSource()
43+
self.lineSeed.SetPoint1(*self.point1)
44+
self.lineSeed.SetPoint2(*self.point2)
45+
self.lineSeed.SetResolution(self.resolution)
3646

37-
tunnelReader = vtk.vtkXMLUnstructuredGridReader()
38-
tunnelReader.SetFileName(tunnel_filename)
39-
tunnelReader.Update()
47+
streamTracer = vtk.vtkStreamTracer()
48+
streamTracer.SetInputConnection(tunnelReader.GetOutputPort())
49+
streamTracer.SetSourceConnection(self.lineSeed.GetOutputPort())
50+
streamTracer.SetIntegrationDirectionToForward()
51+
streamTracer.SetIntegratorTypeToRungeKutta45()
52+
streamTracer.SetMaximumPropagation(3)
53+
streamTracer.SetIntegrationStepUnit(2)
54+
streamTracer.SetInitialIntegrationStep(0.2)
55+
streamTracer.SetMinimumIntegrationStep(0.01)
56+
streamTracer.SetMaximumIntegrationStep(0.5)
57+
streamTracer.SetMaximumError(0.000001)
58+
streamTracer.SetMaximumNumberOfSteps(2000)
59+
streamTracer.SetTerminalSpeed(0.00000000001)
4060

41-
lineSeed = vtk.vtkLineSource()
42-
lineSeed.SetPoint1(*point1)
43-
lineSeed.SetPoint2(*point2)
44-
lineSeed.SetResolution(50)
61+
self.tubeFilter = vtk.vtkTubeFilter()
62+
self.tubeFilter.SetInputConnection(streamTracer.GetOutputPort())
63+
self.tubeFilter.SetRadius(0.01)
64+
self.tubeFilter.SetNumberOfSides(6)
65+
self.tubeFilter.CappingOn()
66+
self.tubeFilter.Update()
4567

46-
streamTracer = vtk.vtkStreamTracer()
47-
streamTracer.SetInputConnection(tunnelReader.GetOutputPort())
48-
streamTracer.SetSourceConnection(lineSeed.GetOutputPort())
49-
streamTracer.SetIntegrationDirectionToForward()
50-
streamTracer.SetIntegratorTypeToRungeKutta45()
51-
streamTracer.SetMaximumPropagation(3)
52-
streamTracer.SetIntegrationStepUnit(2)
53-
streamTracer.SetInitialIntegrationStep(0.2)
54-
streamTracer.SetMinimumIntegrationStep(0.01)
55-
streamTracer.SetMaximumIntegrationStep(0.5)
56-
streamTracer.SetMaximumError(0.000001)
57-
streamTracer.SetMaximumNumberOfSteps(2000)
58-
streamTracer.SetTerminalSpeed(0.00000000001)
68+
def updateSeedPoints(self, p1_y, p2_y, resolution):
69+
self.point1[1] = p1_y
70+
self.point2[1] = p2_y
71+
self.resolution = resolution
5972

60-
tubeFilter = vtk.vtkTubeFilter()
61-
tubeFilter.SetInputConnection(streamTracer.GetOutputPort())
62-
tubeFilter.SetRadius(0.01)
63-
tubeFilter.SetNumberOfSides(6)
64-
tubeFilter.CappingOn()
65-
tubeFilter.Update()
73+
self.lineSeed.SetPoint1(*self.point1)
74+
self.lineSeed.SetPoint2(*self.point2)
75+
self.lineSeed.SetResolution(resolution)
6676

67-
def updateTubesGeometry(field_name):
68-
tubeFilter.Update()
69-
streamlineState = to_mesh_state(tubeFilter.GetOutput(), field_name)
70-
colorRange = streamlineState['field']['dataRange']
77+
def getTubesMesh(self, color_by_field_name):
78+
self.tubeFilter.Update()
79+
ds = self.tubeFilter.GetOutput()
80+
mesh_state = to_mesh_state(ds, color_by_field_name)
81+
self.color_range = mesh_state['field']['dataRange']
82+
return mesh_state
7183

72-
return [streamlineState, colorRange]
84+
def getBikeMesh(self):
85+
return self.bike_mesh
7386

74-
streamline_mesh_state, color_range = updateTubesGeometry('p')
75-
bike_mesh_state = to_mesh_state(bikeReader.GetOutput())
87+
def getColorRange(self):
88+
return self.color_range
89+
90+
def getSeedState(self):
91+
return {
92+
'point1': self.point1,
93+
'point2': self.point2,
94+
'resolution': self.resolution,
95+
}
7696

7797
# -----------------------------------------------------------------------------
7898
# GUI setup
7999
# -----------------------------------------------------------------------------
80100

81101
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
82102
server = app.server
103+
viz = Viz(os.path.join(os.path.dirname(__file__), 'data'))
104+
105+
# -----------------------------------------------------------------------------
106+
# 3D Viz
107+
# -----------------------------------------------------------------------------
83108

84109
vtk_view = dash_vtk.View(
85110
id="vtk-view",
@@ -89,18 +114,18 @@ def updateTubesGeometry(field_name):
89114
children=[
90115
dash_vtk.Mesh(
91116
id="bike",
92-
state=bike_mesh_state,
117+
state=viz.getBikeMesh(),
93118
)
94119
],
95120
),
96121
dash_vtk.GeometryRepresentation(
97122
id="tubes-rep",
98123
colorMapPreset="erdc_rainbow_bright",
99-
colorDataRange=color_range,
124+
colorDataRange=viz.getColorRange(),
100125
children=[
101126
dash_vtk.Mesh(
102127
id="tubes-mesh",
103-
state=streamline_mesh_state,
128+
state=viz.getTubesMesh('p'),
104129
)
105130
],
106131
),
@@ -115,13 +140,17 @@ def updateTubesGeometry(field_name):
115140
dash_vtk.Algorithm(
116141
id="seed-line",
117142
vtkClass="vtkLineSource",
118-
state={'point1': point1, 'point2': point2 },
143+
state=viz.getSeedState(),
119144
)
120145
],
121146
)
122147
]
123148
)
124149

150+
# -----------------------------------------------------------------------------
151+
# Control UI
152+
# -----------------------------------------------------------------------------
153+
125154
controls = dbc.Col(children=[
126155
dbc.Card(
127156
[
@@ -180,7 +209,7 @@ def updateTubesGeometry(field_name):
180209
html.P("Color Preset"),
181210
dcc.Dropdown(
182211
id="preset",
183-
options=list(map(toDropOption, presets)),
212+
options=preset_as_options,
184213
value="erdc_rainbow_bright",
185214
),
186215
]
@@ -189,11 +218,14 @@ def updateTubesGeometry(field_name):
189218
),
190219
])
191220

221+
# -----------------------------------------------------------------------------
222+
# App UI
223+
# -----------------------------------------------------------------------------
192224

193225
app.layout = dbc.Container(
194226
fluid=True,
195227
children=[
196-
html.H1("Demo of dash_vtk.CFD"),
228+
html.H1("dash_vtk rendering with VTK processing"),
197229
html.Hr(),
198230
dbc.Row(
199231
[
@@ -216,7 +248,7 @@ def updateTubesGeometry(field_name):
216248
)
217249

218250
# -----------------------------------------------------------------------------
219-
# Handle seeds
251+
# Handle controls
220252
# -----------------------------------------------------------------------------
221253

222254
@app.callback(
@@ -236,21 +268,13 @@ def updateTubesGeometry(field_name):
236268
],
237269
)
238270
def update_seeds(y1, y2, resolution, colorByField, presetName):
239-
point1[1] = y1
240-
point2[1] = y2
241-
242-
lineSeed.SetPoint1(*point1)
243-
lineSeed.SetPoint2(*point2)
244-
lineSeed.SetResolution(resolution)
245-
246-
tube_state, colorRange = updateTubesGeometry(colorByField)
247-
271+
viz.updateSeedPoints(y1, y2, resolution)
248272
return [
249-
{"point1": point1, "point2": point2, "resolution": resolution},
250-
tube_state,
251-
colorRange,
273+
viz.getSeedState(),
274+
viz.getTubesMesh(colorByField),
275+
viz.getColorRange(),
252276
presetName,
253-
random.random(),
277+
random.random(), # trigger a render
254278
]
255279

256280
# -----------------------------------------------------------------------------

demos/volume-rendering/app.py

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
11
import os
22
import dash
3-
import dash_vtk
43
import dash_html_components as html
54

6-
import vtk
7-
from vtk.util.numpy_support import vtk_to_numpy
5+
import dash_vtk
6+
from dash_vtk.utils import to_volume_state
87

9-
# Numpy to JS TypedArray
10-
to_js_type = {
11-
'int8': 'Int8Array',
12-
'uint8': 'Uint8Array',
13-
'int16': 'Int16Array',
14-
'uint16': 'Uint16Array',
15-
'float32': 'Float32Array',
16-
'float64': 'Float64Array',
17-
}
8+
import vtk
189

1910
# Data file path
2011
demo_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -25,12 +16,7 @@
2516
reader.SetFileName(head_vti)
2617
reader.Update()
2718

28-
image_data = reader.GetOutput()
29-
dimensions = image_data.GetDimensions()
30-
spacing = image_data.GetSpacing()
31-
origin = image_data.GetOrigin()
32-
scalars = vtk_to_numpy(image_data.GetPointData().GetScalars())
33-
js_type = to_js_type[str(scalars.dtype)]
19+
volume_state = to_volume_state(reader.GetOutput())
3420

3521
app = dash.Dash(__name__)
3622
server = app.server
@@ -42,20 +28,7 @@
4228
dash_vtk.VolumeRepresentation(
4329
children=[
4430
dash_vtk.VolumeController(),
45-
dash_vtk.ImageData(
46-
dimensions=dimensions,
47-
spacing=spacing,
48-
origin=origin,
49-
children=[
50-
dash_vtk.PointData([
51-
dash_vtk.DataArray(
52-
registration="setScalars",
53-
values=scalars,
54-
type=js_type,
55-
)
56-
])
57-
],
58-
),
31+
dash_vtk.Volume(state=volume_state),
5932
]
6033
)
6134
)

0 commit comments

Comments
 (0)