From e973792ef6b9c9edbde3e7b7c61e9dfb4629b8ae Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 19 Jan 2023 21:56:41 -0500 Subject: [PATCH] update gcode parser to handle compact notations. fix up/over forced moves --- src/kiri-mode/cam/export.js | 3 ++- src/kiri-mode/cam/prepare.js | 16 +++++++++------- src/kiri/print.js | 26 +++++++++++++++++--------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/kiri-mode/cam/export.js b/src/kiri-mode/cam/export.js index 6753af74..3900abfa 100644 --- a/src/kiri-mode/cam/export.js +++ b/src/kiri-mode/cam/export.js @@ -386,6 +386,7 @@ CAM.export = function(print, online) { // collect tool info to add to header let toolz = {}, ctool; + const isOffset = offset && (offset.x || offset.y); // remap points as necessary for origins, offsets, inversions print.output.forEach(layer => { if (!Array.isArray(layer)) { @@ -403,7 +404,7 @@ CAM.export = function(print, online) { if (!point || point.mod) return; // ensure not point is modified twice point.mod = 1; - if (offset) { + if (isOffset) { point.x += offset.x; point.y += offset.y; } diff --git a/src/kiri-mode/cam/prepare.js b/src/kiri-mode/cam/prepare.js index 5a577bb5..333658b4 100644 --- a/src/kiri-mode/cam/prepare.js +++ b/src/kiri-mode/cam/prepare.js @@ -361,18 +361,20 @@ function prepEach(widget, settings, print, firstPoint, update) { maxToolDiam/2, zclear ), - mustGoUp = Math.max(maxz - point.z, maxz - lastPoint.z) >= tolerance, + maxZdelta = Math.max(maxz - point.z, maxz - lastPoint.z), + mustGoUp = maxZdelta >= tolerance, clearz = maxz; if (zmax_force) { clearz = maxz = zmax + zadd; } // up if any point between higher than start/outline, go up first - if (mustGoUp) { - layerPush(lastPoint.clone().setZ(clearz + ztOff), 0, 0, tool.getNumber()); - } - // move to point above target point - if (mustGoUp || point.z < maxz) { - layerPush(point.clone().setZ(clearz + ztOff), 0, 0, tool.getNumber()); + const zIsBelow = point.z < maxz; + if (mustGoUp || zIsBelow) { + const zClearance = clearz + ztOff; + if (zIsBelow) { + layerPush(lastPoint.clone().setZ(zClearance), 0, 0, tool.getNumber()); + } + layerPush(point.clone().setZ(zClearance), 0, 0, tool.getNumber()); // new pos for plunge calc deltaXY = 0; } diff --git a/src/kiri/print.js b/src/kiri/print.js index 9bb1da7e..d14124fe 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -216,13 +216,16 @@ class Print { const belt = opts.belt; const lines = gcode .toUpperCase() - .replace("X", " X") - .replace("Y", " Y") - .replace("Z", " Z") - .replace("A", " A") - .replace("E", " E") - .replace("F", " F") - .replace(" ", " ") + .replaceAll("X", " X") + .replaceAll("Y", " Y") + .replaceAll("Z", " Z") + .replaceAll("A", " A") + .replaceAll("E", " E") + .replaceAll("F", " F") + .replaceAll("G", " G") + .replaceAll("I", " I") + .replaceAll("J", " J") + .replaceAll(" ", " ") .split("\n"); const scope = this, @@ -264,7 +267,8 @@ class Print { autolayer = true, newlayer = false, arcdivs = Math.PI / 24, - hasmoved = false; + hasmoved = false, + lastG = 'G1'; const output = scope.output = [ seq ]; const beltaxis = { X: "X", Y: "Z", Z: "Y", E: "E", F: "F" }; @@ -359,6 +363,8 @@ class Print { const mov = {}; const axes = {}; + lastG = g0 ? 'G0' : 'G1'; + line.forEach(tok => { let axis = tok.charAt(0); if (morph && belt) { @@ -479,7 +485,9 @@ class Print { // line = `G0${line}`; // } line = line.trim().split(";")[0].split(" ").filter(v => v); - let cmd = line.shift(); + if (!line.length) return; + const c0 = line[0].charAt(0); + let cmd = ["X","Y","Z"].indexOf(c0) >= 0 ? lastG : line.shift(); if (!cmd) return; if (cmd.charAt(0) === 'T') { let ext = scope.settings.device.extruders;