code wiki / (root) / nx_underridge_cleaner_gate.nx

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}