diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 91d3b627ca..604d2a9ad6 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -273,4 +273,4 @@ class CuraEngineBackend(Backend): self._process.terminate() except: # terminating a process that is already terminating causes an exception, silently ignore this. pass - self.slicingCancelled.emit() \ No newline at end of file + self.slicingCancelled.emit() diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 50c3fadb0e..059ede8a8f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -2,6 +2,8 @@ # Cura is released under the terms of the AGPLv3 or higher. import numpy +from string import Formatter +import traceback from UM.Job import Job from UM.Application import Application @@ -14,6 +16,19 @@ from cura.OneAtATimeIterator import OneAtATimeIterator from . import Cura_pb2 +## Formatter class that handles token expansion in start/end gcod +class GcodeStartEndFormatter(Formatter): + def get_value(self, key, args, kwargs): + if isinstance(key, str): + try: + return kwargs[key] + except KeyError: + Logger.log("w", "Unable to replace '%s' placeholder in start/end gcode", key) + return "{" + key + "}" + else: + Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end gcode", key) + return "{" + str(key) + "}" + ## Job class that handles sending the current scene data to CuraEngine class StartSliceJob(Job): def __init__(self, profile, socket): @@ -90,12 +105,28 @@ class StartSliceJob(Job): self.setResult(True) + def _expandGcodeTokens(self, key, value, settings): + try: + # any setting can be used as a token + fmt = GcodeStartEndFormatter() + return str(fmt.format(value, **settings)).encode("utf-8") + except: + Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc()) + return str(value).encode("utf-8") + def _sendSettings(self, profile): msg = Cura_pb2.SettingList() - for key, value in profile.getAllSettingValues(include_machine = True).items(): + settings = profile.getAllSettingValues(include_machine = True) + start_gcode = settings["machine_start_gcode"] + settings["material_bed_temp_prepend"] = not "{material_bed_temperature}" in start_gcode + settings["material_print_temp_prepend"] = not "{material_print_temperature" in start_gcode + for key, value in settings.items(): s = msg.settings.add() s.name = key - s.value = str(value).encode("utf-8") + if key == "machine_start_gcode" or key == "machine_end_gcode": + s.value = self._expandGcodeTokens(key, value, settings) + else: + s.value = str(value).encode("utf-8") self._socket.sendMessage(msg) diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json index a1ed7c4ce6..d466b1d2dc 100644 --- a/resources/machines/fdmprinter.json +++ b/resources/machines/fdmprinter.json @@ -17,6 +17,12 @@ "description": "Gcode commands to be executed at the very end - separated by \\n.", "default": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84" }, + "material_bed_temp_wait": { + "default": true + }, + "material_print_temp_wait": { + "default": true + }, "machine_width": { "description": "The width (X-direction) of the printable area.", "default": 100