From 0625d22e04e00e109ace8855074a3ab687746895 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 21 Nov 2017 16:43:05 +0100 Subject: [PATCH] Fix update script for single extrusion quality changes - CURA-4482 --- cura/Settings/UserProfilesModel.py | 9 ++- .../VersionUpgrade30to31.py | 67 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index aedbba34d5..5ae9055759 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -24,6 +24,9 @@ class UserProfilesModel(ProfilesModel): quality_manager = QualityManager.getInstance() machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) + + extruder_manager = ExtruderManager.getInstance() + active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = self._getOrderedExtruderStacksList() # Fetch the list of usable qualities across all extruders. @@ -32,6 +35,10 @@ class UserProfilesModel(ProfilesModel): # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] + filtered_quality_changes = [qc for qc in quality_changes_list if + qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is not None and + (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] return filtered_quality_changes diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 7130871d8e..b966ae5192 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -3,9 +3,14 @@ import configparser #To parse preference files. import io #To serialise the preference files afterwards. +import os +from urllib.parse import quote_plus +from UM.Resources import Resources from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this. +from cura.CuraApplication import CuraApplication + # a list of all legacy "Not Supported" quality profiles _OLD_NOT_SUPPORTED_PROFILES = [ @@ -106,6 +111,12 @@ class VersionUpgrade30to31(VersionUpgrade): if not parser.has_section(each_section): parser.add_section(each_section) + # Copy global quality changes to extruder quality changes for single extrusion machines + if parser["metadata"]["type"] == "quality_changes": + all_quality_changes = self._getSingleExtrusionMachineQualityChanges(parser) + if len(all_quality_changes) == 1 and not all_quality_changes[0].has_option("metadata", "extruder"): + self._createExtruderQualityChangesForSingleExtrusionMachine(filename, all_quality_changes[0]) + # Update version numbers parser["general"]["version"] = "2" parser["metadata"]["setting_version"] = "4" @@ -153,3 +164,59 @@ class VersionUpgrade30to31(VersionUpgrade): output = io.StringIO() parser.write(output) return [filename], [output.getvalue()] + + def _getSingleExtrusionMachineQualityChanges(self, quality_changes_container): + quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) + quality_changes_containers = [] + + for item in os.listdir(quality_changes_dir): + file_path = os.path.join(quality_changes_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser() + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("metadata", "type"): + continue + if "quality_changes" != parser["metadata"]["type"]: + continue + + if not parser.has_option("general", "name"): + continue + if quality_changes_container["general"]["name"] != parser["general"]["name"]: + continue + + quality_changes_containers.append(parser) + + return quality_changes_containers + + def _createExtruderQualityChangesForSingleExtrusionMachine(self, filename, global_quality_changes): + suffix = "_" + quote_plus(global_quality_changes["general"]["name"].lower()) + machine_name = filename.strip("." + os.sep).replace(suffix, "") + new_filename = machine_name + "_" + "fdmextruder" + suffix + + extruder_quality_changes_parser = configparser.ConfigParser() + extruder_quality_changes_parser.add_section("general") + extruder_quality_changes_parser["general"]["version"] = str(2) + extruder_quality_changes_parser["general"]["name"] = global_quality_changes["general"]["name"] + extruder_quality_changes_parser["general"]["definition"] = global_quality_changes["general"]["definition"] + + extruder_quality_changes_parser.add_section("metadata") + extruder_quality_changes_parser["metadata"]["quality_type"] = global_quality_changes["metadata"]["quality_type"] + extruder_quality_changes_parser["metadata"]["type"] = global_quality_changes["metadata"]["type"] + extruder_quality_changes_parser["metadata"]["setting_version"] = str(4) + extruder_quality_changes_parser["metadata"]["extruder"] = "fdmextruder" + + extruder_quality_changes_output = io.StringIO() + extruder_quality_changes_parser.write(extruder_quality_changes_output) + extruder_quality_changes_filename = quote_plus(new_filename) + ".inst.cfg" + + quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) + + with open(os.path.join(quality_changes_dir, extruder_quality_changes_filename), "w") as f: + f.write(extruder_quality_changes_output.getvalue())