diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 2e07b09593..19110bd11e 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -541,22 +541,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # # This gets called when connecting to a printer as well as when sending a # print. - # - # TODO: For now we send all material profiles that are fully loaded. See - # if that has any performance impact. If not, we can try sending ALL - # profiles. If it has, we may need to limit it to the profiles that are - # active in the current machine. def sendMaterialProfiles(self) -> None: - container_registry = ContainerRegistry.getInstance() - - base_files = set() - for material_metadata in container_registry.findContainersMetadata(type = "material"): - if container_registry.isLoaded(material_metadata["id"]): - if "base_file" not in material_metadata: - continue #If there's no base file then there was no file for it (such as empty_material). - base_files.add(material_metadata["base_file"]) - - job = SendMaterialJob(material_ids = base_files, device = self) + job = SendMaterialJob(device = self) job.run() def loadJsonFromReply(reply): diff --git a/plugins/UM3NetworkPrinting/SendMaterialJob.py b/plugins/UM3NetworkPrinting/SendMaterialJob.py index 72469f43e7..19b7598bef 100644 --- a/plugins/UM3NetworkPrinting/SendMaterialJob.py +++ b/plugins/UM3NetworkPrinting/SendMaterialJob.py @@ -1,11 +1,15 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Set, TYPE_CHECKING +import os #To walk over material files. +import os.path #To filter on material files. +from typing import TYPE_CHECKING -from UM.Settings.ContainerRegistry import ContainerRegistry #To get the material profiles we need to send. from UM.Job import Job #The interface we're implementing. from UM.Logger import Logger +from UM.Resources import Resources + +from cura.CuraApplication import CuraApplication if TYPE_CHECKING: from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice @@ -14,20 +18,19 @@ if TYPE_CHECKING: # # This way it won't freeze up the interface while sending those materials. class SendMaterialJob(Job): - def __init__(self, material_ids: Set[str], device: "NetworkedPrinterDevice"): + def __init__(self, device: "NetworkedPrinterDevice"): super().__init__() - self.material_ids = material_ids self.device = device def run(self): - container_registry = ContainerRegistry.getInstance() - for material_id in self.material_ids: - Logger.log("d", "Syncing material profile with printer: {material_id}".format(material_id = material_id)) - + for file_path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.MaterialInstanceContainer): + if not file_path.startswith(Resources.getDataStoragePath() + os.sep): + continue + _, file_name = os.path.split(file_path) + Logger.log("d", "Syncing material profile with printer: {file_name}".format(file_name = file_name)) parts = [] - material = container_registry.findContainers(id = material_id)[0] - serialized_material = material.serialize().encode("utf-8") - parts.append(self.device._createFormPart("name=\"file\"; filename=\"{file_name}.xml.fdm_material\"".format(file_name = material_id), serialized_material)) - parts.append(self.device._createFormPart("name=\"filename\"", (material_id + ".xml.fdm_material").encode("utf-8"), "text/plain")) + with open(file_path, "rb") as f: + parts.append(self.device._createFormPart("name=\"file\"; filename=\"{file_name}\"".format(file_name = file_name), f.read())) + parts.append(self.device._createFormPart("name=\"filename\"", file_name.encode("utf-8"), "text/plain")) self.device.postFormWithParts(target = "/materials", parts = parts) \ No newline at end of file