Skip to main content

bulge_gcode/
lib.rs

1pub mod arc;
2pub mod precision;
3pub mod dialect;
4pub mod models;
5pub mod gcode;
6
7pub use precision::Precision;
8pub use models::{Vertex, Polyline};
9pub use gcode::{GCodeBuilder, CoordinateMode};
10
11use wasm_bindgen::prelude::wasm_bindgen;
12
13#[wasm_bindgen]
14pub fn generate_gcode(
15    data: &[f64],
16    closed: bool,
17    absolute: bool,
18    places: Option<usize>,
19    scale: Option<f64>
20) -> Option<String> {
21    if data.len() % 3 != 0 { return None; }
22
23    let default = Precision::default();
24    let precision = Precision::new(
25        places.unwrap_or(default.places),
26        scale.unwrap_or(default.scale)
27    );
28
29    let mut pline = Polyline::new();
30    pline.closed = closed;
31
32    for chunk in data.chunks_exact(3) {
33        // chunk = [x, y, bulge]
34        pline.add_vertex(Vertex::new(chunk[0], chunk[1], chunk[2]));
35    }
36
37    let mode = if absolute { CoordinateMode::Absolute } else { CoordinateMode::Relative };
38
39    GCodeBuilder::new(pline)
40        .with_mode(mode)
41        .with_precision(precision)
42        .build()
43}