Fix referencing nodes for quality changes

Contributes to issue CURA-6600.
This commit is contained in:
Ghostkeeper 2019-08-28 16:32:20 +02:00
parent 5fadc7019d
commit 5d8fff69e4
No known key found for this signature in database
GPG key ID: 86BEF881AE2CF276
2 changed files with 29 additions and 14 deletions

View file

@ -3,7 +3,7 @@
from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt
from UM.Application import Application import cura.CuraApplication
from UM.Logger import Logger from UM.Logger import Logger
from UM.Qt.ListModel import ListModel from UM.Qt.ListModel import ListModel
from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerRegistry import ContainerRegistry
@ -35,15 +35,13 @@ class QualitySettingsModel(ListModel):
self.addRoleName(self.CategoryRole, "category") self.addRoleName(self.CategoryRole, "category")
self._container_registry = ContainerRegistry.getInstance() self._container_registry = ContainerRegistry.getInstance()
self._application = Application.getInstance() self._application = cura.CuraApplication.CuraApplication.getInstance()
self._quality_manager = self._application.getQualityManager() self._application.getMachineManager().activeStackChanged.connect(self._update)
self._selected_position = self.GLOBAL_STACK_POSITION #Must be either GLOBAL_STACK_POSITION or an extruder position (0, 1, etc.) self._selected_position = self.GLOBAL_STACK_POSITION #Must be either GLOBAL_STACK_POSITION or an extruder position (0, 1, etc.)
self._selected_quality_item = None # The selected quality in the quality management page self._selected_quality_item = None # The selected quality in the quality management page
self._i18n_catalog = None self._i18n_catalog = None
self._quality_manager.qualitiesUpdated.connect(self._update)
self._update() self._update()
selectedPositionChanged = pyqtSignal() selectedPositionChanged = pyqtSignal()
@ -99,15 +97,25 @@ class QualitySettingsModel(ListModel):
# Here, if the user has selected a quality changes, then "quality_changes_group" will not be None, and we fetch # Here, if the user has selected a quality changes, then "quality_changes_group" will not be None, and we fetch
# the settings in that quality_changes_group. # the settings in that quality_changes_group.
if quality_changes_group is not None: if quality_changes_group is not None:
container_registry = ContainerRegistry.getInstance()
global_containers = container_registry.findContainers(id = quality_changes_group.metadata_for_global["id"])
global_container = None if len(global_containers) == 0 else global_containers[0]
extruders_containers = {pos: container_registry.findContainers(id = quality_changes_group.metadata_per_extruder[pos]["id"]) for pos in quality_changes_group.metadata_per_extruder}
extruders_container = {pos: None if not containers else containers[0] for pos, containers in extruders_containers.items()}
if self._selected_position == self.GLOBAL_STACK_POSITION: if self._selected_position == self.GLOBAL_STACK_POSITION:
quality_changes_node = quality_changes_group.node_for_global quality_changes_metadata = global_container.getMetaData()
else: else:
quality_changes_node = quality_changes_group.nodes_for_extruders.get(str(self._selected_position)) quality_changes_metadata = extruders_container.get(str(self._selected_position))
if quality_changes_node is not None and quality_changes_node.container is not None: # it can be None if number of extruders are changed during runtime if quality_changes_metadata is not None: # It can be None if number of extruders are changed during runtime.
quality_containers.insert(0, quality_changes_node.container) container = container_registry.findContainers(id = quality_changes_metadata["id"])
settings_keys.update(quality_changes_group.getAllKeys()) if container:
quality_containers.insert(0, container[0])
# We iterate over all definitions instead of settings in a quality/qualtiy_changes group is because in the GUI, settings_keys.update(global_container.getAllKeys())
for container in extruders_container.values():
settings_keys.update(container.getAllKeys())
# We iterate over all definitions instead of settings in a quality/quality_changes group is because in the GUI,
# the settings are grouped together by categories, and we had to go over all the definitions to figure out # the settings are grouped together by categories, and we had to go over all the definitions to figure out
# which setting belongs in which category. # which setting belongs in which category.
current_category = "" current_category = ""

View file

@ -1139,8 +1139,13 @@ class MachineManager(QObject):
if quality_group is None: if quality_group is None:
self._fixQualityChangesGroupToNotSupported(quality_changes_group) self._fixQualityChangesGroupToNotSupported(quality_changes_group)
container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry()
quality_changes_container = empty_quality_changes_container quality_changes_container = empty_quality_changes_container
quality_container = empty_quality_container # type: Optional[InstanceContainer] quality_container = empty_quality_container # type: Optional[InstanceContainer]
if quality_changes_group.metadata_for_global:
global_containers = container_registry.findContainers(id = quality_changes_group.metadata_for_global["id"])
if global_containers:
quality_changes_container = global_containers[0]
if quality_changes_group.node_for_global and quality_changes_group.node_for_global.container: if quality_changes_group.node_for_global and quality_changes_group.node_for_global.container:
quality_changes_container = cast(InstanceContainer, quality_changes_group.node_for_global.container) quality_changes_container = cast(InstanceContainer, quality_changes_group.node_for_global.container)
if quality_group is not None and quality_group.node_for_global and quality_group.node_for_global.container: if quality_group is not None and quality_group.node_for_global and quality_group.node_for_global.container:
@ -1150,15 +1155,17 @@ class MachineManager(QObject):
self._global_container_stack.qualityChanges = quality_changes_container self._global_container_stack.qualityChanges = quality_changes_container
for position, extruder in self._global_container_stack.extruders.items(): for position, extruder in self._global_container_stack.extruders.items():
quality_changes_node = quality_changes_group.nodes_for_extruders.get(position)
quality_node = None quality_node = None
if quality_group is not None: if quality_group is not None:
quality_node = quality_group.nodes_for_extruders.get(position) quality_node = quality_group.nodes_for_extruders.get(position)
quality_changes_container = empty_quality_changes_container quality_changes_container = empty_quality_changes_container
quality_container = empty_quality_container quality_container = empty_quality_container
if quality_changes_node and quality_changes_node.container: quality_changes_metadata = quality_changes_group.metadata_for_extruders.get(position)
quality_changes_container = cast(InstanceContainer, quality_changes_node.container) if quality_changes_metadata:
containers = container_registry.findContainers(id = quality_changes_metadata["id"])
if containers:
quality_changes_container = cast(InstanceContainer, containers[0])
if quality_node and quality_node.container: if quality_node and quality_node.container:
quality_container = quality_node.container quality_container = quality_node.container