From 9b34b8cfd03519c0b27f68f25bd8fd7d3e361d7a Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 21 Jun 2016 17:30:36 +0200 Subject: [PATCH] Added support for gcode arc commands (G2/G3) in IJ notation --- src/octoprint/static/gcodeviewer/js/Worker.js | 21 ++++++++++++++++++- .../static/gcodeviewer/js/renderer.js | 14 ++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/octoprint/static/gcodeviewer/js/Worker.js b/src/octoprint/static/gcodeviewer/js/Worker.js index e699cb28..4f3cf4ce 100644 --- a/src/octoprint/static/gcodeviewer/js/Worker.js +++ b/src/octoprint/static/gcodeviewer/js/Worker.js @@ -229,6 +229,7 @@ var doParse = function () { var layer = 0; var x, y, z = 0; + var center_i, center_j, direction; var prevX = 0, prevY = 0, prevZ = 0; var f, lastF = 4000; var extrude = false, extrudeRelative = false, retract = 0; @@ -251,6 +252,9 @@ var doParse = function () { y = undefined; z = undefined; retract = 0; + center_i = undefined; + center_j = undefined; + direction = undefined; var line = gcode[i].line; var percentage = gcode[i].percentage; @@ -263,7 +267,7 @@ var doParse = function () { var log = false; - if (/^(?:G0|G1)\s/i.test(line)) { + if (/^(?:G0|G1|G2|G3)\s/i.test(line)) { var args = line.split(/\s/); for (var j = 0; j < args.length; j++) { @@ -330,6 +334,18 @@ var doParse = function () { numSlice = parseFloat(args[j].slice(1)); lastF = numSlice; break; + case 'i': + center_i = Number(args[j].slice(1)); + break; + case 'j': + center_j = Number(args[j].slice(1)); + break; + case 'g': + if(args[j].charAt(1).toLowerCase()=='2') + direction=1; + if(args[j].charAt(1).toLowerCase()=='3') + direction=-1; + break; } } @@ -487,6 +503,9 @@ var doParse = function () { x: x, y: y, z: z, + i: center_i, + j: center_j, + direction: direction, extrude: extrude, retract: retract, noMove: !move, diff --git a/src/octoprint/static/gcodeviewer/js/renderer.js b/src/octoprint/static/gcodeviewer/js/renderer.js index 32f2195a..779354b5 100644 --- a/src/octoprint/static/gcodeviewer/js/renderer.js +++ b/src/octoprint/static/gcodeviewer/js/renderer.js @@ -490,7 +490,19 @@ GCODE.renderer = (function(){ ctx.lineWidth = renderOptions['extrusionWidth']; ctx.beginPath(); ctx.moveTo(prevX, prevY); - ctx.lineTo(x*zoomFactor,y*zoomFactor); + if(cmd.direction !== undefined && cmd.direction != 0){ + var cmd = cmds[i]; + var di = cmd.i*zoomFactor; + var dj = -1*cmd.j*zoomFactor; // Y-coordinate is inverted + var centerX = prevX+di; + var centerY = prevY+dj; + var startAngle = Math.atan2(prevY-centerY, prevX - centerX); + var endAngle = Math.atan2(y*zoomFactor-centerY, x*zoomFactor - centerX); + var radius=Math.sqrt(di*di+dj*dj); + ctx.arc(centerX,centerY,radius,startAngle,endAngle,cmd.direction<0); // Y-coordinate is inverted so direction is also inverted + } else { + ctx.lineTo(x*zoomFactor,y*zoomFactor); + } ctx.stroke(); } else { // we were previously retracting, now we are restarting => draw dot if configured to do so