Browse Source

Merge branch '2.7'

Ghostkeeper 7 years ago
parent
commit
b917511528
1 changed files with 27 additions and 20 deletions
  1. 27 20
      plugins/CuraEngineBackend/StartSliceJob.py

+ 27 - 20
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,31 +306,38 @@ 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()
-
-            # 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")
+        if not stack: # Check if the node has a stack attached to it and the stack has any settings in the top container.
+            return
 
-            # 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()
+        # Check all settings for relations, so we can also calculate the correct values for dependent settings.
+        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()
+
+        # 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
+            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