Allow machinedefinitions to specify another definition to inherit qualities from

CURA-1780
This commit is contained in:
fieldOfView 2016-09-08 18:49:34 +02:00
parent 4de78db87a
commit 8b7a8327e8
5 changed files with 69 additions and 14 deletions

View file

@ -160,7 +160,7 @@ class ExtruderManager(QObject):
def createExtruderTrain(self, extruder_definition, machine_definition, position, machine_id): def createExtruderTrain(self, extruder_definition, machine_definition, position, machine_id):
# Cache some things. # Cache some things.
container_registry = UM.Settings.ContainerRegistry.getInstance() container_registry = UM.Settings.ContainerRegistry.getInstance()
machine_definition_id = machine_definition.getId() machine_definition_id = UM.Application.getInstance().getMachineManager().getQualityDefinitionId(machine_definition)
# Create a container stack for this extruder. # Create a container stack for this extruder.
extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) extruder_stack_id = container_registry.uniqueName(extruder_definition.getId())
@ -222,7 +222,7 @@ class ExtruderManager(QObject):
search_criteria = { "type": "quality" } search_criteria = { "type": "quality" }
if machine_definition.getMetaDataEntry("has_machine_quality"): if machine_definition.getMetaDataEntry("has_machine_quality"):
search_criteria["definition"] = machine_definition.id search_criteria["definition"] = machine_definition_id
if machine_definition.getMetaDataEntry("has_materials") and material: if machine_definition.getMetaDataEntry("has_materials") and material:
search_criteria["material"] = material.id search_criteria["material"] = material.id
else: else:

View file

@ -430,13 +430,23 @@ class MachineManager(QObject):
return result return result
## Get the Material ID associated with the currently active material
# \returns MaterialID (string) if found, empty string otherwise
@pyqtProperty(str, notify=activeQualityChanged) @pyqtProperty(str, notify=activeQualityChanged)
def activeQualityMaterialId(self): def activeQualityMaterialId(self):
if self._active_container_stack: if self._active_container_stack:
quality = self._active_container_stack.findContainer({"type": "quality"}) quality = self._active_container_stack.findContainer({"type": "quality"})
if quality: if quality:
return quality.getMetaDataEntry("material") material_id = quality.getMetaDataEntry("material")
if material_id:
# if the currently active machine inherits its qualities from a different machine
# definition, make sure to return a material that is relevant to that machine definition
definition_id = self.activeDefinitionId
quality_definition_id = self.activeQualityDefinitionId
if definition_id != quality_definition_id:
material_id = material_id.replace(definition_id, quality_definition_id, 1)
return material_id
return "" return ""
@pyqtProperty(str, notify=activeQualityChanged) @pyqtProperty(str, notify=activeQualityChanged)
@ -594,7 +604,7 @@ class MachineManager(QObject):
criteria["material"] = material.getId() criteria["material"] = material.getId()
if self._global_container_stack.getMetaDataEntry("has_machine_quality"): if self._global_container_stack.getMetaDataEntry("has_machine_quality"):
criteria["definition"] = self._global_container_stack.getBottom().getId() criteria["definition"] = self.activeQualityDefinitionId
else: else:
criteria["definition"] = "fdmprinter" criteria["definition"] = "fdmprinter"
@ -685,6 +695,51 @@ class MachineManager(QObject):
return "" return ""
## Get the Definition ID to use to select quality profiles for the currently active machine
# \returns DefinitionID (string) if found, empty string otherwise
# \sa getQualityDefinitionId
@pyqtProperty(str, notify = globalContainerChanged)
def activeQualityDefinitionId(self):
if self._global_container_stack:
return self.getQualityDefinitionId(self._global_container_stack.getBottom())
return ""
## Get the Definition ID to use to select quality profiles for machines of the specified definition
# This is normally the id of the definition itself, but machines can specify a different definition to inherit qualities from
# \param definition (DefinitionContainer) machine definition
# \returns DefinitionID (string) if found, empty string otherwise
def getQualityDefinitionId(self, definition):
definition_id = definition.getMetaDataEntry("quality_definition")
if not definition_id:
definition_id = definition.getId()
return definition_id
## Get the Variant ID to use to select quality profiles for the currently active variant
# \returns VariantID (string) if found, empty string otherwise
# \sa getQualityVariantId
@pyqtProperty(str, notify = activeVariantChanged)
def activeQualityVariantId(self):
if self._global_container_stack:
variant = self._global_container_stack.findContainer({"type": "variant"})
if variant:
return self.getQualityVariantId(self._global_container_stack.getBottom(), variant)
return ""
## Get the Variant ID to use to select quality profiles for variants of the specified definitions
# This is normally the id of the variant itself, but machines can specify a different definition
# to inherit qualities from, which has consequences for the variant to use as well
# \param definition (DefinitionContainer) machine definition
# \param variant (DefinitionContainer) variant definition
# \returns VariantID (string) if found, empty string otherwise
def getQualityVariantId(self, definition, variant):
variant_id = variant.getId()
definition_id = definition.getId()
quality_definition_id = self.getQualityDefinitionId(definition)
if definition_id != quality_definition_id:
variant_id = variant_id.replace(definition_id, quality_definition_id, 1)
return variant_id
## Gets how the active definition calls variants ## Gets how the active definition calls variants
# Caveat: per-definition-variant-title is currently not translated (though the fallback is) # Caveat: per-definition-variant-title is currently not translated (though the fallback is)
@pyqtProperty(str, notify = globalContainerChanged) @pyqtProperty(str, notify = globalContainerChanged)
@ -789,10 +844,10 @@ class MachineManager(QObject):
search_criteria = { "type": "material" } search_criteria = { "type": "material" }
if definition.getMetaDataEntry("has_machine_materials"): if definition.getMetaDataEntry("has_machine_materials"):
search_criteria["definition"] = definition.id search_criteria["definition"] = self.getQualityDefinitionId(definition)
if definition.getMetaDataEntry("has_variants") and variant_container: if definition.getMetaDataEntry("has_variants") and variant_container:
search_criteria["variant"] = variant_container.id search_criteria["variant"] = self.getQualityVariantId(definition, variant_container)
else: else:
search_criteria["definition"] = "fdmprinter" search_criteria["definition"] = "fdmprinter"
@ -823,7 +878,7 @@ class MachineManager(QObject):
search_criteria = { "type": "quality" } search_criteria = { "type": "quality" }
if definition.getMetaDataEntry("has_machine_quality"): if definition.getMetaDataEntry("has_machine_quality"):
search_criteria["definition"] = definition.id search_criteria["definition"] = self.getQualityDefinitionId(definition)
if definition.getMetaDataEntry("has_materials") and material_container: if definition.getMetaDataEntry("has_materials") and material_container:
search_criteria["material"] = material_container.id search_criteria["material"] = material_container.id
@ -866,10 +921,10 @@ class MachineManager(QObject):
if definition.getMetaDataEntry("has_variants"): if definition.getMetaDataEntry("has_variants"):
material_search_criteria["variant"] = material_container.getMetaDataEntry("variant") material_search_criteria["variant"] = material_container.getMetaDataEntry("variant")
else: else:
material_search_criteria["definition"] = definition.id material_search_criteria["definition"] = self.getQualityDefinitionId(definition)
if definition.getMetaDataEntry("has_variants") and variant_container: if definition.getMetaDataEntry("has_variants") and variant_container:
material_search_criteria["variant"] = variant_container.id material_search_criteria["variant"] = self.getQualityVariantId(definition, variant_container)
else: else:
material_search_criteria["definition"] = "fdmprinter" material_search_criteria["definition"] = "fdmprinter"
material_containers = container_registry.findInstanceContainers(**material_search_criteria) material_containers = container_registry.findInstanceContainers(**material_search_criteria)

