From 6cdd2e7e0111bb70e4e5ad205401fa11c8d77e90 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 2 Jul 2018 18:54:34 +0200 Subject: [PATCH] Create new material from preferred material instead of generic_pla --- plugins/BlackBeltPlugin/BlackBeltPlugin.py | 7 ++- ...erPatches.py => PatchedMaterialManager.py} | 53 +++++++++++++++---- 2 files changed, 49 insertions(+), 11 deletions(-) rename plugins/BlackBeltPlugin/{MaterialManagerPatches.py => PatchedMaterialManager.py} (59%) diff --git a/plugins/BlackBeltPlugin/BlackBeltPlugin.py b/plugins/BlackBeltPlugin/BlackBeltPlugin.py index d7384f52e4..0f0f09dfb1 100644 --- a/plugins/BlackBeltPlugin/BlackBeltPlugin.py +++ b/plugins/BlackBeltPlugin/BlackBeltPlugin.py @@ -17,8 +17,8 @@ from . import BlackBeltDecorator from . import BlackBeltSingleton from . import BuildVolumePatches from . import CuraEngineBackendPatches -from . import MaterialManagerPatches from . import PrintInformationPatches +from . import PatchedMaterialManager from PyQt5.QtQml import qmlRegisterSingletonType @@ -88,9 +88,12 @@ class BlackBeltPlugin(Extension): # Apply patches self._build_volume_patches = BuildVolumePatches.BuildVolumePatches(self._application.getBuildVolume()) self._cura_engine_backend_patches = CuraEngineBackendPatches.CuraEngineBackendPatches(self._application.getBackend()) - self._material_manager_patches = MaterialManagerPatches.MaterialManagerPatches(self._application.getMaterialManager()) self._print_information_patches = PrintInformationPatches.PrintInformationPatches(self._application.getPrintInformation()) + container_registry = ContainerRegistry.getInstance() + self._application._material_manager = PatchedMaterialManager.PatchedMaterialManager(container_registry, self._application) + self._application._material_manager.initialize() + self._application.getBackend().slicingStarted.connect(self._onSlicingStarted) self._fixVisibilityPreferences(forced = self._force_visibility_update) diff --git a/plugins/BlackBeltPlugin/MaterialManagerPatches.py b/plugins/BlackBeltPlugin/PatchedMaterialManager.py similarity index 59% rename from plugins/BlackBeltPlugin/MaterialManagerPatches.py rename to plugins/BlackBeltPlugin/PatchedMaterialManager.py index c30c25238b..d3d8efe1e1 100644 --- a/plugins/BlackBeltPlugin/MaterialManagerPatches.py +++ b/plugins/BlackBeltPlugin/PatchedMaterialManager.py @@ -1,15 +1,14 @@ +from cura.Machines.MaterialManager import MaterialManager from UM.Logger import Logger +import uuid + +from PyQt5.Qt import pyqtSlot from typing import Optional, TYPE_CHECKING if TYPE_CHECKING: from UM.Settings.DefinitionContainer import DefinitionContainer -class MaterialManagerPatches(): - def __init__(self, material_manager): - self._material_manager = material_manager - - self._material_manager.getAvailableMaterials = self.getAvailableMaterials - +class PatchedMaterialManager(MaterialManager): # # Return a dict with all root material IDs (k) and ContainerNodes (v) that's suitable for the given setup. # @@ -19,16 +18,16 @@ class MaterialManagerPatches(): diameter: float) -> dict: # round the diameter to get the approximate diameter rounded_diameter = str(round(diameter)) - if rounded_diameter not in self._material_manager._diameter_machine_variant_material_map: + if rounded_diameter not in self._diameter_machine_variant_material_map: Logger.log("i", "Cannot find materials with diameter [%s] (rounded to [%s])", diameter, rounded_diameter) return dict() machine_definition_id = machine_definition.getId() # If there are variant materials, get the variant material - machine_variant_material_map = self._material_manager._diameter_machine_variant_material_map[rounded_diameter] + machine_variant_material_map = self._diameter_machine_variant_material_map[rounded_diameter] machine_node = machine_variant_material_map.get(machine_definition_id) - default_machine_node = machine_variant_material_map.get(self._material_manager._default_machine_definition_id) + default_machine_node = machine_variant_material_map.get(self._default_machine_definition_id) variant_node = None if extruder_variant_name is not None and machine_node is not None: variant_node = machine_node.getChildNode(extruder_variant_name) @@ -67,3 +66,39 @@ class MaterialManagerPatches(): material_id_metadata_dict[material_id] = node return material_id_metadata_dict + + # + # Create a new material by cloning Generic PLA for the current material diameter and generate a new GUID. + # + # Copied verbatim from MaterialManager.createMaterial, with a minor patch to use the preferred material + # as the template (instead of generic_pla) + @pyqtSlot(result = str) + def createMaterial(self) -> str: + from UM.i18n import i18nCatalog + catalog = i18nCatalog("cura") + # Ensure all settings are saved. + self._application.saveSettings() + + machine_manager = self._application.getMachineManager() + extruder_stack = machine_manager.activeStack + ### START PATCH + machine_definition = self._application.getGlobalContainerStack().definition + preferred_material = machine_definition.getMetaDataEntry("preferred_material") + + approximate_diameter = str(extruder_stack.approximateMaterialDiameter) + root_material_id = preferred_material if preferred_material else "generic_pla" + ### END PATCH + root_material_id = self.getRootMaterialIDForDiameter(root_material_id, approximate_diameter) + material_group = self.getMaterialGroup(root_material_id) + + # Create a new ID & container to hold the data. + new_id = self._container_registry.uniqueName("custom_material") + new_metadata = {"name": catalog.i18nc("@label", "Custom Material"), + "brand": catalog.i18nc("@label", "Custom"), + "GUID": str(uuid.uuid4()), + } + + self.duplicateMaterial(material_group.root_material_node, + new_base_id = new_id, + new_metadata = new_metadata) + return new_id