From 83fcc60bee9a3894a11f2e4ca840968352fd2e95 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 11 Jun 2018 07:52:32 +0200 Subject: [PATCH 1/2] Show message for unknown machines in project files CURA-5337 Do not crash on loading project files with unkown machine types. Show a message instead. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 90241c6e72..ecccfc77ac 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -13,6 +13,7 @@ from UM.Workspace.WorkspaceReader import WorkspaceReader from UM.Application import Application from UM.Logger import Logger +from UM.Message import Message from UM.i18n import i18nCatalog from UM.Signal import postponeSignals, CompressTechnique from UM.Settings.ContainerFormatError import ContainerFormatError @@ -470,6 +471,20 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "File %s is not a valid workspace.", file_name) return WorkspaceReader.PreReadResult.failed + # Check if the machine definition exists. If not, indicate failure because we do not import definition files. + def_results = self._container_registry.findDefinitionContainersMetadata(id = machine_definition_id) + if not def_results: + message = Message(i18n_catalog.i18nc("@info:status Don't translate the XML tags or !", + "Project file {0} contains an unknown machine type" + " {1}. Cannot import the machine." + " Models will be imported instead.", file_name, machine_definition_id), + title = i18n_catalog.i18nc("@info:title", "Open Project File")) + message.show() + + Logger.log("i", "Could unknown machine definition %s in project file %s, cannot import it.", + self._machine_info.definition_id, file_name) + return WorkspaceReader.PreReadResult.failed + # In case we use preRead() to check if a file is a valid project file, we don't want to show a dialog. if not show_dialog: return WorkspaceReader.PreReadResult.accepted From 19b02cd6e841b122e18c557bb12b47bda6303d7c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 11 Jun 2018 08:13:14 +0200 Subject: [PATCH 2/2] Use MachineManager to update material container CURA-5327 The old update function in ExtruderManager is not functioning correctly. --- cura/Settings/ExtruderManager.py | 87 +------------------------------- 1 file changed, 1 insertion(+), 86 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 0f8cb9ae23..8c436ed24f 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -461,10 +461,6 @@ class ExtruderManager(QObject): if global_stack.definitionChanges.hasProperty(key, "value"): global_stack.definitionChanges.removeInstance(key, postpone_emit = True) - # Update material diameter for extruders - for position in extruder_positions_to_update: - self.updateMaterialForDiameter(position, global_stack = global_stack) - ## Get all extruder values for a certain setting. # # This is exposed to SettingFunction so it can be used in value functions. @@ -563,88 +559,7 @@ class ExtruderManager(QObject): if not global_stack: return - if not global_stack.getMetaDataEntry("has_materials", False): - return - - extruder_stack = global_stack.extruders[str(extruder_position)] - - material_diameter = extruder_stack.material.getProperty("material_diameter", "value") - if not material_diameter: - # in case of "empty" material - material_diameter = 0 - - material_approximate_diameter = str(round(material_diameter)) - material_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") - setting_provider = extruder_stack - if not material_diameter: - if extruder_stack.definition.hasProperty("material_diameter", "value"): - material_diameter = extruder_stack.definition.getProperty("material_diameter", "value") - else: - material_diameter = global_stack.definition.getProperty("material_diameter", "value") - setting_provider = global_stack - - if isinstance(material_diameter, SettingFunction): - material_diameter = material_diameter(setting_provider) - - machine_approximate_diameter = str(round(material_diameter)) - - if material_approximate_diameter != machine_approximate_diameter: - Logger.log("i", "The the currently active material(s) do not match the diameter set for the printer. Finding alternatives.") - - if global_stack.getMetaDataEntry("has_machine_materials", False): - materials_definition = global_stack.definition.getId() - has_material_variants = global_stack.getMetaDataEntry("has_variants", False) - else: - materials_definition = "fdmprinter" - has_material_variants = False - - old_material = extruder_stack.material - search_criteria = { - "type": "material", - "approximate_diameter": machine_approximate_diameter, - "material": old_material.getMetaDataEntry("material", "value"), - "brand": old_material.getMetaDataEntry("brand", "value"), - "supplier": old_material.getMetaDataEntry("supplier", "value"), - "color_name": old_material.getMetaDataEntry("color_name", "value"), - "definition": materials_definition - } - if has_material_variants: - search_criteria["variant"] = extruder_stack.variant.getId() - - container_registry = Application.getInstance().getContainerRegistry() - empty_material = container_registry.findInstanceContainers(id = "empty_material")[0] - - if old_material == empty_material: - search_criteria.pop("material", None) - search_criteria.pop("supplier", None) - search_criteria.pop("brand", None) - search_criteria.pop("definition", None) - search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material") - - materials = container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Same material with new diameter is not found, search for generic version of the same material type - search_criteria.pop("supplier", None) - search_criteria.pop("brand", None) - search_criteria["color_name"] = "Generic" - materials = container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Generic material with new diameter is not found, search for preferred material - search_criteria.pop("color_name", None) - search_criteria.pop("material", None) - search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material") - materials = container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Preferred material with new diameter is not found, search for any material - search_criteria.pop("id", None) - materials = container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Just use empty material as a final fallback - materials = [empty_material] - - Logger.log("i", "Selecting new material: %s", materials[0].getId()) - - extruder_stack.material = materials[0] + Application.getInstance().getMachineManager()._updateMaterialWithVariant(extruder_position) ## Get the value for a setting from a specific extruder. #