diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index 8f04a90204..5bcaf12bfb 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -60,28 +60,38 @@ class MaterialNode(ContainerNode): container_registry = ContainerRegistry.getInstance() # Find all quality profiles that fit on this material. if not self.variant.machine.has_machine_quality: # Need to find the global qualities. - qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = "fdmprinter") + qualities = container_registry.findInstanceContainersMetadata(type = "quality", + definition = "fdmprinter") elif not self.variant.machine.has_materials: - qualities = container_registry.findInstanceContainersMetadata(type="quality", definition=self.variant.machine.quality_definition) + qualities = container_registry.findInstanceContainersMetadata(type = "quality", + definition = self.variant.machine.quality_definition) else: if self.variant.machine.has_variants: # Need to find the qualities that specify a material profile with the same material type. - qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, variant = self.variant.variant_name, material = self.container_id) # First try by exact material ID. + qualities = container_registry.findInstanceContainersMetadata(type = "quality", + definition = self.variant.machine.quality_definition, + variant = self.variant.variant_name, + material = self.base_file) # First try by exact material ID. + # CURA-7070 + # The quality profiles only reference a material with the material_root_id. They will never state something + # such as "generic_pla_ultimaker_s5_AA_0.4". So we search with the "base_file" which is the material_root_id. else: - qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, material = self.container_id) + qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, material = self.base_file) if not qualities: my_material_type = self.material_type if self.variant.machine.has_variants: - qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, variant = self.variant.variant_name) + qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", + definition = self.variant.machine.quality_definition, + variant = self.variant.variant_name) else: qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition) for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type): - qualities.extend((quality for quality in qualities_any_material if quality.get("material") == material_metadata["id"])) + qualities.extend((quality for quality in qualities_any_material if quality.get("material") == material_metadata["base_file"])) if not qualities: # No quality profiles found. Go by GUID then. my_guid = self.guid for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", guid = my_guid): - qualities.extend((quality for quality in qualities_any_material if quality["material"] == material_metadata["id"])) + qualities.extend((quality for quality in qualities_any_material if quality["material"] == material_metadata["base_file"])) if not qualities: # There are still some machines that should use global profiles in the extruder, so do that now. diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0138d68a61..876f10ebf8 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -894,8 +894,8 @@ class MachineManager(QObject): @pyqtSlot(int, bool) def setExtruderEnabled(self, position: int, enabled: bool) -> None: - if self._global_container_stack is None: - Logger.log("w", "Could not find extruder on position %s", position) + if self._global_container_stack is None or str(position) not in self._global_container_stack.extruders: + Logger.log("w", "Could not find extruder on position %s.", position) return extruder = self._global_container_stack.extruderList[position] diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 52b204affc..bf1bf19e32 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -1106,6 +1106,12 @@ class XmlMaterialProfile(InstanceContainer): "break preparation speed": "material_break_preparation_speed", "break preparation temperature": "material_break_preparation_temperature", "break position": "material_break_retracted_position", + "flush purge speed": "material_flush_purge_speed", + "flush purge length": "material_flush_purge_length", + "end of filament purge speed": "material_end_of_filament_purge_speed", + "end of filament purge length": "material_end_of_filament_purge_length", + "maximum park duration": "material_maximum_park_duration", + "no load move factor": "material_no_load_move_factor", "break speed": "material_break_speed", "break temperature": "material_break_temperature" } # type: Dict[str, str] diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ed59e77625..13716be9ba 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2419,6 +2419,54 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "material_flush_purge_speed": + { + "label": "Flush Purge Speed", + "description": "Material Station internal value", + "type": "float", + "default_value": 0.5, + "enabled": false + }, + "material_flush_purge_length": + { + "label": "Flush Purge Length", + "description": "Material Station internal value", + "type": "float", + "default_value": 60, + "enabled": false + }, + "material_end_of_filament_purge_speed": + { + "label": "End Of Filament Purge Speed", + "description": "Material Station internal value", + "type": "float", + "default_value": 0.5, + "enabled": false + }, + "material_end_of_filament_purge_length": + { + "label": "End Of Filament Purge Length", + "description": "Material Station internal value", + "type": "float", + "default_value": 20, + "enabled": false + }, + "material_maximum_park_duration": + { + "label": "Maximum Park Duration", + "description": "Material Station internal value", + "type": "float", + "default_value": 300, + "enabled": false + }, + "material_no_load_move_factor": + { + "label": "No Load Move Factor", + "description": "Material Station internal value", + "type": "float", + "default_value": 0.940860215, + "enabled": false + }, "material_flow": { "label": "Flow", diff --git a/resources/texts/change_log.txt b/resources/texts/change_log.txt index dfb3ab0ab1..3aaa727141 100644 --- a/resources/texts/change_log.txt +++ b/resources/texts/change_log.txt @@ -1,3 +1,8 @@ +[4.4.1] +* Bug fixes + - Fixed problem where wrong material was selected by default. + - Fixed a problem where custom profiles were disappearing when loading a project without a nozzle profile. + [4.4.0] *Intent profiles. What’s the intent of your print? A rapid prototype? A visual prototype? An end-use part with specific holes sizes? Intent profiles accelerate the CAD-CAM workflow by preconfiguring all the right settings in Ultimaker Cura for each of these use cases. Simply select a profile that matches the intent of your design, slice, and you’re ready to print immediately, without the need to adjust the typical settings. For now, there are three Intent profiles: