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}