From e010c90c435aab94dc8e7814b89c66fae23a226c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Sep 2016 09:21:19 +0200 Subject: [PATCH 1/4] No longer set move_vector when we don't have to --- cura/PlatformPhysics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index d25a74bf91..b1dd1c4c8e 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -107,7 +107,6 @@ class PlatformPhysics: continue # Other node is already moving, wait for next pass. overlap = (0, 0) # Start loop with no overlap - move_vector = move_vector.set(x=overlap[0] * self._move_factor, z=overlap[1] * self._move_factor) current_overlap_checks = 0 # Continue to check the overlap until we no longer find one. while overlap and current_overlap_checks < self._max_overlap_checks: From 1bafac94bd27817b5e5310618658809e0be3afeb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Sep 2016 09:55:22 +0200 Subject: [PATCH 2/4] Value functions are now correcty copied when using per-object settings CURA-2224 --- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index b4086291ca..25c2290b37 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -69,7 +69,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] else: stack = UM.Application.getInstance().getGlobalContainerStack() - new_instance.setProperty("value", stack.getProperty(item, "value")) + new_instance.setProperty("value", stack.getRawProperty(item, "value")) new_instance.resetState() # Ensure that the state is not seen as a user state. settings.addInstance(new_instance) visibility_changed = True From 86369ce1da14b91deb28ddc32d8cbdc1aab28b96 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 7 Sep 2016 11:11:44 +0200 Subject: [PATCH 3/4] Profile import now supports 2.1 profiles and does any needed conversion work. Contributes to CURA-2252 Import ini profile fails in 2.3 --- .../CuraProfileReader/CuraProfileReader.py | 92 +++++++++++++++---- 1 file changed, 73 insertions(+), 19 deletions(-) diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 772b11890b..4f5bb324c0 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -1,8 +1,8 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. +import configparser -import os.path - +from UM import PluginRegistry from UM.Logger import Logger from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make. from cura.ProfileReader import ProfileReader @@ -28,21 +28,75 @@ class CuraProfileReader(ProfileReader): def read(self, file_name): try: archive = zipfile.ZipFile(file_name, "r") - except Exception: - # zipfile doesn't give proper exceptions, so we can only catch broad ones + results = [] + for profile_id in archive.namelist(): + with archive.open(profile_id) as f: + serialized = f.read() + profile = self._loadProfile(serialized.decode("utf-8"), profile_id) + if profile is not None: + results.append(profile) + return results + + except zipfile.BadZipFile: + # It must be an older profile from Cura 2.1. + with open(file_name, encoding="utf-8") as fhandle: + serialized = fhandle.read() + return [self._loadProfile(serialized, profile_id) for serialized, profile_id in self._upgradeProfile(serialized, file_name)] + + ## Convert a profile from an old Cura to this Cura if needed. + # + # \param serialized \type{str} The profile data to convert in the serialized on-disk format. + # \param profile_id \type{str} The name of the profile. + # \return \type{List[Tuple[str,str]]} List of serialized profile strings and matching profile names. + def _upgradeProfile(self, serialized, profile_id): + parser = configparser.ConfigParser(interpolation=None) + parser.read_string(serialized) + + if not "general" in parser: + Logger.log('w', "Missing required section 'general'.") + return None + if not "version" in parser["general"]: + Logger.log('w', "Missing required 'version' property") + return None + + version = int(parser["general"]["version"]) + if InstanceContainer.Version != version: + name = parser["general"]["name"] + return self._upgradeProfileVersion(serialized, name, version) + else: + return [(serialized, profile_id)] + + ## Load a profile from a serialized string. + # + # \param serialized \type{str} The profile data to read. + # \param profile_id \type{str} The name of the profile. + # \return \type{InstanceContainer|None} + def _loadProfile(self, serialized, profile_id): + # Create an empty profile. + profile = InstanceContainer(profile_id) + profile.addMetaDataEntry("type", "quality_changes") + try: + profile.deserialize(serialized) + except Exception as e: # Parsing error. This is not a (valid) Cura profile then. + Logger.log("e", "Error while trying to parse profile: %s", str(e)) + return None + return profile + + ## Upgrade a serialized profile to the current profile format. + # + # \param serialized \type{str} The profile data to convert. + # \param profile_id \type{str} The name of the profile. + # \param source_version \type{int} The profile version of 'serialized'. + # \return \type{List[Tuple[str,str]]} List of serialized profile strings and matching profile names. + def _upgradeProfileVersion(self, serialized, profile_id, source_version): + converter_plugins = PluginRegistry.getInstance().getAllMetaData(filter={"version_upgrade": {} }, active_only=True) + + source_format = ("profile", source_version) + profile_convert_funcs = [plugin["version_upgrade"][source_format][2] for plugin in converter_plugins + if source_format in plugin["version_upgrade"] and plugin["version_upgrade"][source_format][1] == InstanceContainer.Version] + + if not profile_convert_funcs: return [] - results = [] - for profile_id in archive.namelist(): - # Create an empty profile. - profile = InstanceContainer(profile_id) - profile.addMetaDataEntry("type", "quality_changes") - serialized = "" - with archive.open(profile_id) as f: - serialized = f.read() - try: - profile.deserialize(serialized.decode("utf-8") ) - except Exception as e: # Parsing error. This is not a (valid) Cura profile then. - Logger.log("e", "Error while trying to parse profile: %s", str(e)) - continue - results.append(profile) - return results \ No newline at end of file + + filenames, outputs = profile_convert_funcs[0](serialized, profile_id) + return list(zip(outputs, filenames)) From cce94c80432c0d51d3a7f3189acb740ba650e5c8 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 7 Sep 2016 11:29:37 +0200 Subject: [PATCH 4/4] Added skin_overlap <= infill_overlap mapping. Contributes to CURA-844 Profile converter 2.1 ==> 2.2 --- plugins/LegacyProfileReader/DictionaryOfDoom.json | 3 ++- .../VersionUpgrade21to22/VersionUpgrade21to22.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/LegacyProfileReader/DictionaryOfDoom.json b/plugins/LegacyProfileReader/DictionaryOfDoom.json index db0d26b8e4..15ef792f83 100644 --- a/plugins/LegacyProfileReader/DictionaryOfDoom.json +++ b/plugins/LegacyProfileReader/DictionaryOfDoom.json @@ -70,7 +70,8 @@ "magic_spiralize": "spiralize", "prime_tower_enable": "wipe_tower", "prime_tower_size": "math.sqrt(float(wipe_tower_volume) / float(layer_height))", - "ooze_shield_enabled": "ooze_shield" + "ooze_shield_enabled": "ooze_shield", + "skin_overlap": "fill_overlap" }, "defaults": { diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py index 0c3a4d1055..c8ec559702 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py @@ -279,6 +279,8 @@ class VersionUpgrade21to22(VersionUpgrade): elif key in _setting_name_translations: del settings[key] settings[_setting_name_translations[key]] = value + if "infill_overlap" in settings: # New setting, added in 2.3 + settings["skin_overlap"] = settings["infill_overlap"] return settings ## Translates a setting name for the change from Cura 2.1 to 2.2.