Просмотр исходного кода

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

part of CURA-9859
Remco Burema 2 лет назад
Родитель
Сommit
0a079d9794
1 измененных файлов с 12 добавлено и 16 удалено
  1. 12 16
      plugins/UFPWriter/UFPWriter.py

+ 12 - 16
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