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.
This commit is contained in:
Ghostkeeper 2019-08-27 13:03:03 +02:00
parent 62395d5503
commit 3f5563514c
No known key found for this signature in database
GPG key ID: 86BEF881AE2CF276
2 changed files with 33 additions and 13 deletions

View file

@ -9,11 +9,12 @@ import cura.CuraApplication # Imported like this to prevent circular dependenci
from cura.Machines.MachineNode import MachineNode from cura.Machines.MachineNode import MachineNode
from cura.Settings.GlobalStack import GlobalStack # To listen only to global stacks being added. 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 import time
if TYPE_CHECKING: if TYPE_CHECKING:
from cura.Machines.QualityGroup import QualityGroup 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 ## This class contains a look-up tree for which containers are available at
# which stages of configuration. # which stages of configuration.
@ -57,6 +58,22 @@ class ContainerTree:
extruder_enabled = [extruder.isEnabled 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()].getQualityGroups(variant_names, material_bases, extruder_enabled) 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. ## Builds the initial container tree.
def _loadAll(self): def _loadAll(self):
Logger.log("i", "Building container tree.") Logger.log("i", "Building container tree.")

View file

@ -61,7 +61,6 @@ class MachineManager(QObject):
self._global_container_stack = None # type: Optional[GlobalStack] self._global_container_stack = None # type: Optional[GlobalStack]
self._current_root_material_id = {} # type: Dict[str, str] 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 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: def _setEmptyQuality(self) -> None:
if self._global_container_stack is None: if self._global_container_stack is None:
return return
self._current_quality_changes_group = None
self._global_container_stack.quality = empty_quality_container self._global_container_stack.quality = empty_quality_container
self._global_container_stack.qualityChanges = empty_quality_changes_container self._global_container_stack.qualityChanges = empty_quality_changes_container
for extruder in self._global_container_stack.extruders.values(): for extruder in self._global_container_stack.extruders.values():
@ -1105,9 +1103,6 @@ class MachineManager(QObject):
if node.container is None: if node.container is None:
return return
if empty_quality_changes:
self._current_quality_changes_group = None
# Set quality and quality_changes for the GlobalStack # Set quality and quality_changes for the GlobalStack
self._global_container_stack.quality = quality_group.node_for_global.container self._global_container_stack.quality = quality_group.node_for_global.container
if empty_quality_changes: if empty_quality_changes:
@ -1169,7 +1164,6 @@ class MachineManager(QObject):
extruder.quality = quality_container extruder.quality = quality_container
extruder.qualityChanges = quality_changes_container extruder.qualityChanges = quality_changes_container
self._current_quality_changes_group = quality_changes_group
self.activeQualityGroupChanged.emit() self.activeQualityGroupChanged.emit()
self.activeQualityChangesGroupChanged.emit() self.activeQualityChangesGroupChanged.emit()
@ -1214,10 +1208,11 @@ class MachineManager(QObject):
## Update current quality type and machine after setting material ## Update current quality type and machine after setting material
def _updateQualityWithMaterial(self, *args: Any) -> None: 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 return
Logger.log("d", "Updating quality/quality_changes due to material change") 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() candidate_quality_groups = ContainerTree.getInstance().getCurrentQualityGroups()
available_quality_types = {qt for qt, g in candidate_quality_groups.items() if g.is_available} available_quality_types = {qt for qt, g in candidate_quality_groups.items() if g.is_available}
@ -1229,7 +1224,7 @@ class MachineManager(QObject):
return return
if not available_quality_types: 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).") Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).")
self._setEmptyQuality() self._setEmptyQuality()
return return
@ -1510,7 +1505,7 @@ class MachineManager(QObject):
@pyqtProperty(QObject, fset = setQualityGroup, notify = activeQualityGroupChanged) @pyqtProperty(QObject, fset = setQualityGroup, notify = activeQualityGroupChanged)
def activeQualityGroup(self) -> Optional["QualityGroup"]: def activeQualityGroup(self) -> Optional["QualityGroup"]:
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() 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 None
return ContainerTree.getInstance().getCurrentQualityGroups().get(self.activeQualityType) return ContainerTree.getInstance().getCurrentQualityGroups().get(self.activeQualityType)
@ -1535,11 +1530,19 @@ class MachineManager(QObject):
@pyqtProperty(QObject, fset = setQualityChangesGroup, notify = activeQualityChangesGroupChanged) @pyqtProperty(QObject, fset = setQualityChangesGroup, notify = activeQualityChangesGroupChanged)
def activeQualityChangesGroup(self) -> Optional["QualityChangesGroup"]: 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) @pyqtProperty(bool, notify = activeQualityChangesGroupChanged)
def hasCustomQuality(self) -> bool: 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) @pyqtProperty(str, notify = activeQualityGroupChanged)
def activeQualityOrQualityChangesName(self) -> str: def activeQualityOrQualityChangesName(self) -> str: