Browse Source

Add upgrade script for 3.0 to 3.1

CURA-4451

- Add upgrade script for 3.0. to 3.1
- Upgrade old stack files so they will use "empty_quality" as the
  "Not Supported" quality profile.
- Increase SettingVersion to 4
Lipu Fei 7 years ago
parent
commit
b6dd87081c

+ 1 - 1
cura/CuraApplication.py

@@ -105,7 +105,7 @@ class CuraApplication(QtApplication):
     # SettingVersion represents the set of settings available in the machine/extruder definitions.
     # You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
     # changes of the settings.
-    SettingVersion = 3
+    SettingVersion = 4
 
     class ResourceTypes:
         QmlFiles = Resources.UserType + 1

+ 141 - 0
plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py

@@ -0,0 +1,141 @@
+# Copyright (c) 2017 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+import configparser #To parse preference files.
+import io #To serialise the preference files afterwards.
+
+from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this.
+
+
+# a list of all legacy "Not Supported" quality profiles
+_OLD_NOT_SUPPORTED_PROFILES = [
+    "um2p_pp_0.25_normal.inst.cfg",
+    "um2p_tpu_0.8_normal.inst.cfg",
+    "um3_bb0.4_ABS_Fast_Print.inst.cfg",
+    "um3_bb0.4_ABS_Superdraft_Print.inst.cfg",
+    "um3_bb0.4_CPEP_Fast_Print.inst.cfg",
+    "um3_bb0.4_CPEP_Superdraft_Print.inst.cfg",
+    "um3_bb0.4_CPE_Fast_Print.inst.cfg",
+    "um3_bb0.4_CPE_Superdraft_Print.inst.cfg",
+    "um3_bb0.4_Nylon_Fast_Print.inst.cfg",
+    "um3_bb0.4_Nylon_Superdraft_Print.inst.cfg",
+    "um3_bb0.4_PC_Fast_Print.inst.cfg",
+    "um3_bb0.4_PLA_Fast_Print.inst.cfg",
+    "um3_bb0.4_PLA_Superdraft_Print.inst.cfg",
+    "um3_bb0.4_PP_Fast_Print.inst.cfg",
+    "um3_bb0.4_PP_Superdraft_Print.inst.cfg",
+    "um3_bb0.4_TPU_Fast_Print.inst.cfg",
+    "um3_bb0.4_TPU_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_ABS_Fast_Print.inst.cfg",
+    "um3_bb0.8_ABS_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_CPEP_Fast_Print.inst.cfg",
+    "um3_bb0.8_CPEP_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_CPE_Fast_Print.inst.cfg",
+    "um3_bb0.8_CPE_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_Nylon_Fast_Print.inst.cfg",
+    "um3_bb0.8_Nylon_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_PC_Fast_Print.inst.cfg",
+    "um3_bb0.8_PC_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_PLA_Fast_Print.inst.cfg",
+    "um3_bb0.8_PLA_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_PP_Fast_Print.inst.cfg",
+    "um3_bb0.8_PP_Superdraft_Print.inst.cfg",
+    "um3_bb0.8_TPU_Fast_print.inst.cfg",
+    "um3_bb0.8_TPU_Superdraft_Print.inst.cfg",
+]
+
+
+class VersionUpgrade30to31(VersionUpgrade):
+    ##  Gets the version number from a CFG file in Uranium's 3.0 format.
+    #
+    #   Since the format may change, this is implemented for the 3.0 format only
+    #   and needs to be included in the version upgrade system rather than
+    #   globally in Uranium.
+    #
+    #   \param serialised The serialised form of a CFG file.
+    #   \return The version number stored in the CFG file.
+    #   \raises ValueError The format of the version number in the file is
+    #   incorrect.
+    #   \raises KeyError The format of the file is incorrect.
+    def getCfgVersion(self, serialised):
+        parser = configparser.ConfigParser(interpolation = None)
+        parser.read_string(serialised)
+        format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
+        setting_version = int(parser.get("metadata", "setting_version", fallback = 0))
+        return format_version * 1000000 + setting_version
+
+    ##  Upgrades a preferences file from version 3.0 to 3.1.
+    #
+    #   \param serialised The serialised form of a preferences file.
+    #   \param filename The name of the file to upgrade.
+    def upgradePreferences(self, serialised, filename):
+        parser = configparser.ConfigParser(interpolation=None)
+        parser.read_string(serialised)
+
+        # Update version numbers
+        if "general" not in parser:
+            parser["general"] = {}
+        parser["general"]["version"] = "5"
+        if "metadata" not in parser:
+            parser["metadata"] = {}
+        parser["metadata"]["setting_version"] = "4"
+
+        # Re-serialise the file.
+        output = io.StringIO()
+        parser.write(output)
+        return [filename], [output.getvalue()]
+
+    ##  Upgrades the given instance container file from version 3.0 to 3.1.
+    #
+    #   \param serialised The serialised form of the container file.
+    #   \param filename The name of the file to upgrade.
+    def upgradeInstanceContainer(self, serialised, filename):
+        parser = configparser.ConfigParser(interpolation=None)
+        parser.read_string(serialised)
+
+        for each_section in ("general", "metadata"):
+            if not parser.has_section(each_section):
+                parser.add_section(each_section)
+
+        # Update version numbers
+        parser["general"]["version"] = "2"
+        parser["metadata"]["setting_version"] = "4"
+
+        # Re-serialise the file.
+        output = io.StringIO()
+        parser.write(output)
+        return [filename], [output.getvalue()]
+
+
+    ##  Upgrades a container stack from version 3.0 to 3.1.
+    #
+    #   \param serialised The serialised form of a container stack.
+    #   \param filename The name of the file to upgrade.
+    def upgradeStack(self, serialised, filename):
+        parser = configparser.ConfigParser(interpolation=None)
+        parser.read_string(serialised)
+
+        for each_section in ("general", "metadata"):
+            if not parser.has_section(each_section):
+                parser.add_section(each_section)
+
+        # change "not supported" quality profiles to empty because they no longer exist
+        if parser.has_section("containers"):
+            if parser.has_option("containers", "2"):
+                quality_profile_id = parser["containers"]["2"]
+                if quality_profile_id in _OLD_NOT_SUPPORTED_PROFILES:
+                    parser["containers"]["2"] = "empty_quality"
+
+        # Update version numbers
+        if "general" not in parser:
+            parser["general"] = {}
+        parser["general"]["version"] = "3"
+
+        if "metadata" not in parser:
+            parser["metadata"] = {}
+        parser["metadata"]["setting_version"] = "4"
+
+        # Re-serialise the file.
+        output = io.StringIO()
+        parser.write(output)
+        return [filename], [output.getvalue()]

