diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index d3005a78fe..30370e417f 100644 --- a/cura/Settings/ExtruderManager.py +++ b/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.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.SettingFunction @@ -287,6 +289,57 @@ class ExtruderManager(QObject): result.append(stack.getProperty(setting_key, property)) 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. #