VersionUpgrade.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # Copyright (c) 2016 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. import configparser #To get version numbers from config files.
  4. import os.path
  5. import io
  6. from UM import Resources
  7. from UM.VersionUpgrade import VersionUpgrade # Superclass of the plugin.
  8. class VersionUpgrade22to24(VersionUpgrade):
  9. def upgradeMachineInstance(self, serialised, filename):
  10. config = configparser.ConfigParser(interpolation = None)
  11. config.read_string(serialised) # Read the input string as config file.
  12. config.set("general", "version", "3")
  13. containers = config.get("general", "containers")
  14. container_list = containers.split(",")
  15. user_variants = self.__getUserVariants()
  16. name_path_dict = {}
  17. for variant in user_variants:
  18. name_path_dict[variant.get("name")] = variant.get("path")
  19. user_variant_names = set(container_list).intersection(name_path_dict.keys())
  20. if len(user_variant_names):
  21. # One of the user defined variants appears in the list of containers in the stack.
  22. for variant_name in user_variant_names:
  23. # Copy the variant to the machine_instances/*_settings.inst.cfg
  24. variant_config = configparser.ConfigParser(interpolation=None)
  25. variant_path = name_path_dict.get(variant_name)
  26. with open(variant_path, "r") as fhandle:
  27. variant_config.read_file(fhandle)
  28. if variant_config.has_section("general") and variant_config.has_option("general", "name"):
  29. config_name = variant_config.get("general", "name")
  30. if config_name.endswith("_variant"):
  31. config_name = config_name[:-len("_variant")] + "_settings"
  32. variant_config.set("general", "name", config_name)
  33. if not variant_config.has_section("metadata"):
  34. variant_config.add_section("metadata")
  35. variant_config.set("metadata", "type", "definition_changes")
  36. # "_settings.inst.cfg"
  37. resource_path = Resources.getDataStoragePath()
  38. machine_instances_dir = os.path.join(resource_path, "machine_instances")
  39. if variant_path.endswith("_variant.inst.cfg"):
  40. variant_path = variant_path[:-len("_variant.inst.cfg")] + "_settings.inst.cfg"
  41. with open(os.path.join(machine_instances_dir, os.path.basename(variant_path)), "w") as fp:
  42. variant_config.write(fp)
  43. # Change the name of variant and insert empty_variant into the stack.
  44. new_container_list = []
  45. for item in container_list:
  46. if item == variant_name:
  47. new_container_list.append(config_name)
  48. new_container_list.append("empty_variant")
  49. else:
  50. new_container_list.append(item)
  51. container_list = new_container_list
  52. config.set("general", "containers", ",".join(container_list))
  53. output = io.StringIO()
  54. config.write(output)
  55. return [filename], [output.getvalue()]
  56. def __getUserVariants(self):
  57. resource_path = Resources.getDataStoragePath()
  58. variants_dir = os.path.join(resource_path, "variants")
  59. result = []
  60. for entry in os.scandir(variants_dir):
  61. if entry.name.endswith('.inst.cfg') and entry.is_file():
  62. config = configparser.ConfigParser(interpolation = None)
  63. with open(entry.path, "r") as fhandle:
  64. config.read_file(fhandle)
  65. if config.has_section("general") and config.has_option("general", "name"):
  66. result.append( { "path": entry.path, "name": config.get("general", "name") } )
  67. return result
  68. def getCfgVersion(self, serialised):
  69. parser = configparser.ConfigParser(interpolation = None)
  70. parser.read_string(serialised)
  71. return int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.