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}