From 3f5563514c3bd7b9ab61e57b92581a8501a32e45 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Aug 2019 13:03:03 +0200 Subject: [PATCH] Remove _current_quality_changes_group shadow administration Get the quality changes group back from whichever one is actually active on the stack. This prevents the two from getting out of sync, which makes the code easier to maintain. Contributes to issue CURA-6600. --- cura/Machines/ContainerTree.py | 19 ++++++++++++++++++- cura/Settings/MachineManager.py | 27 +++++++++++++++------------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/cura/Machines/ContainerTree.py b/cura/Machines/ContainerTree.py index 80681c902d..eb2ed7d159 100644 --- a/cura/Machines/ContainerTree.py +++ b/cura/Machines/ContainerTree.py @@ -9,11 +9,12 @@ import cura.CuraApplication # Imported like this to prevent circular dependenci from cura.Machines.MachineNode import MachineNode from cura.Settings.GlobalStack import GlobalStack # To listen only to global stacks being added. -from typing import Dict, TYPE_CHECKING +from typing import Dict, List, TYPE_CHECKING import time if TYPE_CHECKING: from cura.Machines.QualityGroup import QualityGroup + from cura.Machines.QualityChangesGroup import QualityChangesGroup ## This class contains a look-up tree for which containers are available at # which stages of configuration. @@ -57,6 +58,22 @@ class ContainerTree: extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruders.values()] return self.machines[global_stack.definition.getId()].getQualityGroups(variant_names, material_bases, extruder_enabled) + ## Get the quality changes groups available for the currently activated + # printer. + # + # This contains all quality changes groups, enabled or disabled. To check + # whether the quality changes group can be activated, test for the + # ``QualityChangesGroup.is_available`` property. + # \return A list of all quality changes groups. + def getCurrentQualityChangesGroups(self) -> List["QualityChangesGroup"]: + global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() + if global_stack is None: + return [] + variant_names = [extruder.variant.getName() for extruder in global_stack.extruders.values()] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruders.values()] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruders.values()] + return self.machines[global_stack.definition.getId()].getQualityChangesGroups(variant_names, material_bases, extruder_enabled) + ## Builds the initial container tree. def _loadAll(self): Logger.log("i", "Building container tree.") diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8bd86c554c..ce32eeb195 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -61,7 +61,6 @@ class MachineManager(QObject): self._global_container_stack = None # type: Optional[GlobalStack] self._current_root_material_id = {} # type: Dict[str, str] - self._current_quality_changes_group = None # type: Optional[QualityChangesGroup] self._default_extruder_position = "0" # to be updated when extruders are switched on and off @@ -1082,7 +1081,6 @@ class MachineManager(QObject): def _setEmptyQuality(self) -> None: if self._global_container_stack is None: return - self._current_quality_changes_group = None self._global_container_stack.quality = empty_quality_container self._global_container_stack.qualityChanges = empty_quality_changes_container for extruder in self._global_container_stack.extruders.values(): @@ -1105,9 +1103,6 @@ class MachineManager(QObject): if node.container is None: return - if empty_quality_changes: - self._current_quality_changes_group = None - # Set quality and quality_changes for the GlobalStack self._global_container_stack.quality = quality_group.node_for_global.container if empty_quality_changes: @@ -1169,7 +1164,6 @@ class MachineManager(QObject): extruder.quality = quality_container extruder.qualityChanges = quality_changes_container - self._current_quality_changes_group = quality_changes_group self.activeQualityGroupChanged.emit() self.activeQualityChangesGroupChanged.emit() @@ -1214,10 +1208,11 @@ class MachineManager(QObject): ## Update current quality type and machine after setting material def _updateQualityWithMaterial(self, *args: Any) -> None: - if self._global_container_stack is None: + global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() + if global_stack is None: return Logger.log("d", "Updating quality/quality_changes due to material change") - current_quality_type = self._global_container_stack.quality.getMetaDataEntry("quality_type") + current_quality_type = global_stack.quality.getMetaDataEntry("quality_type") candidate_quality_groups = ContainerTree.getInstance().getCurrentQualityGroups() available_quality_types = {qt for qt, g in candidate_quality_groups.items() if g.is_available} @@ -1229,7 +1224,7 @@ class MachineManager(QObject): return if not available_quality_types: - if self._current_quality_changes_group is None: + if global_stack.qualityChanges == empty_quality_changes_container: Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).") self._setEmptyQuality() return @@ -1510,7 +1505,7 @@ class MachineManager(QObject): @pyqtProperty(QObject, fset = setQualityGroup, notify = activeQualityGroupChanged) def activeQualityGroup(self) -> Optional["QualityGroup"]: global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() - if global_stack.quality == empty_quality_container: + if not global_stack or global_stack.quality == empty_quality_container: return None return ContainerTree.getInstance().getCurrentQualityGroups().get(self.activeQualityType) @@ -1535,11 +1530,19 @@ class MachineManager(QObject): @pyqtProperty(QObject, fset = setQualityChangesGroup, notify = activeQualityChangesGroupChanged) def activeQualityChangesGroup(self) -> Optional["QualityChangesGroup"]: - return self._current_quality_changes_group + global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() + if not global_stack or global_stack.qualityChanges == empty_quality_changes_container: + return None + candidate_groups = ContainerTree.getInstance().getCurrentQualityChangesGroups() + for group in candidate_groups: # Match on the container ID of the global stack to find the quality changes group belonging to the active configuration. + if group.node_for_global and group.node_for_global.container_id == global_stack.qualityChanges.getId(): + return group + return None @pyqtProperty(bool, notify = activeQualityChangesGroupChanged) def hasCustomQuality(self) -> bool: - return self._current_quality_changes_group is not None + global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() + return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container @pyqtProperty(str, notify = activeQualityGroupChanged) def activeQualityOrQualityChangesName(self) -> str: