Merge branch 'transparent_limit_to_extruder' of github.com:Ultimaker/Cura

This commit is contained in:
Jaime van Kessel 2017-05-17 11:31:18 +02:00
commit d49dd735bc
5 changed files with 83 additions and 62 deletions

View File

@ -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)

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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