diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 18a9969828..70d2b0f6e4 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -1,22 +1,21 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from typing import Any - -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot +from typing import Any, TYPE_CHECKING, Optional from UM.Decorators import override from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase -from UM.Settings.ContainerStack import ContainerStack, InvalidContainerStackError +from UM.Settings.ContainerStack import ContainerStack from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.InstanceContainer import InstanceContainer -from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.Interfaces import ContainerInterface from . import Exceptions from .CuraContainerStack import CuraContainerStack from .ExtruderManager import ExtruderManager +if TYPE_CHECKING: + from cura.Settings.GlobalStack import GlobalStack + ## Represents an Extruder and its related containers. # # @@ -38,6 +37,10 @@ class ExtruderStack(CuraContainerStack): # For backward compatibility: Register the extruder with the Extruder Manager ExtruderManager.getInstance().registerExtruder(self, stack.id) + @override(ContainerStack) + def getNextStack(self) -> Optional["GlobalStack"]: + return super().getNextStack() + @classmethod def getLoadingPriority(cls) -> int: return 3 @@ -59,6 +62,12 @@ class ExtruderStack(CuraContainerStack): if not super().getProperty(key, "settable_per_extruder"): return self.getNextStack().getProperty(key, property_name) + limit_to_extruder = super().getProperty(key, "limit_to_extruder") + if (limit_to_extruder is not None and limit_to_extruder != "-1") and self.getMetaDataEntry("position") != str(limit_to_extruder): + result = self.getNextStack().extruders[str(limit_to_extruder)].getProperty(key, property_name) + if result is not None: + return result + return super().getProperty(key, property_name) @override(CuraContainerStack) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index cee141cf93..33dc9ab2b5 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -1,7 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from typing import Any +from typing import Any, Dict from PyQt5.QtCore import pyqtProperty @@ -24,7 +24,7 @@ class GlobalStack(CuraContainerStack): self.addMetaDataEntry("type", "machine") # For backward compatibility - self._extruders = [] + self._extruders = {} # This property is used to track which settings we are calculating the "resolve" for # and if so, to bypass the resolve to prevent an infinite recursion that would occur @@ -34,8 +34,8 @@ class GlobalStack(CuraContainerStack): ## Get the list of extruders of this stack. # # \return The extruders registered with this stack. - @pyqtProperty("QVariantList") - def extruders(self) -> list: + @pyqtProperty("QVariantMap") + def extruders(self) -> Dict[str, "ExtruderStack"]: return self._extruders @classmethod @@ -53,7 +53,7 @@ class GlobalStack(CuraContainerStack): if extruder_count and len(self._extruders) + 1 > extruder_count: Logger.log("w", "Adding extruder {meta} to {id} but its extruder count is {count}".format(id = self.id, count = extruder_count, meta = str(extruder.getMetaData()))) - self._extruders.append(extruder) + self._extruders[extruder.getMetaDataEntry("position", "0")] = extruder ## Overridden from ContainerStack # @@ -71,6 +71,7 @@ class GlobalStack(CuraContainerStack): if not self.definition.findDefinitions(key = key): return None + # Handle the "resolve" property. if self._shouldResolve(key, property_name): self._resolving_settings.add(key) resolve = super().getProperty(key, "resolve") @@ -78,6 +79,16 @@ class GlobalStack(CuraContainerStack): if resolve is not None: return resolve + # Handle the "limit_to_extruder" property. + limit_to_extruder = super().getProperty(key, "limit_to_extruder") + if limit_to_extruder is not None and limit_to_extruder != "-1": + if super().getProperty(key, "settable_per_extruder"): + result = self._extruders[str(limit_to_extruder)].getProperty(key, property_name) + if result is not None: + return result + else: + Logger.log("e", "Setting {setting} has limit_to_extruder but is not settable per extruder!", setting = key) + return super().getProperty(key, property_name) ## Overridden from ContainerStack diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 621feb2c70..be283f134f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1953,7 +1953,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "support_interface_enable and support_enable", "limit_to_extruder": "support_interface_extruder_nr", "value": "speed_support / 1.5", "settable_per_mesh": false, @@ -1970,7 +1970,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "support_roof_enable and support_enable", "limit_to_extruder": "support_roof_extruder_nr", "value": "speed_support_interface", "settable_per_mesh": false, @@ -1986,7 +1986,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "support_bottom_enable and support_enable", "limit_to_extruder": "support_bottom_extruder_nr", "value": "speed_support_interface", "settable_per_mesh": false, @@ -2275,7 +2275,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "resolveOrValue('acceleration_enabled') and support_interface_enable and support_enable", "limit_to_extruder": "support_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -2292,7 +2292,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "resolveOrValue('acceleration_enabled') and support_roof_enable and support_enable", "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2308,7 +2308,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "resolveOrValue('acceleration_enabled') and support_bottom_enable and support_enable", "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2540,7 +2540,7 @@ "value": "jerk_support", "minimum_value": "0.1", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "resolveOrValue('jerk_enabled') and support_interface_enable and support_enable", "limit_to_extruder": "support_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -2556,7 +2556,7 @@ "value": "jerk_support_interface", "minimum_value": "0.1", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "resolveOrValue('jerk_enabled') and support_roof_enable and support_enable", "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2571,7 +2571,7 @@ "value": "jerk_support_interface", "minimum_value": "0.1", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "resolveOrValue('jerk_enabled') and support_bottom_enable and support_enable", "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3156,7 +3156,7 @@ "default_value": 0.1, "type": "float", "enabled": "support_enable", - "value": "extruderValue(support_extruder_nr, 'support_z_distance')", + "value": "support_z_distance", "limit_to_extruder": "support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr", "settable_per_mesh": true }, @@ -3168,7 +3168,7 @@ "minimum_value": "0", "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, - "value": "extruderValue(support_extruder_nr, 'support_z_distance') if resolveOrValue('support_type') == 'everywhere' else 0", + "value": "support_z_distance if support_type == 'everywhere' else 0", "limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr", "type": "float", "enabled": "support_enable and resolveOrValue('support_type') == 'everywhere'", @@ -3211,11 +3211,11 @@ "unit": "mm", "type": "float", "minimum_value": "0", - "maximum_value_warning": "extruderValue(support_infill_extruder_nr, 'support_xy_distance')", + "maximum_value_warning": "support_xy_distance", "default_value": 0.2, "value": "machine_nozzle_size / 2", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable and extruderValue(support_infill_extruder_nr, 'support_xy_overrides_z') == 'z_overrides_xy'", + "enabled": "support_enable and support_xy_overrides_z == 'z_overrides_xy'", "settable_per_mesh": true }, "support_bottom_stair_step_height": @@ -3313,10 +3313,10 @@ "type": "float", "default_value": 1, "minimum_value": "0", - "minimum_value_warning": "0.2 + resolveOrValue('layer_height')", + "minimum_value_warning": "0.2 + layer_height", "maximum_value_warning": "10", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": true, "children": { @@ -3328,11 +3328,11 @@ "type": "float", "default_value": 1, "minimum_value": "0", - "minimum_value_warning": "0.2 + resolveOrValue('layer_height')", + "minimum_value_warning": "0.2 + layer_height", "maximum_value_warning": "10", - "value": "extruderValue(support_roof_extruder_nr, 'support_interface_height')", + "value": "support_interface_height", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "support_roof_enable and support_enable", "settable_per_mesh": true }, "support_bottom_height": @@ -3342,12 +3342,12 @@ "unit": "mm", "type": "float", "default_value": 1, - "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_height')", + "value": "support_interface_height", "minimum_value": "0", - "minimum_value_warning": "min(0.2 + resolveOrValue('layer_height'), extruderValue(support_bottom_extruder_nr, 'support_bottom_stair_step_height'))", + "minimum_value_warning": "min(0.2 + layer_height, support_bottom_stair_step_height)", "maximum_value_warning": "10", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "support_bottom_enable and support_enable", "settable_per_mesh": true } } @@ -3361,7 +3361,7 @@ "minimum_value": "0", "maximum_value_warning": "support_interface_height", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": true }, "support_interface_density": @@ -3374,7 +3374,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3389,7 +3389,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "support_roof_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3405,7 +3405,7 @@ "minimum_value_warning": "support_roof_line_width - 0.0001", "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == 'grid' else (3 if support_roof_pattern == 'triangles' else 1))", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "support_roof_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3421,7 +3421,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "support_bottom_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3437,7 +3437,7 @@ "minimum_value_warning": "support_bottom_line_width - 0.0001", "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "support_bottom_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3461,7 +3461,7 @@ }, "default_value": "concentric", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3483,7 +3483,7 @@ "default_value": "concentric", "value": "support_interface_pattern", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", + "enabled": "support_roof_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -3504,7 +3504,7 @@ "default_value": "concentric", "value": "support_interface_pattern", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "enabled": "support_bottom_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3531,7 +3531,7 @@ "minimum_value": "0", "minimum_value_warning": "2 * machine_nozzle_size", "maximum_value_warning": "20", - "enabled": "support_enable and extruderValue(support_infill_extruder_nr, 'support_use_towers')", + "enabled": "support_enable and support_use_towers", "settable_per_mesh": true }, "support_minimal_diameter": @@ -3545,8 +3545,8 @@ "minimum_value": "0", "minimum_value_warning": "2 * machine_nozzle_size", "maximum_value_warning": "20", - "maximum_value": "extruderValue(support_infill_extruder_nr, 'support_tower_diameter')", - "enabled": "support_enable and extruderValue(support_infill_extruder_nr, 'support_use_towers')", + "maximum_value": "support_tower_diameter", + "enabled": "support_enable and support_use_towers", "settable_per_mesh": true }, "support_tower_roof_angle": @@ -3559,7 +3559,7 @@ "maximum_value": "90", "default_value": 65, "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable and extruderValue(support_infill_extruder_nr, 'support_use_towers')", + "enabled": "support_enable and support_use_towers", "settable_per_mesh": true } } @@ -3785,7 +3785,7 @@ "value": "resolveOrValue('layer_height')", "minimum_value": "0.001", "minimum_value_warning": "0.04", - "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'machine_nozzle_size')", + "maximum_value_warning": "0.75 * machine_nozzle_size", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3800,8 +3800,8 @@ "default_value": 0.4, "value": "line_width", "minimum_value": "0.001", - "minimum_value_warning": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 0.1", - "maximum_value_warning": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 2", + "minimum_value_warning": "machine_nozzle_size * 0.1", + "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3815,8 +3815,8 @@ "type": "float", "default_value": 0.4, "minimum_value": "0", - "minimum_value_warning": "extruderValue(adhesion_extruder_nr, 'raft_surface_line_width')", - "maximum_value_warning": "extruderValue(adhesion_extruder_nr, 'raft_surface_line_width') * 3", + "minimum_value_warning": "raft_surface_line_width", + "maximum_value_warning": "raft_surface_line_width * 3", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "value": "raft_surface_line_width", "settable_per_mesh": false, @@ -3833,7 +3833,7 @@ "value": "resolveOrValue('layer_height') * 1.5", "minimum_value": "0.001", "minimum_value_warning": "0.04", - "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'machine_nozzle_size')", + "maximum_value_warning": "0.75 * machine_nozzle_size", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3848,8 +3848,8 @@ "default_value": 0.7, "value": "line_width * 2", "minimum_value": "0.001", - "minimum_value_warning": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 0.5", - "maximum_value_warning": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 3", + "minimum_value_warning": "machine_nozzle_size * 0.5", + "maximum_value_warning": "machine_nozzle_size * 3", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3864,7 +3864,7 @@ "default_value": 0.9, "value": "raft_interface_line_width + 0.2", "minimum_value": "0", - "minimum_value_warning": "extruderValue(adhesion_extruder_nr, 'raft_interface_line_width')", + "minimum_value_warning": "raft_interface_line_width", "maximum_value_warning": "15.0", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, @@ -3881,7 +3881,7 @@ "value": "resolveOrValue('layer_height_0') * 1.2", "minimum_value": "0.001", "minimum_value_warning": "0.04", - "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'raft_base_line_width')", + "maximum_value_warning": "0.75 * raft_base_line_width", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3895,9 +3895,9 @@ "type": "float", "default_value": 0.8, "minimum_value": "0.001", - "value": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 2", - "minimum_value_warning": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 0.5", - "maximum_value_warning": "extruderValue(adhesion_extruder_nr, 'machine_nozzle_size') * 3", + "value": "machine_nozzle_size * 2", + "minimum_value_warning": "machine_nozzle_size * 0.5", + "maximum_value_warning": "machine_nozzle_size * 3", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3912,7 +3912,7 @@ "default_value": 1.6, "value": "raft_base_line_width * 2", "minimum_value": "0", - "minimum_value_warning": "extruderValue(adhesion_extruder_nr, 'raft_base_line_width')", + "minimum_value_warning": "raft_base_line_width", "maximum_value_warning": "100", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, diff --git a/tests/Settings/TestExtruderStack.py b/tests/Settings/TestExtruderStack.py index 4e55411d9d..4cafde5127 100644 --- a/tests/Settings/TestExtruderStack.py +++ b/tests/Settings/TestExtruderStack.py @@ -250,7 +250,8 @@ def test_getPropertyFallThrough(extruder_stack): container_indices = cura.Settings.CuraContainerStack._ContainerIndexes #Cache. for type_id, type_name in container_indices.IndexTypeMap.items(): container = unittest.mock.MagicMock() - container.getProperty = lambda key, property, type_id = type_id: type_id if (key == "layer_height" and property == "value") else None #Returns the container type ID as layer height, in order to identify it. + # Return type_id when asking for value and -1 when asking for limit_to_extruder + container.getProperty = lambda key, property, type_id = type_id: type_id if (key == "layer_height" and property == "value") else (None if property != "limit_to_extruder" else "-1") #Returns the container type ID as layer height, in order to identify it. container.hasProperty = lambda key, property: key == "layer_height" container.getMetaDataEntry = unittest.mock.MagicMock(return_value = type_name) mock_layer_heights[type_id] = container diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index 1eb3c43746..5b28e401d8 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -350,7 +350,7 @@ def test_getPropertyResolveInInstance(global_stack): instance_containers = {} for container_type in container_indices.IndexTypeMap: instance_containers[container_type] = unittest.mock.MagicMock() #Sets the resolve and value for bed temperature. - instance_containers[container_type].getProperty = lambda key, property: (7.5 if property == "resolve" else (InstanceState.User if property == "state" else 5)) if (key == "material_bed_temperature") else None #7.5 resolve, 5 value. + instance_containers[container_type].getProperty = lambda key, property: (7.5 if property == "resolve" else (InstanceState.User if property == "state" else (5 if property != "limit_to_extruder" else "-1"))) if (key == "material_bed_temperature") else None #7.5 resolve, 5 value. instance_containers[container_type].getMetaDataEntry = unittest.mock.MagicMock(return_value = container_indices.IndexTypeMap[container_type]) #Make queries for the type return the desired type. instance_containers[container_indices.Definition].getProperty = lambda key, property: 10 if (key == "material_bed_temperature" and property == "value") else None #Definition only has value. with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. @@ -374,7 +374,7 @@ def test_getPropertyResolveInInstance(global_stack): # definitions. def test_getPropertyInstancesBeforeResolve(global_stack): value = unittest.mock.MagicMock() #Sets just the value. - value.getProperty = lambda key, property: (10 if property == "value" else InstanceState.User) if key == "material_bed_temperature" else None + value.getProperty = lambda key, property: (10 if property == "value" else (InstanceState.User if property != "limit_to_extruder" else "-1")) if key == "material_bed_temperature" else None value.getMetaDataEntry = unittest.mock.MagicMock(return_value = "quality") resolve = unittest.mock.MagicMock() #Sets just the resolve. resolve.getProperty = lambda key, property: 7.5 if (key == "material_bed_temperature" and property == "resolve") else None