View file

@ -106,10 +106,10 @@ Menu
var result = { "type": "material" }; var result = { "type": "material" };
if(Cura.MachineManager.filterMaterialsByMachine) if(Cura.MachineManager.filterMaterialsByMachine)
{ {
result.definition = Cura.MachineManager.activeDefinitionId; result.definition = Cura.MachineManager.activeQualityDefinitionId;
if(Cura.MachineManager.hasVariants) if(Cura.MachineManager.hasVariants)
{ {
result.variant = Cura.MachineManager.activeVariantId; result.variant = Cura.MachineManager.activeQualityVariantId;
} }
} }
else else

View file

@ -38,7 +38,7 @@ Menu
id: customProfileInstantiator id: customProfileInstantiator
model: UM.InstanceContainersModel model: UM.InstanceContainersModel
{ {
filter: { "type": "quality_changes", "extruder": null, "definition": Cura.MachineManager.filterQualityByMachine ? Cura.MachineManager.activeDefinitionId : "fdmprinter" }; filter: { "type": "quality_changes", "extruder": null, "definition": Cura.MachineManager.filterQualityByMachine ? Cura.MachineManager.activeQualityDefinitionId : "fdmprinter" };
onModelReset: customSeparator.visible = rowCount() > 0 onModelReset: customSeparator.visible = rowCount() > 0
} }
@ -79,7 +79,7 @@ Menu
if(Cura.MachineManager.filterQualityByMachine) if(Cura.MachineManager.filterQualityByMachine)
{ {
result.definition = Cura.MachineManager.activeDefinitionId; result.definition = Cura.MachineManager.activeQualityDefinitionId;
if(Cura.MachineManager.hasMaterials) if(Cura.MachineManager.hasMaterials)
{ {
result.material = Cura.MachineManager.activeQualityMaterialId; result.material = Cura.MachineManager.activeQualityMaterialId;

View file

@ -23,7 +23,7 @@ UM.ManagementPage
var result = { "type": "quality*", "extruder": null }; var result = { "type": "quality*", "extruder": null };
if(Cura.MachineManager.filterQualityByMachine) if(Cura.MachineManager.filterQualityByMachine)
{ {
result.definition = Cura.MachineManager.activeDefinitionId; result.definition = Cura.MachineManager.activeQualityDefinitionId;
if(Cura.MachineManager.hasMaterials) if(Cura.MachineManager.hasMaterials)
{ {
result.material = Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId]; result.material = Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId];