diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 68fbf19c13..de8f6328f7 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -609,78 +609,6 @@ class MachineManager(QObject): if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved - ## set the active quality - # \param quality_id The quality_id of either a quality or a quality_changes - @pyqtSlot(str) - def setActiveQuality(self, quality_id: str, always_discard_changes = False): - with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): - self.blurSettings.emit() - - Logger.log("d", "Attempting to change the active quality to %s", quality_id) - - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = quality_id) - if not containers or not self._global_container_stack: - return - - # Quality profile come in two flavours: type=quality and type=quality_changes - # If we found a quality_changes profile then look up its parent quality profile. - container_type = containers[0].get("type") - quality_name = containers[0]["name"] - quality_type = containers[0].get("quality_type") - - # Get quality container and optionally the quality_changes container. - if container_type == "quality": - new_quality_settings_list = self.determineQualityAndQualityChangesForQualityType(quality_type) - elif container_type == "quality_changes": - new_quality_settings_list = self._determineQualityAndQualityChangesForQualityChanges(quality_name) - else: - Logger.log("e", "Tried to set quality to a container that is not of the right type: {container_id}".format(container_id = containers[0]["id"])) - return - - # Check if it was at all possible to find new settings - if new_quality_settings_list is None: - return - - # check if any of the stacks have a not supported profile - # if that is the case, all stacks should have a not supported state (otherwise it will show quality_type normal) - has_not_supported_quality = False - - # check all stacks for not supported - for setting_info in new_quality_settings_list: - if setting_info["quality"].getMetaDataEntry("quality_type") == "not_supported": - has_not_supported_quality = True - break - - # set all stacks to not supported if that's the case - if has_not_supported_quality: - for setting_info in new_quality_settings_list: - setting_info["quality"] = self._empty_quality_container - - self._new_quality_containers.clear() - - # store the upcoming quality profile changes per stack for later execution - # this prevents re-slicing before the user has made a choice in the discard or keep dialog - # (see _executeDelayedActiveContainerStackChanges) - for setting_info in new_quality_settings_list: - stack = setting_info["stack"] - stack_quality = setting_info["quality"] - stack_quality_changes = setting_info["quality_changes"] - - self._new_quality_containers.append({ - "stack": stack, - "quality": stack_quality, - "quality_changes": stack_quality_changes - }) - - Logger.log("d", "Active quality changed") - - # show the keep/discard dialog after the containers have been switched. Otherwise, the default values on - # the dialog will be the those before the switching. - self._executeDelayedActiveContainerStackChanges() - - if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1 and not always_discard_changes: - Application.getInstance().discardOrKeepProfileChanges() - ## Used to update material and variant in the active container stack with a delay. # This delay prevents the stack from triggering a lot of signals (eventually resulting in slicing) # before the user decided to keep or discard any of their changes using the dialog. @@ -721,135 +649,6 @@ class MachineManager(QObject): self._new_buildplate_container = None self._new_variant_container = None - ## Determine the quality and quality changes settings for the current machine for a quality name. - # - # \param quality_name \type{str} the name of the quality. - # \return \type{List[Dict]} with keys "stack", "quality" and "quality_changes". - @UM.FlameProfiler.profile - def determineQualityAndQualityChangesForQualityType(self, quality_type: str) -> List[Dict[str, Union["CuraContainerStack", InstanceContainer]]]: - quality_manager = QualityManager.getInstance() - result = [] - empty_quality_changes = self._empty_quality_changes_container - global_container_stack = self._global_container_stack - if not global_container_stack: - return [] - - global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - - # find qualities for extruders - for extruder_stack in extruder_stacks: - material_metadata = extruder_stack.material.getMetaData() - - # TODO: fix this - if self._new_material_container and extruder_stack.getId() == self._active_container_stack.getId(): - material_metadata = self._new_material_container.getMetaData() - - quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material_metadata]) - - if not quality: - # No quality profile is found for this quality type. - quality = self._empty_quality_container - - result.append({ - "stack": extruder_stack, - "quality": quality, - "quality_changes": empty_quality_changes - }) - - # also find a global quality for the machine - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = "True") - - # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 - if not global_quality and len(extruder_stacks) == 1: - global_quality = result[0]["quality"] - - # if there is still no global quality, set it to empty (not supported) - if not global_quality: - global_quality = self._empty_quality_container - - result.append({ - "stack": global_container_stack, - "quality": global_quality, - "quality_changes": empty_quality_changes - }) - - return result - - ## Determine the quality and quality changes settings for the current machine for a quality changes name. - # - # \param quality_changes_name \type{str} the name of the quality changes. - # \return \type{List[Dict]} with keys "stack", "quality" and "quality_changes". - def _determineQualityAndQualityChangesForQualityChanges(self, quality_changes_name: str) -> Optional[List[Dict[str, Union["CuraContainerStack", InstanceContainer]]]]: - result = [] - quality_manager = QualityManager.getInstance() - - global_container_stack = self._global_container_stack - global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) - quality_changes_profiles = quality_manager.findQualityChangesByName(quality_changes_name, global_machine_definition) - - global_quality_changes = [qcp for qcp in quality_changes_profiles if qcp.getMetaDataEntry("extruder") is None] - if global_quality_changes: - global_quality_changes = global_quality_changes[0] - else: - Logger.log("e", "Could not find the global quality changes container with name %s", quality_changes_name) - return None - - # For the global stack, find a quality which matches the quality_type in - # the quality changes profile and also satisfies any material constraints. - quality_type = global_quality_changes.getMetaDataEntry("quality_type") - - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - - # append the extruder quality changes - for extruder_stack in extruder_stacks: - extruder_definition = quality_manager.getParentMachineDefinition(extruder_stack.definition) - - quality_changes_list = [qcp for qcp in quality_changes_profiles if qcp.getMetaDataEntry("extruder") == extruder_definition.getId()] - - if quality_changes_list: - quality_changes = quality_changes_list[0] - else: - quality_changes = global_quality_changes - if not quality_changes: - quality_changes = self._empty_quality_changes_container - - material_metadata = extruder_stack.material.getMetaData() - - if self._new_material_container and self._active_container_stack.getId() == extruder_stack.getId(): - material_metadata = self._new_material_container.getMetaData() - - quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material_metadata]) - - if not quality: - # No quality profile found for this quality type. - quality = self._empty_quality_container - - result.append({ - "stack": extruder_stack, - "quality": quality, - "quality_changes": quality_changes - }) - - # append the global quality changes - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, global_quality = "True") - - # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 - if not global_quality and len(extruder_stacks) == 1: - global_quality = result[0]["quality"] - - # if still no global quality changes are found we set it to empty (not supported) - if not global_quality: - global_quality = self._empty_quality_container - - result.append({ - "stack": global_container_stack, - "quality": global_quality, - "quality_changes": global_quality_changes - }) - - return result - def _replaceQualityOrQualityChangesInStack(self, stack: "CuraContainerStack", container: "InstanceContainer", postpone_emit = False): # Disconnect the signal handling from the old container. container_type = container.getMetaDataEntry("type")