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}