From 14e736d9ebfedc0826d7ad41c12751655244b907 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 10 Nov 2016 19:31:02 +0100 Subject: [PATCH] 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. --- cura/Settings/ExtruderManager.py | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) 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. #