From 4a788dfbdd45066f5a12f06d3458e519ad26ca56 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 18 Aug 2017 15:02:49 +0200 Subject: [PATCH 1/3] Reduce indentation by inverting input check Reads a bit easier. Contributes to issue CURA-4186. --- plugins/CuraEngineBackend/StartSliceJob.py | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index f2e9cb7db2..d65731a3ee 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. import numpy @@ -306,25 +306,26 @@ class StartSliceJob(Job): # \param message object_lists message to put the per object settings in def _handlePerObjectSettings(self, node, message): stack = node.callDecoration("getStack") - # Check if the node has a stack attached to it and the stack has any settings in the top container. - if stack: - # Check all settings for relations, so we can also calculate the correct values for dependant settings. - changed_setting_keys = set(stack.getTop().getAllKeys()) - for key in stack.getTop().getAllKeys(): - instance = stack.getTop().getInstance(key) - self._addRelations(changed_setting_keys, instance.definition.relations) - Job.yieldThread() + if not stack: # Check if the node has a stack attached to it and the stack has any settings in the top container. + return - # Ensure that the engine is aware what the build extruder is - if stack.getProperty("machine_extruder_count", "value") > 1: - changed_setting_keys.add("extruder_nr") + # Check all settings for relations, so we can also calculate the correct values for dependent settings. + changed_setting_keys = set(stack.getTop().getAllKeys()) + for key in stack.getTop().getAllKeys(): + instance = stack.getTop().getInstance(key) + self._addRelations(changed_setting_keys, instance.definition.relations) + Job.yieldThread() - # Get values for all changed settings - for key in changed_setting_keys: - setting = message.addRepeatedMessage("settings") - setting.name = key - setting.value = str(stack.getProperty(key, "value")).encode("utf-8") - Job.yieldThread() + # Ensure that the engine is aware what the build extruder is + if stack.getProperty("machine_extruder_count", "value") > 1: + changed_setting_keys.add("extruder_nr") + + # Get values for all changed settings + for key in changed_setting_keys: + setting = message.addRepeatedMessage("settings") + setting.name = key + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() ## Recursive function to put all settings that require eachother for value changes in a list # \param relations_set \type{set} Set of keys (strings) of settings that are influenced From 3c36c3427cfc14af8edff63da7f9ef96f67e3d65 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 18 Aug 2017 15:36:15 +0200 Subject: [PATCH 2/3] Cache top of stack for efficiency Otherwise you need to retrieve this container for every key again. Doesn't matter much, but a bit. Contributes to issue CURA-4186. --- plugins/CuraEngineBackend/StartSliceJob.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index d65731a3ee..000cf8fa4a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -310,9 +310,10 @@ class StartSliceJob(Job): return # Check all settings for relations, so we can also calculate the correct values for dependent settings. - changed_setting_keys = set(stack.getTop().getAllKeys()) - for key in stack.getTop().getAllKeys(): - instance = stack.getTop().getInstance(key) + top_of_stack = stack.getTop() #Cache for efficiency. + changed_setting_keys = set(top_of_stack.getAllKeys()) + for key in top_of_stack.getAllKeys(): + instance = top_of_stack.getInstance(key) self._addRelations(changed_setting_keys, instance.definition.relations) Job.yieldThread() From b7493ae1a8eeb39455ee4525f1ceab05ea084f6c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 18 Aug 2017 16:57:13 +0200 Subject: [PATCH 3/3] Also pull limit_to_extruder settings into per-object setting stack Only for settings that are limited by a setting on the stack. Contributes to issue CURA-4186. --- plugins/CuraEngineBackend/StartSliceJob.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 000cf8fa4a..b6da2104a6 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -325,14 +325,19 @@ class StartSliceJob(Job): for key in changed_setting_keys: setting = message.addRepeatedMessage("settings") setting.name = key - setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + extruder = int(round(float(stack.getProperty(key, "limit_to_extruder")))) + if extruder >= 0 and key not in top_of_stack.getAllKeys(): #Limited to a specific extruder, but not overridden by per-object settings. + limited_stack = ExtruderManager.getInstance().getActiveExtruderStacks()[extruder] + else: + limited_stack = stack #Just take from the per-object settings itself. + setting.value = str(limited_stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread() ## Recursive function to put all settings that require eachother for value changes in a list # \param relations_set \type{set} Set of keys (strings) of settings that are influenced # \param relations list of relation objects that need to be checked. def _addRelations(self, relations_set, relations): - for relation in filter(lambda r: r.role == "value", relations): + for relation in filter(lambda r: r.role == "value" or r.role == "limit_to_extruder", relations): if relation.type == RelationType.RequiresTarget: continue