1
1
from . import Shape , Workplane , Assembly , Sketch , Compound , Color , Vector , Location
2
- from .occ_impl .exporters .assembly import _vtkRenderWindow
3
- from .occ_impl .assembly import _loc2vtk
2
+ from .occ_impl .assembly import _loc2vtk , toVTK
4
3
5
4
from typing import Union , Any , List , Tuple
6
5
15
14
vtkMapper ,
16
15
vtkRenderWindowInteractor ,
17
16
vtkActor ,
17
+ vtkProp ,
18
18
vtkPolyDataMapper ,
19
19
vtkAssembly ,
20
+ vtkRenderWindow ,
20
21
)
21
22
from vtkmodules .vtkCommonCore import vtkPoints
22
23
from vtkmodules .vtkCommonDataModel import vtkCellArray , vtkPolyData
27
28
DEFAULT_PT_SIZE = 7.5
28
29
DEFAULT_PT_COLOR = "darkviolet"
29
30
31
+ SPECULAR = 0.3
32
+ SPECULAR_POWER = 100
33
+ SPECULAR_COLOR = vtkNamedColors ().GetColor3d ("White" )
34
+
30
35
ShapeLike = Union [Shape , Workplane , Assembly , Sketch , TopoDS_Shape ]
31
- Showable = Union [ShapeLike , List [ShapeLike ], Vector , List [Vector ]]
36
+ Showable = Union [
37
+ ShapeLike , List [ShapeLike ], Vector , List [Vector ], vtkProp , List [vtkProp ]
38
+ ]
32
39
33
40
34
41
def _to_assy (* objs : ShapeLike , alpha : float = 1 ) -> Assembly :
@@ -50,14 +57,17 @@ def _to_assy(*objs: ShapeLike, alpha: float = 1) -> Assembly:
50
57
return assy
51
58
52
59
53
- def _split_showables (objs ) -> Tuple [List [ShapeLike ], List [Vector ], List [Location ]]:
60
+ def _split_showables (
61
+ objs ,
62
+ ) -> Tuple [List [ShapeLike ], List [Vector ], List [Location ], List [vtkProp ]]:
54
63
"""
55
64
Split into showables and others.
56
65
"""
57
66
58
67
rv_s : List [ShapeLike ] = []
59
68
rv_v : List [Vector ] = []
60
69
rv_l : List [Location ] = []
70
+ rv_a : List [vtkProp ] = []
61
71
62
72
for el in objs :
63
73
if instance_of (el , ShapeLike ):
@@ -66,21 +76,24 @@ def _split_showables(objs) -> Tuple[List[ShapeLike], List[Vector], List[Location
66
76
rv_v .append (el )
67
77
elif isinstance (el , Location ):
68
78
rv_l .append (el )
79
+ elif isinstance (el , vtkProp ):
80
+ rv_a .append (el )
69
81
elif isinstance (el , list ):
70
- tmp1 , tmp2 , tmp3 = _split_showables (el ) # split recursively
82
+ tmp1 , tmp2 , tmp3 , tmp4 = _split_showables (el ) # split recursively
71
83
72
84
rv_s .extend (tmp1 )
73
85
rv_v .extend (tmp2 )
74
86
rv_l .extend (tmp3 )
87
+ rv_a .extend (tmp4 )
75
88
76
- return rv_s , rv_v , rv_l
89
+ return rv_s , rv_v , rv_l , rv_a
77
90
78
91
79
92
def _to_vtk_pts (
80
93
vecs : List [Vector ], size : float = DEFAULT_PT_SIZE , color : str = DEFAULT_PT_COLOR
81
94
) -> vtkActor :
82
95
"""
83
- Convert vectors to vtkActor.
96
+ Convert Vectors to vtkActor.
84
97
"""
85
98
86
99
rv = vtkActor ()
@@ -110,7 +123,7 @@ def _to_vtk_pts(
110
123
111
124
def _to_vtk_axs (locs : List [Location ], scale : float = 0.1 ) -> vtkActor :
112
125
"""
113
- Convert vectors to vtkActor.
126
+ Convert Locations to vtkActor.
114
127
"""
115
128
116
129
rv = vtkAssembly ()
@@ -135,14 +148,16 @@ def show(
135
148
alpha : float = 1 ,
136
149
tolerance : float = 1e-3 ,
137
150
edges : bool = False ,
151
+ specular : bool = True ,
152
+ title : str = "CQ viewer" ,
138
153
** kwrags : Any ,
139
154
):
140
155
"""
141
156
Show CQ objects using VTK.
142
157
"""
143
158
144
159
# split objects
145
- shapes , vecs , locs = _split_showables (objs )
160
+ shapes , vecs , locs , props = _split_showables (objs )
146
161
147
162
# construct the assy
148
163
assy = _to_assy (* shapes , alpha = alpha )
@@ -151,19 +166,28 @@ def show(
151
166
pts = _to_vtk_pts (vecs )
152
167
axs = _to_vtk_axs (locs , scale = scale )
153
168
154
- # create a VTK window
155
- win = _vtkRenderWindow (assy , tolerance = tolerance )
169
+ # assy+renderer
170
+ renderer = toVTK (assy , tolerance = tolerance )
156
171
157
- win .SetWindowName ("CQ viewer" )
172
+ # VTK window boilerplate
173
+ win = vtkRenderWindow ()
174
+ win .SetWindowName (title )
175
+ win .AddRenderer (renderer )
158
176
159
177
# get renderer and actor
160
- if edges :
161
- ren = win .GetRenderers ().GetFirstRenderer ()
162
- for act in ren .GetActors ():
163
- act .GetProperty ().EdgeVisibilityOn ()
178
+ for act in renderer .GetActors ():
179
+
180
+ propt = act .GetProperty ()
181
+
182
+ if edges :
183
+ propt .EdgeVisibilityOn ()
184
+
185
+ if specular :
186
+ propt .SetSpecular (SPECULAR )
187
+ propt .SetSpecularPower (SPECULAR_POWER )
188
+ propt .SetSpecularColor (SPECULAR_COLOR )
164
189
165
190
# rendering related settings
166
- win .SetMultiSamples (16 )
167
191
vtkMapper .SetResolveCoincidentTopologyToPolygonOffset ()
168
192
vtkMapper .SetResolveCoincidentTopologyPolygonOffsetParameters (1 , 0 )
169
193
vtkMapper .SetResolveCoincidentTopologyLineOffsetParameters (- 1 , 0 )
@@ -193,7 +217,7 @@ def show(
193
217
orient_widget .InteractiveOff ()
194
218
195
219
# use gradient background
196
- renderer = win . GetRenderers (). GetFirstRenderer ( )
220
+ renderer . SetBackground ( 1 , 1 , 1 )
197
221
renderer .GradientBackgroundOn ()
198
222
199
223
# use FXXAA
@@ -209,9 +233,15 @@ def show(
209
233
renderer .AddActor (pts )
210
234
renderer .AddActor (axs )
211
235
236
+ # add other vtk actors
237
+ for p in props :
238
+ renderer .AddActor (p )
239
+
212
240
# initialize and set size
213
241
inter .Initialize ()
214
- win .SetSize (* win .GetScreenSize ())
242
+
243
+ w , h = win .GetScreenSize ()
244
+ win .SetSize ((w // 2 , h // 2 ))
215
245
win .SetPosition (- 10 , 0 )
216
246
217
247
# show and return
0 commit comments