From f988912f6bc029fe792cb7ec7120d2c678c0a21a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 21:53:58 -0500 Subject: [PATCH] fix arc parsing (clockwise). clean up label preference restoration and apply to parsed gcode --- src/kiri/main.js | 21 +++++++++++---------- src/kiri/print.js | 43 +++++++++++++++++++++++++----------------- src/mode/fdm/export.js | 8 +++++--- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index a896f133..b397942f 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -936,10 +936,7 @@ updateSliderMax(true); setVisibleLayer(-1, 0); if (scale === 1) { - for (let label of STACKS.getLabels()) { - let check = `${mode}-${viewMode}-${label}`; - STACKS.setVisible(label, settings.labels[check] !== false); - } + updateStackLabelState(); } }); if (scale === 1) { @@ -1076,12 +1073,7 @@ updateSliderMax(true); setVisibleLayer(-1, 0); updateSpeeds(maxSpeed); - - // maatch label checkboxes to preference - for (let label of STACKS.getLabels()) { - let check = `${settings.mode}-${viewMode}-${label}`; - STACKS.setVisible(label, settings.labels[check] !== false); - } + updateStackLabelState(); // mark preview complete for export complete.preview = true; @@ -1104,6 +1096,14 @@ KIRI.export(...argsave); } + function updateStackLabelState() { + // match label checkboxes to preference + for (let label of STACKS.getLabels()) { + let check = `${settings.mode}-${viewMode}-${label}`; + STACKS.setVisible(label, settings.labels[check] !== false); + } + } + function loadCode(code, type) { setViewMode(VIEWS.PREVIEW); setOpacity(0); @@ -1119,6 +1119,7 @@ updateSliderMax(true); updateSpeeds(maxSpeed); showSlices(); + updateStackLabelState(); SPACE.update(); API.event.emit("code.loaded", {code, type}); }); diff --git a/src/kiri/print.js b/src/kiri/print.js index b2369eef..f9f7e475 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -133,7 +133,8 @@ maxf = 0, seq = [], autolayer = true, - newlayer = false; + newlayer = false, + arcdivs = Math.PI / 12; const output = scope.output = [ seq ]; const beltaxis = { X: "X", Y: "Z", Z: "Y", E: "E", F: "F" }; @@ -156,14 +157,24 @@ center.x = pos.X + rec.I; center.y = pos.Y + rec.J; //center.r = TODO + console.log("G[2,3] IJ not supported"); } else if (rec.R !== undefined) { - let pr2 = BASE.util.center2pr({ - x: pos.X, - y: pos.Y - }, { - x: rec.X, - y: rec.Y - }, rec.R)[g2 ? 1 : 0]; + let pd = { x: rec.X - pos.X, y: rec.Y - pos.Y }; + let dst = Math.sqrt(pd.x * pd.x + pd.y * pd.y) / 2; + let pr2; + if (Math.abs(dst - rec.R) < 0.001) { + // center point radius + pr2 = { x: (rec.X + pos.X) / 2, y: (rec.Y + pos.Y) / 2}; + } else { + // triangulate + pr2 = BASE.util.center2pr({ + x: pos.X, + y: pos.Y + }, { + x: rec.X, + y: rec.Y + }, rec.R)[g2 ? 1 : 0]; + } center.x = pr2.x; center.y = pr2.y; center.r = rec.R; @@ -172,23 +183,21 @@ } // line angles - // let a1 = Math.PI - Math.atan2(pos.Y - center.y, pos.X - center.x); - // let a2 = Math.PI - Math.atan2(rec.Y - center.y, rec.X - center.x); - let a1 = Math.PI - Math.atan2(center.y - pos.Y, center.x - pos.X); - let a2 = Math.PI - Math.atan2(center.y - rec.Y, center.x - rec.X); + let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X) + Math.PI; + let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X) + Math.PI; let ad = BASE.util.thetaDiff(a1, a2, true); - let steps = 20; + let steps = Math.floor(Math.abs(ad) / arcdivs); let step = (Math.abs(ad) > 0.001 ? ad : Math.PI * 2) / steps; - let rot = a2; + let rot = a1 + step; LOG({first: pos, last: rec, center, a1, a2, ad, step, rot, line}); // G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); let pc = { X: pos.X, Y: pos.Y }; - for (let i=0; i<=steps; i++) { + for (let i=0; i<=steps-2; i++) { let np = { - X: center.x + Math.sin(rot) * center.r, - Y: center.y + Math.cos(rot) * center.r + X: center.x + Math.cos(rot) * center.r, + Y: center.y + Math.sin(rot) * center.r }; rot += step; G0G1(false, [`X${np.X}`, `Y${np.Y}`, `E1`]); diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index b60d69b5..034ab597 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -505,12 +505,13 @@ let from = arcQ[0]; let to = arcQ.peek(); let cc = {x:0, y:0, z:0, r:0}; - let cl = arcQ.center.length; - for (let center of arcQ.center) { + let cl = 0; + for (let center of arcQ.center.filter(rec => !isNaN(rec.r))) { cc.x += center.x; cc.y += center.y; cc.z += center.z; cc.r += center.r; + cl++; } cc.x /= cl; cc.y /= cl; @@ -518,7 +519,8 @@ cc.r /= cl; // first arc point emitQrec(from); - console.log({first: from, last: arcQ.peek(), center: cc}); + // console.log(arcQ.slice(), arcQ.center); + // console.log({first: from, last: arcQ.peek(), center: cc}); // rest of arc to final point let dist = arcQ.slice(1).map(v => v.dist).reduce((a,v) => a+v); let emit = from.e;//arcQ.slice(1).map(v => v.e).reduce((a,v) => a+v);