From fbe50e33d380bb5faf28e7b77807e346bee7e0f6 Mon Sep 17 00:00:00 2001 From: Mark Walker Date: Wed, 15 Apr 2015 02:33:31 -0700 Subject: [PATCH] Add a printer profile option to allow centered origin on rectangular beds Some printers have (0, 0) at the center of the bed. Circular beds commonly, but also some rectangular beds. --- src/octoprint/printer/profile.py | 7 +++++++ src/octoprint/static/gcodeviewer/js/renderer.js | 15 ++++++++++----- src/octoprint/static/js/app/viewmodels/gcode.js | 9 ++++++--- .../static/js/app/viewmodels/printerprofiles.js | 3 +++ .../dialogs/settings/printerprofiles.jinja2 | 8 ++++++++ 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/octoprint/printer/profile.py b/src/octoprint/printer/profile.py index 547e81df9a..ac9845b1ad 100644 --- a/src/octoprint/printer/profile.py +++ b/src/octoprint/printer/profile.py @@ -72,6 +72,11 @@ class PrinterProfileManager(object): * - ``volume.formFactor`` - ``string`` - Form factor of the print bed, either ``rectangular`` or ``circular`` + * - ``centeredOrigin`` + - ``bool`` + - Whether the printer's origin is in the center of the bed, otherwise + - the origin is assumed to be the lower left and all valid coordinates + - positive. * - ``heatedBed`` - ``bool`` - Whether the printer has a heated bed (``True``) or not (``False``) @@ -140,6 +145,7 @@ class PrinterProfileManager(object): formFactor = BedTypes.RECTANGULAR, ), heatedBed = False, + centeredOrigin = False, extruder=dict( count = 1, offsets = [ @@ -291,6 +297,7 @@ def _load_from_path(self, path): import yaml with open(path) as f: profile = yaml.safe_load(f) + profile = dict_merge(self._load_default(), profile) profile = self._ensure_valid_profile(profile) if not profile: self._logger.warn("Invalid profile: %s" % path) diff --git a/src/octoprint/static/gcodeviewer/js/renderer.js b/src/octoprint/static/gcodeviewer/js/renderer.js index 79abfff8f5..15b44eca4e 100644 --- a/src/octoprint/static/gcodeviewer/js/renderer.js +++ b/src/octoprint/static/gcodeviewer/js/renderer.js @@ -266,6 +266,11 @@ GCODE.renderer = (function(){ y: -1 * renderOptions["bed"]["y"] * zoomFactor }; + if (renderOptions["bed"]["centeredOrigin"]) { + origin.x -= width / 2; + origin.y += height / 2; + } + ctx.beginPath(); ctx.strokeStyle = renderOptions["colorGrid"]; ctx.fillStyle = "#ffffff"; @@ -281,15 +286,15 @@ GCODE.renderer = (function(){ 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.moveTo(origin.x + i * zoomFactor, origin.y); + ctx.lineTo(origin.x + i * zoomFactor, origin.y + height); } 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.moveTo(origin.x, origin.y + i * zoomFactor); + ctx.lineTo(origin.x + width, origin.y + i * zoomFactor); } ctx.stroke(); }; @@ -496,7 +501,7 @@ 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"]) { + } else if (renderOptions["bed"]["circular"] || renderOptions["bed"]["centeredOrigin"]) { canvasCenter = ctx.transformedPoint(canvas.width / 2, canvas.height / 2); offsetModelX = canvasCenter.x; offsetModelY = canvasCenter.y; diff --git a/src/octoprint/static/js/app/viewmodels/gcode.js b/src/octoprint/static/js/app/viewmodels/gcode.js index e44096c79f..d392367739 100644 --- a/src/octoprint/static/js/app/viewmodels/gcode.js +++ b/src/octoprint/static/js/app/viewmodels/gcode.js @@ -137,22 +137,25 @@ $(function() { } if (currentProfileData && currentProfileData.volume && currentProfileData.volume.formFactor() && currentProfileData.volume.width() && currentProfileData.volume.depth()) { - var x = undefined, y = undefined, r = undefined, circular = false; + var x = undefined, y = undefined, r = undefined, circular = false, centeredOrigin = false; var formFactor = currentProfileData.volume.formFactor(); if (formFactor == "circular") { r = currentProfileData.volume.width() / 2; circular = true; + centeredOrigin = true; } else { x = currentProfileData.volume.width(); y = currentProfileData.volume.depth(); + centeredOrigin = currentProfileData.hasOwnProperty("centeredOrigin") && currentProfileData.centeredOrigin(); } return { x: x, y: y, r: r, - circular: circular + circular: circular, + centeredOrigin: centeredOrigin }; } else { return undefined; @@ -507,4 +510,4 @@ $(function() { ["loginStateViewModel", "settingsViewModel"], "#gcode" ]); -}); \ No newline at end of file +}); diff --git a/src/octoprint/static/js/app/viewmodels/printerprofiles.js b/src/octoprint/static/js/app/viewmodels/printerprofiles.js index 516c207b94..de57ff3831 100644 --- a/src/octoprint/static/js/app/viewmodels/printerprofiles.js +++ b/src/octoprint/static/js/app/viewmodels/printerprofiles.js @@ -68,6 +68,7 @@ $(function() { self.editorVolumeFormFactor = ko.observable(); self.editorHeatedBed = ko.observable(); + self.editorCenteredOrigin = ko.observable(); self.editorNozzleDiameter = ko.observable(); self.editorExtruders = ko.observable(); @@ -284,6 +285,7 @@ $(function() { self.editorVolumeFormFactor(data.volume.formFactor); self.editorHeatedBed(data.heatedBed); + self.editorCenteredOrigin(data.centeredOrigin); self.editorNozzleDiameter(data.extruder.nozzleDiameter); self.editorExtruders(data.extruder.count); @@ -349,6 +351,7 @@ $(function() { formFactor: self.editorVolumeFormFactor() }, heatedBed: self.editorHeatedBed(), + centeredOrigin: self.editorCenteredOrigin(), extruder: { count: parseInt(self.editorExtruders()), offsets: [ diff --git a/src/octoprint/templates/dialogs/settings/printerprofiles.jinja2 b/src/octoprint/templates/dialogs/settings/printerprofiles.jinja2 index 821be2365d..df3684889c 100644 --- a/src/octoprint/templates/dialogs/settings/printerprofiles.jinja2 +++ b/src/octoprint/templates/dialogs/settings/printerprofiles.jinja2 @@ -100,6 +100,14 @@ +
+ +
+ +
+