+ 56 - 0
plugins/VersionUpgrade/VersionUpgrade30to31/__init__.py

@@ -0,0 +1,56 @@
+# Copyright (c) 2017 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from . import VersionUpgrade30to31
+
+upgrade = VersionUpgrade30to31.VersionUpgrade30to31()
+
+def getMetaData():
+    return {
+        "version_upgrade": {
+            # From                    To                       Upgrade function
+            ("preferences", 5000003): ("preferences", 5000004, upgrade.upgradePreferences),
+
+            ("machine_stack", 3000003):     ("machine_stack", 3000004,     upgrade.upgradeStack),
+            ("extruder_train", 3000003):    ("extruder_train", 3000004,    upgrade.upgradeStack),
+
+            ("quality_changes", 2000003):    ("quality_changes", 2000004,    upgrade.upgradeInstanceContainer),
+            ("user", 2000003):               ("user", 2000004,               upgrade.upgradeInstanceContainer),
+            ("quality", 2000003):            ("quality", 2000004,            upgrade.upgradeInstanceContainer),
+            ("definition_changes", 2000003): ("definition_changes", 2000004, upgrade.upgradeInstanceContainer),
+            ("variant", 2000003):            ("variant", 2000004,            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"}
+            },
+            "quality_changes": {
+                "get_version": upgrade.getCfgVersion,
+                "location": {"./quality"}
+            },
+            "user": {
+                "get_version": upgrade.getCfgVersion,
+                "location": {"./user"}
+            },
+            "definition_changes": {
+                "get_version": upgrade.getCfgVersion,
+                "location": {"./definition_changes"}
+            },
+            "variant": {
+                "get_version": upgrade.getCfgVersion,
+                "location": {"./variants"}
+            }
+        }
+    }
+
+def register(app):
+    return { "version_upgrade": upgrade }

+ 8 - 0
plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json

@@ -0,0 +1,8 @@
+ {
+    "name": "Version Upgrade 3.0 to 3.1",
+    "author": "Ultimaker B.V.",
+    "version": "1.0.0",
+    "description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
+    "api": 4,
+    "i18n-catalog": "cura"
+}

+ 1 - 1
plugins/XmlMaterialProfile/XmlMaterialProfile.py

@@ -35,7 +35,7 @@ class XmlMaterialProfile(InstanceContainer):
     #   \return The corresponding setting_version.
     def xmlVersionToSettingVersion(self, xml_version: str) -> int:
         if xml_version == "1.3":
-            return 3
+            return 4
         return 0 #Older than 1.3.
 
     def getInheritedFiles(self):

+ 1 - 1
resources/quality/abax_pri3/apri3_pla_fast.inst.cfg

@@ -8,7 +8,7 @@ type = quality
 material = generic_pla
 weight = -1
 quality_type = normal
-setting_version = 3
+setting_version = 4
 
 [values]
 layer_height = 0.2

+ 1 - 1
resources/quality/abax_pri3/apri3_pla_high.inst.cfg

@@ -8,7 +8,7 @@ type = quality
 material = generic_pla
 weight = 1
 quality_type = high
-setting_version = 3
+setting_version = 4
 
 [values]
 layer_height = 0.1

+ 1 - 1
resources/quality/abax_pri3/apri3_pla_normal.inst.cfg

@@ -8,7 +8,7 @@ type = quality
 material = generic_pla
 weight = 0
 quality_type = normal
-setting_version = 3
+setting_version = 4
 
 [values]
 layer_height = 0.2

+ 1 - 1
resources/quality/abax_pri5/apri5_pla_fast.inst.cfg

@@ -8,7 +8,7 @@ type = quality
 material = generic_pla
 weight = -1
 quality_type = normal
-setting_version = 3
+setting_version = 4
 
 [values]
 layer_height = 0.2

+ 1 - 1
resources/quality/abax_pri5/apri5_pla_high.inst.cfg

@@ -8,7 +8,7 @@ type = quality
 material = generic_pla
 weight = 1
 quality_type = high
-setting_version = 3
+setting_version = 4
 
 [values]
 layer_height = 0.1

Some files were not shown because too many files changed in this diff