123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- from UM.Workspace.WorkspaceWriter import WorkspaceWriter
- from UM.Application import Application
- from UM.Preferences import Preferences
- from UM.Settings.ContainerRegistry import ContainerRegistry
- from cura.Settings.ExtruderManager import ExtruderManager
- import zipfile
- from io import StringIO
- import configparser
- class ThreeMFWorkspaceWriter(WorkspaceWriter):
- def __init__(self):
- super().__init__()
- def write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode):
- mesh_writer = Application.getInstance().getMeshFileHandler().getWriter("3MFWriter")
- if not mesh_writer:
- return False
-
- mesh_writer.setStoreArchive(True)
- mesh_writer.write(stream, nodes, mode)
- archive = mesh_writer.getArchive()
- if archive is None:
- archive = zipfile.ZipFile(stream, "w", compression = zipfile.ZIP_DEFLATED)
- global_container_stack = Application.getInstance().getGlobalContainerStack()
-
- self._writeContainerToArchive(global_container_stack, archive)
-
- for container in global_container_stack.getContainers():
- self._writeContainerToArchive(container, archive)
-
- for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()):
- self._writeContainerToArchive(extruder_stack, archive)
- for container in extruder_stack.getContainers():
- self._writeContainerToArchive(container, archive)
-
- preferences_file = zipfile.ZipInfo("Cura/preferences.cfg")
- preferences_string = StringIO()
- Preferences.getInstance().writeToFile(preferences_string)
- archive.writestr(preferences_file, preferences_string.getvalue())
-
- version_file = zipfile.ZipInfo("Cura/version.ini")
- version_config_parser = configparser.ConfigParser()
- version_config_parser.add_section("versions")
- version_config_parser.set("versions", "cura_version", Application.getStaticVersion())
- version_file_string = StringIO()
- version_config_parser.write(version_file_string)
- archive.writestr(version_file, version_file_string.getvalue())
-
- archive.close()
- mesh_writer.setStoreArchive(False)
- return True
-
-
-
- @staticmethod
- def _writeContainerToArchive(container, archive):
- if isinstance(container, type(ContainerRegistry.getInstance().getEmptyInstanceContainer())):
- return
- file_suffix = ContainerRegistry.getMimeTypeForContainer(type(container)).preferredSuffix
-
- if "base_file" in container.getMetaData():
- base_file = container.getMetaDataEntry("base_file")
- container = ContainerRegistry.getInstance().findContainers(id = base_file)[0]
- file_name = "Cura/%s.%s" % (container.getId(), file_suffix)
- if file_name in archive.namelist():
- return
- file_in_archive = zipfile.ZipInfo(file_name)
-
- file_in_archive.compress_type = zipfile.ZIP_DEFLATED
-
- ignore_keys = ["network_authentication_id", "network_authentication_key"]
- serialized_data = container.serialize(ignored_metadata_keys = ignore_keys)
- archive.writestr(file_in_archive, serialized_data)
|