Skip to content

Commit 379d8cd

Browse files
committed
Enhance rendering and intersection:
- Add `add_nurbs_surface` method with shading capability (`_add_surface_mesh`) and alpha blending support. - Improve `_draw_surfaces` routine for rendering meshed NURBS surfaces. - Integrate surface-tessellation (`surface_to_mesh`) for visualizing parametric surfaces with control over tolerance. - Refactor examples for NURBS curve-surface intersection to utilize updated rendering capabilities (`Viewer` and `render_result`). - Optimize curve-surface intersection routines (`nurbs_csx_v2`) with overlap tolerance and rational handling improvements.
1 parent 75d6880 commit 379d8cd

13 files changed

Lines changed: 628 additions & 120 deletions

examples/ccx/multiple_int_3d.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@
203203

204204

205205
isolated,overlaps=nurbs_ccx_multiple(val,tol=1e-3)
206-
print(isolated['point'].tolist())
206+
#print(isolated['point'].tolist())
207207
if args.no_display:
208208
print(isolated)
209209
print(overlaps)

examples/csx/overlap_nurbs_intersection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135

136136
viewer=Viewer(camera=OrbitCamera(target= surface.control_points.reshape(-1,3).mean(axis=0)))
137137

138-
srf = viewer.add_nurbs_surface(surface, color=(0.7,0.7,0.7,1), v_count=4)
138+
srf = viewer.add_nurbs_surface(surface, color=(0.7,0.7,0.7,1),surface_color=(0.5, 0.5, 0.9, 0.05), v_count=4)
139139
if isolated is not None:
140140
uvs=[]
141141
for pt in isolated['point']:

examples/csx/overlap_nurbs_intersection_3.py

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import time
22

3+
import rich
4+
35
from mmcore._test_data import csx as csx_cases
46

5-
from mmcore.numeric.intersection.csx import nurbs_csx
7+
from mmcore.numeric.intersection.csx import nurbs_csx, nurbs_csx_v2
68

7-
from mmcore.geom._nurbs_eval import _tuple_to_nurbs, _nurbs_to_tuple
9+
from mmcore.geom._nurbs_eval import _tuple_to_nurbs, _nurbs_to_tuple, evaluate_nurbs_curve
810
from mmcore.geom._nurbs_knots import split_curve_multiple
911
import numpy as np
1012
from mmcore.geom._nurbs_eval import NURBSCurveTuple
@@ -22,7 +24,6 @@
2224
)
2325

2426

