From 1d6b7c71cbd3301915a0777404d0d6627373b979 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 3 Sep 2017 17:15:31 +0200 Subject: [PATCH 1/3] Optimise starting slice job a bit Moved some common code into a subroutine. Also replaced the start and end g-code directly in the settings list instead of checking for the key at each iteration of the loop. --- plugins/CuraEngineBackend/StartSliceJob.py | 68 ++++++++++++---------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 13aee06289..1e8698dee1 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -208,6 +208,27 @@ class StartSliceJob(Job): def isCancelled(self): return self._is_cancelled + ## Creates a dictionary of tokens to replace in g-code pieces. + # + # This indicates what should be replaced in the start and end g-codes. + # \param stack The stack to get the settings from to replace the tokens + # with. + # \return A dictionary of replacement tokens to the values they should be + # replaced with. + def _buildReplacementTokens(self, stack) -> dict: + result = {} + for key in stack.getAllKeys(): + result[key] = stack.getProperty(key, "value") + Job.yieldThread() + + result["print_bed_temperature"] = result["material_bed_temperature"] #Renamed settings. + result["print_temperature"] = result["material_print_temperature"] + result["time"] = time.strftime("%H:%M:%S") #Some extra settings. + result["date"] = time.strftime("%d-%m-%Y") + result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))] + + return result + def _expandGcodeTokens(self, key, value, settings): try: # any setting can be used as a token @@ -222,18 +243,16 @@ class StartSliceJob(Job): message = self._slice_message.addRepeatedMessage("extruders") message.id = int(stack.getMetaDataEntry("position")) + settings = self._buildReplacementTokens(stack) + + #Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. material_instance_container = stack.findContainer({"type": "material"}) + if material_instance_container: + settings["material_guid"] = material_instance_container.getMetaDataEntry("GUID", "") - settings = {} - for key in stack.getAllKeys(): - settings[key] = stack.getProperty(key, "value") - Job.yieldThread() - - settings["print_bed_temperature"] = settings["material_bed_temperature"] #Renamed settings. - settings["print_temperature"] = settings["material_print_temperature"] - settings["time"] = time.strftime("%H:%M:%S") #Some extra settings. - settings["date"] = time.strftime("%d-%m-%Y") - settings["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))] + #Replace the setting tokens in start and end g-code. + settings["machine_extruder_start_code"] = self._expandGcodeTokens("machine_extruder_start_code", settings["machine_extruder_start_code"], settings) + settings["machine_extruder_end_code"] = self._expandGcodeTokens("machine_extruder_end_code", settings["machine_extruder_end_code"], settings) for key, value in settings.items(): # Do not send settings that are not settable_per_extruder. @@ -241,13 +260,7 @@ class StartSliceJob(Job): continue setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key - if key == "material_guid" and material_instance_container: - # Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. - setting.value = str(material_instance_container.getMetaDataEntry("GUID", "")).encode("utf-8") - elif key == "machine_extruder_start_code" or key == "machine_extruder_end_code": - setting.value = self._expandGcodeTokens(key, value, settings) - else: - setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + setting.value = str(value).encode("utf-8") Job.yieldThread() ## Create extruder message from global stack @@ -268,11 +281,7 @@ class StartSliceJob(Job): # The settings are taken from the global stack. This does not include any # per-extruder settings or per-object settings. def _buildGlobalSettingsMessage(self, stack): - keys = stack.getAllKeys() - settings = {} - for key in keys: - settings[key] = stack.getProperty(key, "value") - Job.yieldThread() + settings = self._buildReplacementTokens(stack) start_gcode = settings["machine_start_gcode"] #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend @@ -281,20 +290,14 @@ class StartSliceJob(Job): print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"} settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) - settings["print_bed_temperature"] = settings["material_bed_temperature"] - settings["print_temperature"] = settings["material_print_temperature"] - - settings["time"] = time.strftime('%H:%M:%S') - settings["date"] = time.strftime('%d-%m-%Y') - settings["day"] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][int(time.strftime('%w'))] + #Replace the setting tokens in start and end g-code. + settings["machine_start_gcode"] = self._expandGcodeTokens("machine_start_gcode", settings["machine_start_gcode"], settings) + settings["machine_end_gcode"] = self._expandGcodeTokens("machine_end_gcode", settings["machine_end_gcode"], settings) for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key - if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting. - setting_message.value = self._expandGcodeTokens(key, value, settings) - else: - setting_message.value = str(value).encode("utf-8") + setting_message.value = str(value).encode("utf-8") Job.yieldThread() ## Sends for some settings which extruder they should fallback to if not @@ -356,3 +359,4 @@ class StartSliceJob(Job): relations_set.add(relation.target.key) self._addRelations(relations_set, relation.target.relations) + From 0a2a7dda2330074074aed3127934c80298c1fe46 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 3 Sep 2017 17:19:30 +0200 Subject: [PATCH 2/3] Remove unused parameter And document that function while we're at it. --- plugins/CuraEngineBackend/StartSliceJob.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 1e8698dee1..00db2ffa00 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -229,7 +229,11 @@ class StartSliceJob(Job): return result - def _expandGcodeTokens(self, key, value, settings): + ## Replace setting tokens in a piece of g-code. + # \param value A piece of g-code to replace tokens in. + # \param settings A dictionary of tokens to replace and their respective + # replacement strings. + def _expandGcodeTokens(self, value: str, settings: dict): try: # any setting can be used as a token fmt = GcodeStartEndFormatter() @@ -251,8 +255,8 @@ class StartSliceJob(Job): settings["material_guid"] = material_instance_container.getMetaDataEntry("GUID", "") #Replace the setting tokens in start and end g-code. - settings["machine_extruder_start_code"] = self._expandGcodeTokens("machine_extruder_start_code", settings["machine_extruder_start_code"], settings) - settings["machine_extruder_end_code"] = self._expandGcodeTokens("machine_extruder_end_code", settings["machine_extruder_end_code"], settings) + settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings) + settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], settings) for key, value in settings.items(): # Do not send settings that are not settable_per_extruder. @@ -291,8 +295,8 @@ class StartSliceJob(Job): settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) #Replace the setting tokens in start and end g-code. - settings["machine_start_gcode"] = self._expandGcodeTokens("machine_start_gcode", settings["machine_start_gcode"], settings) - settings["machine_end_gcode"] = self._expandGcodeTokens("machine_end_gcode", settings["machine_end_gcode"], settings) + settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], settings) + settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], settings) for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") From e55bb1e25c94b0d2e78a53372116fa60cda99971 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 15 Nov 2017 00:35:53 +0100 Subject: [PATCH 3/3] Simplify getting material's GUID --- plugins/CuraEngineBackend/StartSliceJob.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 00db2ffa00..720aacf374 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -250,9 +250,7 @@ class StartSliceJob(Job): settings = self._buildReplacementTokens(stack) #Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. - material_instance_container = stack.findContainer({"type": "material"}) - if material_instance_container: - settings["material_guid"] = material_instance_container.getMetaDataEntry("GUID", "") + settings["material_guid"] = stack.material.getMetaDataEntry("GUID", "") #Replace the setting tokens in start and end g-code. settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings)