VersionUpgrade27to30.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. import configparser #To parse preference files.
  4. import io #To serialise the preference files afterwards.
  5. import os
  6. from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this.
  7. _renamed_themes = {
  8. "cura": "cura-light"
  9. }
  10. _renamed_i18n = {
  11. "7s": "en_7S",
  12. "de": "de_DE",
  13. "en": "en_US",
  14. "es": "es_ES",
  15. "fi": "fi_FI",
  16. "fr": "fr_FR",
  17. "hu": "hu_HU",
  18. "it": "it_IT",
  19. "jp": "ja_JP",
  20. "ko": "ko_KR",
  21. "nl": "nl_NL",
  22. "pl": "pl_PL",
  23. "ptbr": "pt_BR",
  24. "ru": "ru_RU",
  25. "tr": "tr_TR"
  26. }
  27. class VersionUpgrade27to30(VersionUpgrade):
  28. ## Gets the version number from a CFG file in Uranium's 2.7 format.
  29. #
  30. # Since the format may change, this is implemented for the 2.7 format only
  31. # and needs to be included in the version upgrade system rather than
  32. # globally in Uranium.
  33. #
  34. # \param serialised The serialised form of a CFG file.
  35. # \return The version number stored in the CFG file.
  36. # \raises ValueError The format of the version number in the file is
  37. # incorrect.
  38. # \raises KeyError The format of the file is incorrect.
  39. def getCfgVersion(self, serialised):
  40. parser = configparser.ConfigParser(interpolation = None)
  41. parser.read_string(serialised)
  42. format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
  43. setting_version = int(parser.get("metadata", "setting_version", fallback = 0))
  44. return format_version * 1000000 + setting_version
  45. ## Upgrades a preferences file from version 2.7 to 3.0.
  46. #
  47. # \param serialised The serialised form of a preferences file.
  48. # \param filename The name of the file to upgrade.
  49. def upgradePreferences(self, serialised, filename):
  50. parser = configparser.ConfigParser(interpolation=None)
  51. parser.read_string(serialised)
  52. # Update version numbers
  53. if "general" not in parser:
  54. parser["general"] = {}
  55. parser["general"]["version"] = "5"
  56. if "metadata" not in parser:
  57. parser["metadata"] = {}
  58. parser["metadata"]["setting_version"] = "3"
  59. #Renamed themes.
  60. if "theme" in parser["general"]:
  61. if parser["general"]["theme"] in _renamed_themes:
  62. parser["general"]["theme"] = _renamed_themes[parser["general"]["theme"]]
  63. #Renamed languages.
  64. if "language" in parser["general"]:
  65. if parser["general"]["language"] in _renamed_i18n:
  66. parser["general"]["language"] = _renamed_i18n[parser["general"]["language"]]
  67. # Renamed settings for skin pre-shrink settings
  68. if parser.has_section("general") and "visible_settings" in parser["general"]:
  69. visible_settings = parser["general"]["visible_settings"].split(";")
  70. new_visible_settings = []
  71. renamed_skin_preshrink_names = {"expand_upper_skins": "top_skin_expand_distance",
  72. "expand_lower_skins": "bottom_skin_expand_distance"}
  73. for setting in visible_settings:
  74. if setting == "expand_skins_into_infill":
  75. continue # this one is removed
  76. if setting in renamed_skin_preshrink_names:
  77. new_visible_settings.append(renamed_skin_preshrink_names[setting])
  78. continue #Don't add the original.
  79. new_visible_settings.append(setting) #No special handling, so just add the original visible setting back.
  80. parser["general"]["visible_settings"] = ";".join(new_visible_settings)
  81. # Re-serialise the file.
  82. output = io.StringIO()
  83. parser.write(output)
  84. return [filename], [output.getvalue()]
  85. ## Upgrades the given quality changes container file from version 2.7 to 3.0.
  86. #
  87. # \param serialised The serialised form of the container file.
  88. # \param filename The name of the file to upgrade.
  89. def upgradeQualityChangesContainer(self, serialised, filename):
  90. parser = configparser.ConfigParser(interpolation=None)
  91. parser.read_string(serialised)
  92. # Update the skin pre-shrink settings:
  93. # - Remove the old ones
  94. # - Do not add the new ones. The default values will be used for them.
  95. if parser.has_section("values"):
  96. for remove_key in ["expand_skins_into_infill", "expand_upper_skins", "expand_lower_skins"]:
  97. if remove_key in parser["values"]:
  98. del parser["values"][remove_key]
  99. for each_section in ("general", "metadata"):
  100. if not parser.has_section(each_section):
  101. parser.add_section(each_section)
  102. # Set the definition to "ultimaker2" for Ultimaker 2 quality changes
  103. if not parser.has_section("general"):
  104. parser.add_section("general")
  105. # The ultimaker 2 family
  106. ultimaker2_prefix_list = ["ultimaker2_extended_",
  107. "ultimaker2_go_",
  108. "ultimaker2_"]
  109. # ultimaker 2+ is a different family, so don't do anything with those
  110. exclude_prefix_list = ["ultimaker2_extended_plus_",
  111. "ultimaker2_plus_"]
  112. # set machine definition to "ultimaker2" for the custom quality profiles that can be for the ultimaker 2 family
  113. file_base_name = os.path.basename(filename)
  114. is_ultimaker2_family = False
  115. if not any(file_base_name.startswith(ep) for ep in exclude_prefix_list):
  116. is_ultimaker2_family = any(file_base_name.startswith(ep) for ep in ultimaker2_prefix_list)
  117. # ultimaker2 family quality profiles used to set as "fdmprinter" profiles
  118. if is_ultimaker2_family and parser["general"]["definition"] == "fdmprinter":
  119. parser["general"]["definition"] = "ultimaker2"
  120. # Update version numbers
  121. parser["general"]["version"] = "2"
  122. parser["metadata"]["setting_version"] = "3"
  123. # Re-serialise the file.
  124. output = io.StringIO()
  125. parser.write(output)
  126. return [filename], [output.getvalue()]
  127. ## Upgrades the given instance container file from version 2.7 to 3.0.
  128. #
  129. # \param serialised The serialised form of the container file.
  130. # \param filename The name of the file to upgrade.
  131. def upgradeOtherContainer(self, serialised, filename):
  132. parser = configparser.ConfigParser(interpolation=None)
  133. parser.read_string(serialised)
  134. # Update the skin pre-shrink settings:
  135. # - Remove the old ones
  136. # - Do not add the new ones. The default values will be used for them.
  137. if parser.has_section("values"):
  138. for remove_key in ["expand_skins_into_infill", "expand_upper_skins", "expand_lower_skins"]:
  139. if remove_key in parser["values"]:
  140. del parser["values"][remove_key]
  141. for each_section in ("general", "metadata"):
  142. if not parser.has_section(each_section):
  143. parser.add_section(each_section)
  144. # Update version numbers
  145. parser["general"]["version"] = "2"
  146. parser["metadata"]["setting_version"] = "3"
  147. # Re-serialise the file.
  148. output = io.StringIO()
  149. parser.write(output)
  150. return [filename], [output.getvalue()]
  151. ## Upgrades a container stack from version 2.7 to 3.0.
  152. #
  153. # \param serialised The serialised form of a container stack.
  154. # \param filename The name of the file to upgrade.
  155. def upgradeStack(self, serialised, filename):
  156. parser = configparser.ConfigParser(interpolation=None)
  157. parser.read_string(serialised)
  158. for each_section in ("general", "metadata"):
  159. if not parser.has_section(each_section):
  160. parser.add_section(each_section)
  161. # Update version numbers
  162. if "general" not in parser:
  163. parser["general"] = {}
  164. parser["general"]["version"] = "3"
  165. if "metadata" not in parser:
  166. parser["metadata"] = {}
  167. parser["metadata"]["setting_version"] = "3"
  168. # Re-serialise the file.
  169. output = io.StringIO()
  170. parser.write(output)
  171. return [filename], [output.getvalue()]