25-
2627
curve2 = NURBSCurveTuple(
2728
order=4,
2829
knot=np.array([0., 0., 0., 0., 2.10490611,
@@ -60,83 +61,82 @@
6061
)
6162

6263
surface, curve3 = csx_cases[0]
64+
surface=_nurbs_to_tuple(surface)
6365
curve3=_nurbs_to_tuple(curve3)
6466
inters = []
6567
overs = []
6668
pts = []
6769
s = time.time()
68-
result1 = nurbs_csx(_tuple_to_nurbs(curve1), surface)
70+
result1 = nurbs_csx_v2(curve1, surface,tol=1e-3)
71+
6972
print(f"CSX 1 performed at: {time.time()-s} secs.")
73+
print('isolated:')
74+
if result1[0] is not None:
75+
rich.print(result1[0]['point'])
76+
print('overlaps:')
77+
if result1[1] is not None:
78+
rich.print(result1[1]['point'])
79+
7080
s = time.time()
71-
result2 = nurbs_csx(_tuple_to_nurbs(curve2), surface)
81+
result2 = nurbs_csx_v2(curve2, surface,tol=1e-3)
7282
print(f"CSX 2 performed at: {time.time()-s} secs.")
83+
print('isolated:')
84+
if result2[0] is not None:
85+
rich.print(result2[0]['point'])
86+
print('overlaps:')
87+
if result2[1] is not None:
88+
rich.print(result2[1]['point'])
89+
7390
s = time.time()
74-
result3 = nurbs_csx(_tuple_to_nurbs(curve3), surface)
91+
result3 = nurbs_csx_v2(curve3, surface,tol=1e-3)
7592

7693
print(f"CSX 3 performed at: {time.time()-s} secs.")
94+
print('isolated:')
95+
if result3[0] is not None:
96+
rich.print(result3[0]['point'])
97+
print('overlaps:')
98+
if result3[1] is not None:
99+
rich.print(result3[1]['point'])
100+
101+
try:
102+
from mmcore.extras.renderer.renderer3d import Viewer,OrbitCamera
77103

104+
viewer=Viewer(camera=OrbitCamera(target= surface.control_points.reshape(-1,3).mean(axis=0)))
105+
srf = viewer.add_nurbs_surface(surface, color=(0.7, 0.7, 0.7,1.), surface_color=(0.5, 0.5, 0.9, 0.05), v_count=4)
78106

107+
def render_result(result,curve,surface=None):
108+
if surface is not None:
109+
srf = viewer.add_nurbs_surface(surface, color=(0.3, 0.3, 0.3, 0.05), v_count=4)
110+
111+
crv= viewer.add(curve, color=(0.9, 0.9, 0.9, 1.0))
112+
isolated, overlaps = result
113+
if isolated is not None:
114+
uvs=[]
115+
for pt in isolated['point']:
116+
117+
viewer.add(pt, color=(0.0, 1.0, 0.5,1.0),size_px=13)
118+
119+
if overlaps is not None:
120+
121+
for start,end in overlaps['point']:
122+
viewer.add(start, color=(0.0, 1.0, 0.5, 1.0), size_px=6)
123+
viewer.add(end, color=(0.0, 1.0, 0.5, 1.0), size_px=6)
124+
125+
for o in overlaps["t"]:
126+
127+
t0 = o[0]
128+
t1 = o[-1]
129+
130+
pts=np.linspace(t0,t1,500)
131+
for t in pts:
132+
133+
evl=evaluate_nurbs_curve(curve,t,d_order=0)
134+
viewer.add_point3d(evl['C'],color=(0.0, 1.0, 0.5, 1.0), size_px=3)
135+
render_result(result1,curve1)
136+
render_result(result2, curve2)
137+
render_result(result3, curve3)
138+
viewer.run()
79139

80-
try:
81-
from mmcore.extras.renderer import CADRenderer, Camera
82-
83-
print(dir(Camera))
84-
85-
86-
renderer = CADRenderer(camera=Camera(zoom=50.0, near=0.1))
87-
88-
tess=renderer.add_nurbs_surface(surface, color=(0.9,0.9,0.9),surface_color = (0.5, 0.5, 0.9, 0.1))
89-
90-
def render_intersects(renderer,curve1,result1, curve_color=(0.0, 1.0, 0.5),inter_color=(1.0, 0.5, 0.0)):
91-
overlaps_prms=[]
92-
93-
for item in result1:
94-
print(item)
95-
if item[0]=='overlap':
96-
tinter,uinter,vinter=item[2]
97-
98-
renderer.add_point(item[1][0], np.array(inter_color), 4)
99-
100-
renderer.add_point(item[1][1], np.array(inter_color), 4)
101-
overlaps_prms.extend((tinter.low,tinter.upp))
102-
103-
104-
else:
105-
renderer.add_point(item[1], np.array(inter_color), 4)
106-
if len(overlaps_prms)>0:
107-
overlaps_prms=np.unique(overlaps_prms).tolist()
108-
109-
at_start=(overlaps_prms[0]-curve1.interval()[0])<=1e-6
110-
if at_start:
111-
del overlaps_prms[0]
112-
if (curve1.interval()[1]-overlaps_prms[-1] ) <= 1e-6:
113-
del overlaps_prms[-1]
114-
115-
116-
for i,segm in enumerate(split_curve_multiple(curve1, overlaps_prms)):
117-
118-
if ((i%2) ==0) :
119-
120-
renderer.add_nurbs_curve(
121-
_tuple_to_nurbs(segm),
122-
color=np.array(inter_color) if at_start else np.array(curve_color)
123-
)
124-
else:
125-
renderer.add_nurbs_curve(
126-
_tuple_to_nurbs(segm),
127-
color=np.array(curve_color) if at_start else np.array(inter_color)
128-
)
129-
else:
130-
131-
renderer.add_nurbs_curve(
132-
_tuple_to_nurbs(curve1),
133-
color=np.array(curve_color)
134-
)
135-
136-
render_intersects(renderer,curve1,result1)
137-
render_intersects(renderer, curve2, result2)
138-
#render_intersects(renderer, curve3, result3)
139-
renderer.run()
140140

141141
except ModuleNotFoundError as err:
142142
print("mmcore.renderer is not installed, skip preview.")

examples/csx/overlap_nurbs_intersection_4.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,12 @@
8484
print('overlaps:')
8585
if overlaps is not None:
8686
rich.print(overlaps['point'].tolist())
87-
from mmcore.numeric.algorithms.tnb import frenet_serret_frame, frenet_serret_frame_from_ders
8887

8988
try:
9089
from mmcore.extras.renderer.renderer3d import Viewer,OrbitCamera
9190
viewer=Viewer(camera=OrbitCamera(near=1,far=1e+9))
9291
primary_color=(*(np.array([250, 102, 166])/255).tolist(),1)
93-
srf = viewer.add_nurbs_surface(surface, color=(0.7,0.7,0.7,1))
92+
srf = viewer.add_nurbs_surface(surface, color=(0.7,0.7,0.7,1),surface_color=(0.5, 0.5, 0.9, 0.05),)
9493
if isolated is not None:
9594
for pt in isolated['point']:
9695

@@ -101,7 +100,7 @@
101100
viewer.add(start, color=(0.0, 1.0, 0.5, 1.0), size_px=6)
102101
viewer.add(end, color=(0.0, 1.0, 0.5, 1.0), size_px=6)
103102
for o in overlaps['t']:
104-
print(o)
103+
#print(o)
105104
t0 = o[0]
106105
t1 = o[-1]
107106
viewer.add(trim_curve(curve,curve.interval()[0],t0),color=(0.9, 0.9, 0.9, 1.0))

0 commit comments

Comments
 (0)