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}