From 0a079d979415b94b5a8364594b39d6f1b6e7b67f Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 23 Dec 2022 18:05:28 +0100 Subject: [PATCH] Account for setting-function value that evaluates to another setting-function. part of CURA-9859 --- plugins/UFPWriter/UFPWriter.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d76bcb1b83..c8064ac37f 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -229,22 +229,24 @@ class UFPWriter(MeshWriter): "quality": asdict(machine_manager.activeQualityDisplayNameMap()), } + def _retrieveValue(container: InstanceContainer, setting_: str): + value_ = container.getProperty(setting_, "value") + for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit. + if not isinstance(value_, SettingFunction): + return value_ # Success! + value_ = value_(container) + return 0 # Fallback value after breaking possibly endless loop. + global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) # Add global user or quality changes global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges) for setting in global_flattened_changes.getAllKeys(): - value = global_flattened_changes.getProperty(setting, "value") - if isinstance(value, SettingFunction): - value = value(global_flattened_changes) - settings["global"]["changes"][setting] = value + settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting) # Get global all settings values without user or quality changes for setting in global_stack.getAllKeys(): - value = global_stack.getProperty(setting, "value") - if isinstance(value, SettingFunction): - value = value(global_stack) - settings["global"]["all_settings"][setting] = value + settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting) for i, extruder in enumerate(global_stack.extruderList): # Add extruder fields to settings dictionary @@ -256,16 +258,10 @@ class UFPWriter(MeshWriter): # Add extruder user or quality changes extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges) for setting in extruder_flattened_changes.getAllKeys(): - value = extruder_flattened_changes.getProperty(setting, "value") - if isinstance(value, SettingFunction): - value = value(extruder_flattened_changes) - settings[f"extruder_{i}"]["changes"][setting] = value + settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting) # Get extruder all settings values without user or quality changes for setting in extruder.getAllKeys(): - value = extruder.getProperty(setting, "value") - if isinstance(value, SettingFunction): - value = value(extruder) - settings[f"extruder_{i}"]["all_settings"][setting] = value + settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting) return settings