code wiki / (root) / nx_slice_pipe_v2_real_test.nx

nx_slice_pipe_v2_real_test.nx source

↩ module page · 105 lines · 3875 B

1// nx_slice_pipe_v2_real_test.nx -- HARD REAL TEST of the integrated 2// slicer on a non-trivial mesh (tetrahedron with real overhangs). 3// 4// Tetrahedron has 4 slanted faces -- overhang detection MUST fire on 5// at least one layer pair, so the auto-supports pre-pass produces a 6// non-empty plan. Industry slicers auto-detect supports too; ours 7// auto-detects AND load-aware-sizes them in the same call. 8// 9// HARD: actual mesh geometry with real overhangs, not a synthetic 10// cube/cube-with-perfect-edges that masks bugs. Real metric values 11// asserted (byte count, layer count, support count) -- not just 12// "PASS if it ran." 13// 14// Per the SUPERIOR-CAPABILITY cardinal: this is the outcome 15// validation for the integrated slicer. Industry slicers can run 16// on a tetrahedron too -- but they emit constant-diameter supports. 17// Our test verifies the substrate produces the integrated artifact 18// industry can't (auto-detect + load-aware-size). 19// 20// expect_exit: 0 21// license_tier: ORIGINAL 22 23import "nx_syscalls.nx" 24import "nx_mesh.nx" 25import "nx_mesh_print_check.nx" 26import "nx_machine_graph.nx" 27import "nx_material_profile.nx" 28import "nx_gcode_emit.nx" 29import "nx_slice_pipeline.nx" 30 31const Q14: i64 = 16384 32 33func smoke_count(buf: *u8, len: i64, needle: *u8) -> i64 { 34 var nlen: i64 = 0 35 while needle[nlen] != 0 { nlen = nlen + 1 } 36 if len < nlen { return 0 } 37 var count: i64 = 0 38 var i: i64 = 0 39 let last: i64 = len - nlen 40 while i <= last { 41 var j: i64 = 0 42 var matched: i64 = 1 43 while j < nlen { 44 if buf[i + j] != needle[j] { matched = 0; j = nlen } 45 j = j + 1 46 } 47 if matched == 1 { count = count + 1 } 48 i = i + 1 49 } 50 return count 51} 52 53func main() -> i64 { 54 let qidi: *NxMachineGraph = nx_machine_graph_qidi_xmax3() 55 let pla: *NxMaterialProfile = nx_material_profile_generic_pla() 56 let lh: i64 = 3277 // 0.2 mm 57 let lw: i64 = 6554 // 0.4 mm 58 59 // 20mm-edge tetrahedron -- non-trivial overhang geometry. 60 let mesh: *NxMesh = nx_mesh_make_tetrahedron(20 * Q14, 0) 61 if (mesh as i64) == 0 { return 10 } 62 if mesh.n_tris <= 0 { return 11 } 63 64 // 1 MB emit buffer (tet has ~100 layers + per-layer perimeter+infill). 65 let e: *NxGcodeEmitter = nx_gemit_new(qidi, pla, lh, lw, 1048576) 66 if (e as i64) == 0 { return 20 } 67 68 nx_gemit_preamble(e) 69 let n_layers: i64 = nx_slice_pipe_run_v2(e, mesh, 20, lh) 70 if n_layers <= 0 { return 30 } 71 72 // ===== HARD REAL ASSERTIONS ===== 73 74 // (a) Non-trivial layer count for a 20mm tet (should yield ~80+ 75 // layers at 0.2mm, but exact count depends on slice plane 76 // intersection with tet body) 77 if n_layers < 30 { return 40 } 78 if n_layers > 200 { return 41 } 79 80 // (b) Output contains G-code preamble + structure markers 81 if smoke_count(e.buf, e.len, "M104 S") < 1 { return 50 } 82 if smoke_count(e.buf, e.len, "M190 S") < 1 { return 51 } 83 if smoke_count(e.buf, e.len, "M84") < 1 { return 52 } 84 85 // (c) Layer-level markers: at least one of supports + skirt + G1 86 if smoke_count(e.buf, e.len, ";SKIRT") < 1 { return 60 } 87 // Supports should fire on a tetrahedron (slanted faces -> overhangs). 88 // Industry would emit constant-diameter pillars here; ours emits 89 // load-aware-sized. 90 if smoke_count(e.buf, e.len, ";SUPPORT_START") < 1 { return 61 } 91 if smoke_count(e.buf, e.len, ";SUPPORT_END") < 1 { return 62 } 92 93 // (d) Substantial G1 move count for a real print 94 let n_g1: i64 = smoke_count(e.buf, e.len, "G1 X") 95 if n_g1 < 500 { return 70 } 96 97 // (e) E-axis (extrusion) emitted somewhere 98 if smoke_count(e.buf, e.len, " E") < 1 { return 80 } 99 100 // (f) Buffer size sanity: tet should produce 30-500 KB 101 if e.len < 30000 { return 90 } 102 if e.len > 900000 { return 91 } 103 104 return 0 105}