|
@@ -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.
|
|
|
#
|