From 88ea30c1285a68ce69e3ff43068a1e5a1c1c0ac9 Mon Sep 17 00:00:00 2001 From: Sameer Puri Date: Sat, 14 Aug 2021 20:30:52 -0400 Subject: [PATCH] track g-code 0.3 --- Cargo.lock | 6 +++--- cli/Cargo.toml | 2 +- cli/src/main.rs | 28 ++++++++++--------------- lib/Cargo.toml | 4 ++-- lib/src/lib.rs | 46 ------------------------------------------ web/Cargo.toml | 2 +- web/src/inputs.rs | 2 +- web/src/main.rs | 29 ++++++++++++-------------- web/src/spectre/mod.rs | 6 +++--- 9 files changed, 35 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9eb43de..60893c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -207,9 +207,9 @@ checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" [[package]] name = "g-code" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce6421233f5b738db44d6cf210465c2606cda44ed92cabd7920685506cb0c29" +checksum = "844e6deaab51dbee3328a56f233f3d8124cd62d4962c0f8783651ccaa4d88305" dependencies = [ "codespan", "codespan-reporting", @@ -593,7 +593,7 @@ dependencies = [ [[package]] name = "svg2gcode" -version = "0.0.3" +version = "0.0.4" dependencies = [ "euclid", "g-code", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index f08a797..7fae572 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -11,7 +11,7 @@ license = "MIT" svg2gcode = { path = "../lib" } env_logger = { version = "0", default-features = false, features = ["atty", "termcolor", "humantime"] } log = "0" -g-code = ">= 0.2.6" +g-code = "0.3" codespan-reporting = "0.11" structopt = "0.3" roxmltree = "0" diff --git a/cli/src/main.rs b/cli/src/main.rs index c2129ff..d70d69f 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,4 +1,7 @@ -use g_code::parse::snippet_parser; +use g_code::{ + emit::{format_gcode_io, FormatOptions}, + parse::snippet_parser, +}; use log::info; use std::{ env, @@ -8,9 +11,7 @@ use std::{ }; use structopt::StructOpt; -use svg2gcode::{ - set_origin, svg2program, tokens_into_gcode_bytes, ConversionOptions, Machine, Turtle, -}; +use svg2gcode::{set_origin, svg2program, ConversionOptions, Machine, Turtle}; #[derive(Debug, StructOpt)] #[structopt(name = "svg2gcode", author, about)] @@ -79,25 +80,18 @@ fn main() -> io::Result<()> { let snippets = [ opt.tool_on_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose(), opt.tool_off_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose(), opt.begin_sequence - .as_ref() - .map(String::as_str) - .map(snippet_parser) - .transpose(), - opt.end_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose(), + opt.end_sequence.as_deref().map(snippet_parser).transpose(), ]; let machine = if let [Ok(tool_on_action), Ok(tool_off_action), Ok(program_begin_sequence), Ok(program_end_sequence)] = @@ -164,8 +158,8 @@ fn main() -> io::Result<()> { set_origin(&mut program, origin); if let Some(out_path) = opt.out { - tokens_into_gcode_bytes(&program, File::create(out_path)?) + format_gcode_io(&program, FormatOptions::default(), File::create(out_path)?) } else { - tokens_into_gcode_bytes(&program, std::io::stdout()) + format_gcode_io(&program, FormatOptions::default(), std::io::stdout()) } } diff --git a/lib/Cargo.toml b/lib/Cargo.toml index c983d8e..fbdd3d8 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "svg2gcode" -version = "0.0.3" +version = "0.0.4" authors = ["Sameer Puri "] edition = "2018" description = "Convert paths in SVG files to GCode for a pen plotter, laser engraver, or other machine." @@ -8,7 +8,7 @@ repository = "https://github.com/sameer/svg2gcode" license = "MIT" [dependencies] -g-code = ">= 0.2.6" +g-code = "0.3" lyon_geom = ">= 0.17.2" euclid = "0.22" log = "0" diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 9b082fd..dd1a97c 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -1,5 +1,3 @@ -use std::io; - /// Converts an SVG to GCode in an internal representation mod converter; /// Emulates the state of an arbitrary machine that can run GCode @@ -16,50 +14,6 @@ pub use machine::Machine; pub use postprocess::set_origin; pub use turtle::Turtle; -/// Write GCode tokens to a byte sink in a nicely formatted manner -pub fn tokens_into_gcode_bytes( - program: &[g_code::emit::Token<'_>], - mut w: W, -) -> io::Result<()> { - use g_code::emit::Token::*; - let mut preceded_by_newline = true; - for token in program { - match token { - Field(f) => { - if !preceded_by_newline { - if matches!(f.letters.as_ref(), "G" | "M") { - writeln!(w)?; - } else { - write!(w, " ")?; - } - } - write!(w, "{}", f)?; - preceded_by_newline = false; - } - Comment { - is_inline: true, - inner, - } => { - write!(w, "({})", inner)?; - preceded_by_newline = false; - } - Comment { - is_inline: false, - inner, - } => { - writeln!(w, ";{}", inner)?; - preceded_by_newline = true; - } - _ => {} - } - } - // Ensure presence of trailing newline - if !preceded_by_newline { - writeln!(w)?; - } - Ok(()) -} - #[cfg(test)] mod test { use super::*; diff --git a/web/Cargo.toml b/web/Cargo.toml index 8b0bdb4..76b127a 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -12,7 +12,7 @@ license = "MIT" wasm-bindgen = "0.2" svg2gcode = { path = "../lib" } roxmltree = "0" -g-code = ">= 0.2.6" +g-code = "0.3" codespan-reporting = "0.11" codespan = "0.11" serde = "1" diff --git a/web/src/inputs.rs b/web/src/inputs.rs index 45832cb..6ad79ee 100644 --- a/web/src/inputs.rs +++ b/web/src/inputs.rs @@ -503,7 +503,7 @@ pub fn settings_form() -> Html { #[function_component(SvgInput)] pub fn svg_input() -> Html { let app = use_store::(); - let parsed_state = use_ref(|| vec![]); + let parsed_state = use_ref(Vec::default); let parsed_state_cloned = parsed_state.clone(); diff --git a/web/src/main.rs b/web/src/main.rs index 7efb1f3..c0d36ff 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -1,11 +1,12 @@ -use std::{io::Cursor, path::Path, rc::Rc}; +use std::{path::Path, rc::Rc}; -use g_code::parse::snippet_parser; +use g_code::{ + emit::{format_gcode_fmt, FormatOptions}, + parse::snippet_parser, +}; use log::Level; use roxmltree::Document; -use svg2gcode::{ - set_origin, svg2program, tokens_into_gcode_bytes, ConversionOptions, Machine, Turtle, -}; +use svg2gcode::{set_origin, svg2program, ConversionOptions, Machine, Turtle}; use wasm_bindgen::JsCast; use web_sys::HtmlElement; use yew::{prelude::*, utils::window}; @@ -77,29 +78,25 @@ impl Component for App { let machine = Machine::new( app_state .tool_on_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose() .unwrap(), app_state .tool_off_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose() .unwrap(), app_state .begin_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose() .unwrap(), app_state .end_sequence - .as_ref() - .map(String::as_str) + .as_deref() .map(snippet_parser) .transpose() .unwrap(), @@ -112,9 +109,9 @@ impl Component for App { set_origin(&mut program, app_state.origin); let gcode_base64 = { - let mut cursor = Cursor::new(vec![]); - tokens_into_gcode_bytes(&program, &mut cursor).unwrap(); - base64::encode(cursor.get_ref()) + let mut acc = String::new(); + format_gcode_fmt(&program, FormatOptions::default(), &mut acc).unwrap(); + base64::encode(acc.as_bytes()) }; let window = window(); diff --git a/web/src/spectre/mod.rs b/web/src/spectre/mod.rs index 4b7f361..34d6555 100644 --- a/web/src/spectre/mod.rs +++ b/web/src/spectre/mod.rs @@ -69,7 +69,7 @@ where let id = props.label.to_lowercase().replace(' ', "-"); let applied_default_value = use_state(|| false); - let node_ref = use_state(|| NodeRef::default()); + let node_ref = use_state(NodeRef::default); if let (false, Some(default), Some(input_element)) = ( *applied_default_value, @@ -279,7 +279,7 @@ where let id = props.label.to_lowercase().replace(' ', "-"); let applied_default_value = use_state(|| false); - let node_ref = use_state(|| NodeRef::default()); + let node_ref = use_state(NodeRef::default); if let (false, Some(default), Some(input_element)) = ( *applied_default_value, @@ -409,7 +409,7 @@ pub fn hyperlink_button(props: &HyperlinkButtonProps) -> Html { { props.title.map(Into::into).unwrap_or_else(|| html!()) } { if props.icon.is_some() && props.title.is_some() { " " } else { "" } } { - if let Some(name) = props.icon.clone() { + if let Some(name) = props.icon { html!{ }