From 90d2c29fb49db054e67aa5a2ca12068ecea98a50 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 28 Mar 2018 12:11:48 +0200 Subject: [PATCH 1/3] Use global_stack.extruders instead of ExtruderManager.extruderIds CURA-5168 We want to remove ExtruderManager eventually, and keeping two separate pieces of data can cause it to be out of sync. --- cura/Settings/ExtruderManager.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 2b422ec406..23b6c22f0c 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -259,8 +259,9 @@ class ExtruderManager(QObject): # # \return A list of extruder stacks. def getUsedExtruderStacks(self) -> List["ContainerStack"]: - global_stack = self._application.getGlobalContainerStack() + machine_manager = self._application.getMachineManager() container_registry = ContainerRegistry.getInstance() + global_stack = machine_manager.activeMachine used_extruder_stack_ids = set() @@ -269,11 +270,7 @@ class ExtruderManager(QObject): support_bottom_enabled = False support_roof_enabled = False - scene_root = Application.getInstance().getController().getScene().getRoot() - - # If no extruders are registered in the extruder manager yet, return an empty array - if len(self.extruderIds) == 0: - return [] + scene_root = self._application.getController().getScene().getRoot() # Get the extruders of all printable meshes in the scene meshes = [node for node in DepthFirstIterator(scene_root) if isinstance(node, SceneNode) and node.isSelectable()] @@ -281,7 +278,7 @@ class ExtruderManager(QObject): extruder_stack_id = mesh.callDecoration("getActiveExtruder") if not extruder_stack_id: # No per-object settings for this node - extruder_stack_id = self.extruderIds["0"] + extruder_stack_id = global_stack.extruders["0"].getId() used_extruder_stack_ids.add(extruder_stack_id) # Get whether any of them use support. @@ -305,23 +302,23 @@ class ExtruderManager(QObject): extruder_nr = int(global_stack.getProperty(extruder_nr_feature_name, "value")) if extruder_nr == -1: continue - used_extruder_stack_ids.add(self.extruderIds[str(extruder_nr)]) + used_extruder_stack_ids.add(global_stack.extruders[str(extruder_nr)].getId()) # Check support extruders if support_enabled: - used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_infill_extruder_nr", "value")))]) - used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_extruder_nr_layer_0", "value")))]) + used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_infill_extruder_nr", "value")))].getId()) + used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_extruder_nr_layer_0", "value")))].getId()) if support_bottom_enabled: - used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_bottom_extruder_nr", "value")))]) + used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_bottom_extruder_nr", "value")))].getId()) if support_roof_enabled: - used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_roof_extruder_nr", "value")))]) + used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_roof_extruder_nr", "value")))].getId()) # The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": extruder_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value")) if extruder_nr == "-1": extruder_nr = Application.getInstance().getMachineManager().defaultExtruderPosition - used_extruder_stack_ids.add(self.extruderIds[extruder_nr]) + used_extruder_stack_ids.add(global_stack.extruders[extruder_nr].getId()) try: return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids] From e3c578aa18e09de39c1b7eb193290ce8735d1814 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 28 Mar 2018 12:17:44 +0200 Subject: [PATCH 2/3] Revert "Use global_stack.extruders instead of ExtruderManager.extruderIds" CURA-5168 Causes side effects. --- cura/Settings/ExtruderManager.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 23b6c22f0c..2b422ec406 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -259,9 +259,8 @@ class ExtruderManager(QObject): # # \return A list of extruder stacks. def getUsedExtruderStacks(self) -> List["ContainerStack"]: - machine_manager = self._application.getMachineManager() + global_stack = self._application.getGlobalContainerStack() container_registry = ContainerRegistry.getInstance() - global_stack = machine_manager.activeMachine used_extruder_stack_ids = set() @@ -270,7 +269,11 @@ class ExtruderManager(QObject): support_bottom_enabled = False support_roof_enabled = False - scene_root = self._application.getController().getScene().getRoot() + scene_root = Application.getInstance().getController().getScene().getRoot() + + # If no extruders are registered in the extruder manager yet, return an empty array + if len(self.extruderIds) == 0: + return [] # Get the extruders of all printable meshes in the scene meshes = [node for node in DepthFirstIterator(scene_root) if isinstance(node, SceneNode) and node.isSelectable()] @@ -278,7 +281,7 @@ class ExtruderManager(QObject): extruder_stack_id = mesh.callDecoration("getActiveExtruder") if not extruder_stack_id: # No per-object settings for this node - extruder_stack_id = global_stack.extruders["0"].getId() + extruder_stack_id = self.extruderIds["0"] used_extruder_stack_ids.add(extruder_stack_id) # Get whether any of them use support. @@ -302,23 +305,23 @@ class ExtruderManager(QObject): extruder_nr = int(global_stack.getProperty(extruder_nr_feature_name, "value")) if extruder_nr == -1: continue - used_extruder_stack_ids.add(global_stack.extruders[str(extruder_nr)].getId()) + used_extruder_stack_ids.add(self.extruderIds[str(extruder_nr)]) # Check support extruders if support_enabled: - used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_infill_extruder_nr", "value")))].getId()) - used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_extruder_nr_layer_0", "value")))].getId()) + used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_infill_extruder_nr", "value")))]) + used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_extruder_nr_layer_0", "value")))]) if support_bottom_enabled: - used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_bottom_extruder_nr", "value")))].getId()) + used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_bottom_extruder_nr", "value")))]) if support_roof_enabled: - used_extruder_stack_ids.add(global_stack.extruders[self.extruderValueWithDefault(str(global_stack.getProperty("support_roof_extruder_nr", "value")))].getId()) + used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_roof_extruder_nr", "value")))]) # The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": extruder_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value")) if extruder_nr == "-1": extruder_nr = Application.getInstance().getMachineManager().defaultExtruderPosition - used_extruder_stack_ids.add(global_stack.extruders[extruder_nr].getId()) + used_extruder_stack_ids.add(self.extruderIds[extruder_nr]) try: return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids] From 9efad28599e40c9463ab8159b2960549d055f095 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 28 Mar 2018 12:55:41 +0200 Subject: [PATCH 3/3] Fix setQualityChangesGroup when quality_type is not_supported CURA-5169 --- cura/Settings/MachineManager.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 2e9a643be4..8a1be1d6d3 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1016,27 +1016,35 @@ class MachineManager(QObject): def _setQualityChangesGroup(self, quality_changes_group): quality_type = quality_changes_group.quality_type - quality_group_dict = self._quality_manager.getQualityGroups(self._global_container_stack) - quality_group = quality_group_dict[quality_type] + # A custom quality can be created based on "not supported". + # In that case, do not set quality containers to empty. + if quality_type == "not_supported": + quality_group = None + else: + quality_group_dict = self._quality_manager.getQualityGroups(self._global_container_stack) + quality_group = quality_group_dict[quality_type] quality_changes_container = self._empty_quality_changes_container - quality_container = self._empty_quality_changes_container if quality_changes_group.node_for_global: quality_changes_container = quality_changes_group.node_for_global.getContainer() - if quality_group.node_for_global: - quality_container = quality_group.node_for_global.getContainer() + quality_container = self._empty_quality_changes_container + if quality_group is not None: + if quality_group.node_for_global: + quality_container = quality_group.node_for_global.getContainer() self._global_container_stack.quality = quality_container self._global_container_stack.qualityChanges = quality_changes_container for position, extruder in self._global_container_stack.extruders.items(): quality_changes_node = quality_changes_group.nodes_for_extruders.get(position) - quality_node = quality_group.nodes_for_extruders.get(position) + quality_node = None + if quality_group is not None: + quality_node = quality_group.nodes_for_extruders.get(position) quality_changes_container = self._empty_quality_changes_container - quality_container = self._empty_quality_container if quality_changes_node: quality_changes_container = quality_changes_node.getContainer() + quality_container = self._empty_quality_container if quality_node: quality_container = quality_node.getContainer()