track g-code 0.3

master
Sameer Puri 4 years ago
parent 328bc16f08
commit 88ea30c128

6
Cargo.lock generated

@ -207,9 +207,9 @@ checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99"
[[package]] [[package]]
name = "g-code" name = "g-code"
version = "0.2.6" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ce6421233f5b738db44d6cf210465c2606cda44ed92cabd7920685506cb0c29" checksum = "844e6deaab51dbee3328a56f233f3d8124cd62d4962c0f8783651ccaa4d88305"
dependencies = [ dependencies = [
"codespan", "codespan",
"codespan-reporting", "codespan-reporting",
@ -593,7 +593,7 @@ dependencies = [
[[package]] [[package]]
name = "svg2gcode" name = "svg2gcode"
version = "0.0.3" version = "0.0.4"
dependencies = [ dependencies = [
"euclid", "euclid",
"g-code", "g-code",

@ -11,7 +11,7 @@ license = "MIT"
svg2gcode = { path = "../lib" } svg2gcode = { path = "../lib" }
env_logger = { version = "0", default-features = false, features = ["atty", "termcolor", "humantime"] } env_logger = { version = "0", default-features = false, features = ["atty", "termcolor", "humantime"] }
log = "0" log = "0"
g-code = ">= 0.2.6" g-code = "0.3"
codespan-reporting = "0.11" codespan-reporting = "0.11"
structopt = "0.3" structopt = "0.3"
roxmltree = "0" roxmltree = "0"

@ -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 log::info;
use std::{ use std::{
env, env,
@ -8,9 +11,7 @@ use std::{
}; };
use structopt::StructOpt; use structopt::StructOpt;
use svg2gcode::{ use svg2gcode::{set_origin, svg2program, ConversionOptions, Machine, Turtle};
set_origin, svg2program, tokens_into_gcode_bytes, ConversionOptions, Machine, Turtle,
};
#[derive(Debug, StructOpt)] #[derive(Debug, StructOpt)]
#[structopt(name = "svg2gcode", author, about)] #[structopt(name = "svg2gcode", author, about)]
@ -79,25 +80,18 @@ fn main() -> io::Result<()> {
let snippets = [ let snippets = [
opt.tool_on_sequence opt.tool_on_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose(), .transpose(),
opt.tool_off_sequence opt.tool_off_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose(), .transpose(),
opt.begin_sequence opt.begin_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser)
.transpose(),
opt.end_sequence
.as_ref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose(), .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)] = 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); set_origin(&mut program, origin);
if let Some(out_path) = opt.out { 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 { } else {
tokens_into_gcode_bytes(&program, std::io::stdout()) format_gcode_io(&program, FormatOptions::default(), std::io::stdout())
} }
} }

@ -1,6 +1,6 @@
[package] [package]
name = "svg2gcode" name = "svg2gcode"
version = "0.0.3" version = "0.0.4"
authors = ["Sameer Puri <crates@purisa.me>"] authors = ["Sameer Puri <crates@purisa.me>"]
edition = "2018" edition = "2018"
description = "Convert paths in SVG files to GCode for a pen plotter, laser engraver, or other machine." 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" license = "MIT"
[dependencies] [dependencies]
g-code = ">= 0.2.6" g-code = "0.3"
lyon_geom = ">= 0.17.2" lyon_geom = ">= 0.17.2"
euclid = "0.22" euclid = "0.22"
log = "0" log = "0"

@ -1,5 +1,3 @@
use std::io;
/// Converts an SVG to GCode in an internal representation /// Converts an SVG to GCode in an internal representation
mod converter; mod converter;
/// Emulates the state of an arbitrary machine that can run GCode /// 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 postprocess::set_origin;
pub use turtle::Turtle; pub use turtle::Turtle;
/// Write GCode tokens to a byte sink in a nicely formatted manner
pub fn tokens_into_gcode_bytes<W: std::io::Write>(
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)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;

@ -12,7 +12,7 @@ license = "MIT"
wasm-bindgen = "0.2" wasm-bindgen = "0.2"
svg2gcode = { path = "../lib" } svg2gcode = { path = "../lib" }
roxmltree = "0" roxmltree = "0"
g-code = ">= 0.2.6" g-code = "0.3"
codespan-reporting = "0.11" codespan-reporting = "0.11"
codespan = "0.11" codespan = "0.11"
serde = "1" serde = "1"

@ -503,7 +503,7 @@ pub fn settings_form() -> Html {
#[function_component(SvgInput)] #[function_component(SvgInput)]
pub fn svg_input() -> Html { pub fn svg_input() -> Html {
let app = use_store::<AppStore>(); let app = use_store::<AppStore>();
let parsed_state = use_ref(|| vec![]); let parsed_state = use_ref(Vec::default);
let parsed_state_cloned = parsed_state.clone(); let parsed_state_cloned = parsed_state.clone();

@ -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 log::Level;
use roxmltree::Document; use roxmltree::Document;
use svg2gcode::{ use svg2gcode::{set_origin, svg2program, ConversionOptions, Machine, Turtle};
set_origin, svg2program, tokens_into_gcode_bytes, ConversionOptions, Machine, Turtle,
};
use wasm_bindgen::JsCast; use wasm_bindgen::JsCast;
use web_sys::HtmlElement; use web_sys::HtmlElement;
use yew::{prelude::*, utils::window}; use yew::{prelude::*, utils::window};
@ -77,29 +78,25 @@ impl Component for App {
let machine = Machine::new( let machine = Machine::new(
app_state app_state
.tool_on_sequence .tool_on_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose() .transpose()
.unwrap(), .unwrap(),
app_state app_state
.tool_off_sequence .tool_off_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose() .transpose()
.unwrap(), .unwrap(),
app_state app_state
.begin_sequence .begin_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose() .transpose()
.unwrap(), .unwrap(),
app_state app_state
.end_sequence .end_sequence
.as_ref() .as_deref()
.map(String::as_str)
.map(snippet_parser) .map(snippet_parser)
.transpose() .transpose()
.unwrap(), .unwrap(),
@ -112,9 +109,9 @@ impl Component for App {
set_origin(&mut program, app_state.origin); set_origin(&mut program, app_state.origin);
let gcode_base64 = { let gcode_base64 = {
let mut cursor = Cursor::new(vec![]); let mut acc = String::new();
tokens_into_gcode_bytes(&program, &mut cursor).unwrap(); format_gcode_fmt(&program, FormatOptions::default(), &mut acc).unwrap();
base64::encode(cursor.get_ref()) base64::encode(acc.as_bytes())
}; };
let window = window(); let window = window();

@ -69,7 +69,7 @@ where
let id = props.label.to_lowercase().replace(' ', "-"); let id = props.label.to_lowercase().replace(' ', "-");
let applied_default_value = use_state(|| false); 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)) = ( if let (false, Some(default), Some(input_element)) = (
*applied_default_value, *applied_default_value,
@ -279,7 +279,7 @@ where
let id = props.label.to_lowercase().replace(' ', "-"); let id = props.label.to_lowercase().replace(' ', "-");
let applied_default_value = use_state(|| false); 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)) = ( if let (false, Some(default), Some(input_element)) = (
*applied_default_value, *applied_default_value,
@ -409,7 +409,7 @@ pub fn hyperlink_button(props: &HyperlinkButtonProps) -> Html {
{ props.title.map(Into::into).unwrap_or_else(|| html!()) } { props.title.map(Into::into).unwrap_or_else(|| html!()) }
{ if props.icon.is_some() && props.title.is_some() { " " } else { "" } } { if props.icon.is_some() && props.title.is_some() { " " } else { "" } }
{ {
if let Some(name) = props.icon.clone() { if let Some(name) = props.icon {
html!{ html!{
<Icon name={name} /> <Icon name={name} />
} }

Loading…
Cancel
Save