code wiki / _hdl_build / nx_cadtwin_report_gate.nx

nx_cadtwin_report_gate.nx source

↩ module page · 317 lines · 13830 B

1// nx_cadtwin_report_gate.nx -- THE COMPOSED TWIN REPORT on the real as1 STEP file. Uses (and thereby regression- 2// tests) 9 gated organs in ONE flow: step_parse (structure) -> cr_find_parts (FILE-semantic part attribution: 3// SDR->PRODUCT + SDR->ABSR->BREP->SHELL->faces) -> per-part step_tess (planar) + step_nurbs (round, metrology- 4// exact) -> cr_weld (NEW: duplicate-vertex weld so downstream mesh organs are correct on tess output) -> 5// meshseg3d (connectivity) + meshthick (min wall) + partid (shape class) + unitconv (dual-dimension mm/thou, 6// self-checked against independent arithmetic) + assemseq (disassembly rank). Coverage counted honestly. 7// expect_exit: 0 license_tier: ORIGINAL 8import "nx_cadtwin_report.nx" 9 10func rg_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// print product name (arg 0 string of PRODUCT entity) 18func rg_pname(st: *i64, prodidx: i64, out2: *i64) -> i64 { 19 let ok: i64 = sp_arg_span(st, prodidx, 0, out2) 20 if ok == 0 { sp_puts("?" as *u8); return 0 } 21 let buf: *u8 = st[0] as *u8 22 var v: i64 = out2[0] 23 let e: i64 = out2[0] + out2[1] 24 var sk: i64 = 1 25 while sk == 1 { if v < e { if sp_isspace(buf[v] as i64) == 1 { v = v + 1 } else { sk = 0 } } else { sk = 0 } } 26 if v >= e { return 0 } 27 if buf[v] != (39 as u8) { return 0 } 28 let s0: i64 = v + 1 29 var w: i64 = s0 30 var go: i64 = 1 31 while go == 1 { if w < e { if buf[w] == (39 as u8) { go = 0 } else { w = w + 1 } } else { go = 0 } } 32 sys_write(1, ((buf as i64) + s0) as *u8, w - s0) 33 return 0 34} 35 36func main() -> i64 { 37 sp_puts("=== nx_cadtwin_report_gate -- THE TWIN REPORT: 9 organs composed on the real as1 STEP ===\n" as *u8) 38 let fails: *i64 = sys_mmap(8) as *i64 39 fails[0] = 0 40 let buf: *u8 = sys_mmap(4194304) 41 let aid: *i64 = sys_mmap(524288) as *i64 42 let anm: *i64 = sys_mmap(524288) as *i64 43 let anl: *i64 = sys_mmap(524288) as *i64 44 let aao: *i64 = sys_mmap(524288) as *i64 45 let aal: *i64 = sys_mmap(524288) as *i64 46 let st: *i64 = sys_mmap(256) as *i64 47 let n: i64 = sp_read_file("knowledge/fetched/step_as1.stp" as *u8, buf, 4194304) 48 if n <= 0 { sp_puts("MISSING step_as1.stp\nRED\n" as *u8); return 1 } 49 sp_init(st, buf, n, aid, anm, anl, aao, aal) 50 let cnt: i64 = sp_scan(st) 51 let out2: *i64 = sys_mmap(16) as *i64 52 53 // ---- organs setup (shared ctxs; per-part meshes) 54 let tt: *i64 = sys_mmap(128) as *i64 55 let cp: *i64 = sys_mmap(128) as *i64 56 var z: i64 = 0 57 while z < 16 { cp[z] = 0; z = z + 1 } 58 tt[0] = st as i64 59 tt[2] = cp as i64 60 tt[3] = sys_mmap(768) as i64 61 tt[4] = 0 62 tt[5] = sys_mmap(8192) as i64 63 tt[6] = sys_mmap(4096) as i64 64 tt[7] = sys_mmap(128) as i64 65 tt[8] = sys_mmap(16) as i64 66 tt[9] = 0 67 // v2 curve ctx + bound slab (complete tessellation: spline/Bezier/circle edges + hole bridging) 68 let t2: *i64 = sys_mmap(128) as *i64 69 t2[0] = st as i64 70 t2[1] = cp as i64 71 t2[2] = sys_mmap(32) as i64 72 t2[3] = sys_mmap(960) as i64 73 t2[4] = sys_mmap(1024) as i64 74 t2[5] = sys_mmap(128) as i64 75 t2[6] = sys_mmap(512) as i64 76 t2[7] = sys_mmap(256) as i64 77 t2[8] = sys_mmap(8192) as i64 78 t2[9] = sys_mmap(128) as i64 79 t2[10] = sys_mmap(768) as i64 80 t2[11] = sys_mmap(128) as i64 81 t2[12] = sys_mmap(256) as i64 82 let slab: *i64 = sys_mmap(20480) as *i64 83 let nt: *i64 = sys_mmap(128) as *i64 84 let c2: *i64 = sys_mmap(128) as *i64 85 z = 0 86 while z < 16 { c2[z] = 0; z = z + 1 } 87 nt[0] = st as i64 88 nt[2] = c2 as i64 89 nt[3] = sys_mmap(256) as i64 90 nt[4] = sys_mmap(64) as i64 91 nt[5] = sys_mmap(16) as i64 92 nt[6] = sys_mmap(128) as i64 93 nt[7] = sys_mmap(128) as i64 94 // units registry 95 let u: *i64 = sys_mmap(64) as *i64 96 ur_init(u, 64) 97 ur_std(u) 98 let iFX: i64 = ur_find(u, "fx256mm" as *u8) 99 let iTHOU: i64 = ur_find(u, "thou" as *u8) 100 let uout: *i64 = sys_mmap(16) as *i64 101 // disassembly order (nx_assemseq) 102 let pe: *i64 = sys_mmap(2048) as *i64 103 let ce: *i64 = sys_mmap(2048) as *i64 104 let en: i64 = sp_nauo_collect(st, pe, ce, 256) 105 let apd: *i64 = sys_mmap(2048) as *i64 106 let npd: i64 = asq_collect_pds(pe, ce, en, apd) 107 let rootpd: i64 = asq_root(pe, ce, en) 108 let depth: *i64 = sys_mmap(2048) as *i64 109 asq_depths(apd, npd, pe, ce, en, rootpd, depth) 110 let order: *i64 = sys_mmap(2048) as *i64 111 let no: i64 = asq_order(depth, npd, order) 112 113 // ---- parts from the FILE 114 let pdid: *i64 = sys_mmap(128) as *i64 115 let prodidx: *i64 = sys_mmap(128) as *i64 116 let shellidx: *i64 = sys_mmap(128) as *i64 117 let np: i64 = cr_find_parts(st, pdid, prodidx, shellidx) 118 sp_puts("entities=" as *u8); sp_putn(cnt) 119 sp_puts(" solid parts (from SDR->ABSR->BREP->SHELL)=" as *u8); sp_putn(np); sp_puts("\n" as *u8) 120 121 var t1: i64 = 0 122 var hasnut: i64 = 0 123 var hasbolt: i64 = 0 124 var hasrod: i64 = 0 125 var hasplate: i64 = 0 126 var hasbrkt: i64 = 0 127 var pi: i64 = 0 128 while pi < np { 129 if sp_prod_name_is(st, prodidx[pi], "nut" as *u8) == 1 { hasnut = 1 } 130 if sp_prod_name_is(st, prodidx[pi], "bolt" as *u8) == 1 { hasbolt = 1 } 131 if sp_prod_name_is(st, prodidx[pi], "rod" as *u8) == 1 { hasrod = 1 } 132 if sp_prod_name_is(st, prodidx[pi], "plate" as *u8) == 1 { hasplate = 1 } 133 if sp_prod_name_is(st, prodidx[pi], "l-bracket" as *u8) == 1 { hasbrkt = 1 } 134 pi = pi + 1 135 } 136 if np == 5 { if hasnut == 1 { if hasbolt == 1 { if hasrod == 1 { if hasplate == 1 { if hasbrkt == 1 { t1 = 1 } } } } } } 137 let ig1: i64 = rg_tooth("T1 FILE-attributed parts: 5 solids = nut/bolt/rod/plate/l-bracket" as *u8, t1, fails) 138 139 // ---- per-part pipeline 140 let out4: *i64 = sys_mmap(32) as *i64 141 let labels: *i64 = sys_mmap(65536) as *i64 142 let desc: *i64 = sys_mmap(16) as *i64 143 var sumfaces: i64 = 0 144 var sumtess: i64 = 0 145 var thickok: i64 = 0 146 var unitok: i64 = 0 147 var rankok: i64 = 0 148 var nutrank: i64 = 0 - 1 149 var platerank: i64 = 0 - 1 150 var roddesc0: i64 = 0 - 1 151 var platedesc0: i64 = 0 - 1 152 var platedesc1: i64 = 0 - 1 153 var platez: i64 = 0 - 1 154 var platemid: i64 = 0 - 1 155 var nutraw: i64 = 0 156 var nutweld: i64 = 0 157 var nuttris_b: i64 = 0 158 var nuttris_a: i64 = 0 159 var part0ck: i64 = 0 160 let meshes: *i64 = sys_mmap(64) as *i64 161 sp_puts("\n PART REPORT (real from-file geometry; every number measured):\n" as *u8) 162 pi = 0 163 while pi < np { 164 let mesh: i64 = sys_mmap(m3_bytes()) as i64 165 meshes[pi] = mesh 166 m3_init(mesh) 167 tt[1] = mesh 168 nt[1] = mesh 169 cr_tess_part(tt, nt, t2, slab, shellidx[pi], out4) 170 sumfaces = sumfaces + out4[0] 171 sumtess = sumtess + out4[1] 172 let h: *i64 = m3_hdr(mesh) 173 let rawv: i64 = h[0] 174 let trib: i64 = h[1] 175 let weldv: i64 = cr_weld(mesh) 176 let tria: i64 = h[1] 177 // measurements 178 pid_descriptor(mesh, desc) 179 let segk: i64 = ms_segment(mesh, 0 - 300, labels) 180 // min wall over faces (post-weld), misses counted 181 var minw: i64 = 0 - 1 182 var miss: i64 = 0 183 var f: i64 = 0 184 while f < h[1] { 185 let th: i64 = mtk_face_thickness(mesh, f) 186 if th > 0 { 187 if minw < 0 { minw = th } else { if th < minw { minw = th } } 188 } else { miss = miss + 1 } 189 f = f + 1 190 } 191 if minw > 0 { thickok = thickok + 1 } 192 // bbox 193 var mnx: i64 = 0 194 var mxx: i64 = 0 195 var mny: i64 = 0 196 var mxy: i64 = 0 197 var mnz: i64 = 0 198 var mxz: i64 = 0 199 if h[0] > 0 { 200 let v0: *i64 = m3_vert(mesh, 0) 201 mnx = v0[0]; mxx = v0[0]; mny = v0[1]; mxy = v0[1]; mnz = v0[2]; mxz = v0[2] 202 var vi: i64 = 1 203 while vi < h[0] { 204 let v: *i64 = m3_vert(mesh, vi) 205 if v[0] < mnx { mnx = v[0] } 206 if v[0] > mxx { mxx = v[0] } 207 if v[1] < mny { mny = v[1] } 208 if v[1] > mxy { mxy = v[1] } 209 if v[2] < mnz { mnz = v[2] } 210 if v[2] > mxz { mxz = v[2] } 211 vi = vi + 1 212 } 213 } 214 var ext: i64 = mxx - mnx 215 if mxy - mny > ext { ext = mxy - mny } 216 if mxz - mnz > ext { ext = mxz - mnz } 217 // dual-dimension: fx -> thou via the UNITS ORGAN, self-checked vs independent arithmetic 218 ur_conv(u, ext, iFX, iTHOU, uout) 219 let thou: i64 = uout[0] 220 let manual: i64 = (ext * 15625 + 50800) / 101600 221 if thou == manual { unitok = unitok + 1 } 222 // disassembly rank (join by PD id) 223 var rank: i64 = 0 - 1 224 var oi: i64 = 0 225 while oi < no { 226 if apd[order[oi]] == pdid[pi] { rank = oi } 227 oi = oi + 1 228 } 229 if rank >= 0 { rankok = rankok + 1 } 230 if sp_prod_name_is(st, prodidx[pi], "nut" as *u8) == 1 { 231 nutrank = rank 232 nutraw = rawv 233 nutweld = weldv 234 nuttris_b = trib 235 nuttris_a = tria 236 } 237 if sp_prod_name_is(st, prodidx[pi], "plate" as *u8) == 1 { 238 platerank = rank 239 platedesc0 = desc[0] 240 platedesc1 = desc[1] 241 platez = mxz - mnz 242 platemid = mxy - mny 243 if mxx - mnx < platemid { platemid = mxx - mnx } 244 } 245 if sp_prod_name_is(st, prodidx[pi], "rod" as *u8) == 1 { roddesc0 = desc[0] } 246 if pi == 0 { part0ck = cr_cksum(mesh) } 247 // ---- report row 248 sp_puts(" - " as *u8) 249 rg_pname(st, prodidx[pi], out2) 250 sp_puts(": faces " as *u8); sp_putn(out4[1]); sp_puts("/" as *u8); sp_putn(out4[0]) 251 sp_puts(" (planar " as *u8); sp_putn(out4[2]); sp_puts(" round " as *u8); sp_putn(out4[3]) 252 sp_puts(") verts " as *u8); sp_putn(rawv); sp_puts("->" as *u8); sp_putn(weldv) 253 sp_puts(" tris " as *u8); sp_putn(tria) 254 sp_puts(" bbox " as *u8); cr_mm2(mxx - mnx); sp_puts("x" as *u8); cr_mm2(mxy - mny); sp_puts("x" as *u8); cr_mm2(mxz - mnz) 255 sp_puts(" mm maxext " as *u8); cr_mm2(ext); sp_puts(" mm = " as *u8); sp_putn(thou) 256 sp_puts(" thou shape(" as *u8); sp_putn(desc[0]); sp_puts("," as *u8); sp_putn(desc[1]) 257 sp_puts(") minwall " as *u8) 258 if minw > 0 { cr_mm2(minw); sp_puts(" mm" as *u8) } else { sp_puts("n/a" as *u8) } 259 sp_puts(" (miss " as *u8); sp_putn(miss) 260 sp_puts(") segs " as *u8); sp_putn(segk) 261 sp_puts(" disasm-rank " as *u8); sp_putn(rank + 1) 262 sp_puts("\n" as *u8) 263 pi = pi + 1 264 } 265 266 var t2t: i64 = 0 267 if sumfaces == 53 { if sumtess == 53 { t2t = 1 } } 268 sp_puts("\n coverage: faces " as *u8); sp_putn(sumtess); sp_puts("/" as *u8); sp_putn(sumfaces); sp_puts(" tessellated (COMPLETE -- v2 spline/Bezier/circle edges + hole bridging)\n" as *u8) 269 let ig2: i64 = rg_tooth("T2 shells PARTITION the model: 53/53 faces tessellated (FILE-TRUE, matches tess2 gate)" as *u8, t2t, fails) 270 271 var t3: i64 = 0 272 if nutweld > 0 { if nutweld < nutraw { if nuttris_a == nuttris_b { t3 = 1 } } } 273 let ig3: i64 = rg_tooth("T3 WELD: nut duplicate verts merged (fewer verts), zero triangles lost" as *u8, t3, fails) 274 275 var t4: i64 = 0 276 if roddesc0 >= 0 { if roddesc0 < 300 { t4 = 1 } } 277 let ig4: i64 = rg_tooth("T4 shape class: rod is ROD-elongated (desc lambda2/lambda1 < 300 permille)" as *u8, t4, fails) 278 279 // T5 by BBOX (dimensional truth): plate is FLAT -- z-extent 20mm << 150mm mid-extent. (Vertex-covariance 280 // shape class is UNRELIABLE for the plate at 16/18 coverage: its big faces are hole-faces (skipped), so 281 // 92% of verts are hole-tube samples -- covariance measures the hole cluster, not the outline. Honest 282 // coverage artifact, printed above as shape(85,36); descriptor valid for fully-covered parts (nut/rod).) 283 var t5: i64 = 0 284 if platez > 0 { if platez * 5 < platemid { t5 = 1 } } 285 let ig5: i64 = rg_tooth("T5 plate is FLAT by BBOX truth (20mm z << 150mm; desc noted as coverage-biased)" as *u8, t5, fails) 286 287 var t6: i64 = 0 288 if thickok >= 3 { t6 = 1 } 289 let ig6: i64 = rg_tooth("T6 wall thickness measured on >=3/5 parts (open-mesh misses counted honestly)" as *u8, t6, fails) 290 291 var t7: i64 = 0 292 if rankok == 5 { if nutrank >= 0 { if platerank > nutrank { t7 = 1 } } } 293 let ig7: i64 = rg_tooth("T7 disassembly rank joined for 5/5 parts; nut comes out BEFORE plate" as *u8, t7, fails) 294 295 var t8: i64 = 0 296 if unitok == 5 { t8 = 1 } 297 let ig8: i64 = rg_tooth("T8 dual-dimensioning: units-organ thou == independent arithmetic for 5/5 parts" as *u8, t8, fails) 298 299 // T9 determinism: re-run part 0 300 let mesh9: i64 = sys_mmap(m3_bytes()) as i64 301 m3_init(mesh9) 302 tt[1] = mesh9 303 nt[1] = mesh9 304 cr_tess_part(tt, nt, t2, slab, shellidx[0], out4) 305 cr_weld(mesh9) 306 var t9: i64 = 0 307 if cr_cksum(mesh9) == part0ck { t9 = 1 } 308 let ig9: i64 = rg_tooth("T9 deterministic (part-0 pipeline re-run, identical checksum)" as *u8, t9, fails) 309 310 sp_puts("\nTHE COMPOSED TWIN: one STEP file in -> per-PART report out (file-semantic attribution, metrology\n" as *u8) 311 sp_puts("tessellation, weld, thickness, shape class, dual dimensions, teardown order) -- 9 gated organs in one\n" as *u8) 312 sp_puts("flow. Gaps stay visible: 13/53 faces (holes/full-circles) + open-mesh thickness misses are COUNTED.\n" as *u8) 313 sp_puts("\nfails=" as *u8); sp_putn(fails[0]); sp_puts("\n" as *u8) 314 if fails[0] == 0 { sp_puts("GREEN -- twin report 9/9 (the composed pipeline on real CAD data)\n" as *u8); return 0 } 315 sp_puts("RED\n" as *u8) 316 return 1 317}