From 7d5c55fc95d99aa5d1ba7c26b03abeca2b3c9400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Mon, 11 Aug 2014 15:21:50 +0200 Subject: [PATCH] Added sanity check for extruder selection in gcode files Any T command targeting a number higher than the value specified in the settings for gcodeAnalysis.maxExtruders (defaults to 10) will be ignored and trigger a warning in the log file. Fix for #539 --- src/octoprint/settings.py | 3 +++ src/octoprint/util/gcodeInterpreter.py | 31 ++++++++++++++------------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index b607f97e..e04bb922 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -73,6 +73,9 @@ default_settings = { "mobileSizeThreshold": 2 * 1024 * 1024, # 2MB "sizeThreshold": 20 * 1024 * 1024, # 20MB }, + "gcodeAnalysis": { + "maxExtruders": 10 + }, "feature": { "temperatureGraph": True, "waitForStartOnConnect": False, diff --git a/src/octoprint/util/gcodeInterpreter.py b/src/octoprint/util/gcodeInterpreter.py index 4a0901c9..253f6d54 100644 --- a/src/octoprint/util/gcodeInterpreter.py +++ b/src/octoprint/util/gcodeInterpreter.py @@ -195,23 +195,26 @@ class gcode(object): absoluteE = False elif T is not None: - posOffset[0] -= offsets[currentExtruder]["x"] if currentExtruder < len(offsets) else 0 - posOffset[1] -= offsets[currentExtruder]["y"] if currentExtruder < len(offsets) else 0 + if T > settings().getInt(["gcodeAnalysis", "maxExtruders"]): + self._logger.warn("GCODE tried to select tool %d, that looks wrong, ignoring for GCODE analysis" % T) + else: + posOffset[0] -= offsets[currentExtruder]["x"] if currentExtruder < len(offsets) else 0 + posOffset[1] -= offsets[currentExtruder]["y"] if currentExtruder < len(offsets) else 0 - currentExtruder = T + currentExtruder = T - posOffset[0] += offsets[currentExtruder]["x"] if currentExtruder < len(offsets) else 0 - posOffset[1] += offsets[currentExtruder]["y"] if currentExtruder < len(offsets) else 0 + posOffset[0] += offsets[currentExtruder]["x"] if currentExtruder < len(offsets) else 0 + posOffset[1] += offsets[currentExtruder]["y"] if currentExtruder < len(offsets) else 0 - if len(currentE) <= currentExtruder: - for i in range(len(currentE), currentExtruder + 1): - currentE.append(0.0) - if len(maxExtrusion) <= currentExtruder: - for i in range(len(maxExtrusion), currentExtruder + 1): - maxExtrusion.append(0.0) - if len(totalExtrusion) <= currentExtruder: - for i in range(len(totalExtrusion), currentExtruder + 1): - totalExtrusion.append(0.0) + if len(currentE) <= currentExtruder: + for i in range(len(currentE), currentExtruder + 1): + currentE.append(0.0) + if len(maxExtrusion) <= currentExtruder: + for i in range(len(maxExtrusion), currentExtruder + 1): + maxExtrusion.append(0.0) + if len(totalExtrusion) <= currentExtruder: + for i in range(len(totalExtrusion), currentExtruder + 1): + totalExtrusion.append(0.0) if self.progressCallback is not None: self.progressCallback(100.0)