code wiki / _hdl_build / nx_step_write_gate.nx
nx_step_write_gate.nx source
↩ module page · 193 lines · 8465 B
1// nx_step_write_gate.nx -- STEP WRITE round-trip on real twin geometry (cadtwin P3a write half, rung 1).
2// Build the NUT part mesh from as1 via the full v2 pipeline (attribution+tessellation+weld = the organs we
3// built), WRITE it as a faceted-brep STEP with declared mm units + product identity, then READ IT BACK with
4// our own parser + faceted path and require an INTEGER-EXACT round trip (8-decimal fx256 lossless encoding):
5// same triangle count, every corner coordinate identical, known vertex present, units confirmed, product name
6// recovered, deterministic. expect_exit: 0 license_tier: ORIGINAL
7import "nx_cadtwin_report.nx"
8import "nx_step_write.nx"
9
10func wg_tooth(name: *u8, pass: i64, fails: *i64) -> i64 {
11 sp_puts(" " as *u8); sp_puts(name); sp_puts(" -> " as *u8)
12 if pass == 1 { sp_puts("PASS\n" as *u8); return 0 }
13 sp_puts("FAIL\n" as *u8)
14 fails[0] = fails[0] + 1
15 return 0
16}
17
18func main() -> i64 {
19 sp_puts("=== nx_step_write_gate -- faceted STEP write + integer-exact round-trip (nut twin) ===\n" as *u8)
20 let fails: *i64 = sys_mmap(8) as *i64
21 fails[0] = 0
22 let buf: *u8 = sys_mmap(4194304)
23 let aid: *i64 = sys_mmap(524288) as *i64
24 let anm: *i64 = sys_mmap(524288) as *i64
25 let anl: *i64 = sys_mmap(524288) as *i64
26 let aao: *i64 = sys_mmap(524288) as *i64
27 let aal: *i64 = sys_mmap(524288) as *i64
28 let st: *i64 = sys_mmap(256) as *i64
29 let n: i64 = sp_read_file("knowledge/fetched/step_as1.stp" as *u8, buf, 4194304)
30 if n <= 0 { sp_puts("MISSING step_as1.stp\nRED\n" as *u8); return 1 }
31 sp_init(st, buf, n, aid, anm, anl, aao, aal)
32 sp_scan(st)
33
34 // ---- build the nut mesh with the composed pipeline (v2 planar + nurbs + weld)
35 let tt: *i64 = sys_mmap(128) as *i64
36 let cp: *i64 = sys_mmap(128) as *i64
37 var z: i64 = 0
38 while z < 16 { cp[z] = 0; z = z + 1 }
39 tt[0] = st as i64
40 tt[2] = cp as i64
41 tt[3] = sys_mmap(768) as i64
42 tt[4] = 0
43 tt[5] = sys_mmap(8192) as i64
44 tt[6] = sys_mmap(4096) as i64
45 tt[7] = sys_mmap(128) as i64
46 tt[8] = sys_mmap(16) as i64
47 tt[9] = 0
48 let t2: *i64 = sys_mmap(128) as *i64
49 t2[0] = st as i64
50 t2[1] = cp as i64
51 t2[2] = sys_mmap(32) as i64
52 t2[3] = sys_mmap(960) as i64
53 t2[4] = sys_mmap(1024) as i64
54 t2[5] = sys_mmap(128) as i64
55 t2[6] = sys_mmap(512) as i64
56 t2[7] = sys_mmap(256) as i64
57 t2[8] = sys_mmap(8192) as i64
58 t2[9] = sys_mmap(128) as i64
59 t2[10] = sys_mmap(768) as i64
60 t2[11] = sys_mmap(128) as i64
61 t2[12] = sys_mmap(256) as i64
62 let slab: *i64 = sys_mmap(20480) as *i64
63 let nt: *i64 = sys_mmap(128) as *i64
64 let c2: *i64 = sys_mmap(128) as *i64
65 z = 0
66 while z < 16 { c2[z] = 0; z = z + 1 }
67 nt[0] = st as i64
68 nt[2] = c2 as i64
69 nt[3] = sys_mmap(256) as i64
70 nt[4] = sys_mmap(64) as i64
71 nt[5] = sys_mmap(16) as i64
72 nt[6] = sys_mmap(128) as i64
73 nt[7] = sys_mmap(128) as i64
74 let pdid: *i64 = sys_mmap(128) as *i64
75 let prodidx: *i64 = sys_mmap(128) as *i64
76 let shellidx: *i64 = sys_mmap(128) as *i64
77 let np: i64 = cr_find_parts(st, pdid, prodidx, shellidx)
78 var nuti: i64 = 0 - 1
79 var pi: i64 = 0
80 while pi < np {
81 if sp_prod_name_is(st, prodidx[pi], "nut" as *u8) == 1 { nuti = pi }
82 pi = pi + 1
83 }
84 if nuti < 0 { sp_puts("nut part not found\nRED\n" as *u8); return 1 }
85 let mesh: i64 = sys_mmap(m3_bytes()) as i64
86 m3_init(mesh)
87 tt[1] = mesh
88 nt[1] = mesh
89 let out4: *i64 = sys_mmap(32) as *i64
90 cr_tess_part(tt, nt, t2, slab, shellidx[nuti], out4)
91 cr_weld(mesh)
92 let h: *i64 = m3_hdr(mesh)
93 sp_puts("nut mesh: verts=" as *u8); sp_putn(h[0]); sp_puts(" tris=" as *u8); sp_putn(h[1]); sp_puts("\n" as *u8)
94
95 // ---- WRITE
96 let expected: i64 = sw_write_mesh(mesh, "knowledge/nut_twin.stp" as *u8, "nut-twin" as *u8)
97 sp_puts(" wrote knowledge/nut_twin.stp, expected entities=" as *u8); sp_putn(expected); sp_puts("\n" as *u8)
98
99 // ---- READ BACK with our own parser
100 let buf2: *u8 = sys_mmap(4194304)
101 let bid: *i64 = sys_mmap(262144) as *i64
102 let bnm: *i64 = sys_mmap(262144) as *i64
103 let bnl: *i64 = sys_mmap(262144) as *i64
104 let bao: *i64 = sys_mmap(262144) as *i64
105 let bal: *i64 = sys_mmap(262144) as *i64
106 let st2: *i64 = sys_mmap(256) as *i64
107 let n2: i64 = sp_read_file("knowledge/nut_twin.stp" as *u8, buf2, 4194304)
108 var t1: i64 = 0
109 if n2 > 5000 {
110 sp_init(st2, buf2, n2, bid, bnm, bnl, bao, bal)
111 let cnt2: i64 = sp_scan(st2)
112 sp_puts(" read back: bytes=" as *u8); sp_putn(n2); sp_puts(" entities=" as *u8); sp_putn(cnt2); sp_puts("\n" as *u8)
113 if cnt2 == expected { t1 = 1 }
114 }
115 let ig1: i64 = wg_tooth("T1 file written + re-parsed: entity count EXACT-matches the writer's formula" as *u8, t1, fails)
116
117 // T2 units declared + confirmed by OUR unit checker on OUR file (anti-JPL: files say their units)
118 let mm: i64 = sgn_unit_mm(st2)
119 let ig2: i64 = wg_tooth("T2 written file DECLARES mm units (confirmed by sgn_unit_mm on the new file)" as *u8, mm, fails)
120
121 // T3 faceted READ -> integer-exact round trip
122 let mesh2: i64 = sys_mmap(m3_bytes()) as i64
123 m3_init(mesh2)
124 let tris2: i64 = sw_read_faceted(st2, mesh2)
125 let h2: *i64 = m3_hdr(mesh2)
126 var mism: i64 = 0
127 if tris2 == h[1] {
128 var t: i64 = 0
129 while t < h[1] {
130 let trA: *i64 = m3_tri(mesh, t)
131 let trB: *i64 = m3_tri(mesh2, t)
132 var k: i64 = 0
133 while k < 3 {
134 let va: *i64 = m3_vert(mesh, trA[k])
135 let vb: *i64 = m3_vert(mesh2, trB[k])
136 if va[0] != vb[0] { mism = mism + 1 }
137 if va[1] != vb[1] { mism = mism + 1 }
138 if va[2] != vb[2] { mism = mism + 1 }
139 k = k + 1
140 }
141 t = t + 1
142 }
143 } else { mism = 0 - 1 }
144 sp_puts(" round-trip: tris " as *u8); sp_putn(tris2); sp_puts("/" as *u8); sp_putn(h[1])
145 sp_puts(" corner-coordinate mismatches=" as *u8); sp_putn(mism); sp_puts(" (0 = INTEGER-EXACT)\n" as *u8)
146 var t3: i64 = 0
147 if tris2 == h[1] { if mism == 0 { t3 = 1 } }
148 let ig3: i64 = wg_tooth("T3 INTEGER-EXACT round trip: every corner of every triangle identical" as *u8, t3, fails)
149
150 // T4 known model vertex (5, 7.5, 3)mm survives write->read exactly
151 var has: i64 = 0
152 var vi: i64 = 0
153 while vi < h2[0] {
154 let v: *i64 = m3_vert(mesh2, vi)
155 if v[0] == 1280 { if v[1] == 1920 { if v[2] == 768 { has = 1 } } }
156 vi = vi + 1
157 }
158 let ig4: i64 = wg_tooth("T4 known vertex (5,7.5,3)mm present EXACTLY after round trip" as *u8, has, fails)
159
160 // T5 product identity round-trips
161 var pfound: i64 = 0
162 var ei: i64 = 0
163 while ei < st2[7] {
164 if sp_name_is(st2, ei, "PRODUCT" as *u8) == 1 {
165 if sp_prod_name_is(st2, ei, "nut-twin" as *u8) == 1 { pfound = 1 }
166 }
167 ei = ei + 1
168 }
169 let ig5: i64 = wg_tooth("T5 PRODUCT identity 'nut-twin' recovered from the written file" as *u8, pfound, fails)
170
171 // T6 determinism: write again -> identical byte count + byte sum
172 let exp2: i64 = sw_write_mesh(mesh, "knowledge/nut_twin2.stp" as *u8, "nut-twin" as *u8)
173 let buf3: *u8 = sys_mmap(4194304)
174 let n3: i64 = sp_read_file("knowledge/nut_twin2.stp" as *u8, buf3, 4194304)
175 var s1: i64 = 0
176 var s2: i64 = 0
177 var bi2: i64 = 0
178 while bi2 < n2 { s1 = s1 + (buf2[bi2] as i64); bi2 = bi2 + 1 }
179 bi2 = 0
180 while bi2 < n3 { s2 = s2 + (buf3[bi2] as i64); bi2 = bi2 + 1 }
181 var t6: i64 = 0
182 if n3 == n2 { if s1 == s2 { if exp2 == expected { t6 = 1 } } }
183 let ig6: i64 = wg_tooth("T6 deterministic (byte-identical second write)" as *u8, t6, fails)
184
185 sp_puts("\nP3a WRITE RUNG 1: faceted-brep STEP OUT (products + DECLARED mm units + exact-decimal coords) with\n" as *u8)
186 sp_puts("an INTEGER-EXACT round trip through our own gated reader. HONEST residual for write PARITY: analytic/\n" as *u8)
187 sp_puts("NURBS B-rep write (planes/splines back out) -- the named next rung. Faceted class = real-world mesh\n" as *u8)
188 sp_puts("exchange (STL-in-STEP-clothing with identity+units, which raw STL lacks).\n" as *u8)
189 sp_puts("\nfails=" as *u8); sp_putn(fails[0]); sp_puts("\n" as *u8)
190 if fails[0] == 0 { sp_puts("GREEN -- STEP write 6/6 (faceted, exact round-trip, units declared)\n" as *u8); return 0 }
191 sp_puts("RED\n" as *u8)
192 return 1
193}