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