Use container tree to determine default material

Using the new architecture here.

Contributes to issue CURA-6600.
This commit is contained in:
Ghostkeeper 2019-08-22 15:04:20 +02:00
parent 8ef410e826
commit 7b83e51439
No known key found for this signature in database
GPG Key ID: 86BEF881AE2CF276
2 changed files with 17 additions and 24 deletions

View File

@ -36,6 +36,7 @@ class MachineNode(ContainerNode):
self.quality_definition = my_metadata.get("quality_definition", container_id) self.quality_definition = my_metadata.get("quality_definition", container_id)
self.exclude_materials = my_metadata.get("exclude_materials", []) self.exclude_materials = my_metadata.get("exclude_materials", [])
self.preferred_variant_name = my_metadata.get("preferred_variant_name", "") self.preferred_variant_name = my_metadata.get("preferred_variant_name", "")
self.preferred_material = my_metadata.get("preferred_material", "")
self.preferred_quality_type = my_metadata.get("preferred_quality_type", "") self.preferred_quality_type = my_metadata.get("preferred_quality_type", "")
self._loadAll() self._loadAll()

View File

@ -227,34 +227,26 @@ class MaterialManager(QObject):
# you can provide the extruder_definition and then the position is ignored (useful when building up global stack in CuraStackBuilder) # you can provide the extruder_definition and then the position is ignored (useful when building up global stack in CuraStackBuilder)
def getDefaultMaterial(self, global_stack: "GlobalStack", position: str, nozzle_name: Optional[str], def getDefaultMaterial(self, global_stack: "GlobalStack", position: str, nozzle_name: Optional[str],
extruder_definition: Optional["DefinitionContainer"] = None) -> Optional["MaterialNode"]: extruder_definition: Optional["DefinitionContainer"] = None) -> Optional["MaterialNode"]:
node = None if not parseBool(global_stack.getMetaDataEntry("has_materials", False)):
return None
buildplate_name = global_stack.getBuildplateName() definition_id = global_stack.definition.getId()
machine_definition = global_stack.definition machine_node = ContainerTree.getInstance().machines[definition_id]
# The extruder-compatible material diameter in the extruder definition may not be the correct value because if extruder_definition is not None:
# the user can change it in the definition_changes container. material_diameter = extruder_definition.getProperty("material_diameter", "value")
if extruder_definition is None:
extruder_stack_or_definition = global_stack.extruders[position]
is_extruder_stack = True
else: else:
extruder_stack_or_definition = extruder_definition material_diameter = global_stack.extruders[position].getCompatibleMaterialDiameter()
is_extruder_stack = False approximate_material_diameter = round(material_diameter)
if extruder_stack_or_definition and parseBool(global_stack.getMetaDataEntry("has_materials", False)): if nozzle_name not in machine_node.variants:
if is_extruder_stack: Logger.log("w", "Could not find variant {nozzle_name} for machine with definition {definition_id} in the container tree".format(nozzle_name = nozzle_name, definition_id = definition_id))
material_diameter = extruder_stack_or_definition.getCompatibleMaterialDiameter() return None
else: available_materials = machine_node.variants[nozzle_name].materials
material_diameter = extruder_stack_or_definition.getProperty("material_diameter", "value") for base_material, material_node in available_materials.items():
if machine_node.preferred_material in base_material and approximate_material_diameter == int(material_node.getMetaDataEntry("approximate_diameter")):
if isinstance(material_diameter, SettingFunction): return material_node
material_diameter = material_diameter(global_stack) return None
approximate_material_diameter = str(round(material_diameter))
root_material_id = machine_definition.getMetaDataEntry("preferred_material")
root_material_id = self.getRootMaterialIDForDiameter(root_material_id, approximate_material_diameter)
node = self.getMaterialNode(machine_definition.getId(), nozzle_name, buildplate_name,
material_diameter, root_material_id)
return node
def removeMaterialByRootId(self, root_material_id: str): def removeMaterialByRootId(self, root_material_id: str):
container_registry = CuraContainerRegistry.getInstance() container_registry = CuraContainerRegistry.getInstance()