diff --git a/src/octoprint/static/gcodeviewer/js/Worker.js b/src/octoprint/static/gcodeviewer/js/Worker.js index e0aa50f5..a8421d44 100644 --- a/src/octoprint/static/gcodeviewer/js/Worker.js +++ b/src/octoprint/static/gcodeviewer/js/Worker.js @@ -11,22 +11,24 @@ var gCodeOptions = { sortLayers: false, purgeEmptyLayers: true, - analyzeModel: false + analyzeModel: false, + toolOffsets: [ + {x: 0, y: 0}, + {x: 0, y: -21.6} + ] }; var max = {x: undefined, y: undefined, z: undefined}; var min = {x: undefined, y: undefined, z: undefined}; var modelSize = {x: undefined, y: undefined, z: undefined}; var filamentByLayer = {}; - var totalFilament=0; - var printTime=0; + var totalFilament = [0]; + var printTime = 0; var printTimeByLayer = {}; - var layerHeight=0; + var layerHeight = 0; var layerCnt = 0; var speeds = {extrude: [], retract: [], move: []}; var speedsByLayer = {extrude: {}, retract: {}, move: {}}; - - var sendLayerToParent = function(layerNum, z, progress){ self.postMessage({ "cmd": "returnLayer", @@ -79,7 +81,7 @@ max: max, min: min, modelSize: modelSize, - totalFilament:totalFilament, + totalFilament: totalFilament, filamentByLayer: filamentByLayer, printTime: printTime, layerHeight: layerHeight, @@ -106,95 +108,108 @@ layerCnt+=1; } } -// self.postMessage('LayerCnt: ' + layerCnt); }; - var analyzeModel = function(){ - var i,j; - var x_ok=false, y_ok=false; - var cmds; - var tmp1= 0, tmp2=0; - var speedIndex=0; + var analyzeModel = function() { + var tmp1 = 0, tmp2 = 0; + var speedIndex = 0; var type; - var printTimeAdd=0; -// var moveTime=0; + var printTimeAdd = 0; - for(i=0;iparseFloat(cmds[j].x)?parseFloat(max.x):parseFloat(cmds[j].x); - max.x = parseFloat(max.x)>parseFloat(cmds[j].prevX)?parseFloat(max.x):parseFloat(cmds[j].prevX); - min.x = parseFloat(min.x)parseFloat(cmds[j].y)?parseFloat(max.y):parseFloat(cmds[j].y); - max.y = parseFloat(max.y)>parseFloat(cmds[j].prevY)?parseFloat(max.y):parseFloat(cmds[j].prevY); - min.y = parseFloat(min.y)parseFloat(cmds[j].prevZ)?parseFloat(max.z):parseFloat(cmds[j].prevZ); - min.z = parseFloat(min.z)=tmp2?tmp1:tmp2; - }else if(cmds[j].retract!==0){ - printTimeAdd = Math.abs(parseFloat(cmds[j].extrusion)/(cmds[j].speed/60)); + if (x_ok && y_ok) { + printTimeAdd = Math.sqrt(Math.pow(cmds[j].x - cmds[j].prevX, 2) + Math.pow(cmds[j].y - cmds[j].prevY,2)) / (cmds[j].speed / 60); + } else if (cmds[j].retract === 0 && cmds[j].extrusion !== 0) { + tmp1 = Math.sqrt(Math.pow(cmds[j].x - cmds[j].prevX, 2) + Math.pow(cmds[j].y - cmds[j].prevY, 2)) / (cmds[j].speed/60); + tmp2 = Math.abs(cmds[j].extrusion / (cmds[j].speed / 60)); + printTimeAdd = Math.max(tmp1, tmp2); + } else if (cmds[j].retract !== 0) { + printTimeAdd = Math.abs(cmds[j].extrusion / (cmds[j].speed/60)); } printTime += printTimeAdd; - if(typeof(printTimeByLayer[cmds[j].prevZ])==='undefined'){printTimeByLayer[cmds[j].prevZ]=0;} + if (typeof(printTimeByLayer[cmds[j].prevZ]) === 'undefined') { + printTimeByLayer[cmds[j].prevZ] = 0; + } printTimeByLayer[cmds[j].prevZ] += printTimeAdd; - if(cmds[j].extrude&&cmds[j].retract===0){ + if (cmds[j].extrude && cmds[j].retract === 0){ type = 'extrude'; - }else if(cmds[j].retract!==0){ + } else if (cmds[j].retract !== 0) { type = 'retract'; - }else if(!cmds[j].extrude&&cmds[j].retract===0){ + } else if (!cmds[j].extrude && cmds[j].retract === 0) { type = 'move'; - // if(cmds[j].prevZ == '17.1'){ - // self.postMessage({cmd: 'Got speed ' + cmds[j].speed + 'with line ' + cmds[j].gcodeLine}); - // } - }else { + } else { self.postMessage({cmd: 'unknown type of move'}); type = 'unknown'; } + speedIndex = speeds[type].indexOf(cmds[j].speed); if (speedIndex === -1) { speeds[type].push(cmds[j].speed); speedIndex = speeds[type].indexOf(cmds[j].speed); } - if(typeof(speedsByLayer[type][cmds[j].prevZ]) === 'undefined'){ + if (typeof(speedsByLayer[type][cmds[j].prevZ]) === 'undefined'){ speedsByLayer[type][cmds[j].prevZ] = []; } - if(speedsByLayer[type][cmds[j].prevZ].indexOf(cmds[j].speed) === -1){ + if (speedsByLayer[type][cmds[j].prevZ].indexOf(cmds[j].speed) === -1){ speedsByLayer[type][cmds[j].prevZ][speedIndex] = cmds[j].speed; } } - sendSizeProgress(i/model.length*100); + sendSizeProgress(i / model.length * 100); } purgeLayers(); @@ -202,30 +217,39 @@ modelSize.x = Math.abs(max.x - min.x); modelSize.y = Math.abs(max.y - min.y); modelSize.z = Math.abs(max.z - min.z); - layerHeight = (max.z-min.z)/(layerCnt-1); + layerHeight = (max.z-min.z) / (layerCnt - 1); sendAnalyzeDone(); }; var doParse = function(){ var argChar, numSlice; - model=[]; var sendLayer = undefined; var sendLayerZ = 0; var sendMultiLayer = []; var sendMultiLayerZ = []; var lastSend = 0; - // console.time("parseGCode timer"); - var reg = new RegExp(/^(?:G0|G1)\s/i); - var comment = new RegExp() - var j, layer= 0, extrude=false, prevRetract= 0, retract=0, x, y, z=0, f, prevZ=0, prevX, prevY,lastF=4000, prev_extrude = {a: undefined, b: undefined, c: undefined, e: undefined, abs: undefined}, extrudeRelative=false; + + var layer = 0; + var x, y, z = 0; + var prevX = 0, prevY = 0, prevZ = 0; + var f, lastF = 4000; + var extrude = false, extrudeRelative = false, retract = 0; + var positionRelative = false; + var dcExtrude=false; var assumeNonDC = false; - for(var i=0;i0; - if(prev_extrude["abs"]<0){ - prevRetract = -1; + extrude = prev_extrude[tool]["abs"] > 0; + if (prev_extrude[tool]["abs"] < 0) { + prev_retract[tool] = -1; retract = -1; - } - else if(prev_extrude["abs"]==0){ + } else if (prev_extrude[tool]["abs"] == 0) { retract = 0; - }else if(prev_extrude["abs"]>0&&prevRetract < 0){ - prevRetract = 0; + } else if (prev_extrude[tool]["abs"] > 0 && prev_retract[tool] < 0) { + prev_retract[tool] = 0; retract = 1; } else { retract = 0; } - prev_extrude[argChar] = numSlice; break; + case 'f': - numSlice = args[j].slice(1); + numSlice = parseFloat(args[j].slice(1)); lastF = numSlice; break; + default: break; } } - if(dcExtrude&&!assumeNonDC){ + + if (dcExtrude && !assumeNonDC) { extrude = true; - prev_extrude["abs"] = Math.sqrt((prevX-x)*(prevX-x)+(prevY-y)*(prevY-y)); + prev_extrude[tool]["abs"] = Math.sqrt((prevX - x) * (prevX - x) + (prevY - y) * (prevY - y)); } - if(!model[layer])model[layer]=[]; - if(typeof(x) !== 'undefined' || typeof(y) !== 'undefined' ||typeof(z) !== 'undefined'||retract!=0) model[layer][model[layer].length] = {x: Number(x), y: Number(y), z: Number(z), extrude: extrude, retract: Number(retract), noMove: false, extrusion: (extrude||retract)?Number(prev_extrude["abs"]):0, prevX: Number(prevX), prevY: Number(prevY), prevZ: Number(prevZ), speed: Number(lastF), gcodeLine: Number(i), percentage: percentage}; - //{x: x, y: y, z: z, extrude: extrude, retract: retract, noMove: false, extrusion: (extrude||retract)?prev_extrude["abs"]:0, prevX: prevX, prevY: prevY, prevZ: prevZ, speed: lastF, gcodeLine: i}; - if(typeof(x) !== 'undefined') prevX = x; - if(typeof(y) !== 'undefined') prevY = y; - } else if(line.match(/^(?:M82)/i)){ + + if (typeof(x) !== 'undefined' || typeof(y) !== 'undefined' || typeof(z) !== 'undefined' || retract != 0) { + addToModel = true; + move = true; + } + } else if (/^(?:M82)/i.test(line)) { extrudeRelative = false; - }else if(line.match(/^(?:G91)/i)){ - extrudeRelative=true; - }else if(line.match(/^(?:G90)/i)){ - extrudeRelative=false; - }else if(line.match(/^(?:M83)/i)){ - extrudeRelative=true; - }else if(line.match(/^(?:M101)/i)){ - dcExtrude=true; - }else if(line.match(/^(?:M103)/i)){ - dcExtrude=false; - }else if(line.match(/^(?:G92)/i)){ + } else if (/^(?:G91)/i.test(line)) { + positionRelative = true; + extrudeRelative = true; + } else if (/^(?:G90)/i.test(line)) { + positionRelative = false; + extrudeRelative = false; + } else if (/^(?:M83)/i.test(line)) { + extrudeRelative = true; + } else if (/^(?:M101)/i.test(line)) { + dcExtrude = true; + } else if (/^(?:M103)/i.test(line)) { + dcExtrude = false; + } else if (/^(?:G92)/i.test(line)) { var args = line.split(/\s/); - for(j=0;j reset all axes to 0 + x = 0; + y = 0; + z = 0; + prev_extrude[tool]["e"] = 0; + prev_extrude[tool]["a"] = 0; + prev_extrude[tool]["b"] = 0; + prev_extrude[tool]["c"] = 0; + } else { + switch (argChar = args[j].charAt(0).toLowerCase()) { + case 'x': + x = Number(args[j].slice(1)) + offset.x; + break; + case 'y': + y = Number(args[j].slice(1)) + offset.y; + break; + case 'z': + z = Number(args[j].slice(1)); + prevZ = z; + break; + case 'e'||'a'||'b'||'c': + numSlice = Number(args[j].slice(1)); + if(!extrudeRelative) + prev_extrude[tool][argChar] = 0; + else { + prev_extrude[tool][argChar] = numSlice; + } + break; + default: + break; + } } } - if(!model[layer])model[layer]=[]; - if(typeof(x) !== 'undefined' || typeof(y) !== 'undefined' ||typeof(z) !== 'undefined') model[layer][model[layer].length] = {x: parseFloat(x), y: parseFloat(y), z: parseFloat(z), extrude: extrude, retract: parseFloat(retract), noMove: true, extrusion: (extrude||retract)?parseFloat(prev_extrude["abs"]):0, prevX: parseFloat(prevX), prevY: parseFloat(prevY), prevZ: parseFloat(prevZ), speed: parseFloat(lastF),gcodeLine: parseFloat(i), percentage: percentage}; - }else if(line.match(/^(?:G28)/i)){ - var args = line.split(/\s/); - for(j=0;j home all axis + x = 0; + y = 0; + z = 0; + } else { + for(j = 0; j < args.length; j++){ + switch(argChar = args[j].charAt(0).toLowerCase()){ + case 'x': + x = 0; + break; + case 'y': + y = 0; + break; + case 'z': + z = 0; + break; + default: + break; + } + } + } + + // if it's the first layer and G28 was without z + if (layer == 0 && typeof(z) === 'undefined') { + z = 0; + } + + if (typeof(x) !== 'undefined' || typeof(y) !== 'undefined' || typeof(z) !== 'undefined' || retract != 0) { + addToModel = true; + move = true; + } + } else if (/^(?:T\d+)/i.test(line)) { + tool = Number(line.split(/\s/)[0].slice(1)); + if (!prev_extrude[tool]) prev_extrude[tool] = {a: 0, b: 0, c: 0, e: 0, abs: 0}; + if (!prev_retract[tool]) prev_retract[tool] = 0; + + offset = gCodeOptions.toolOffsets[tool]; } - if(typeof(sendLayer) !== "undefined"){ - if(i-lastSend > gcode.length*0.02 && sendMultiLayer.length != 0){ + if (typeof(z) !== 'undefined' && z != prevZ) { + if (z_heights[z]) { + layer = z_heights[z]; + } else { + layer = model.length; + z_heights[z] = layer; + } + + sendLayer = layer; + sendLayerZ = z; + prevZ = z; + } else if (typeof(z) == 'undefined' && typeof(prevZ) != 'undefined') { + if (z_heights.hasOwnProperty(prevZ)) { + layer = z_heights[prevZ]; + } else { + layer = model.length; + z_heights[prevZ] = layer; + } + } + + if (addToModel) { + if (!model[layer]) model[layer] = []; + model[layer].push({ + x: x, + y: y, + z: z, + extrude: extrude, + retract: retract, + noMove: !move, + extrusion: (extrude || retract) && prev_extrude[tool]["abs"] ? prev_extrude[tool]["abs"] : 0, + prevX: prevX, + prevY: prevY, + prevZ: prevZ, + speed: lastF, + gcodeLine: i, + percentage: percentage, + tool: tool + }); + } + + if (move) { + if (typeof(x) !== 'undefined') prevX = x; + if (typeof(y) !== 'undefined') prevY = y; + } + + if (typeof(sendLayer) !== "undefined") { + if (i - lastSend > gcode.length*0.02 && sendMultiLayer.length != 0){ lastSend = i; - sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i/gcode.length*100); + sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i / gcode.length * 100); sendMultiLayer = []; sendMultiLayerZ = []; } @@ -406,7 +503,7 @@ sendLayerZ = undefined; } } - sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i/gcode.length*100); + sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i / gcode.length*100); }; @@ -414,16 +511,12 @@ gcode = message.gcode; firstReport = message.options.firstReport; - doParse(); gcode = []; self.postMessage({ "cmd": "returnModel", - "msg": { -// model: model - } + "msg": {} }); - }; var runAnalyze = function(message){ @@ -446,6 +539,7 @@ speeds = {extrude: [], retract: [], move: []}; speedsByLayer = {extrude: {}, retract: {}, move: {}}; }; + var setOption = function(options){ for(var opt in options){ gCodeOptions[opt] = options[opt]; diff --git a/src/octoprint/static/gcodeviewer/js/renderer.js b/src/octoprint/static/gcodeviewer/js/renderer.js index cbf8b6bf..3936c06b 100644 --- a/src/octoprint/static/gcodeviewer/js/renderer.js +++ b/src/octoprint/static/gcodeviewer/js/renderer.js @@ -15,7 +15,6 @@ GCODE.renderer = (function(){ var ctxHeight, ctxWidth; var prevX=0, prevY=0; -// var colorGrid="#bbbbbb", colorLine="#000000"; var sliderHor, sliderVer; var layerNumStore, progressStore={from: 0, to: -1}; var lastX, lastY; @@ -28,8 +27,8 @@ GCODE.renderer = (function(){ showRetracts: true, colorGrid: "#bbbbbb", extrusionWidth: 1, -// colorLine: ["#000000", "#aabb88", "#ffe7a0", "#6e7700", "#331a00", "#44ba97", "#08262f", "#db0e00", "#ff9977"], - colorLine: ["#000000", "#45c7ba", "#a9533a", "#ff44cc", "#dd1177", "#eeee22", "#ffbb55", "#ff5511", "#777788"], + // #000000", "#45c7ba", "#a9533a", "#ff44cc", "#dd1177", "#eeee22", "#ffbb55", "#ff5511", "#777788" + colorLine: ["#000000", "#3333cc", "#cc3333", "#33cc33", "#cc33cc"], colorMove: "#00ff00", colorRetract: "#ff0000", colorRestart: "#0000ff", @@ -198,95 +197,77 @@ GCODE.renderer = (function(){ }; var drawLayer = function(layerNum, fromProgress, toProgress, isNextLayer){ - var i, speedIndex= 0, prevZ = 0; + var i, speedIndex= 0; + isNextLayer = typeof isNextLayer !== 'undefined' ? isNextLayer : false; - if(!isNextLayer){ + if (!isNextLayer) { layerNumStore=layerNum; progressStore = {from: fromProgress, to: toProgress}; } - if(!model||!model[layerNum])return; + + if (!model || !model[layerNum]) return; var cmds = model[layerNum]; var x, y; -// if(toProgress === -1){ -// toProgress=cmds.length; -// } - - if(fromProgress>0){ - prevX = cmds[fromProgress-1].x*zoomFactor; - prevY = -cmds[fromProgress-1].y*zoomFactor; - }else if(fromProgress===0 && layerNum==0){ - if(model[0]&&model[0].x !== undefined &&model[0].y !== undefined){ - prevX = model[0].x*zoomFactor; - prevY = -model[0].y*zoomFactor; - }else { + if (fromProgress > 0) { + prevX = cmds[fromProgress-1].x * zoomFactor; + prevY = -cmds[fromProgress-1].y * zoomFactor; + } else if (fromProgress === 0 && layerNum == 0) { + if (model[0] && model[0].x !== undefined && model[0].y !== undefined) { + prevX = model[0].x * zoomFactor; + prevY = -model[0].y * zoomFactor; + } else { prevX = 0; prevY = 0; } - }else if(typeof(cmds[0].prevX) !== 'undefined' && typeof(cmds[0].prevY) !== 'undefined'){ - prevX = cmds[0].prevX*zoomFactor; - prevY = -cmds[0].prevY*zoomFactor; - }else{ - if(model[layerNum-1]){ - prevX=undefined; - prevY=undefined; - for(i=model[layerNum-1].length-1;i>=0;i--){ - if(prevX === undefined && model[layerNum-1][i].x!==undefined)prevX=model[layerNum-1][i].x*zoomFactor; - if(prevY === undefined && model[layerNum-1][i].y!==undefined)prevY=-model[layerNum-1][i].y*zoomFactor; + } else if(typeof(cmds[0].prevX) !== 'undefined' && typeof(cmds[0].prevY) !== 'undefined') { + prevX = cmds[0].prevX * zoomFactor; + prevY = -cmds[0].prevY * zoomFactor; + } else { + if (model[layerNum-1]) { + prevX = undefined; + prevY = undefined; + for (i = model[layerNum-1].length-1; i >= 0; i--) { + if (prevX === undefined && model[layerNum-1][i].x !== undefined) prevX = model[layerNum-1][i].x * zoomFactor; + if (prevY === undefined && model[layerNum-1][i].y !== undefined) prevY =- model[layerNum-1][i].y * zoomFactor; } - if(prevX === undefined)prevX=0; - if(prevY === undefined)prevY=0; - }else{ - prevX=0; - prevY=0; + if (prevX === undefined) prevX=0; + if (prevY === undefined) prevY=0; + } else { + prevX = 0; + prevY = 0; } } - prevZ = GCODE.renderer.getZ(layerNum); - -// ctx.strokeStyle = renderOptions["colorLine"]; - for(i=fromProgress;i<=toProgress;i++){ + for (i = fromProgress; i <= toProgress; i++) { ctx.lineWidth = 1; - if(typeof(cmds[i]) === 'undefined')continue; + if (typeof(cmds[i]) === 'undefined') continue; - if(typeof(cmds[i].prevX) !== 'undefined' && typeof(cmds[i].prevY) !== 'undefined'){ - prevX = cmds[i].prevX*zoomFactor; - prevY = -cmds[i].prevY*zoomFactor; - } -// console.log(cmds[i]); - if(typeof(cmds[i].x)==='undefined'||isNaN(cmds[i].x))x=prevX/zoomFactor; - else x = cmds[i].x; - if(typeof(cmds[i].y) === 'undefined'||isNaN(cmds[i].y))y=prevY/zoomFactor; - else y = -cmds[i].y; - if(renderOptions["differentiateColors"]&&!renderOptions['showNextLayer']){ -// if(speedsByLayer['extrude'][prevZ]){ - speedIndex = speeds['extrude'].indexOf(cmds[i].speed); -// speedIndex = GCODE.ui.ArrayIndexOf(speedsByLayer['extrude'][prevZ], function(obj) {return obj.speed === cmds[i].speed;}); -// } else { -// speedIndex = -1; -// } - if(speedIndex === -1){ - speedIndex = 0; - }else if(speedIndex > renderOptions["colorLine"].length -1){ - speedIndex = speedIndex % (renderOptions["colorLine"].length-1); - // console.log("Too much colors"); - } - }else if(renderOptions['showNextLayer']&&isNextLayer){ - speedIndex=3; - }else{ - speedIndex=0; + if (typeof(cmds[i].prevX) !== 'undefined' && typeof(cmds[i].prevY) !== 'undefined') { + prevX = cmds[i].prevX * zoomFactor; + prevY = -cmds[i].prevY * zoomFactor; } + if (typeof(cmds[i].x) === 'undefined' || isNaN(cmds[i].x)) { + x = prevX / zoomFactor; + } else { + x = cmds[i].x; + } + if (typeof(cmds[i].y) === 'undefined' || isNaN(cmds[i].y)) { + y=prevY/zoomFactor; + } else { + y = -cmds[i].y; + } - if(!cmds[i].extrude&&!cmds[i].noMove){ -// ctx.stroke(); - if(cmds[i].retract == -1){ - if(renderOptions["showRetracts"]){ - - ctx.strokeStyle = renderOptions["colorRetract"]; - ctx.fillStyle = renderOptions["colorRetract"]; + var alpha = renderOptions['showNextLayer'] && isNextLayer ? 0.5 : 1.0; + var shade = cmds[i].tool * 0.15; + if (!cmds[i].extrude && !cmds[i].noMove) { + if (cmds[i].retract == -1) { + if (renderOptions["showRetracts"]) { + ctx.strokeStyle = pusher.color(renderOptions["colorRetract"]).shade(shade).alpha(alpha).html(); + ctx.fillStyle = pusher.color(renderOptions["colorRetract"]).shade(shade).alpha(alpha).html(); ctx.beginPath(); ctx.arc(prevX, prevY, renderOptions["sizeRetractSpot"], 0, Math.PI*2, true); ctx.stroke(); @@ -294,41 +275,33 @@ GCODE.renderer = (function(){ } } if(renderOptions["showMoves"]){ - ctx.strokeStyle = renderOptions["colorMove"]; + ctx.strokeStyle = pusher.color(renderOptions["colorMove"]).shade(shade).alpha(alpha).html(); ctx.beginPath(); ctx.moveTo(prevX, prevY); ctx.lineTo(x*zoomFactor,y*zoomFactor); ctx.stroke(); } -// ctx.strokeStyle = renderOptions["colorLine"][0]; -// ctx.beginPath(); -// console.log("moveto: "+cmds[i].x+":"+cmds[i].y) -// ctx.moveTo(cmds[i].x*zoomFactor,cmds[i].y*zoomFactor); - } - else if(cmds[i].extrude){ - if(cmds[i].retract==0){ - ctx.strokeStyle = renderOptions["colorLine"][speedIndex]; + } else if(cmds[i].extrude) { + if (cmds[i].retract == 0) { + ctx.strokeStyle = pusher.color(renderOptions["colorLine"][cmds[i].tool]).alpha(alpha).html(); ctx.lineWidth = renderOptions['extrusionWidth']; ctx.beginPath(); ctx.moveTo(prevX, prevY); ctx.lineTo(x*zoomFactor,y*zoomFactor); ctx.stroke(); - }else { - if(renderOptions["showRetracts"]){ -// ctx.stroke(); - ctx.strokeStyle = renderOptions["colorRestart"]; - ctx.fillStyle = renderOptions["colorRestart"]; + } else { + if (renderOptions["showRetracts"]) { + ctx.strokeStyle = pusher.color(renderOptions["colorRestart"]).shade(shade).alpha(alpha).html(); + ctx.fillStyle = pusher.color(renderOptions["colorRestart"]).shade(shade).alpha(alpha).html(); ctx.beginPath(); ctx.arc(prevX, prevY, renderOptions["sizeRetractSpot"], 0, Math.PI*2, true); ctx.stroke(); ctx.fill(); -// ctx.strokeStyle = renderOptions["colorLine"][0]; -// ctx.beginPath(); } } } - prevX = x*zoomFactor; - prevY = y*zoomFactor; + prevX = x * zoomFactor; + prevY = y * zoomFactor; } ctx.stroke(); }; @@ -360,17 +333,16 @@ GCODE.renderer = (function(){ drawGrid(); }else{ if(layerNum < model.length){ - var p1 = ctx.transformedPoint(0,0); - var p2 = ctx.transformedPoint(canvas.width,canvas.height); - ctx.clearRect(p1.x,p1.y,p2.x-p1.x,p2.y-p1.y); + var p1 = ctx.transformedPoint(0, 0); + var p2 = ctx.transformedPoint(canvas.width, canvas.height); + ctx.clearRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y); drawGrid(); -// ctx.globalAlpha = 0.5; if(renderOptions['showNextLayer'] && layerNum < model.length - 1) { drawLayer(layerNum+1, 0, this.getLayerNumSegments(layerNum+1), true); } drawLayer(layerNum, fromProgress, toProgress); }else{ - console.log("Got request to render non-existent layer!!"); + console.log("Got request to render non-existent layer"); } } }, @@ -394,12 +366,11 @@ GCODE.renderer = (function(){ mdlInfo = GCODE.gCodeReader.getModelInfo(); speeds = mdlInfo.speeds; speedsByLayer = mdlInfo.speedsByLayer; -// console.log(speeds); -// console.log(mdlInfo.min.x + ' ' + mdlInfo.modelSize.x); offsetModelX = (gridSizeX/2-(mdlInfo.min.x+mdlInfo.modelSize.x/2))*zoomFactor; offsetModelY = (mdlInfo.min.y+mdlInfo.modelSize.y/2)*zoomFactor-gridSizeY/2*zoomFactor; if(ctx)ctx.translate(offsetModelX, offsetModelY); + if (!model[layerNum]) return; this.render(layerNum, 0, model[layerNum].length); }, getZ: function(layerNum){ diff --git a/src/octoprint/static/gcodeviewer/js/ui.js b/src/octoprint/static/gcodeviewer/js/ui.js index 29883595..01539b81 100644 --- a/src/octoprint/static/gcodeviewer/js/ui.js +++ b/src/octoprint/static/gcodeviewer/js/ui.js @@ -21,67 +21,27 @@ GCODE.ui = (function(){ }; var chooseAccordion = function(id){ -// debugger; $('#'+id).collapse("show"); }; - var setLinesColor = function(toggle){ -// var i=0; -// for(i=gCodeLines.first;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} - output.push("
= " + (parseFloat(layerSpeeds['extrude'][z][i])/60).toFixed(2)+"mm/s"); - } - if(typeof(layerSpeeds['move'][z]) !== 'undefined'){ - output.push("Move speeds:"); - for(i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} - output.push("
= " + (parseFloat(layerSpeeds['move'][z][i])/60).toFixed(2)+"mm/s"); - } - } - if(typeof(layerSpeeds['retract'][z]) !== 'undefined'){ - output.push("Retract speeds:"); - for(i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} - output.push(" = " +(parseFloat(layerSpeeds['retract'][z][i])/60).toFixed(2)+"mm/s"); + if (filament.length == 1) { + output.push("Filament used by layer: " + filament[0].toFixed(2)) + "mm"; + } else { + for (var i = 0; i < filament.length; i++) { + output.push("Filament used by layer (Tool " + i + "): " + filament[i].toFixed(2) + "mm"); } } + output.push("Print time for layer: " + parseFloat(GCODE.gCodeReader.getModelInfo().printTimeByLayer[z]).toFixed(1) + "sec"); $('#layerInfo').html(output.join('
')); -// chooseAccordion('layerAccordionTab'); }; var handleFileSelect = function(evt) { @@ -136,9 +96,7 @@ GCODE.ui = (function(){ var progress = GCODE.renderer.getLayerNumSegments(val)-1; GCODE.renderer.render(val,0, progress); sliderHor.slider({max: progress, values: [0,progress]}); - setLinesColor(false); //clear current selection gCodeLines = GCODE.gCodeReader.getGCodeLines(val, sliderHor.slider("values",0), sliderHor.slider("values",1)); - setLinesColor(true); // highlight lines printLayerInfo(val); }; @@ -193,8 +151,7 @@ GCODE.ui = (function(){ setProgress('loadProgress', 100); worker.postMessage({ "cmd":"analyzeModel", - "msg":{ - } + "msg":{} } ); break; @@ -205,14 +162,19 @@ GCODE.ui = (function(){ GCODE.gCodeReader.processAnalyzeModelDone(data.msg); GCODE.gCodeReader.passDataToRenderer(); initSliders(); - resultSet.push("Model size is: " + data.msg.modelSize.x.toFixed(2) + 'x' + data.msg.modelSize.y.toFixed(2) + 'x' + data.msg.modelSize.z.toFixed(2)+'mm
'); - resultSet.push("Total filament used: " + data.msg.totalFilament.toFixed(2) + "mm
"); - resultSet.push("Estimated print time: " + parseInt(parseFloat(data.msg.printTime)/60/60) + ":" + parseInt((parseFloat(data.msg.printTime)/60)%60) + ":" + parseInt(parseFloat(data.msg.printTime)%60) + "
"); + resultSet.push("Model size is: " + data.msg.modelSize.x.toFixed(2) + 'mm × ' + data.msg.modelSize.y.toFixed(2) + 'mm × ' + data.msg.modelSize.z.toFixed(2)+'mm
'); + if (data.msg.totalFilament.length == 0) { + resultSet.push("Total filament used: " + data.msg.totalFilament.toFixed(2) + "mm
"); + } else { + for (var i = 0; i < data.msg.totalFilament.length; i++) { + resultSet.push("Total filament used (Tool " + i + "): " + data.msg.totalFilament[i].toFixed(2) + "mm
"); + } + } + + resultSet.push("Estimated print time: " + formatDuration(data.msg.printTime) + "
"); resultSet.push("Estimated layer height: " + data.msg.layerHeight.toFixed(2) + "mm
"); - resultSet.push("Layer count: " + data.msg.layerCnt.toFixed(0) + "printed, " + data.msg.layerTotal.toFixed(0) + 'visited
'); + resultSet.push("Layer count: " + data.msg.layerCnt.toFixed(0) + " printed, " + data.msg.layerTotal.toFixed(0) + " visited
"); document.getElementById('list').innerHTML = resultSet.join(''); - chooseAccordion('infoAccordionTab'); - $('#myTab a[href="#tab2d"]').tab('show'); break; case 'returnLayer': GCODE.gCodeReader.processLayerFromWorker(data.msg); @@ -239,7 +201,6 @@ GCODE.ui = (function(){ }); if(!Modernizr.canvas)fatal.push("
  • Your browser doesn't seem to support HTML5 Canvas, this application won't work without it.
  • "); - //if(!Modernizr.filereader)fatal.push("
  • Your browser doesn't seem to support HTML5 File API, this application won't work without it.
  • "); if(!Modernizr.webworkers)fatal.push("
  • Your browser doesn't seem to support HTML5 Web Workers, this application won't work without it.
  • "); if(!Modernizr.svg)fatal.push("
  • Your browser doesn't seem to support HTML5 SVG, this application won't work without it.
  • "); @@ -307,20 +268,6 @@ GCODE.ui = (function(){ if(document.getElementById('purgeEmptyLayersCheckbox').checked)GCODE.gCodeReader.setOption({purgeEmptyLayers: true}); else GCODE.gCodeReader.setOption({purgeEmptyLayers: false}); - if(document.getElementById('showGCodeCheckbox').checked)showGCode = true; - else showGCode = false; - - -// if(document.getElementById('sortLayersCheckbox').checked) worker.postMessage({"cmd":"setOption", "msg":{sortLayers: true}}); -// else worker.postMessage({"cmd":"setOption", "msg":{sortLayers: false}}); -// -// if(document.getElementById('purgeEmptyLayersCheckbox').checked)worker.postMessage({"cmd":"setOption", "msg":{purgeEmptyLayers: true}}); -// else worker.postMessage({"cmd":"setOption", "msg":{purgeEmptyLayers: false}}); - -// if(document.getElementById('analyzeModelCheckbox').checked)worker.postMessage({"cmd":"setOption", "msg":{analyzeModel: true}}); -// else worker.postMessage({"cmd":"setOption", "msg":{analyzeModel: false}}); - - if(document.getElementById('moveModelCheckbox').checked)GCODE.renderer.setOption({moveModel: true}); else GCODE.renderer.setOption({moveModel: false}); @@ -330,9 +277,6 @@ GCODE.ui = (function(){ if(document.getElementById('showRetractsCheckbox').checked)GCODE.renderer.setOption({showRetracts: true}); else GCODE.renderer.setOption({showRetracts: false}); - if(document.getElementById('differentiateColorsCheckbox').checked)GCODE.renderer.setOption({differentiateColors: true}); - else GCODE.renderer.setOption({differentiateColors: false}); - var widthMod = 2; if(Number($('#widthModifier').attr('value'))) {widthMod = Number($('#widthModifier').attr('value'));} if(document.getElementById('thickExtrusionCheckbox').checked)GCODE.renderer.setOption({extrusionWidth: widthMod});