Create new material from preferred material instead of generic_pla

This commit is contained in:
fieldOfView 2018-07-02 18:54:34 +02:00
parent 13aa59920a
commit 6cdd2e7e01
2 changed files with 49 additions and 11 deletions

View file

@ -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)

View file

@ -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