diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index b029665abd..10ae8bb87a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -528,7 +528,7 @@ class BuildVolume(SceneNode): def _onStackChanged(self): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged) - extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + extruders = ExtruderManager.getInstance().getActiveExtruderStacks() for extruder in extruders: extruder.propertyChanged.disconnect(self._onSettingPropertyChanged) @@ -536,7 +536,7 @@ class BuildVolume(SceneNode): if self._global_container_stack: self._global_container_stack.propertyChanged.connect(self._onSettingPropertyChanged) - extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + extruders = ExtruderManager.getInstance().getActiveExtruderStacks() for extruder in extruders: extruder.propertyChanged.connect(self._onSettingPropertyChanged) diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 367144abfc..ea54d64642 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -304,7 +304,7 @@ class ConvexHullDecorator(SceneNodeDecorator): if self._global_stack: self._global_stack.propertyChanged.disconnect(self._onSettingValueChanged) self._global_stack.containersChanged.disconnect(self._onChanged) - extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_stack.getId()) + extruders = ExtruderManager.getInstance().getActiveExtruderStacks() for extruder in extruders: extruder.propertyChanged.disconnect(self._onSettingValueChanged) @@ -314,7 +314,7 @@ class ConvexHullDecorator(SceneNodeDecorator): self._global_stack.propertyChanged.connect(self._onSettingValueChanged) self._global_stack.containersChanged.connect(self._onChanged) - extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_stack.getId()) + extruders = ExtruderManager.getInstance().getActiveExtruderStacks() for extruder in extruders: extruder.propertyChanged.connect(self._onSettingValueChanged) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index a7cb15d806..65a7764508 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -12,11 +12,10 @@ from UM.Scene.Selection import Selection from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID. from UM.Settings.SettingFunction import SettingFunction -from UM.Settings.SettingInstance import SettingInstance from UM.Settings.ContainerStack import ContainerStack from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext -from typing import Optional, List, TYPE_CHECKING, Union, Dict +from typing import Optional, List, TYPE_CHECKING, Dict, List if TYPE_CHECKING: from cura.Settings.ExtruderStack import ExtruderStack @@ -38,9 +37,10 @@ class ExtruderManager(QObject): self._application = cura.CuraApplication.CuraApplication.getInstance() - self._extruder_trains = {} # Per machine, a dictionary of extruder container stack IDs. Only for separately defined extruders. + # Per machine, a dictionary of extruder container stack IDs. Only for separately defined extruders. + self._extruder_trains = {} # type: Dict[str, List[ExtruderStack]] self._active_extruder_index = -1 # Indicates the index of the active extruder stack. -1 means no active extruder stack - self._selected_object_extruders = [] + self._selected_object_extruders = [] # type: List[ExtruderStack] self._addCurrentMachineExtruders() Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) @@ -68,7 +68,7 @@ class ExtruderManager(QObject): ## Return extruder count according to extruder trains. @pyqtProperty(int, notify = extrudersChanged) - def extruderCount(self): + def extruderCount(self) -> int: if not self._application.getGlobalContainerStack(): return 0 # No active machine, so no extruders. try: @@ -83,11 +83,7 @@ class ExtruderManager(QObject): global_container_stack = self._application.getGlobalContainerStack() if global_container_stack: - global_stack_id = global_container_stack.getId() - - if global_stack_id in self._extruder_trains: - for position in self._extruder_trains[global_stack_id]: - extruder_stack_ids[position] = self._extruder_trains[global_stack_id][position].getId() + extruder_stack_ids = {position: extruder.id for position, extruder in global_container_stack.extruders.items()} return extruder_stack_ids @@ -109,7 +105,7 @@ class ExtruderManager(QObject): @pyqtSlot(int, result = str) def getExtruderName(self, index): try: - return list(self.getActiveExtruderStacks())[index].getName() + return self.getActiveExtruderStacks()[index].getName() except IndexError: return "" @@ -318,7 +314,7 @@ class ExtruderManager(QObject): ## Returns extruders for a specific machine. # # \param machine_id The machine to get the extruders of. - def getMachineExtruders(self, machine_id: str): + def getMachineExtruders(self, machine_id: str) -> List["ExtruderStack"]: if machine_id not in self._extruder_trains: return [] return [self._extruder_trains[machine_id][name] for name in self._extruder_trains[machine_id]] @@ -331,11 +327,7 @@ class ExtruderManager(QObject): if not global_stack: return [] - result = [] - - if global_stack.getId() in self._extruder_trains: - for extruder in sorted(self._extruder_trains[global_stack.getId()]): - result.append(self._extruder_trains[global_stack.getId()][extruder]) + result = list(global_stack.extruders.values()) machine_extruder_count = global_stack.getProperty("machine_extruder_count", "value") @@ -404,7 +396,7 @@ class ExtruderManager(QObject): global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() result = [] - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): if not extruder.isEnabled: continue # only include values from extruders that are "active" for the current machine instance @@ -446,7 +438,7 @@ class ExtruderManager(QObject): } result = [] - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): # only include values from extruders that are "active" for the current machine instance if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value", context = context): continue diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index f179dabd5a..37cb68af32 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -171,7 +171,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # get machine extruder count for verification machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - for extruder in Application.getInstance().getExtruderManager().getMachineExtruders(global_container_stack.getId()): + for extruder in Application.getInstance().getExtruderManager().getActiveExtruderStacks(): position = extruder.getMetaDataEntry("position", default = "0") # Get the position try: position = int(position) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a1d824a5da..ed543fcee1 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -414,7 +414,7 @@ class MachineManager(QObject): # Not a very pretty solution, but the extruder manager doesn't really know how many extruders there are machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") - extruder_stacks = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() count = 1 # we start with the global stack for stack in extruder_stacks: md = stack.getMetaData() @@ -437,7 +437,7 @@ class MachineManager(QObject): if self._global_container_stack.getTop().findInstances(): return True - stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + stacks = ExtruderManager.getInstance().getActiveExtruderStacks() for stack in stacks: if stack.getTop().findInstances(): return True @@ -450,7 +450,7 @@ class MachineManager(QObject): return 0 num_user_settings = 0 num_user_settings += len(self._global_container_stack.getTop().findInstances()) - stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + stacks = ExtruderManager.getInstance().getActiveExtruderStacks() for stack in stacks: num_user_settings += len(stack.getTop().findInstances()) return num_user_settings @@ -475,7 +475,7 @@ class MachineManager(QObject): stack = ExtruderManager.getInstance().getActiveExtruderStack() stacks = [stack] else: - stacks = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + stacks = ExtruderManager.getInstance().getActiveExtruderStacks() for stack in stacks: if stack is not None: @@ -640,7 +640,7 @@ class MachineManager(QObject): if self._active_container_stack is None or self._global_container_stack is None: return new_value = self._active_container_stack.getProperty(key, "value") - extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + extruder_stacks = [stack for stack in ExtruderManager.getInstance().getActiveExtruderStacks()] # check in which stack the value has to be replaced for extruder_stack in extruder_stacks: diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9a5c95b04d..91a9ee0e7b 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -343,7 +343,7 @@ class CuraEngineBackend(QObject, Backend): if not self._global_container_stack: Logger.log("w", "Global container stack not assigned to CuraEngineBackend!") return - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + extruders = ExtruderManager.getInstance().getActiveExtruderStacks() error_keys = [] #type: List[str] for extruder in extruders: error_keys.extend(extruder.getErrorKeys()) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 3bd6d79198..3953625c7e 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -178,7 +178,7 @@ class ProcessSlicedLayersJob(Job): # Find out colors per extruder global_container_stack = Application.getInstance().getGlobalContainerStack() manager = ExtruderManager.getInstance() - extruders = list(manager.getMachineExtruders(global_container_stack.getId())) + extruders = manager.getActiveExtruderStacks() if extruders: material_color_map = numpy.zeros((len(extruders), 4), dtype=numpy.float32) for extruder in extruders: diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 1295390c22..28e442033b 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -333,7 +333,7 @@ class StartSliceJob(Job): "-1": self._buildReplacementTokens(global_stack) } - for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): extruder_nr = extruder_stack.getProperty("extruder_nr", "value") self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack)