From 696844f1cf3aa20590a6fd940f6c06dc1036a664 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 2 Dec 2020 12:04:06 +0100 Subject: [PATCH] Add VersionUpgrader for libArachne 5.0 Things to note: * Since there is no VersionUpgrader from 4.8 to 4.9, this versionUpgrader attempts to upgrade files made in 4.8. This means that it touches files with setting_version = 16. * The upgrade of the setting_version to 18 is currently commented out because we are not entirely sure that 18 will be the setting_version in 5.0. * This versionUpgrader removes the following three settings that were removed in libArachne * "Compensate Wall Overlaps" * "Compensate Outer Wall Overlaps" * "Compensate Inner Wall Overlaps" * The VersionUpgrader also disabled Fuzzy Skin from any profiles that may have it enabled, as fuzzy skin currently doesn't work in libArachne. * The printer definitions have NOT been updated to the new setting_version to avoid having to deal with an enormous merge conflict in case the setting_version of 5.0 is something other than 18. * Since the VersionUpgrader does not alter the setting_version, it will run every time Cura starts. In short, this versionUpgrader runs and removes the deleted settings but it does not really change the setting_version of any files. Contributes to CURA-7683 and CURA-7656 --- .../VersionUpgrade49to50.py | 98 +++++++++++++++++++ .../VersionUpgrade49to50/__init__.py | 67 +++++++++++++ .../VersionUpgrade49to50/plugin.json | 8 ++ 3 files changed, 173 insertions(+) create mode 100644 plugins/VersionUpgrade/VersionUpgrade49to50/VersionUpgrade49to50.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade49to50/__init__.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade49to50/plugin.json diff --git a/plugins/VersionUpgrade/VersionUpgrade49to50/VersionUpgrade49to50.py b/plugins/VersionUpgrade/VersionUpgrade49to50/VersionUpgrade49to50.py new file mode 100644 index 0000000000..f1abd85ba6 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade49to50/VersionUpgrade49to50.py @@ -0,0 +1,98 @@ +# Copyright (c) 2020 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import configparser +from typing import Tuple, List +import io +from UM.VersionUpgrade import VersionUpgrade + +_removed_settings = { + "travel_compensate_overlapping_walls_enabled", + "travel_compensate_overlapping_walls_0_enabled", + "travel_compensate_overlapping_walls_x_enabled" +} + + +class VersionUpgrade49to50(VersionUpgrade): + def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: + """ + Upgrades preferences to remove from the visibility list the settings that were removed in this version. + It also changes the preferences to have the new version number. + + This removes any settings that were removed in the new Cura version. + :param serialized: The original contents of the preferences file. + :param filename: The file name of the preferences file. + :return: A list of new file names, and a list of the new contents for + those files. + """ + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialized) + + # Update version number. Disabled until we ensure that 18 will be the 5.0 setting version number + # parser["metadata"]["setting_version"] = "18" + + # Remove deleted settings from the visible settings list. + if "general" in parser and "visible_settings" in parser["general"]: + visible_settings = set(parser["general"]["visible_settings"].split(";")) + for removed in _removed_settings: + if removed in visible_settings: + visible_settings.remove(removed) + parser["general"]["visible_settings"] = ";".join(visible_settings) + + result = io.StringIO() + parser.write(result) + return [filename], [result.getvalue()] + + def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: + """ + Upgrades instance containers to remove the settings that were removed in this version. + It also changes the instance containers to have the new version number. + + This removes any settings that were removed in the new Cura version and updates settings that need to be updated + with a new value. + + :param serialized: The original contents of the instance container. + :param filename: The original file name of the instance container. + :return: A list of new file names, and a list of the new contents for + those files. + """ + parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ()) + parser.read_string(serialized) + + # Update version number. Disabled until we ensure that 18 will be the 5.0 setting version number + # parser["metadata"]["setting_version"] = "18" + + if "values" in parser: + # Remove deleted settings from the instance containers. + for removed in _removed_settings: + if removed in parser["values"]: + del parser["values"][removed] + + # Disable Fuzzy Skin as it doesn't work with with the libArachne walls + if "magic_fuzzy_skin_enabled" in parser["values"]: + parser["values"]["magic_fuzzy_skin_enabled"] = "False" + + result = io.StringIO() + parser.write(result) + return [filename], [result.getvalue()] + + def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: + """ + Upgrades stacks to have the new version number. + + :param serialized: The original contents of the stack. + :param filename: The original file name of the stack. + :return: A list of new file names, and a list of the new contents for + those files. + """ + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialized) + + # Update version number. Disabled until we ensure that 18 will be the 5.0 setting version number + if "metadata" not in parser: + parser["metadata"] = {} + # parser["metadata"]["setting_version"] = "18" + + result = io.StringIO() + parser.write(result) + return [filename], [result.getvalue()] diff --git a/plugins/VersionUpgrade/VersionUpgrade49to50/__init__.py b/plugins/VersionUpgrade/VersionUpgrade49to50/__init__.py new file mode 100644 index 0000000000..001570f00b --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade49to50/__init__.py @@ -0,0 +1,67 @@ +# Copyright (c) 2020 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from typing import Any, Dict, TYPE_CHECKING + +from . import VersionUpgrade49to50 + +if TYPE_CHECKING: + from UM.Application import Application + +upgrade = VersionUpgrade49to50.VersionUpgrade49to50() + +def getMetaData() -> Dict[str, Any]: + return { # Since there is no VersionUpgrade from 48 to 49 yet, upgrade the 48 profiles to 50. + "version_upgrade": { + # From To Upgrade function + ("preferences", 6000016): ("preferences", 6000018, upgrade.upgradePreferences), + ("machine_stack", 4000016): ("machine_stack", 4000018, upgrade.upgradeStack), + ("extruder_train", 4000016): ("extruder_train", 4000018, upgrade.upgradeStack), + ("definition_changes", 4000016): ("definition_changes", 4000018, upgrade.upgradeInstanceContainer), + ("quality_changes", 4000016): ("quality_changes", 4000018, upgrade.upgradeInstanceContainer), + ("quality", 4000016): ("quality", 4000018, upgrade.upgradeInstanceContainer), + ("user", 4000016): ("user", 4000018, upgrade.upgradeInstanceContainer), + + ("preferences", 6000016): ("preferences", 6000018, upgrade.upgradePreferences), + ("machine_stack", 4000016): ("machine_stack", 4000018, upgrade.upgradeStack), + ("extruder_train", 4000016): ("extruder_train", 4000018, upgrade.upgradeStack), + ("definition_changes", 4000016): ("definition_changes", 4000018, upgrade.upgradeInstanceContainer), + ("quality_changes", 4000016): ("quality_changes", 4000018, upgrade.upgradeInstanceContainer), + ("quality", 4000016): ("quality", 4000018, upgrade.upgradeInstanceContainer), + ("user", 4000016): ("user", 4000018, upgrade.upgradeInstanceContainer), + }, + "sources": { + "preferences": { + "get_version": upgrade.getCfgVersion, + "location": {"."} + }, + "machine_stack": { + "get_version": upgrade.getCfgVersion, + "location": {"./machine_instances"} + }, + "extruder_train": { + "get_version": upgrade.getCfgVersion, + "location": {"./extruders"} + }, + "definition_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./definition_changes"} + }, + "quality_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./quality_changes"} + }, + "quality": { + "get_version": upgrade.getCfgVersion, + "location": {"./quality"} + }, + "user": { + "get_version": upgrade.getCfgVersion, + "location": {"./user"} + } + } + } + + +def register(app: "Application") -> Dict[str, Any]: + return {"version_upgrade": upgrade} diff --git a/plugins/VersionUpgrade/VersionUpgrade49to50/plugin.json b/plugins/VersionUpgrade/VersionUpgrade49to50/plugin.json new file mode 100644 index 0000000000..bedc7d46e8 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade49to50/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Version Upgrade 4.9 to 5.0", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Upgrades configurations from Cura 4.9 to Cura 5.0.", + "api": "7.4.0", + "i18n-catalog": "cura" +}