code wiki / _hdl_build / nx_step_nurbs_gate.nx

nx_step_nurbs_gate.nx source

↩ module page · 179 lines · 8964 B

1// nx_step_nurbs_gate.nx -- METROLOGY gate for rational B-spline surface evaluation (cadtwin P3a round parts). 2// ENGINEERING-TWIN doctrine: dimensional truth, measured -- units confirmed from the file (never assumed), exact 3// integer teeth where the math is exact, measured-um bounds where it rounds. Ground truth = surface #248 of the 4// real as1: hand-decoded exact NURBS half-circle, center (10,7.5)mm, RADIUS EXACTLY 5.000mm, z 0..3mm, weights 5// (1,1/3,1/3,1). Full-model sweep must cover ALL 28 spline faces with the boundary-exactness invariant clean. 6// expect_exit: 0 license_tier: ORIGINAL 7import "nx_step_nurbs.nx" 8 9func ng_tooth(name: *u8, pass: i64, fails: *i64) -> i64 { 10 sp_puts(" " as *u8); sp_puts(name); sp_puts(" -> " as *u8) 11 if pass == 1 { sp_puts("PASS\n" as *u8); return 0 } 12 sp_puts("FAIL\n" as *u8) 13 fails[0] = fails[0] + 1 14 return 0 15} 16 17func main() -> i64 { 18 sp_puts("=== nx_step_nurbs_gate -- exact round parts: rational B-spline metrology on the real as1 ===\n" as *u8) 19 let fails: *i64 = sys_mmap(8) as *i64 20 fails[0] = 0 21 let buf: *u8 = sys_mmap(4194304) 22 let aid: *i64 = sys_mmap(524288) as *i64 23 let anm: *i64 = sys_mmap(524288) as *i64 24 let anl: *i64 = sys_mmap(524288) as *i64 25 let aao: *i64 = sys_mmap(524288) as *i64 26 let aal: *i64 = sys_mmap(524288) as *i64 27 let st: *i64 = sys_mmap(256) as *i64 28 let n: i64 = sp_read_file("knowledge/fetched/step_as1.stp" as *u8, buf, 4194304) 29 if n <= 0 { sp_puts("MISSING step_as1.stp\nRED\n" as *u8); return 1 } 30 sp_init(st, buf, n, aid, anm, anl, aao, aal) 31 let cnt: i64 = sp_scan(st) 32 sp_puts("entities=" as *u8); sp_putn(cnt); sp_puts("\n" as *u8) 33 34 // T0 UNITS from the file, never assumed 35 let mm: i64 = sgn_unit_mm(st) 36 sp_puts(" file declares LENGTH_UNIT SI_UNIT(.MILLI.,.METRE.) -> mm=" as *u8); sp_putn(mm) 37 sp_puts(" (our quantum: 1 fx256 = 3.90625 um)\n" as *u8) 38 let ig0: i64 = ng_tooth("T0 units CONFIRMED from file: millimetre" as *u8, mm, fails) 39 40 // nurbs ctx 41 let nt: *i64 = sys_mmap(128) as *i64 42 let c2: *i64 = sys_mmap(128) as *i64 43 let mesh: i64 = sys_mmap(m3_bytes()) as i64 44 m3_init(mesh) 45 var ci: i64 = 0 46 while ci < 16 { c2[ci] = 0; ci = ci + 1 } 47 nt[0] = st as i64 48 nt[1] = mesh 49 nt[2] = c2 as i64 50 nt[3] = sys_mmap(256) as i64 51 nt[4] = sys_mmap(64) as i64 52 nt[5] = sys_mmap(16) as i64 53 nt[6] = sys_mmap(128) as i64 54 nt[7] = sys_mmap(128) as i64 55 56 // T1 parse the KNOWN surface #248 57 let sidx: i64 = sp_find(st, 248) 58 let pok: i64 = sgn_parse_surface(nt, sidx) 59 let ctrl: *i64 = nt[3] as *i64 60 let wts: *i64 = nt[4] as *i64 61 var t1: i64 = 0 62 if pok == 1 { 63 var wdev: i64 = wts[1] - 349525 64 if wdev < 0 { wdev = 0 - wdev } 65 if wts[0] == 1048576 { if wdev <= 2 { 66 if ctrl[0] == 1280 { if ctrl[1] == 1920 { if ctrl[2] == 768 { 67 if ctrl[21] == 3840 { if ctrl[22] == 1920 { if ctrl[23] == 0 { t1 = 1 } } } 68 } } } 69 } } 70 } 71 sp_puts(" #248 parsed=" as *u8); sp_putn(pok) 72 sp_puts(" w=(" as *u8); sp_putn(wts[0]); sp_puts("," as *u8); sp_putn(wts[1]); sp_puts(",...) ctrl0=(" as *u8) 73 sp_putn(ctrl[0]); sp_puts("," as *u8); sp_putn(ctrl[1]); sp_puts("," as *u8); sp_putn(ctrl[2]); sp_puts(")\n" as *u8) 74 let ig1: i64 = ng_tooth("T1 #248: 2x4 net + weights (1, 1/3@Q20 +-2) + exact ctrl coords" as *u8, t1, fails) 75 76 // T2 boundary interpolation INTEGER-EXACT 77 let ev: *i64 = sys_mmap(32) as *i64 78 sgn_eval(nt, 0, 0, ev) 79 var t2: i64 = 0 80 if ev[0] == 1280 { if ev[1] == 1920 { if ev[2] == 768 { 81 sgn_eval(nt, 0, SN_Q12, ev) 82 if ev[0] == 3840 { if ev[1] == 1920 { if ev[2] == 768 { t2 = 1 } } } 83 } } } 84 let ig2: i64 = ng_tooth("T2 eval(0)==(5,7.5,3)mm and eval(1)==(15,7.5,3)mm INTEGER-EXACT" as *u8, t2, fails) 85 86 // T3 the arc TOP at t=1/2 must be (10,12.5,3)mm exactly = (2560,3200,768) fx 87 sgn_eval(nt, 0, SN_Q12 / 2, ev) 88 sp_puts(" eval(1/2)=(" as *u8); sp_putn(ev[0]); sp_puts("," as *u8); sp_putn(ev[1]); sp_puts("," as *u8); sp_putn(ev[2]); sp_puts(") expect (2560,3200,768)\n" as *u8) 89 var t3: i64 = 0 90 if ev[0] == 2560 { if ev[1] == 3200 { if ev[2] == 768 { t3 = 1 } } } 91 let ig3: i64 = ng_tooth("T3 arc apex eval(1/2)==(10,12.5,3)mm INTEGER-EXACT (rational weights work)" as *u8, t3, fails) 92 93 // T4 METROLOGY SWEEP: 33 samples on rim0 -- radius vs center (10,7.5)mm must be 5.000mm; measure max deviation 94 var maxdev2: i64 = 0 95 var maxzdev: i64 = 0 96 var si: i64 = 0 97 while si <= 32 { 98 sgn_eval(nt, 0, (si * SN_Q12) / 32, ev) 99 let dx: i64 = ev[0] - 2560 100 let dy: i64 = ev[1] - 1920 101 var d2: i64 = dx * dx + dy * dy - 1638400 // R^2 = 1280^2 102 if d2 < 0 { d2 = 0 - d2 } 103 if d2 > maxdev2 { maxdev2 = d2 } 104 var zd: i64 = ev[2] - 768 105 if zd < 0 { zd = 0 - zd } 106 if zd > maxzdev { maxzdev = zd } 107 si = si + 1 108 } 109 // radial deviation in fx units ~ maxdev2 / (2R) = maxdev2 / 2560; 1 fx = 3.90625 um 110 let devfx: i64 = maxdev2 / 2560 111 let devnm: i64 = devfx * 3906 + ((maxdev2 % 2560) * 3906) / 2560 112 sp_puts(" ROUNDNESS: 33 samples, radius 5.000mm, max radial deviation = " as *u8); sp_putn(devnm) 113 sp_puts(" nm (bound 7813 = 2 fx units); max z deviation = " as *u8); sp_putn(maxzdev); sp_puts(" fx\n" as *u8) 114 var t4: i64 = 0 115 if devfx <= 2 { if maxzdev == 0 { t4 = 1 } } 116 let ig4: i64 = ng_tooth("T4 MEASURED roundness: every sample within 2 fx (7.8um) of exact 5.000mm; rim plane z EXACT" as *u8, t4, fails) 117 118 // T5 FULL-MODEL sweep: all 28 spline faces tessellated, boundary invariant clean, + planar 12 -> 40/53 faces 119 let ntess: i64 = sgn_tessellate_all(nt) 120 sp_puts(" full sweep: spline-faces=" as *u8); sp_putn(c2[0]) 121 sp_puts(" parsed=" as *u8); sp_putn(c2[1]) 122 sp_puts(" tessellated=" as *u8); sp_putn(c2[2]) 123 sp_puts(" tris=" as *u8); sp_putn(c2[6]) 124 sp_puts(" boundary-exact-fails=" as *u8); sp_putn(c2[7]) 125 sp_puts("\n skips: degree=" as *u8); sp_putn(c2[3]); sp_puts(" refs=" as *u8); sp_putn(c2[4]); sp_puts(" weights=" as *u8); sp_putn(c2[5]); sp_puts("\n" as *u8) 126 var t5: i64 = 0 127 if c2[0] == 28 { if c2[2] == 28 { if c2[7] == 0 { if c2[6] == 896 { t5 = 1 } } } } 128 let ig5: i64 = ng_tooth("T5 ALL 28/28 round faces tessellated, 896 tris, boundary invariant CLEAN" as *u8, t5, fails) 129 130 // T6 compose with planar: full-model mesh (planar 28 + round 896 = 924 tris) -> STL round-trip 131 let tt: *i64 = sys_mmap(128) as *i64 132 let cp: *i64 = sys_mmap(128) as *i64 133 var ci2: i64 = 0 134 while ci2 < 16 { cp[ci2] = 0; ci2 = ci2 + 1 } 135 tt[0] = st as i64 136 tt[1] = mesh // SAME mesh: planar adds onto the round tris 137 tt[2] = cp as i64 138 tt[3] = sys_mmap(768) as i64 139 tt[4] = sys_mmap(1536) as i64 140 tt[5] = sys_mmap(1024) as i64 141 tt[6] = sys_mmap(512) as i64 142 tt[7] = sys_mmap(128) as i64 143 tt[8] = sys_mmap(16) as i64 144 tt[9] = 0 145 let np: i64 = sgt_tessellate(tt) 146 let h: *i64 = m3_hdr(mesh) 147 let wr: i64 = m3_write_stl(mesh, "knowledge/step_full.stl" as *u8) 148 let mesh2: i64 = sys_mmap(m3_bytes()) as i64 149 let rd: i64 = m3_read_stl(mesh2, "knowledge/step_full.stl" as *u8) 150 let h2: *i64 = m3_hdr(mesh2) 151 sp_puts(" FULL MODEL: planar-faces=" as *u8); sp_putn(cp[2]) 152 sp_puts(" total tris=" as *u8); sp_putn(h[1]) 153 sp_puts(" STL round-trip=" as *u8); sp_putn(h2[1]); sp_puts("\n" as *u8) 154 var t6: i64 = 0 155 if cp[2] == 12 { if h[1] == 924 { if h2[1] == 924 { if wr >= 0 { if rd >= 0 { t6 = 1 } } } } } 156 let ig6: i64 = ng_tooth("T6 FULL MODEL: 40/53 faces -> 924 real tris -> STL round-trip (real from-file geometry)" as *u8, t6, fails) 157 158 // T7 determinism 159 let c3: *i64 = sys_mmap(128) as *i64 160 let mesh3b: i64 = sys_mmap(m3_bytes()) as i64 161 m3_init(mesh3b) 162 var ci3: i64 = 0 163 while ci3 < 16 { c3[ci3] = 0; ci3 = ci3 + 1 } 164 nt[1] = mesh3b 165 nt[2] = c3 as i64 166 let ntess2: i64 = sgn_tessellate_all(nt) 167 var t7: i64 = 0 168 if ntess2 == ntess { if c3[6] == 896 { t7 = 1 } } 169 let ig7: i64 = ng_tooth("T7 deterministic" as *u8, t7, fails) 170 171 sp_puts("\nENGINEERING-TWIN METROLOGY: units read from the FILE; the bolt-class round geometry evaluated from the\n" as *u8) 172 sp_puts("file's own rational B-splines -- radius 5.000mm verified to nm-scale at 33 samples, apex/boundaries\n" as *u8) 173 sp_puts("INTEGER-EXACT, all 28 round faces + 12 planar = 40/53 faces now REAL from-file geometry (924 tris).\n" as *u8) 174 sp_puts("Remaining: 9 hole-faces (bridging) + 4 full-circle loops -> then the WHOLE model is file-true.\n" as *u8) 175 sp_puts("\nfails=" as *u8); sp_putn(fails[0]); sp_puts("\n" as *u8) 176 if fails[0] == 0 { sp_puts("GREEN -- rational B-spline metrology 8/8 (round parts exact to file dimensions)\n" as *u8); return 0 } 177 sp_puts("RED\n" as *u8) 178 return 1 179}