|
@@ -1,7 +1,7 @@
|
|
|
# Copyright (c) 2018 Ultimaker B.V.
|
|
|
# Cura is released under the terms of the LGPLv3 or higher.
|
|
|
import io
|
|
|
-from typing import Optional, Dict, Union, List
|
|
|
+from typing import Optional, Dict, Union, List, cast
|
|
|
|
|
|
from UM.FileHandler.FileHandler import FileHandler
|
|
|
from UM.FileHandler.FileWriter import FileWriter
|
|
@@ -26,7 +26,7 @@ class MeshFormatHandler:
|
|
|
def __init__(self, file_handler: Optional[FileHandler], firmware_version: str) -> None:
|
|
|
self._file_handler = file_handler or CuraApplication.getInstance().getMeshFileHandler()
|
|
|
self._preferred_format = self._getPreferredFormat(firmware_version)
|
|
|
- self._writer = self._getWriter(self._preferred_format["mime_type"]) if self._preferred_format else None
|
|
|
+ self._writer = self._getWriter(self.mime_type) if self._preferred_format else None
|
|
|
|
|
|
@property
|
|
|
def is_valid(self) -> bool:
|
|
@@ -47,32 +47,40 @@ class MeshFormatHandler:
|
|
|
|
|
|
@property
|
|
|
def mime_type(self) -> str:
|
|
|
- return self._preferred_format["mime_type"]
|
|
|
+ return cast(str, self._preferred_format["mime_type"])
|
|
|
|
|
|
## Gets the file mode (FileWriter.OutputMode.TextMode or FileWriter.OutputMode.BinaryMode)
|
|
|
@property
|
|
|
def file_mode(self) -> int:
|
|
|
- return self._preferred_format["mode"]
|
|
|
+ return cast(int, self._preferred_format["mode"])
|
|
|
|
|
|
## Gets the file extension
|
|
|
@property
|
|
|
def file_extension(self) -> str:
|
|
|
- return self._preferred_format["extension"]
|
|
|
+ return cast(str, self._preferred_format["extension"])
|
|
|
|
|
|
## Creates the right kind of stream based on the preferred format.
|
|
|
def createStream(self) -> Union[io.BytesIO, io.StringIO]:
|
|
|
- return io.StringIO() if self.file_mode == FileWriter.OutputMode.TextMode else io.BytesIO()
|
|
|
+ if self.file_mode == FileWriter.OutputMode.TextMode:
|
|
|
+ return io.StringIO()
|
|
|
+ else:
|
|
|
+ return io.BytesIO()
|
|
|
|
|
|
## Writes the mesh and returns its value.
|
|
|
def getBytes(self, nodes: List[SceneNode]) -> bytes:
|
|
|
+ if self.writer is None:
|
|
|
+ raise ValueError("There is no writer for the mesh format handler.")
|
|
|
stream = self.createStream()
|
|
|
self.writer.write(stream, nodes)
|
|
|
- return stream.getvalue()
|
|
|
+ value = stream.getvalue()
|
|
|
+ if isinstance(value, str):
|
|
|
+ value = value.encode()
|
|
|
+ return value
|
|
|
|
|
|
## Chooses the preferred file format for the given file handler.
|
|
|
# \param firmware_version: The version of the firmware.
|
|
|
# \return A dict with the file format details.
|
|
|
- def _getPreferredFormat(self, firmware_version: str) -> Optional[Dict[str, Union[str, int, bool]]]:
|
|
|
+ def _getPreferredFormat(self, firmware_version: str) -> Dict[str, Union[str, int, bool]]:
|
|
|
# Formats supported by this application (file types that we can actually write).
|
|
|
application = CuraApplication.getInstance()
|
|
|
|
|
@@ -82,7 +90,7 @@ class MeshFormatHandler:
|
|
|
# Create a list from the supported file formats string.
|
|
|
if not global_stack:
|
|
|
Logger.log("e", "Missing global stack!")
|
|
|
- return
|
|
|
+ return {}
|
|
|
|
|
|
machine_file_formats = global_stack.getMetaDataEntry("file_formats").split(";")
|
|
|
machine_file_formats = [file_type.strip() for file_type in machine_file_formats]
|