diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 5139b9885d..c3db797e19 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -43,6 +43,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # The variant of the extruder. VariantRole = Qt.UserRole + 7 + StackRole = Qt.UserRole + 8 ## List of colours to display if there is no material or the material has no known # colour. @@ -62,6 +63,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self.addRoleName(self.DefinitionRole, "definition") self.addRoleName(self.MaterialRole, "material") self.addRoleName(self.VariantRole, "variant") + self.addRoleName(self.StackRole, "stack") self._update_extruder_timer = QTimer() self._update_extruder_timer.setInterval(100) @@ -188,6 +190,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "definition": extruder.getBottom().getId(), "material": extruder.material.getName() if extruder.material else "", "variant": extruder.variant.getName() if extruder.variant else "", # e.g. print core + "stack": extruder, } items.append(item) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 8b7205f8b2..11d98c0e43 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -110,6 +110,7 @@ class StartSliceJob(Job): return stack = Application.getInstance().getGlobalContainerStack() + extruder_stack_id_to_position = {} # a lookup table because we need the position, not the id. if not stack: self.setResult(StartJobResult.Error) return @@ -129,7 +130,8 @@ class StartSliceJob(Job): self.setResult(StartJobResult.MaterialIncompatible) return - for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + for position, extruder_stack in stack.extruders.items(): + extruder_stack_id_to_position[extruder_stack.getId()] = position material = extruder_stack.findContainer({"type": "material"}) if material: if material.getMetaDataEntry("compatible") == False: @@ -193,11 +195,19 @@ class StartSliceJob(Job): if per_object_stack: is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) - if node.callDecoration("getBuildPlateNumber") == self._build_plate_number: - if not getattr(node, "_outside_buildarea", False) or is_non_printing_mesh: - temp_list.append(node) - if not is_non_printing_mesh: - has_printing_mesh = True + # Find a reason not to add the node + if node.callDecoration("getBuildPlateNumber") != self._build_plate_number: + continue + if getattr(node, "_outside_buildarea", False) and is_non_printing_mesh: + continue + node_extruder_id = node.callDecoration("getActiveExtruder") + node_position = extruder_stack_id_to_position.get(node_extruder_id, "0") + if not stack.extruders[str(node_position)].isEnabled: + continue + + temp_list.append(node) + if not is_non_printing_mesh: + has_printing_mesh = True Job.yieldThread() @@ -382,7 +392,7 @@ class StartSliceJob(Job): def _buildGlobalInheritsStackMessage(self, stack): for key in stack.getAllKeys(): extruder = int(round(float(stack.getProperty(key, "limit_to_extruder")))) - if extruder >= 0: #Set to a specific extruder. + if extruder >= 0 and stack.extruders[str(extruder)].isEnabled: #Set to a specific extruder. setting_extruder = self._slice_message.addRepeatedMessage("limit_to_extruder") setting_extruder.name = key setting_extruder.extruder = extruder