From 3d9c27a7f7d4d0b6dd3016fc0b1adf5684194e59 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Mon, 5 Dec 2016 11:00:33 +0100 Subject: [PATCH 1/3] CURA-2953 Version upgrade 2.3 to 2.4 --- .../VersionUpgrade22to24/VersionUpgrade.py | 90 +++++++++++++++++++ .../VersionUpgrade22to24/__init__.py | 33 +++++++ 2 files changed, 123 insertions(+) create mode 100644 plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py new file mode 100644 index 0000000000..38710026ac --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py @@ -0,0 +1,90 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import configparser #To get version numbers from config files. +import os.path +import io + +from UM import Resources +from UM.VersionUpgrade import VersionUpgrade # Superclass of the plugin. + +class VersionUpgrade22to24(VersionUpgrade): + + def upgradeMachineInstance(self, serialised, filename): + config = configparser.ConfigParser(interpolation = None) + config.read_string(serialised) # Read the input string as config file. + config.set("general", "version", "3") + containers = config.get("general", "containers") + container_list = containers.split(",") + + user_variants = self.__getUserVariants() + name_path_dict = {} + for variant in user_variants: + name_path_dict[variant.get("name")] = variant.get("path") + + user_variant_names = set(container_list).intersection(name_path_dict.keys()) + if len(user_variant_names): + # One of the user defined variants appears in the list of containers in the stack. + + for variant_name in user_variant_names: + # Copy the variant to the machine_instances/*_settings.inst.cfg + variant_config = configparser.ConfigParser(interpolation=None) + variant_path = name_path_dict.get(variant_name) + with open(variant_path, "r") as fhandle: + variant_config.read_file(fhandle) + + if variant_config.has_section("general") and variant_config.has_option("general", "name"): + config_name = variant_config.get("general", "name") + if config_name.endswith("_variant"): + config_name = config_name[:-len("_variant")] + "_settings" + variant_config.set("general", "name", config_name) + + if not variant_config.has_section("metadata"): + variant_config.add_section("metadata") + variant_config.set("metadata", "type", "definition_changes") + + # "_settings.inst.cfg" + resource_path = Resources.getDataStoragePath() + machine_instances_dir = os.path.join(resource_path, "machine_instances") + + if variant_path.endswith("_variant.inst.cfg"): + variant_path = variant_path[:-len("_variant.inst.cfg")] + "_settings.inst.cfg" + + with open(os.path.join(machine_instances_dir, os.path.basename(variant_path)), "w") as fp: + variant_config.write(fp) + + # Change the name of variant and insert empty_variant into the stack. + new_container_list = [] + for item in container_list: + if item == variant_name: + new_container_list.append(config_name) + new_container_list.append("empty_variant") + else: + new_container_list.append(item) + + container_list = new_container_list + + config.set("general", "containers", ",".join(container_list)) + + output = io.StringIO() + config.write(output) + return [filename], [output.getvalue()] + + def __getUserVariants(self): + resource_path = Resources.getDataStoragePath() + variants_dir = os.path.join(resource_path, "variants") + + result = [] + for entry in os.scandir(variants_dir): + if entry.name.endswith('.inst.cfg') and entry.is_file(): + config = configparser.ConfigParser(interpolation = None) + with open(entry.path, "r") as fhandle: + config.read_file(fhandle) + if config.has_section("general") and config.has_option("general", "name"): + result.append( { "path": entry.path, "name": config.get("general", "name") } ) + return result + + def getCfgVersion(self, serialised): + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialised) + return int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised. diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py new file mode 100644 index 0000000000..1a562abbd5 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py @@ -0,0 +1,33 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from . import VersionUpgrade + +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +upgrade = VersionUpgrade.VersionUpgrade22to24() + +def getMetaData(): + return { + "plugin": { + "name": catalog.i18nc("@label", "Version Upgrade 2.2 to 2.4"), + "author": "Ultimaker", + "version": "1.0", + "description": catalog.i18nc("@info:whatsthis", "Upgrades configurations from Cura 2.2 to Cura 2.4."), + "api": 3 + }, + "version_upgrade": { + # From To Upgrade function + ("machine_instance", 2): ("machine_stack", 3, upgrade.upgradeMachineInstance) + }, + "sources": { + "machine_instance": { + "get_version": upgrade.getCfgVersion, + "location": {"./machine_instances"} + } + } + } + +def register(app): + return { "version_upgrade": upgrade } From 724cc99f590891bbdc79c6034a9043c058e23f3c Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Mon, 5 Dec 2016 13:31:24 +0100 Subject: [PATCH 2/3] Make things neater. CURA-2953 Version upgrade 2.3 to 2.4 --- .../VersionUpgrade22to24/VersionUpgrade.py | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py index 38710026ac..8c42ec489f 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py @@ -11,6 +11,11 @@ from UM.VersionUpgrade import VersionUpgrade # Superclass of the plugin. class VersionUpgrade22to24(VersionUpgrade): def upgradeMachineInstance(self, serialised, filename): + # All of this is needed to upgrade custom variant machines from old Cura to 2.4 where + # `definition_changes` instance container has been introduced. Variant files which + # look like the the handy work of the old machine settings plugin are converted directly + # on disk. + config = configparser.ConfigParser(interpolation = None) config.read_string(serialised) # Read the input string as config file. config.set("general", "version", "3") @@ -26,32 +31,8 @@ class VersionUpgrade22to24(VersionUpgrade): if len(user_variant_names): # One of the user defined variants appears in the list of containers in the stack. - for variant_name in user_variant_names: - # Copy the variant to the machine_instances/*_settings.inst.cfg - variant_config = configparser.ConfigParser(interpolation=None) - variant_path = name_path_dict.get(variant_name) - with open(variant_path, "r") as fhandle: - variant_config.read_file(fhandle) - - if variant_config.has_section("general") and variant_config.has_option("general", "name"): - config_name = variant_config.get("general", "name") - if config_name.endswith("_variant"): - config_name = config_name[:-len("_variant")] + "_settings" - variant_config.set("general", "name", config_name) - - if not variant_config.has_section("metadata"): - variant_config.add_section("metadata") - variant_config.set("metadata", "type", "definition_changes") - - # "_settings.inst.cfg" - resource_path = Resources.getDataStoragePath() - machine_instances_dir = os.path.join(resource_path, "machine_instances") - - if variant_path.endswith("_variant.inst.cfg"): - variant_path = variant_path[:-len("_variant.inst.cfg")] + "_settings.inst.cfg" - - with open(os.path.join(machine_instances_dir, os.path.basename(variant_path)), "w") as fp: - variant_config.write(fp) + for variant_name in user_variant_names: # really there should just be one variant to convert. + config_name = self.__convertVariant(name_path_dict.get(variant_name)) # Change the name of variant and insert empty_variant into the stack. new_container_list = [] @@ -70,6 +51,33 @@ class VersionUpgrade22to24(VersionUpgrade): config.write(output) return [filename], [output.getvalue()] + def __convertVariant(self, variant_path): + # Copy the variant to the machine_instances/*_settings.inst.cfg + variant_config = configparser.ConfigParser(interpolation=None) + with open(variant_path, "r") as fhandle: + variant_config.read_file(fhandle) + + if variant_config.has_section("general") and variant_config.has_option("general", "name"): + config_name = variant_config.get("general", "name") + if config_name.endswith("_variant"): + config_name = config_name[:-len("_variant")] + "_settings" + variant_config.set("general", "name", config_name) + + if not variant_config.has_section("metadata"): + variant_config.add_section("metadata") + variant_config.set("metadata", "type", "definition_changes") + + resource_path = Resources.getDataStoragePath() + machine_instances_dir = os.path.join(resource_path, "machine_instances") + + if variant_path.endswith("_variant.inst.cfg"): + variant_path = variant_path[:-len("_variant.inst.cfg")] + "_settings.inst.cfg" + + with open(os.path.join(machine_instances_dir, os.path.basename(variant_path)), "w") as fp: + variant_config.write(fp) + + return config_name + def __getUserVariants(self): resource_path = Resources.getDataStoragePath() variants_dir = os.path.join(resource_path, "variants") From e1d7a9faece7ccd357ba506633aed272e03241aa Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Tue, 6 Dec 2016 17:03:35 +0100 Subject: [PATCH 3/3] Properly support the extrauder trains. CURA-2953 Version upgrade 2.3 to 2.4 --- cura/CuraApplication.py | 1 + .../VersionUpgrade22to24/VersionUpgrade.py | 9 +++++++++ .../VersionUpgrade/VersionUpgrade22to24/__init__.py | 11 ++++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6ed7759c34..4753955337 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -129,6 +129,7 @@ class CuraApplication(QtApplication): { ("quality", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), ("machine_stack", UM.Settings.ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), + ("extruder_train", UM.Settings.ContainerStack.Version): (self.ResourceTypes.ExtruderStack, "application/x-uranium-extruderstack"), ("preferences", UM.Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences"), ("user", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer") } diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py index 8c42ec489f..64c98dea60 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py @@ -92,6 +92,15 @@ class VersionUpgrade22to24(VersionUpgrade): result.append( { "path": entry.path, "name": config.get("general", "name") } ) return result + def upgradeExtruderTrain(self, serialised, filename): + config = configparser.ConfigParser(interpolation = None) + config.read_string(serialised) # Read the input string as config file. + config.set("general", "version", "3") # Just bump the version number. That is all we need for now. + + output = io.StringIO() + config.write(output) + return [filename], [output.getvalue()] + def getCfgVersion(self, serialised): parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialised) diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py index 1a562abbd5..85d53199e4 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py @@ -19,13 +19,18 @@ def getMetaData(): }, "version_upgrade": { # From To Upgrade function - ("machine_instance", 2): ("machine_stack", 3, upgrade.upgradeMachineInstance) + ("machine_instance", 2): ("machine_stack", 3, upgrade.upgradeMachineInstance), + ("extruder_train", 2): ("extruder_train", 3, upgrade.upgradeExtruderTrain) }, "sources": { - "machine_instance": { + "machine_stack": { "get_version": upgrade.getCfgVersion, "location": {"./machine_instances"} - } + }, + "extruder_train": { + "get_version": upgrade.getCfgVersion, + "location": {"./extruders"} + }, } }