VersionUpgrade32to33.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. # Copyright (c) 2018 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. from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this.
  6. ## Mapping extruder definition IDs to the positions that they are in.
  7. _EXTRUDER_TO_POSITION = {
  8. "builder_premium_large_front": 1,
  9. "builder_premium_large_rear": 0,
  10. "builder_premium_medium_front": 1,
  11. "builder_premium_medium_rear": 0,
  12. "builder_premium_small_front": 1,
  13. "builder_premium_small_rear": 0,
  14. "cartesio_extruder_0": 0,
  15. "cartesio_extruder_1": 1,
  16. "cartesio_extruder_2": 2,
  17. "cartesio_extruder_3": 3,
  18. "custom_extruder_1": 0, #Warning, non-programmers are attempting to count here.
  19. "custom_extruder_2": 1,
  20. "custom_extruder_3": 2,
  21. "custom_extruder_4": 3,
  22. "custom_extruder_5": 4,
  23. "custom_extruder_6": 5,
  24. "custom_extruder_7": 6,
  25. "custom_extruder_8": 7,
  26. "hBp_extruder_left": 0,
  27. "hBp_extruder_right": 1,
  28. "makeit_dual_1st": 0,
  29. "makeit_dual_2nd": 1,
  30. "makeit_l_dual_1st": 0,
  31. "makeit_l_dual_2nd": 1,
  32. "ord_extruder_0": 0,
  33. "ord_extruder_1": 1,
  34. "ord_extruder_2": 2,
  35. "ord_extruder_3": 3,
  36. "ord_extruder_4": 4,
  37. "punchtec_connect_xl_extruder_left": 0,
  38. "punchtec_connect_xl_extruder_right": 1,
  39. "raise3D_N2_dual_extruder_0": 0,
  40. "raise3D_N2_dual_extruder_1": 1,
  41. "raise3D_N2_plus_dual_extruder_0": 0,
  42. "raise3D_N2_plus_dual_extruder_1": 1,
  43. "ultimaker3_extended_extruder_left": 0,
  44. "ultimaker3_extended_extruder_right": 1,
  45. "ultimaker3_extruder_left": 0,
  46. "ultimaker3_extruder_right": 1,
  47. "ultimaker_original_dual_1st": 0,
  48. "ultimaker_original_dual_2nd": 1,
  49. "vertex_k8400_dual_1st": 0,
  50. "vertex_k8400_dual_2nd": 1
  51. }
  52. _RENAMED_QUALITY_PROFILES = {
  53. "low": "fast",
  54. "um2_low": "um2_fast"
  55. }
  56. _RENAMED_QUALITY_TYPES = {
  57. "low": "fast"
  58. }
  59. ## Upgrades configurations from the state they were in at version 3.2 to the
  60. # state they should be in at version 3.3.
  61. class VersionUpgrade32to33(VersionUpgrade):
  62. temporary_group_name_counter = 1
  63. ## Gets the version number from a CFG file in Uranium's 3.2 format.
  64. #
  65. # Since the format may change, this is implemented for the 3.2 format only
  66. # and needs to be included in the version upgrade system rather than
  67. # globally in Uranium.
  68. #
  69. # \param serialised The serialised form of a CFG file.
  70. # \return The version number stored in the CFG file.
  71. # \raises ValueError The format of the version number in the file is
  72. # incorrect.
  73. # \raises KeyError The format of the file is incorrect.
  74. def getCfgVersion(self, serialised):
  75. parser = configparser.ConfigParser(interpolation = None)
  76. parser.read_string(serialised)
  77. format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
  78. setting_version = int(parser.get("metadata", "setting_version", fallback = 0))
  79. return format_version * 1000000 + setting_version
  80. ## Upgrades a preferences file from version 3.2 to 3.3.
  81. #
  82. # \param serialised The serialised form of a preferences file.
  83. # \param filename The name of the file to upgrade.
  84. def upgradePreferences(self, serialised, filename):
  85. parser = configparser.ConfigParser(interpolation = None)
  86. parser.read_string(serialised)
  87. # Update version numbers
  88. if "general" not in parser:
  89. parser["general"] = {}
  90. parser["general"]["version"] = "6"
  91. if "metadata" not in parser:
  92. parser["metadata"] = {}
  93. parser["metadata"]["setting_version"] = "4"
  94. # The auto_slice preference changed its default value to "disabled" so if there is no value in previous versions,
  95. # then it means the desired value is auto_slice "enabled"
  96. if "auto_slice" not in parser["general"]:
  97. parser["general"]["auto_slice"] = "True"
  98. elif parser["general"]["auto_slice"] == "False": # If the value is False, then remove the entry
  99. del parser["general"]["auto_slice"]
  100. # Re-serialise the file.
  101. output = io.StringIO()
  102. parser.write(output)
  103. return [filename], [output.getvalue()]
  104. ## Upgrades a container stack from version 3.2 to 3.3.
  105. #
  106. # \param serialised The serialised form of a container stack.
  107. # \param filename The name of the file to upgrade.
  108. def upgradeStack(self, serialized, filename):
  109. parser = configparser.ConfigParser(interpolation = None)
  110. parser.read_string(serialized)
  111. if "metadata" in parser and "um_network_key" in parser["metadata"]:
  112. if "hidden" not in parser["metadata"]:
  113. parser["metadata"]["hidden"] = "False"
  114. if "connect_group_name" not in parser["metadata"]:
  115. parser["metadata"]["connect_group_name"] = "Temporary group name #" + str(self.temporary_group_name_counter)
  116. self.temporary_group_name_counter += 1
  117. #Update version number.
  118. parser["general"]["version"] = "4"
  119. #Update the name of the quality profile.
  120. if parser["containers"]["2"] in _RENAMED_QUALITY_PROFILES:
  121. parser["containers"]["2"] = _RENAMED_QUALITY_PROFILES[parser["containers"]["2"]]
  122. result = io.StringIO()
  123. parser.write(result)
  124. return [filename], [result.getvalue()]
  125. ## Upgrades non-quality-changes instance containers to have the new version
  126. # number.
  127. def upgradeInstanceContainer(self, serialized, filename):
  128. parser = configparser.ConfigParser(interpolation = None)
  129. parser.read_string(serialized)
  130. #Update version number.
  131. parser["general"]["version"] = "3"
  132. result = io.StringIO()
  133. parser.write(result)
  134. return [filename], [result.getvalue()]
  135. ## Upgrades a quality changes container to the new format.
  136. def upgradeQualityChanges(self, serialized, filename):
  137. parser = configparser.ConfigParser(interpolation = None)
  138. parser.read_string(serialized)
  139. #Extruder quality changes profiles have the extruder position instead of the ID of the extruder definition.
  140. if "metadata" in parser and "extruder" in parser["metadata"]: #Only do this for extruder profiles.
  141. extruder_id = parser["metadata"]["extruder"]
  142. if extruder_id in _EXTRUDER_TO_POSITION:
  143. extruder_position = _EXTRUDER_TO_POSITION[extruder_id]
  144. else:
  145. extruder_position = 0 #The user was using custom extruder definitions. He's on his own then.
  146. parser["metadata"]["position"] = str(extruder_position)
  147. del parser["metadata"]["extruder"]
  148. quality_type = parser["metadata"]["quality_type"]
  149. quality_type = quality_type.lower()
  150. if quality_type in _RENAMED_QUALITY_TYPES:
  151. quality_type = _RENAMED_QUALITY_TYPES[quality_type]
  152. parser["metadata"]["quality_type"] = quality_type
  153. #Update version number.
  154. parser["general"]["version"] = "3"
  155. result = io.StringIO()
  156. parser.write(result)
  157. return [filename], [result.getvalue()]
  158. ## Upgrades a variant container to the new format.
  159. def upgradeVariants(self, serialized, filename):
  160. parser = configparser.ConfigParser(interpolation = None)
  161. parser.read_string(serialized)
  162. #Add the hardware type to the variants
  163. if "metadata" in parser and "hardware_type" not in parser["metadata"]:
  164. parser["metadata"]["hardware_type"] = "nozzle"
  165. #Update version number.
  166. parser["general"]["version"] = "3"
  167. result = io.StringIO()
  168. parser.write(result)
  169. return [filename], [result.getvalue()]