diff options
Diffstat (limited to 'plugins/DigitalLibrary/src/ExportFileJob.py')
-rw-r--r-- | plugins/DigitalLibrary/src/ExportFileJob.py | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/plugins/DigitalLibrary/src/ExportFileJob.py b/plugins/DigitalLibrary/src/ExportFileJob.py new file mode 100644 index 0000000000..3e4c6dfea2 --- /dev/null +++ b/plugins/DigitalLibrary/src/ExportFileJob.py @@ -0,0 +1,55 @@ +# Copyright (c) 2021 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import io +from typing import List, Optional, Union + +from UM.FileHandler.FileHandler import FileHandler +from UM.FileHandler.FileWriter import FileWriter +from UM.FileHandler.WriteFileJob import WriteFileJob +from UM.Logger import Logger +from UM.MimeTypeDatabase import MimeTypeDatabase +from UM.OutputDevice import OutputDeviceError +from UM.Scene.SceneNode import SceneNode + + +class ExportFileJob(WriteFileJob): + """Job that exports the build plate to the correct file format for the Digital Factory Library project.""" + + def __init__(self, file_handler: FileHandler, nodes: List[SceneNode], job_name: str, extension: str) -> None: + file_types = file_handler.getSupportedFileTypesWrite() + if len(file_types) == 0: + Logger.log("e", "There are no file types available to write with!") + raise OutputDeviceError.WriteRequestFailedError("There are no file types available to write with!") + + mode = None + file_writer = None + for file_type in file_types: + if file_type["extension"] == extension: + file_writer = file_handler.getWriter(file_type["id"]) + mode = file_type.get("mode") + super().__init__(file_writer, self.createStream(mode = mode), nodes, mode) + + # Determine the filename. + self.setFileName("{}.{}".format(job_name, extension)) + + def getOutput(self) -> bytes: + """Get the job result as bytes as that is what we need to upload to the Digital Factory Library.""" + + output = self.getStream().getvalue() + if isinstance(output, str): + output = output.encode("utf-8") + return output + + def getMimeType(self) -> str: + """Get the mime type of the selected export file type.""" + return MimeTypeDatabase.getMimeTypeForFile(self.getFileName()).name + + @staticmethod + def createStream(mode) -> Union[io.BytesIO, io.StringIO]: + """Creates the right kind of stream based on the preferred format.""" + + if mode == FileWriter.OutputMode.TextMode: + return io.StringIO() + else: + return io.BytesIO() |