Profile.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # Copyright (c) 2016 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. import UM.Settings.SettingsError #To indicate that a file is of incorrect format.
  4. import configparser #To read config files.
  5. import io #To write config files to strings as if they were files.
  6. ## Creates a new profile instance by parsing a serialised profile in version 1
  7. # of the file format.
  8. #
  9. # \param serialised The serialised form of a profile in version 1.
  10. # \return A profile instance, or None if the file format is incorrect.
  11. def importFrom(serialised):
  12. try:
  13. return Profile(serialised)
  14. except (configparser.Error, SettingsError.InvalidFormatError, SettingsError.InvalidVersionError):
  15. return None
  16. ## A representation of a profile used as intermediary form for conversion from
  17. # one format to the other.
  18. class Profile:
  19. ## Reads version 1 of the file format, storing it in memory.
  20. #
  21. # \param serialised A string with the contents of a machine instance file.
  22. def __init__(self, serialised):
  23. parser = configparser.ConfigParser(interpolation = None)
  24. parser.read_string(serialised)
  25. # Check correctness.
  26. if not parser.has_section("general"):
  27. raise SettingsError.InvalidFormatError("general")
  28. if not parser.has_option("general", "version") or int(parser.get("general", "version")) != 1: # Hard-coded profile version here. If this number changes the entire function needs to change.
  29. raise SettingsError.InvalidVersionError("Version upgrade intermediary version 1")
  30. # Parse the general section.
  31. self._name = parser.get("general", "name")
  32. self._type = parser.get("general", "type", fallback = None)
  33. if "weight" in parser["general"]:
  34. self._weight = int(parser.get("general", "weight"))
  35. else:
  36. self._weight = None
  37. self._machine_type_id = parser.get("general", "machine_type", fallback = None)
  38. self._machine_variant_name = parser.get("general", "machine_variant", fallback = None)
  39. self._machine_instance_name = parser.get("general", "machine_instance", fallback = None)
  40. if "material" in parser["general"]:
  41. self._material_name = parser.get("general", "material")
  42. elif self._type == "material":
  43. self._material_name = parser.get("general", "name", fallback = None)
  44. else:
  45. self._material_name = None
  46. # Parse the settings.
  47. self._settings = {}
  48. if parser.has_section("settings"):
  49. for key, value in parser["settings"].items():
  50. self._settings[key] = value
  51. # Parse the defaults and the disabled defaults.
  52. self._changed_settings_defaults = {}
  53. if parser.has_section("defaults"):
  54. for key, value in parser["defaults"].items():
  55. self._changed_settings_defaults[key] = value
  56. self._disabled_settings_defaults = []
  57. if parser.has_section("disabled_defaults"):
  58. disabled_defaults_string = parser.get("disabled_defaults", "values")
  59. for item in disabled_defaults_string.split(","):
  60. if item != "":
  61. self._disabled_settings_defaults.append(item)
  62. ## Serialises this profile as file format version 2.
  63. #
  64. # \return A serialised form of this profile, serialised in version 2 of
  65. # the file format.
  66. def exportTo(self):
  67. import VersionUpgrade21to22 # Import here to prevent circular dependencies.
  68. config = configparser.ConfigParser(interpolation = None)
  69. config.add_section("general")
  70. config.set("general", "version", "2") # Hard-coded profile version 2
  71. config.set("general", "name", self._name)
  72. if self._type:
  73. config.set("general", "type", self._type)
  74. if self._weight:
  75. config.set("general", "weight", self._weight)
  76. if self._machine_type_id:
  77. config.set("general", "machine_type", self._machine_type_id)
  78. if self._machine_variant_name:
  79. config.set("general", "machine_variant", self._machine_variant_name)
  80. if self._machine_instance_name:
  81. config.set("general", "machine_instance", self._machine_instance_name)
  82. if self._material_name and self._type != "material":
  83. config.set("general", "material", self._material_name)
  84. if self._settings:
  85. VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._settings)
  86. config.add_section("settings")
  87. for key, value in self._settings.items():
  88. config.set("settings", key, str(value))
  89. if self._changed_settings_defaults:
  90. VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._changed_settings_defaults)
  91. config.add_section("defaults")
  92. for key, value in self._changed_settings_defaults.items():
  93. config.set("defaults", key, str(value))
  94. if self._disabled_settings_defaults:
  95. VersionUpgrade21to22.VersionUpgrade21to22.translateSettingNames(self._disabled_settings_defaults)
  96. config.add_section("disabled_defaults")
  97. disabled_defaults_string = str(self._disabled_settings_defaults[0]) # Must be at least 1 item, otherwise we wouldn't enter this if statement.
  98. for item in self._disabled_settings_defaults[1:]:
  99. disabled_defaults_string += "," + str(item)
  100. output = io.StringIO()
  101. config.write(output)
  102. return output.getvalue()