Account for setting-function value that evaluates to another setting-function.

part of CURA-9859
This commit is contained in:
Remco Burema 2022-12-23 18:05:28 +01:00
parent 78ca98f9bf
commit 0a079d9794

View file

@ -229,22 +229,24 @@ class UFPWriter(MeshWriter):
"quality": asdict(machine_manager.activeQualityDisplayNameMap()), "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()) global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack())
# Add global user or quality changes # Add global user or quality changes
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges) global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
for setting in global_flattened_changes.getAllKeys(): for setting in global_flattened_changes.getAllKeys():
value = global_flattened_changes.getProperty(setting, "value") settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
if isinstance(value, SettingFunction):
value = value(global_flattened_changes)
settings["global"]["changes"][setting] = value
# Get global all settings values without user or quality changes # Get global all settings values without user or quality changes
for setting in global_stack.getAllKeys(): for setting in global_stack.getAllKeys():
value = global_stack.getProperty(setting, "value") settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
if isinstance(value, SettingFunction):
value = value(global_stack)
settings["global"]["all_settings"][setting] = value
for i, extruder in enumerate(global_stack.extruderList): for i, extruder in enumerate(global_stack.extruderList):
# Add extruder fields to settings dictionary # Add extruder fields to settings dictionary
@ -256,16 +258,10 @@ class UFPWriter(MeshWriter):
# Add extruder user or quality changes # Add extruder user or quality changes
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges) extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
for setting in extruder_flattened_changes.getAllKeys(): for setting in extruder_flattened_changes.getAllKeys():
value = extruder_flattened_changes.getProperty(setting, "value") settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
if isinstance(value, SettingFunction):
value = value(extruder_flattened_changes)
settings[f"extruder_{i}"]["changes"][setting] = value
# Get extruder all settings values without user or quality changes # Get extruder all settings values without user or quality changes
for setting in extruder.getAllKeys(): for setting in extruder.getAllKeys():
value = extruder.getProperty(setting, "value") settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
if isinstance(value, SettingFunction):
value = value(extruder)
settings[f"extruder_{i}"]["all_settings"][setting] = value
return settings return settings