code wiki / _hdl_build / nx_slicer_lib.nx

nx_slicer_lib.nx source

↩ module page · 67 lines · 2723 B

1// nx_slicer_lib.nx -- the sovereign STL->G-code slice core (no main). 2// 3// Composes the SHIPPED, GATE-PROVEN slicer stack (proven end-to-end by 4// nx_stl_to_gcode_real_test): nx_stl_load_binary -> nx_gemit_new(machine, 5// material) -> nx_gemit_preamble -> nx_slice_pipe_run_v2. This is the 6// SOVEREIGN alternative to third-party OrcaSlicer / PrusaSlicer / Cura -- 7// our own geometry -> toolpath -> G-code, offline, deterministic. 8// 9// license_tier: ORIGINAL 10import "nx_syscalls.nx" 11import "nx_mesh.nx" 12import "nx_stl.nx" 13import "nx_machine_graph.nx" 14import "nx_material_profile.nx" 15import "nx_gcode_emit.nx" 16import "nx_slice_pipeline.nx" 17 18const SL_LINE_W: i64 = 6554 // 0.4 mm line width (Q14-ish, matches E2E) 19const SL_GCODE_CAP: i64 = 4194304 // 4 MB emitter buffer 20 21func sl_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 22func sl_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { d[o] = s[i]; o = o + 1; i = i + 1 } return o } 23func sl_catn(d: *u8, o: i64, v: i64) -> i64 { 24 let t: *u8 = sys_mmap(28) 25 var m: i64 = v 26 if m < 0 { d[o] = 45 as u8; o = o + 1; m = 0 - m } 27 var k: i64 = 0 28 if m == 0 { t[0] = 48 as u8; k = 1 } 29 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 30 var i: i64 = 0 31 while i < k { d[o] = t[k-1-i]; o = o + 1; i = i + 1 } 32 return o 33} 34func sl_atoi(s: *u8) -> i64 { 35 var v: i64 = 0 36 var i: i64 = 0 37 while s[i] != (0 as u8) { 38 let c: i64 = s[i] & 0xff 39 if c < 48 { return v } 40 if c > 57 { return v } 41 v = v * 10 + (c - 48) 42 i = i + 1 43 } 44 return v 45} 46 47// Slice raw binary-STL bytes -> a G-code emitter (e.buf / e.len hold the G-code). 48// Returns the emitter, or NULL on any failure; n_layers_out[0] + n_tris_out[0] set. 49func sl_slice_stl(stl: *u8, stl_len: i64, layer_h: i64, infill: i64, 50 n_layers_out: *i64, n_tris_out: *i64) -> *NxGcodeEmitter { 51 n_layers_out[0] = 0 52 n_tris_out[0] = 0 53 let r: *NxStlResult = nx_stl_load_binary(stl, stl_len) 54 if r.verdict != NX_STL_OK { return 0 as *NxGcodeEmitter } 55 n_tris_out[0] = r.n_tris_header 56 let mesh: *NxMesh = r.mesh 57 if (mesh as i64) == 0 { return 0 as *NxGcodeEmitter } 58 let qidi: *NxMachineGraph = nx_machine_graph_qidi_xmax3() 59 let pla: *NxMaterialProfile = nx_material_profile_generic_pla() 60 let e: *NxGcodeEmitter = nx_gemit_new(qidi, pla, layer_h, SL_LINE_W, SL_GCODE_CAP) 61 if (e as i64) == 0 { return 0 as *NxGcodeEmitter } 62 nx_gemit_preamble(e) 63 let n_layers: i64 = nx_slice_pipe_run_v2(e, mesh, infill, layer_h) 64 if n_layers <= 0 { return 0 as *NxGcodeEmitter } 65 n_layers_out[0] = n_layers 66 return e 67}