From aac3077f9d04a2d3c0574fb98bdb4bae31044227 Mon Sep 17 00:00:00 2001 From: Frederic98 <13856291+Frederic98@users.noreply.github.com> Date: Fri, 27 Sep 2024 16:19:20 +0200 Subject: [PATCH] Add filtering to `extruderValues()` --- cura/Settings/CuraFormulaFunctions.py | 26 ++++++++++++++++------- resources/definitions/fdmprinter.def.json | 24 +++++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index 30d3031798..517226ef06 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Any, List, Optional, TYPE_CHECKING +from typing import Any, List, Optional, Union, TYPE_CHECKING from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext from UM.Settings.SettingFunction import SettingFunction @@ -61,14 +61,20 @@ class CuraFormulaFunctions: return value - def _getActiveExtruders(self, context: Optional["PropertyEvaluationContext"] = None) -> List[str]: + def _getActiveExtruders(self, context: Optional["PropertyEvaluationContext"] = None, + where: Union[str, List[str]] = None, where_not: Union[str, List[str]] = None) -> List[str]: machine_manager = self._application.getMachineManager() extruder_manager = self._application.getExtruderManager() global_stack = machine_manager.activeMachine + if isinstance(where, str): + where = [where] + if isinstance(where_not, str): + where_not = [where_not] + enabled_extruders = [] - used_extruders = [] + filtered_extruders = [] for extruder in extruder_manager.getActiveExtruderStacks(): if not extruder.isEnabled: continue @@ -76,18 +82,22 @@ class CuraFormulaFunctions: if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value", context = context): continue enabled_extruders.append(extruder) - if extruder.getProperty("extruder_used", "value"): - used_extruders.append(extruder) + if where and not all(extruder.getProperty(key, "value", context=context) for key in where): + continue + if where_not and any(extruder.getProperty(key, "value", context=context) for key in where_not): + continue + filtered_extruders.append(extruder) - return used_extruders if used_extruders else enabled_extruders + return filtered_extruders if filtered_extruders else enabled_extruders # Gets all extruder values as a list for the given property. def getValuesInAllExtruders(self, property_key: str, - context: Optional["PropertyEvaluationContext"] = None) -> List[Any]: + context: Optional["PropertyEvaluationContext"] = None, + *, where: str = None, where_not: str = None) -> List[Any]: global_stack = self._application.getMachineManager().activeMachine result = [] - for extruder in self._getActiveExtruders(context): + for extruder in self._getActiveExtruders(context, where=where, where_not=where_not): value = extruder.getRawProperty(property_key, "value", context = context) if value is None: diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 92ab524741..17683b48b0 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -300,6 +300,18 @@ "settable_per_meshgroup": false, "type": "[int]" }, + "extruder_used": + { + "default_value": true, + "description": "Is this extruder used? This setting is controlled by Cura automatically.", + "label": "Extruder Used", + "settable_globally": false, + "settable_per_extruder": true, + "settable_per_mesh": false, + "settable_per_meshgroup": false, + "type": "bool", + "force_depends_on_settings": ["extruders_used"] + }, "machine_nozzle_tip_outer_diameter": { "label": "Outer Nozzle Diameter", @@ -2487,14 +2499,13 @@ "unit": "\u00b0C", "type": "float", "default_value": 0, - "resolve": "min(extruderValues('build_volume_temperature'))", + "resolve": "min(extruderValues('build_volume_temperature', where='extruder_used'))", "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "285", "enabled": "machine_heated_build_volume", "settable_per_mesh": false, - "settable_per_extruder": false, - "depends_on_settings": [ "extruders_used" ] + "settable_per_extruder": false }, "material_print_temperature": { @@ -2580,7 +2591,7 @@ "description": "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value", "unit": "\u00b0C", "type": "float", - "resolve": "max(extruderValues('default_material_bed_temperature'))", + "resolve": "max(extruderValues('default_material_bed_temperature', where='extruder_used'))", "default_value": 60, "minimum_value": "-273.15", "minimum_value_warning": "build_volume_temperature", @@ -2599,7 +2610,7 @@ "type": "float", "default_value": 60, "value": "default_material_bed_temperature", - "resolve": "max(extruderValues('material_bed_temperature'))", + "resolve": "max(extruderValues('material_bed_temperature', where='extruder_used'))", "minimum_value": "-273.15", "minimum_value_warning": "build_volume_temperature", "maximum_value_warning": "130", @@ -2607,8 +2618,7 @@ "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "depends_on_settings": [ "extruders_used" ] + "settable_per_meshgroup": false }, "material_bed_temperature_layer_0": {