Browse Source

Add function to find the extruders that are used

These are the extruders that are being used by the scene if it would currently be printed. You can ask the extruder stacks for stuff like the nozzle offset. This way we can determine the disallowed areas per extruder.

Contributes to issue CURA-2625.
Ghostkeeper 8 years ago
parent
commit
14e736d9eb
1 changed files with 53 additions and 0 deletions
  1. 53 0
      cura/Settings/ExtruderManager.py

+ 53 - 0
cura/Settings/ExtruderManager.py

@@ -5,6 +5,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant #
 
 
 import UM.Application #To get the global container stack to find the current machine.
 import UM.Application #To get the global container stack to find the current machine.
 import UM.Logger
 import UM.Logger
+from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator #To find which extruders are used in the scene.
+from UM.Scene.SceneNode import SceneNode #To find which extruders are used in the scene.
 import UM.Settings.ContainerRegistry #Finding containers by ID.
 import UM.Settings.ContainerRegistry #Finding containers by ID.
 import UM.Settings.SettingFunction
 import UM.Settings.SettingFunction
 
 
@@ -287,6 +289,57 @@ class ExtruderManager(QObject):
             result.append(stack.getProperty(setting_key, property))
             result.append(stack.getProperty(setting_key, property))
         return result
         return result
 
 
+    ##  Gets the extruder stacks that are actually being used at the moment.
+    #
+    #   An extruder stack is being used if it is the extruder to print any mesh
+    #   with, or if it is the support infill extruder, the support interface
+    #   extruder, or the bed adhesion extruder.
+    #
+    #   If there are no extruders, this returns the global stack as a singleton
+    #   list.
+    #
+    #   \return A list of extruder stacks.
+    def getUsedExtruderStacks(self):
+        global_stack = UM.Application.getInstance().getGlobalContainerStack()
+        container_registry = UM.Settings.ContainerRegistry.getInstance()
+
+        if global_stack.getProperty("machine_extruder_count", "value") == 0: #For single extrusion.
+            return [global_stack]
+
+        used_extruder_stack_ids = set()
+
+        #Get the extruders of all meshes in the scene.
+        support_enabled = False
+        support_interface_enabled = False
+        scene_root = UM.Application.getInstance().getController().getScene().getRoot()
+        meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed.
+        for mesh in meshes:
+            extruder_stack_id = mesh.callDecoration("getActiveExtruder")
+            if not extruder_stack_id: #No per-object settings for this node.
+                extruder_stack_id = self.extruderIds["0"]
+            used_extruder_stack_ids.add(extruder_stack_id)
+
+            #Get whether any of them use support.
+            per_mesh_stack = mesh.callDecoration("getStack")
+            if per_mesh_stack:
+                support_enabled |= per_mesh_stack.getProperty("support_enable", "value")
+                support_interface_enabled |= per_mesh_stack.getProperty("support_interface_enable", "value")
+            else: #Take the setting from the build extruder stack.
+                extruder_stack = container_registry.findContainerStacks(id = extruder_stack_id)[0]
+                support_enabled |= extruder_stack.getProperty("support_enable", "value")
+                support_interface_enabled |= extruder_stack.getProperty("support_enable", "value")
+
+        #The support extruders.
+        if support_enabled:
+            used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_infill_extruder_nr", "value"))])
+            if support_interface_enabled:
+                used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_interface_extruder_nr", "value"))])
+
+        #The platform adhesion extruder. Not used if using brim and brim width is 0.
+        if global_stack.getProperty("adhesion_type", "value") != "brim" or global_stack.getProperty("brim_line_count", "value") > 0:
+            used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("adhesion_extruder_nr", "value"))])
+
+        return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]
 
 
     ##  Removes the container stack and user profile for the extruders for a specific machine.
     ##  Removes the container stack and user profile for the extruders for a specific machine.
     #
     #