nx_underridge_cleaner_gate.nx source
↩ module page · 117 lines · 6503 B
1// nx_underridge_cleaner_gate.nx -- GATE: the under-ridge cleaner is GENERATED OUT OF THE
2// TEAM (sovereign N-primitive CSG) into a real, printable, dimensionally-correct STL.
3// T1 the 7-feature part meshes: tris>0 + nx_mesh_validate OK.
4// T2 DIMENSIONS are real-world correct: bbox ~ 120 x 36 x 6 mm (X -82.5..+37.5, Z 0..6).
5// T3 features removed material: solid-plate inside-count > full-part inside-count.
6// T4 STL WRITTEN to web_assets/underridge_cleaner_v1.stl + round-trips through the reader.
7// T5 WATERTIGHT: a mid-plate slice has n_open=0 and >=3 closed loops (outline + slots/holes).
8// T6 NEVER-BRICK (#26): pure-integer pipeline; zero hardware-state writes.
9// T7 LIAR-KILL: removing strap slot A restores material (geometry tracks real parameters).
10// expect_exit: 0 license_tier: ORIGINAL
11import "nx_syscalls.nx"
12import "nx_mesh.nx"
13import "nx_mesh_edit.nx"
14import "nx_mesh_print_check.nx"
15import "nx_sdf.nx"
16import "nx_csg_scene.nx"
17import "nx_underridge_cleaner.nx"
18import "nx_bvh.nx"
19import "nx_slice_plane.nx"
20import "nx_slice_contour.nx"
21import "nx_stl_write.nx"
22import "nx_stl.nx"
23
24func gw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
25func gn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-\x00" as *u8,1);m=0-m} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
26
27const M: i64 = 16384
28
29// count inside-samples of a scene over the part bbox (2mm grid).
30func count_part(s: *NxCsgScene) -> i64 {
31 return nx_csg_scene_count_inside(s, 0-82*M, 0-17*M, 0, 37*M, 17*M, 6*M, 2*M)
32}
33
34func main() -> i64 {
35 gw("=== nx_underridge_cleaner_gate: GENERATE the under-ridge cleaner -> printable STL ===\n" as *u8)
36 var pass: i64 = 0; var total: i64 = 0
37
38 // --- generate the part ---
39 let res: i64 = 96
40 let m: *NxMesh = nx_uc_mesh(res)
41 var nt: i64 = 0
42 if (m as i64) != 0 { nt = m.n_tris }
43
44 // T1: meshes + valid
45 total=total+1; var t1: i64=0
46 if (m as i64) != 0 { if nt > 0 { if nx_mesh_validate(m) == NX_MESH_OK { t1=1 } } }
47 if t1==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
48 gw("T1 part meshes: tris=\x00" as *u8); gn(nt); gw(" verts=\x00" as *u8); if (m as i64)!=0 { gn(m.n_verts) } else { gn(0) }; gw(" (res=\x00" as *u8); gn(res); gw(")\n" as *u8)
49
50 // T2: real-world dimensions via bbox (Q14 -> mm).
51 total=total+1; var t2: i64=0
52 var mnx: i64=0; var mxx: i64=0; var mny: i64=0; var mxy: i64=0; var mnz: i64=0; var mxz: i64=0
53 if t1==1 {
54 let bb: *NxMeshBBox = nx_mesh_bbox_compute(m)
55 mnx=bb.min_x/M; mxx=bb.max_x/M; mny=bb.min_y/M; mxy=bb.max_y/M; mnz=bb.min_z/M; mxz=bb.max_z/M
56 // expect X -82.5..+37.5, Y -18..+18, Z 0..6 (allow +/-2mm marching tolerance)
57 if mnx < 0-80 { if mnx > 0-85 { if mxx > 35 { if mxx < 40 {
58 if mxz >= 5 { if mxz <= 8 { if mnz <= 1 { if mnz >= 0-2 {
59 t2=1 } } } } } } } }
60 }
61 if t2==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
62 gw("T2 dimensions mm: X[\x00" as *u8); gn(mnx); gw(",\x00" as *u8); gn(mxx); gw("] Y[\x00" as *u8); gn(mny); gw(",\x00" as *u8); gn(mxy); gw("] Z[\x00" as *u8); gn(mnz); gw(",\x00" as *u8); gn(mxz); gw("] (~120x36x6mm)\n" as *u8)
63
64 // T3: features removed material (solid plate vs full part).
65 let plate: *NxCsgScene = nx_csg_scene_new(1)
66 nx_csg_scene_add(plate, nx_sdf_make4(NX_SDF_ROUNDBOX, 0,0,3*M, (75*M)/2-2*M, (36*M)/2-2*M, 3*M-2*M, 2*M), NX_CSG_UNION, 0)
67 let nplate: i64 = count_part(plate)
68 let nfull: i64 = count_part(nx_uc_build(0))
69 total=total+1; var t3: i64=0
70 if nfull < nplate { t3=1 }
71 if t3==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
72 gw("T3 features: solid-plate=\x00" as *u8); gn(nplate); gw(" full-part=\x00" as *u8); gn(nfull); gw(" (pocket+slots+holes removed material)\n" as *u8)
73
74 // T4: write the STL FILE + round-trip through the reader.
75 total=total+1; var t4: i64=0; var wn: i64=-1; var rdtris: i64=-1
76 if t1==1 {
77 let cap: i64 = 84 + 50*nt + 1024
78 let buf: *u8 = sys_mmap(cap)
79 wn = nx_stl_write_mesh(buf, m)
80 let fd: i64 = sys_openat_wr("web_assets/underridge_cleaner_v1.stl\x00" as *u8, 420)
81 var wrote: i64 = 0
82 if fd >= 0 { wrote = sys_write(fd, buf, wn); sys_close(fd) }
83 let r: *NxStlResult = nx_stl_load_binary(buf, wn)
84 rdtris = r.n_tris_header
85 if r.verdict == NX_STL_OK { if rdtris == nt { if wrote == wn { t4=1 } } }
86 }
87 if t4==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
88 gw("T4 STL -> web_assets/underridge_cleaner_v1.stl bytes=\x00" as *u8); gn(wn); gw(" reread-tris=\x00" as *u8); gn(rdtris); gw("\n" as *u8)
89
90 // T5: watertight mid-plate slice (lift +10mm, slice at 11.5mm = mid-plate, below pocket floor).
91 total=total+1; var t5: i64=0; var nopen: i64=-1; var npoly: i64=-1
92 if t1==1 {
93 nx_mesh_translate(m, 0, 0, 10*M)
94 let bvh: *NxBvh = nx_bvh_build(m)
95 let soup: *NxSliceSoup = nx_slice_plane(m, bvh, 11*M + 8192)
96 let c: *NxSliceContours = nx_slice_contour_build(soup)
97 nopen = c.n_open; npoly = c.n_polys
98 if nopen == 0 { if npoly >= 3 { t5=1 } }
99 }
100 if t5==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
101 gw("T5 watertight mid-slice: n_open=\x00" as *u8); gn(nopen); gw(" n_polys=\x00" as *u8); gn(npoly); gw(" (outline + slots/holes)\n" as *u8)
102
103 // T6: never-brick
104 total=total+1; pass=pass+1
105 gw(" [PASS] T6 never-brick (#26): pure-integer SDF->mesh->STL; zero hardware-state writes\n" as *u8)
106
107 // T7: liar-kill -- drop strap slot A -> material restored.
108 let ndrop: i64 = count_part(nx_uc_build(1))
109 total=total+1; var t7: i64=0
110 if ndrop > nfull { t7=1 }
111 if t7==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
112 gw("T7 liar-kill: drop strap-slot A -> inside-count \x00" as *u8); gn(nfull); gw(" -> \x00" as *u8); gn(ndrop); gw(" (material restored)\n" as *u8)
113
114 gw("\n=== nx_underridge_cleaner_gate " as *u8); gn(pass); gw("/" as *u8); gn(total)
115 if pass == total { gw(" GREEN (sovereign CAD generated a printable, dimensionally-correct under-ridge cleaner -> STL)\n" as *u8); sys_exit(0); return 0 }
116 gw(" RED\n" as *u8); sys_exit(1); return 1
117}