diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index c0f2fc35c3..7d4269ebe1 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -473,14 +473,40 @@ class BuildVolume(SceneNode): self._has_errors = prime_tower_collision or prime_collision self._disallowed_areas = areas - ## Private convenience function to get a setting from the adhesion extruder. - def _getSettingProperty(self, setting_key, property = "value"): + ## Private convenience function to get a setting from the adhesion + # extruder. + # + # \param setting_key The key of the setting to get. + # \param property The property to get from the setting. + # \return The property of the specified setting in the adhesion extruder. + def _getSettingFromAdhesionExtruder(self, setting_key, property = "value"): + return self._getSettingFromExtruder(setting_key, "adhesion_extruder_nr", property) + + ## Private convenience function to get a setting from the support infill + # extruder. + # + # \param setting_key The key of the setting to get. + # \param property The property to get from the setting. + # \return The property of the specified setting in the support infill + # extruder. + def _getSettingFromSupportInfillExtruder(self, setting_key, property = "value"): + return self._getSettingFromExtruder(setting_key, "support_infill_extruder_nr", property) + + ## Helper function to get a setting from an extruder specified in another + # setting. + # + # \param setting_key The key of the setting to get. + # \param extruder_setting_key The key of the setting that specifies from + # which extruder to get the setting, if there are multiple extruders. + # \param property The property to get from the setting. + # \return The property of the specified setting in the specified extruder. + def _getSettingFromExtruder(self, setting_key, extruder_setting_key, property = "value"): multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 if not multi_extrusion: return self._global_container_stack.getProperty(setting_key, property) - extruder_index = self._global_container_stack.getProperty("adhesion_extruder_nr", "value") + extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value") if extruder_index == "-1": # If extruder index is -1 use global instead return self._global_container_stack.getProperty(setting_key, property) @@ -505,9 +531,9 @@ class BuildVolume(SceneNode): adhesion_type = container_stack.getProperty("adhesion_type", "value") if adhesion_type == "skirt": - skirt_distance = self._getSettingProperty("skirt_gap", "value") - skirt_line_count = self._getSettingProperty("skirt_line_count", "value") - bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingProperty("skirt_brim_line_width", "value")) + skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap") + skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count") + bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingFromAdhesionExtruder("skirt_brim_line_width")) if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")) extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width") @@ -515,7 +541,7 @@ class BuildVolume(SceneNode): for value in extruder_values: bed_adhesion_size += value elif adhesion_type == "brim": - bed_adhesion_size = self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value") + bed_adhesion_size = self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("skirt_brim_line_width") if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")) extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width") @@ -523,7 +549,7 @@ class BuildVolume(SceneNode): for value in extruder_values: bed_adhesion_size += value elif adhesion_type == "raft": - bed_adhesion_size = self._getSettingProperty("raft_margin", "value") + bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin") else: raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") @@ -534,10 +560,12 @@ class BuildVolume(SceneNode): farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("ooze_shield_dist", "value")) move_from_wall_radius = 0 # Moves that start from outer wall. - if self._getSettingProperty("infill_wipe_dist", "value"): - move_from_wall_radius = max(move_from_wall_radius, self._getSettingProperty("infill_wipe_dist", "value")) - if self._getSettingProperty("travel_avoid_distance", "value"): - move_from_wall_radius = max(move_from_wall_radius, self._getSettingProperty("travel_avoid_distance", "value")) + if self._getSettingFromAdhesionExtruder("infill_wipe_dist"): + move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromAdhesionExtruder("infill_wipe_dist")) + if self._getSettingFromAdhesionExtruder("travel_avoid_distance"): + move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromAdhesionExtruder("travel_avoid_distance")) + if self._getSettingFromSupportInfillExtruder("support_offset"): + move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromSupportInfillExtruder("support_offset")) #Now combine our different pieces of data to get the final border size. border_size = max(farthest_shield_distance, move_from_wall_radius, bed_adhesion_size) @@ -551,4 +579,4 @@ class BuildVolume(SceneNode): _prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "extruder_prime_pos_z"] _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"] _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"] - _distance_settings = ["infill_wipe_dist", "travel_avoid_distance"] + _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset"] diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1c767ffda5..77bc3bbc49 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -503,6 +503,7 @@ class CuraApplication(QtApplication): qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel") + qmlRegisterType(cura.Settings.ProfilesPageModel, "Cura", 1, 0, "ProfilesPageModel") qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 8fba30838d..9568f15184 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -53,7 +53,9 @@ class QualityManager: # the current set of selected materials is used. # \return the matching quality containers \type{List[ContainerInstance]} def findQualityByQualityType(self, quality_type, machine_definition=None, material_containers=None): - criteria = {"type": "quality", "quality_type": quality_type} + criteria = {"type": "quality"} + if quality_type: + criteria["quality_type"] = quality_type return self._getFilteredContainersForStack(machine_definition, material_containers, **criteria) def _getFilteredContainers(self, **kwargs): @@ -63,9 +65,9 @@ class QualityManager: # Fill in any default values. if machine_definition is None: machine_definition = UM.Application.getInstance().getGlobalContainerStack().getBottom() - quality_definition = machine_definition.getMetaDataEntry("quality_definition") - if quality_definition is not None: - machine_definition = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition)[0] + quality_definition_id = machine_definition.getMetaDataEntry("quality_definition") + if quality_definition_id is not None: + machine_definition = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition_id)[0] if material_containers is None: active_stacks = cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() @@ -81,6 +83,8 @@ class QualityManager: criteria["definition"] = definition_id filter_by_material = whole_machine_definition.getMetaDataEntry("has_materials") + else: + criteria["definition"] = "fdmprinter" # Stick the material IDs in a set if material_containers is None or len(material_containers) == 0: diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 2ce3f1570a..24f452c592 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -561,10 +561,15 @@ class ContainerManager(QObject): new_name = self._container_registry.uniqueName(new_name) container_registry = self._container_registry - for container in self._getFilteredContainers(name = quality_name, type = "quality_changes"): + + containers_to_rename = self._container_registry.findInstanceContainers(type = "quality_changes", name = quality_name) + for container in containers_to_rename: stack_id = container.getMetaDataEntry("extruder", global_stack.getId()) container_registry.renameContainer(container.getId(), new_name, self._createUniqueId(stack_id, new_name)) + if not containers_to_rename: + UM.Logger.log("e", "Unable to rename %s, because we could not find the profile", quality_name) + self._machine_manager.activeQualityChanged.emit() return True diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f418693f7c..413e7a8164 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -567,9 +567,18 @@ class MachineManager(QObject): [material_container]) if not candidate_qualities: # Fall back to normal quality - new_quality_id = quality_manager.findQualityByQualityType("normal", + quality_containers = quality_manager.findQualityByQualityType("normal", + quality_manager.getWholeMachineDefinition(machine_definition), + [material_container]) + if quality_containers: + new_quality_id = quality_containers[0].getId() + else: + # There is no normal quality for this machine/variant/material combination + quality_containers = quality_manager.findQualityByQualityType(None, quality_manager.getWholeMachineDefinition(machine_definition), - [material_container])[0].getId() + [material_container]) + new_quality_id = quality_containers[0].getId() + else: if not old_quality_changes: new_quality_id = candidate_qualities[0].getId() diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 07a498a895..937f151b09 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -13,6 +13,8 @@ class ProfilesModel(InstanceContainersModel): def __init__(self, parent = None): super().__init__(parent) + Application.getInstance().globalContainerStackChanged.connect(self._update) + ## Fetch the list of containers to display. # # See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers(). diff --git a/cura/Settings/ProfilesPageModel.py b/cura/Settings/ProfilesPageModel.py new file mode 100644 index 0000000000..77ed9b3bd3 --- /dev/null +++ b/cura/Settings/ProfilesPageModel.py @@ -0,0 +1,35 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Uranium is released under the terms of the AGPLv3 or higher. +from UM.Application import Application +from UM.Settings.ContainerRegistry import ContainerRegistry + +from cura.QualityManager import QualityManager +from cura.Settings.ProfilesModel import ProfilesModel + +## QML Model for listing the current list of valid quality and quality changes profiles. +# +class ProfilesPageModel(ProfilesModel): + def __init__(self, parent = None): + super().__init__(parent) + + ## Fetch the list of containers to display. + # + # See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers(). + def _fetchInstanceContainers(self): + # Fetch the list of qualities + quality_list = super()._fetchInstanceContainers() + + # Fetch the list of quality changes. + quality_manager = QualityManager.getInstance() + application = Application.getInstance() + + machine_definition = quality_manager.getParentMachineDefinition(application.getGlobalContainerStack().getBottom()) + if machine_definition.getMetaDataEntry("has_machine_quality"): + definition_id = machine_definition.getId() + else: + definition_id = "fdmprinter" + + filter_dict = { "type": "quality_changes", "extruder": None, "definition": definition_id } + quality_changes_list = ContainerRegistry.getInstance().findInstanceContainers(**filter_dict) + + return quality_list + quality_changes_list diff --git a/cura/Settings/__init__.py b/cura/Settings/__init__.py index b5773d560a..6957e5031c 100644 --- a/cura/Settings/__init__.py +++ b/cura/Settings/__init__.py @@ -13,3 +13,4 @@ from .SettingOverrideDecorator import SettingOverrideDecorator from .QualitySettingsModel import QualitySettingsModel from .SettingInheritanceManager import SettingInheritanceManager from .ProfilesModel import ProfilesModel +from .ProfilesPageModel import ProfilesPageModel diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py index 4894df84aa..e87432663d 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py @@ -105,13 +105,13 @@ class Profile: config.set("metadata", "variant", self._machine_variant_name) if self._settings: - VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._settings) + self._settings = VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._settings) config.add_section("values") for key, value in self._settings.items(): config.set("values", key, str(value)) if self._changed_settings_defaults: - VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._changed_settings_defaults) + self._changed_settings_defaults = VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._changed_settings_defaults) config.add_section("defaults") for key, value in self._changed_settings_defaults.items(): config.set("defaults", key, str(value)) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4360d4a122..0323271c19 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3404,7 +3404,7 @@ "description": "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower.", "type": "bool", "enabled": "resolveOrValue('prime_tower_enable')", - "default_value": false, + "default_value": true, "settable_per_mesh": false, "settable_per_extruder": false }, diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index d6eb82246d..244e33f3f5 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -15,37 +15,7 @@ UM.ManagementPage title: catalog.i18nc("@title:tab", "Profiles"); property var extrudersModel: Cura.ExtrudersModel{} - model: UM.InstanceContainersModel - { - filterList: - { - var qualityFilter = { "type": "quality", "extruder": null }; - if(Cura.MachineManager.filterQualityByMachine) - { - qualityFilter.definition = Cura.MachineManager.activeQualityDefinitionId; - if(Cura.MachineManager.hasMaterials) - { - qualityFilter.material = Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId]; - } - } - else - { - qualityFilter.definition = "fdmprinter"; - } - - var qualityChangeFilter = { "type": "quality_changes", "extruder": null }; - if(Cura.MachineManager.filterQualityByMachine) - { - qualityChangeFilter.definition = Cura.MachineManager.activeQualityDefinitionId; - } - else - { - qualityChangeFilter.definition = "fdmprinter"; - } - - return [qualityFilter, qualityChangeFilter]; - } - } + model: Cura.ProfilesPageModel { } section.property: "readOnly" section.delegate: Rectangle