From b81a4b6d5e0db616408fbf4d3c5e181932494fff Mon Sep 17 00:00:00 2001 From: Ilya Novoselov Date: Tue, 11 Mar 2014 12:05:34 +0600 Subject: [PATCH] Should resolve #402 (only for cicular beds) --- src/octoprint/settings.py | 2 +- .../static/gcodeviewer/js/renderer.js | 100 +++++++++++++----- .../static/js/app/viewmodels/settings.js | 8 +- src/octoprint/templates/settings.jinja2 | 14 ++- 4 files changed, 92 insertions(+), 32 deletions(-) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 3c796e67..8c2684bf 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -97,7 +97,7 @@ default_settings = { {"x": 0.0, "y": 0.0} ], "bedDimensions": { - "x": 200.0, "y": 200.0 + "x": 200.0, "y": 200.0, "r": 100 } }, "appearance": { diff --git a/src/octoprint/static/gcodeviewer/js/renderer.js b/src/octoprint/static/gcodeviewer/js/renderer.js index ac5a53d2..7fe9c032 100644 --- a/src/octoprint/static/gcodeviewer/js/renderer.js +++ b/src/octoprint/static/gcodeviewer/js/renderer.js @@ -186,37 +186,68 @@ GCODE.renderer = (function(){ ctx.translate(offsetBedX, offsetBedY); - ctx.beginPath(); - var width = renderOptions["bed"]["x"] * zoomFactor; - var height = renderOptions["bed"]["y"] * zoomFactor; - var origin = { - x: 0, - y: -1 * renderOptions["bed"]["y"] * zoomFactor - }; - ctx.strokeStyle = renderOptions["colorGrid"]; - ctx.fillStyle = "#ffffff"; - ctx.lineWidth = 2; - ctx.rect(origin.x, origin.y, width, height); - ctx.fill(); - ctx.stroke(); - var i; - ctx.strokeStyle = renderOptions["colorGrid"]; - ctx.lineWidth = 1; - ctx.beginPath(); - for (i = 0; i <= renderOptions["bed"]["x"]; i += gridStep) { - ctx.moveTo(i * zoomFactor, 0); - ctx.lineTo(i * zoomFactor, -1 * renderOptions["bed"]["y"] * zoomFactor); - } - ctx.stroke(); + if(renderOptions["bed"]["circular"]) { + ctx.strokeStyle = renderOptions["colorGrid"]; + ctx.fillStyle = "#ffffff"; + ctx.lineWidth = 2; - ctx.beginPath(); - for (i = 0; i <= renderOptions["bed"]["y"]; i += gridStep) { - ctx.moveTo(0, -1 * i * zoomFactor); - ctx.lineTo(renderOptions["bed"]["x"] * zoomFactor, -1 * i * zoomFactor); + ctx.beginPath(); + ctx.arc(0, 0, renderOptions["bed"]["r"] * zoomFactor, 0, Math.PI * 2, true); + ctx.fill(); + ctx.stroke(); + + ctx.strokeStyle = renderOptions["colorGrid"]; + ctx.lineWidth = 1; + + ctx.beginPath(); + for (i = -renderOptions["bed"]["r"]; i <= renderOptions["bed"]["r"]; i += gridStep) { + var x = i; + var y = Math.sqrt(Math.pow(renderOptions["bed"]["r"], 2) - Math.pow(x, 2)); + + ctx.moveTo(x * zoomFactor, y * zoomFactor); + ctx.lineTo(x * zoomFactor, -1 * y * zoomFactor); + + ctx.moveTo(y * zoomFactor, x * zoomFactor); + ctx.lineTo(-1 * y * zoomFactor, x * zoomFactor); + } + ctx.stroke(); + } else { + var width = renderOptions["bed"]["x"] * zoomFactor; + var height = renderOptions["bed"]["y"] * zoomFactor; + var origin = { + x: 0, + y: -1 * renderOptions["bed"]["y"] * zoomFactor + }; + + ctx.beginPath(); + ctx.strokeStyle = renderOptions["colorGrid"]; + ctx.fillStyle = "#ffffff"; + ctx.lineWidth = 2; + + ctx.rect(origin.x, origin.y, width, height); + + ctx.fill(); + ctx.stroke(); + + ctx.strokeStyle = renderOptions["colorGrid"]; + ctx.lineWidth = 1; + + ctx.beginPath(); + for (i = 0; i <= renderOptions["bed"]["x"]; i += gridStep) { + ctx.moveTo(i * zoomFactor, 0); + ctx.lineTo(i * zoomFactor, -1 * renderOptions["bed"]["y"] * zoomFactor); + } + ctx.stroke(); + + ctx.beginPath(); + for (i = 0; i <= renderOptions["bed"]["y"]; i += gridStep) { + ctx.moveTo(0, -1 * i * zoomFactor); + ctx.lineTo(renderOptions["bed"]["x"] * zoomFactor, -1 * i * zoomFactor); + } + ctx.stroke(); } - ctx.stroke(); ctx.translate(-offsetBedX, -offsetBedY); }; @@ -358,6 +389,12 @@ GCODE.renderer = (function(){ offsetModelY = -1 * (renderOptions["bed"]["y"] / 2 - (mdlInfo.min.y + mdlInfo.modelSize.y / 2)) * zoomFactor; offsetBedX = -1 * (renderOptions["bed"]["x"] / 2 - (mdlInfo.min.x + mdlInfo.modelSize.x / 2)) * zoomFactor; offsetBedY = (renderOptions["bed"]["y"] / 2 - (mdlInfo.min.y + mdlInfo.modelSize.y / 2)) * zoomFactor; + } else if (renderOptions["bed"]["circular"]) { + var canvasCenter = ctx.transformedPoint(canvas.width / 2, canvas.height / 2); + offsetModelX = canvasCenter.x; + offsetModelY = canvasCenter.y; + offsetBedX = 0; + offsetBedY = 0; } else { offsetModelX = 0; offsetModelY = 0; @@ -397,8 +434,13 @@ GCODE.renderer = (function(){ init: function(){ startCanvas(); initialized = true; - zoomFactor = Math.min((canvas.width - 10) / renderOptions["bed"]["x"], (canvas.height - 10) / renderOptions["bed"]["y"]); - ctx.translate((canvas.width - renderOptions["bed"]["x"] * zoomFactor) / 2, renderOptions["bed"]["y"] * zoomFactor + (canvas.height - renderOptions["bed"]["y"] * zoomFactor) / 2); + var bedWidth = renderOptions["bed"]["x"]; + var bedHeight = renderOptions["bed"]["y"];; + if(renderOptions["bed"]["circular"]) { + bedWidth = bedHeight = renderOptions["bed"]["r"] *2; + } + zoomFactor = Math.min((canvas.width - 10) / bedWidth, (canvas.height - 10) / bedHeight); + ctx.translate((canvas.width - bedWidth * zoomFactor) / 2, bedHeight * zoomFactor + (canvas.height - bedHeight * zoomFactor) / 2); offsetModelX = 0; offsetModelY = 0; diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index eef8d584..80379743 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -68,16 +68,22 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.printer_bedDimensionX = ko.observable(undefined); self.printer_bedDimensionY = ko.observable(undefined); + self.printer_bedDimensionR = ko.observable(undefined); + self.printer_bedCircular = ko.observable(undefined); self.printer_bedDimensions = ko.computed({ read: function () { return { x: parseFloat(self.printer_bedDimensionX()), - y: parseFloat(self.printer_bedDimensionY()) + y: parseFloat(self.printer_bedDimensionY()), + r: parseFloat(self.printer_bedDimensionR()), + circular: self.printer_bedCircular() }; }, write: function(value) { self.printer_bedDimensionX(value.x); self.printer_bedDimensionY(value.y); + self.printer_bedDimensionR(value.r); + self.printer_bedCircular(value.circular); }, owner: self }); diff --git a/src/octoprint/templates/settings.jinja2 b/src/octoprint/templates/settings.jinja2 index 4c29e6b1..1a3d8ace 100644 --- a/src/octoprint/templates/settings.jinja2 +++ b/src/octoprint/templates/settings.jinja2 @@ -148,7 +148,7 @@
-
+
@@ -160,6 +160,18 @@ mm
+
+ +
+ + mm +
+
+
+ +