diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index db912c56..377634b3 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -65,6 +65,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 a456ef1f..b901a12f 100644 --- a/src/octoprint/util/gcodeInterpreter.py +++ b/src/octoprint/util/gcodeInterpreter.py @@ -92,23 +92,26 @@ class gcode(object): T = getCodeInt(line, 'T') if 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 - - currentExtruder = T - - 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 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 + + 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) G = getCodeInt(line, 'G') if G is not None: