From 8bc350fa8e4594ce833f9e4e94876e2266e4cf19 Mon Sep 17 00:00:00 2001 From: Teja Date: Thu, 29 Jan 2015 20:45:41 +0100 Subject: [PATCH] hacked the gCodeViewer to render into our svg preview --- .../svgtogcode/static/js/working_area.js | 31 ++++++- .../templates/override_index.jinja2 | 2 +- .../static/gcodeviewer/js/renderer.js | 84 ++++++++++++++++++- 3 files changed, 113 insertions(+), 4 deletions(-) diff --git a/src/octoprint/plugins/svgtogcode/static/js/working_area.js b/src/octoprint/plugins/svgtogcode/static/js/working_area.js index 71a204e6..2f3e5916 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/working_area.js +++ b/src/octoprint/plugins/svgtogcode/static/js/working_area.js @@ -70,9 +70,25 @@ $(function(){ return self.workingAreaWidthMM() / self.workingAreaWidthPx(); }); + // matrix scales svg units to display_pixels self.scaleMatrix = ko.computed(function(){ var m = new Snap.Matrix(); - m.scale(25.4/self.svgDPI() * 1/self.px2mm_factor()); + var factor = 25.4/self.svgDPI() * 1/self.px2mm_factor(); + if(!isNaN(factor)){ + m.scale(factor); + return m; + } + return m; + }); + + // matrix scales svg units to display_pixels + self.scaleMatrixMMtoDisplay = ko.computed(function(){ + var m = new Snap.Matrix(); + var factor = self.svgDPI()/25.4 ; + if(!isNaN(factor)){ + m.scale(factor); + return m; + } return m; }); @@ -89,7 +105,6 @@ $(function(){ }; self.move_laser = function(el){ - console.log(self.state.isOperational(), self.state.isPrinting() , "OP"); if(self.state.isOperational() && !self.state.isPrinting()){ var x = self.px2mm(event.offsetX); // var y = self.px2mm(event.toElement.offsetHeight - event.offsetY); // toElement.offsetHeight is always 0 on svg>* elements ??? @@ -226,8 +241,20 @@ $(function(){ var svg = ''+ tmpsvg +''; return svg; }; + + self.draw_gcode = function(points, intensity){ + var stroke_color = intensity === 0 ? '#BBBBBB' : '#FF0000'; + var d = 'M'+points.join(' '); + var p = snap.path(d).attr({ + fill: "none", + stroke: stroke_color, + strokeWidth: 1 + }); + snap.select('#gCodePreview').append(p); + }; self.onStartup = function(){ + GCODE.workingArea = self; // Temporary hack to use the gcode parser from the gCodeViewer self.files.workingArea = self; self.conversion.workingArea = self; $(window).resize(function(){ diff --git a/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 b/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 index 421038c7..772406cb 100644 --- a/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 +++ b/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 @@ -299,7 +299,7 @@ id="coordGrid" x="0" y="0" width="0" height="0" stroke="none" fill="none"> - + diff --git a/src/octoprint/static/gcodeviewer/js/renderer.js b/src/octoprint/static/gcodeviewer/js/renderer.js index 1b8e5b49..cd12144f 100644 --- a/src/octoprint/static/gcodeviewer/js/renderer.js +++ b/src/octoprint/static/gcodeviewer/js/renderer.js @@ -341,7 +341,89 @@ GCODE.renderer = (function(){ ctx.stroke(); }; - var drawLayer = function(layerNum, fromProgress, toProgress, isNotCurrentLayer){ +var drawLayer = function(layerNum, fromProgress, toProgress, isNotCurrentLayer){ + if(GCODE.workingArea){ + if (!model || !model[layerNum]) return; + + var cmds = model[layerNum]; + var x, y; + + //~~ find our initial prevX/prevY tuple + + if (typeof(cmds[0].prevX) !== 'undefined' && typeof(cmds[0].prevY) !== 'undefined') { + // command contains prevX/prevY values, use those + prevX = cmds[0].prevX; // * zoomFactor; + prevY = -1 * cmds[0].prevY; // * zoomFactor; + } else if (fromProgress > 0) { + // previous command in same layer exists, use x/y as prevX/prevY + prevX = cmds[fromProgress - 1].x; // * zoomFactor; + prevY = -cmds[fromProgress - 1].y; // * zoomFactor; + } else if (model[layerNum - 1]) { + // previous layer exists, use last x/y as prevX/prevY + prevX = undefined; + prevY = undefined; + for (i = model[layerNum-1].length-1; i >= 0; i--) { + if (typeof(prevX) === 'undefined' && typeof(model[layerNum - 1][i].x) !== 'undefined') prevX = model[layerNum - 1][i].x; // * zoomFactor; + if (typeof(prevY) === 'undefined' && typeof(model[layerNum - 1][i].y) !== 'undefined') prevY =- model[layerNum - 1][i].y; // * zoomFactor; + } + } + + // if we did not find prevX or prevY, set it to 0 (might be that we are on the first command of the first layer, + // or it's just a very weird model...) + if (typeof(prevX) === 'undefined') prevX = 0; + if (typeof(prevY) === 'undefined') prevY = 0; + + //~~ render this layer's commands + + var lastLaser = 0; + var points = []; + for (var i = fromProgress; i <= toProgress; i++) { + ctx.lineWidth = 1; + + if (typeof(cmds[i]) === 'undefined') continue; + + if (typeof(cmds[i].prevX) !== 'undefined' && typeof(cmds[i].prevY) !== 'undefined') { + // override new (prevX, prevY) + prevX = cmds[i].prevX; // * zoomFactor; + prevY = -1 * cmds[i].prevY; // * zoomFactor; + } + + // new x + if (typeof(cmds[i].x) === 'undefined' || isNaN(cmds[i].x)) { + x = prevX ;// / zoomFactor; + } else { + x = cmds[i].x; + } + + // new y + if (typeof(cmds[i].y) === 'undefined' || isNaN(cmds[i].y)) { + y = prevY;// / zoomFactor; + } else { + y = -cmds[i].y; + } + + console.log("cmd", cmds[i]); + if(lastLaser !== cmds[i].laser){ + + GCODE.workingArea.draw_gcode(points, lastLaser); + console.log("points", points, lastLaser, cmds[i].laser); + points = [[prevX,prevY]]; + lastLaser = cmds[i].laser; + } + points.push([x,y]); + + + + prevX = x ; + prevY = y ; + } + GCODE.workingArea.draw_gcode(points, lastLaser); + console.log("final", points, lastLaser); + + } +}; + + var drawLayer2 = function(layerNum, fromProgress, toProgress, isNotCurrentLayer){ var i; var mdlInfo = GCODE.gCodeReader.getModelInfo();