From ea10d5e6087135609b3d0b3fa87ff5af9cdc3940 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Oct 2018 11:36:11 +0200 Subject: [PATCH 1/5] Rename to comptabileMaterialDiameter CURA-5834 This property returns the material diameter an extruder is compatible with, so this makes it more clear. --- cura/Settings/ExtruderStack.py | 4 ++-- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index ca687e358b..ae0c2a7893 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -70,7 +70,7 @@ class ExtruderStack(CuraContainerStack): # If the machine has no requirement for the diameter, -1 is returned. # \return The filament diameter for the printer @property - def materialDiameter(self) -> float: + def comptabileMaterialDiameter(self) -> float: context = PropertyEvaluationContext(self) context.context["evaluate_from_container_index"] = _ContainerIndexes.Variant @@ -86,7 +86,7 @@ class ExtruderStack(CuraContainerStack): # \return The approximate filament diameter for the printer @pyqtProperty(float) def approximateMaterialDiameter(self) -> float: - return round(float(self.materialDiameter)) + return round(float(self.comptabileMaterialDiameter)) ## Overridden from ContainerStack # diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 429d4ab7d4..e56e4c0f13 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -926,7 +926,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): build_plate_id = global_stack.variant.getId() # get material diameter of this extruder - machine_material_diameter = extruder_stack.materialDiameter + machine_material_diameter = extruder_stack.comptabileMaterialDiameter material_node = material_manager.getMaterialNode(global_stack.definition.getId(), extruder_stack.variant.getName(), build_plate_id, From 97e6354c13be511152e8f683dde275026ee5e3eb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Oct 2018 13:48:50 +0200 Subject: [PATCH 2/5] Fix material update upon extruder-compatible diameter change CURA-5834 Material models and the material container on an extruder need to be updated when the extruder's compatible diameter gets changes. --- cura/Machines/MaterialManager.py | 22 +++++++++---- cura/Machines/Models/BaseMaterialsModel.py | 2 ++ cura/Settings/CuraStackBuilder.py | 2 +- cura/Settings/ExtruderStack.py | 31 +++++++++++++++---- cura/Settings/MachineManager.py | 8 ++--- .../MachineSettingsAction.qml | 14 ++++++++- 6 files changed, 59 insertions(+), 20 deletions(-) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index be97fbc161..f91259723d 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -365,7 +365,7 @@ class MaterialManager(QObject): nozzle_name = None if extruder_stack.variant.getId() != "empty_variant": nozzle_name = extruder_stack.variant.getName() - diameter = extruder_stack.approximateMaterialDiameter + diameter = extruder_stack.getApproximateMaterialDiameter() # Fetch the available materials (ContainerNode) for the current active machine and extruder setup. return self.getAvailableMaterials(machine.definition, nozzle_name, buildplate_name, diameter) @@ -478,12 +478,22 @@ class MaterialManager(QObject): buildplate_name = global_stack.getBuildplateName() machine_definition = global_stack.definition - if extruder_definition is None: - extruder_definition = global_stack.extruders[position].definition - if extruder_definition and parseBool(global_stack.getMetaDataEntry("has_materials", False)): - # At this point the extruder_definition is not None - material_diameter = extruder_definition.getProperty("material_diameter", "value") + # The extruder-compatible material diameter in the extruder definition may not be the correct value because + # the user can change it in the definition_changes container. + if extruder_definition is None: + extruder_stack_or_definition = global_stack.extruders[position] + is_extruder_stack = True + else: + extruder_stack_or_definition = extruder_definition + is_extruder_stack = False + + if extruder_stack_or_definition and parseBool(global_stack.getMetaDataEntry("has_materials", False)): + if is_extruder_stack: + material_diameter = extruder_stack_or_definition.getComptabileMaterialDiameter() + else: + material_diameter = extruder_stack_or_definition.getProperty("material_diameter", "value") + if isinstance(material_diameter, SettingFunction): material_diameter = material_diameter(global_stack) approximate_material_diameter = str(round(material_diameter)) diff --git a/cura/Machines/Models/BaseMaterialsModel.py b/cura/Machines/Models/BaseMaterialsModel.py index be9f8be1ed..ef2e760330 100644 --- a/cura/Machines/Models/BaseMaterialsModel.py +++ b/cura/Machines/Models/BaseMaterialsModel.py @@ -64,9 +64,11 @@ class BaseMaterialsModel(ListModel): if self._extruder_stack is not None: self._extruder_stack.pyqtContainersChanged.disconnect(self._update) + self._extruder_stack.approximateMaterialDiameterChanged.disconnect(self._update) self._extruder_stack = global_stack.extruders.get(str(self._extruder_position)) if self._extruder_stack is not None: self._extruder_stack.pyqtContainersChanged.connect(self._update) + self._extruder_stack.approximateMaterialDiameterChanged.connect(self._update) # Force update the model when the extruder stack changes self._update() diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 58109d3a8d..95aa364a2e 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -129,7 +129,7 @@ class CuraStackBuilder: # get material container for extruders material_container = application.empty_material_container - material_node = material_manager.getDefaultMaterial(global_stack, extruder_position, extruder_variant_name, + material_node = material_manager.getDefaultMaterial(global_stack, str(extruder_position), extruder_variant_name, extruder_definition = extruder_definition) if material_node and material_node.getContainer(): material_container = material_node.getContainer() diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index ae0c2a7893..02e8824a9d 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -65,16 +65,33 @@ class ExtruderStack(CuraContainerStack): def getLoadingPriority(cls) -> int: return 3 + compatibleMaterialDiameterChanged = pyqtSignal() + ## Return the filament diameter that the machine requires. # # If the machine has no requirement for the diameter, -1 is returned. # \return The filament diameter for the printer - @property - def comptabileMaterialDiameter(self) -> float: + def getComptabileMaterialDiameter(self) -> float: context = PropertyEvaluationContext(self) context.context["evaluate_from_container_index"] = _ContainerIndexes.Variant - return self.getProperty("material_diameter", "value", context = context) + return float(self.getProperty("material_diameter", "value", context = context)) + + def setCompatibleMaterialDiameter(self, value: float) -> None: + old_approximate_diameter = self.getApproximateMaterialDiameter() + if self.getComptabileMaterialDiameter() != value: + self.definitionChanges.setProperty("material_diameter", "value", value) + self.compatibleMaterialDiameterChanged.emit() + + # Emit approximate diameter changed signal if needed + if old_approximate_diameter != self.getApproximateMaterialDiameter(): + self.approximateMaterialDiameterChanged.emit() + + compatibleMaterialDiameter = pyqtProperty(float, fset = setCompatibleMaterialDiameter, + fget = getComptabileMaterialDiameter, + notify = compatibleMaterialDiameterChanged) + + approximateMaterialDiameterChanged = pyqtSignal() ## Return the approximate filament diameter that the machine requires. # @@ -84,9 +101,11 @@ class ExtruderStack(CuraContainerStack): # If the machine has no requirement for the diameter, -1 is returned. # # \return The approximate filament diameter for the printer - @pyqtProperty(float) - def approximateMaterialDiameter(self) -> float: - return round(float(self.comptabileMaterialDiameter)) + def getApproximateMaterialDiameter(self) -> float: + return round(self.getComptabileMaterialDiameter()) + + approximateMaterialDiameter = pyqtProperty(float, fget = getApproximateMaterialDiameter, + notify = approximateMaterialDiameterChanged) ## Overridden from ContainerStack # diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 063f894d23..c27e95bbf0 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1276,11 +1276,7 @@ class MachineManager(QObject): if extruder.variant.getId() != self._empty_variant_container.getId(): current_nozzle_name = extruder.variant.getMetaDataEntry("name") - from UM.Settings.Interfaces import PropertyEvaluationContext - from cura.Settings.CuraContainerStack import _ContainerIndexes - context = PropertyEvaluationContext(extruder) - context.context["evaluate_from_container_index"] = _ContainerIndexes.DefinitionChanges - material_diameter = extruder.getProperty("material_diameter", "value", context) + material_diameter = extruder.getComptabileMaterialDiameter() candidate_materials = self._material_manager.getAvailableMaterials( self._global_container_stack.definition, current_nozzle_name, @@ -1415,7 +1411,7 @@ class MachineManager(QObject): position = str(position) extruder_stack = self._global_container_stack.extruders[position] nozzle_name = extruder_stack.variant.getName() - material_diameter = extruder_stack.approximateMaterialDiameter + material_diameter = extruder_stack.getApproximateMaterialDiameter() material_node = self._material_manager.getMaterialNode(machine_definition_id, nozzle_name, buildplate_name, material_diameter, root_material_id) self.setMaterial(position, material_node) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 6c95dc2c92..275f1d2a41 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -408,6 +408,10 @@ Cura.MachineAction manager.updateMaterialForDiameter(settingsTabs.currentIndex - 1); } } + function setValueFunction(value) + { + Cura.MachineManager.activeStack.compatibleMaterialDiameter = value; + } property bool isExtruderSetting: true } @@ -564,6 +568,7 @@ Cura.MachineAction property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange property string _label: (typeof(label) === 'undefined') ? "" : label property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip + property var _setValueFunction: (typeof(setValueFunction) === 'undefined') ? undefined : setValueFunction UM.SettingPropertyProvider { @@ -616,7 +621,14 @@ Cura.MachineAction { if (propertyProvider && text != propertyProvider.properties.value) { - propertyProvider.setPropertyValue("value", text); + if (_setValueFunction !== undefined) + { + _setValueFunction(text); + } + else + { + propertyProvider.setPropertyValue("value", text); + } if(_forceUpdateOnChange) { manager.forceUpdate(); From ea9aa2c7773899b37f582b160aea4de51b81243a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 22 Oct 2018 10:56:04 +0200 Subject: [PATCH 3/5] Add doc for using setCompatibleMaterialDiameter() in QML CURA-5834 --- .../MachineSettingsAction/MachineSettingsAction.qml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 275f1d2a41..be2b1d337a 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -621,6 +621,17 @@ Cura.MachineAction { if (propertyProvider && text != propertyProvider.properties.value) { + // For some properties like the extruder-compatible material diameter, they need to + // trigger many updates, such as the available materials, the current material may + // need to be switched, etc. Although setting the diameter can be done directly via + // the provider, all the updates that need to be triggered then need to depend on + // the metadata update, a signal that can be fired way too often. The update functions + // can have if-checks to filter out the irrelevant updates, but still it incurs unnecessary + // overhead. + // The ExtruderStack class has a dedicated function for this call "setCompatibleMaterialDiameter()", + // and it triggers the diameter update signals only when it is needed. Here it is optionally + // choose to use setCompatibleMaterialDiameter() or other more specific functions that + // are available. if (_setValueFunction !== undefined) { _setValueFunction(text); From 94ef0b92fe8642ef3b4f4e795340a82b0b205f26 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 23 Oct 2018 10:25:13 +0200 Subject: [PATCH 4/5] Fix typo in the getCompatibleMaterialDiameter function. Contributes to CURA-5834. --- cura/Settings/ExtruderStack.py | 8 ++++---- cura/Settings/MachineManager.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- .../MachineSettingsAction/MachineSettingsAction.qml | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 02e8824a9d..d7faedb71c 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -71,7 +71,7 @@ class ExtruderStack(CuraContainerStack): # # If the machine has no requirement for the diameter, -1 is returned. # \return The filament diameter for the printer - def getComptabileMaterialDiameter(self) -> float: + def getCompatibleMaterialDiameter(self) -> float: context = PropertyEvaluationContext(self) context.context["evaluate_from_container_index"] = _ContainerIndexes.Variant @@ -79,7 +79,7 @@ class ExtruderStack(CuraContainerStack): def setCompatibleMaterialDiameter(self, value: float) -> None: old_approximate_diameter = self.getApproximateMaterialDiameter() - if self.getComptabileMaterialDiameter() != value: + if self.getCompatibleMaterialDiameter() != value: self.definitionChanges.setProperty("material_diameter", "value", value) self.compatibleMaterialDiameterChanged.emit() @@ -88,7 +88,7 @@ class ExtruderStack(CuraContainerStack): self.approximateMaterialDiameterChanged.emit() compatibleMaterialDiameter = pyqtProperty(float, fset = setCompatibleMaterialDiameter, - fget = getComptabileMaterialDiameter, + fget = getCompatibleMaterialDiameter, notify = compatibleMaterialDiameterChanged) approximateMaterialDiameterChanged = pyqtSignal() @@ -102,7 +102,7 @@ class ExtruderStack(CuraContainerStack): # # \return The approximate filament diameter for the printer def getApproximateMaterialDiameter(self) -> float: - return round(self.getComptabileMaterialDiameter()) + return round(self.getCompatibleMaterialDiameter()) approximateMaterialDiameter = pyqtProperty(float, fget = getApproximateMaterialDiameter, notify = approximateMaterialDiameterChanged) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c27e95bbf0..e728ae433b 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1276,7 +1276,7 @@ class MachineManager(QObject): if extruder.variant.getId() != self._empty_variant_container.getId(): current_nozzle_name = extruder.variant.getMetaDataEntry("name") - material_diameter = extruder.getComptabileMaterialDiameter() + material_diameter = extruder.getCompatibleMaterialDiameter() candidate_materials = self._material_manager.getAvailableMaterials( self._global_container_stack.definition, current_nozzle_name, diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index e56e4c0f13..e994e1a817 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -926,7 +926,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): build_plate_id = global_stack.variant.getId() # get material diameter of this extruder - machine_material_diameter = extruder_stack.comptabileMaterialDiameter + machine_material_diameter = extruder_stack.getCompatibleMaterialDiameter() material_node = material_manager.getMaterialNode(global_stack.definition.getId(), extruder_stack.variant.getName(), build_plate_id, diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index be2b1d337a..5109aa05cb 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -410,7 +410,7 @@ Cura.MachineAction } function setValueFunction(value) { - Cura.MachineManager.activeStack.compatibleMaterialDiameter = value; + Cura.MachineManager.activeStack.compatibleMaterialDiameter = value } property bool isExtruderSetting: true } @@ -634,19 +634,19 @@ Cura.MachineAction // are available. if (_setValueFunction !== undefined) { - _setValueFunction(text); + _setValueFunction(text) } else { - propertyProvider.setPropertyValue("value", text); + propertyProvider.setPropertyValue("value", text) } if(_forceUpdateOnChange) { - manager.forceUpdate(); + manager.forceUpdate() } if(_afterOnEditingFinished) { - _afterOnEditingFinished(); + _afterOnEditingFinished() } } } From fb9d85557eb270b9809e18367295a25c27eea943 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 23 Oct 2018 13:57:42 +0200 Subject: [PATCH 5/5] Missed one of the getCompatibleMaterialDiameter typo's in the previous commit. part of [CURA-5834] --- cura/Machines/MaterialManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index f91259723d..1a204c020b 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -490,7 +490,7 @@ class MaterialManager(QObject): if extruder_stack_or_definition and parseBool(global_stack.getMetaDataEntry("has_materials", False)): if is_extruder_stack: - material_diameter = extruder_stack_or_definition.getComptabileMaterialDiameter() + material_diameter = extruder_stack_or_definition.getCompatibleMaterialDiameter() else: material_diameter = extruder_stack_or_definition.getProperty("material_diameter", "value")