ExportFileJob.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # Copyright (c) 2021 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. import io
  4. from typing import List, Optional, Union
  5. from UM.FileHandler.FileHandler import FileHandler
  6. from UM.FileHandler.FileWriter import FileWriter
  7. from UM.FileHandler.WriteFileJob import WriteFileJob
  8. from UM.Logger import Logger
  9. from UM.MimeTypeDatabase import MimeTypeDatabase
  10. from UM.OutputDevice import OutputDeviceError
  11. from UM.Scene.SceneNode import SceneNode
  12. class ExportFileJob(WriteFileJob):
  13. """Job that exports the build plate to the correct file format for the Digital Factory Library project."""
  14. def __init__(self, file_handler: FileHandler, nodes: List[SceneNode], job_name: str, extension: str) -> None:
  15. file_types = file_handler.getSupportedFileTypesWrite()
  16. if len(file_types) == 0:
  17. Logger.log("e", "There are no file types available to write with!")
  18. raise OutputDeviceError.WriteRequestFailedError("There are no file types available to write with!")
  19. mode = None
  20. file_writer = None
  21. for file_type in file_types:
  22. if file_type["extension"] == extension:
  23. file_writer = file_handler.getWriter(file_type["id"])
  24. mode = file_type.get("mode")
  25. super().__init__(file_writer, self.createStream(mode = mode), nodes, mode)
  26. # Determine the filename.
  27. self.setFileName("{}.{}".format(job_name, extension))
  28. def getOutput(self) -> bytes:
  29. """Get the job result as bytes as that is what we need to upload to the Digital Factory Library."""
  30. output = self.getStream().getvalue()
  31. if isinstance(output, str):
  32. output = output.encode("utf-8")
  33. return output
  34. def getMimeType(self) -> str:
  35. """Get the mime type of the selected export file type."""
  36. return MimeTypeDatabase.getMimeTypeForFile(self.getFileName()).name
  37. @staticmethod
  38. def createStream(mode) -> Union[io.BytesIO, io.StringIO]:
  39. """Creates the right kind of stream based on the preferred format."""
  40. if mode == FileWriter.OutputMode.TextMode:
  41. return io.StringIO()
  42. else:
  43. return io.BytesIO()