ThreeMFWorkspaceWriter.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from UM.Workspace.WorkspaceWriter import WorkspaceWriter
  2. from UM.Application import Application
  3. from UM.Preferences import Preferences
  4. import zipfile
  5. from io import StringIO
  6. class ThreeMFWorkspaceWriter(WorkspaceWriter):
  7. def __init__(self):
  8. super().__init__()
  9. def write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode):
  10. mesh_writer = Application.getInstance().getMeshFileHandler().getWriter("3MFWriter")
  11. if not mesh_writer: # We need to have the 3mf mesh writer, otherwise we can't save the entire workspace
  12. return False
  13. # Indicate that the 3mf mesh writer should not close the archive just yet (we still need to add stuff to it).
  14. mesh_writer.setStoreArchive(True)
  15. mesh_writer.write(stream, nodes, mode)
  16. archive = mesh_writer.getArchive()
  17. # Add global container stack data to the archive.
  18. global_container_stack = Application.getInstance().getGlobalContainerStack()
  19. global_stack_file = zipfile.ZipInfo("Cura/%s.stack.cfg" % global_container_stack.getId())
  20. global_stack_file.compress_type = zipfile.ZIP_DEFLATED
  21. archive.writestr(global_stack_file, global_container_stack.serialize())
  22. # Write user changes to the archive.
  23. global_user_instance_container = global_container_stack.getTop()
  24. global_user_instance_file = zipfile.ZipInfo("Cura/%s.inst.cfg" % global_user_instance_container.getId())
  25. global_user_instance_container.compress_type = zipfile.ZIP_DEFLATED
  26. archive.writestr(global_user_instance_file, global_user_instance_container.serialize())
  27. # Write quality changes to the archive.
  28. global_quality_changes = global_container_stack.findContainer({"type": "quality_changes"})
  29. global_quality_changes_file = zipfile.ZipInfo("Cura/%s.inst.cfg" % global_quality_changes.getId())
  30. global_quality_changes.compress_type = zipfile.ZIP_DEFLATED
  31. archive.writestr(global_quality_changes_file, global_quality_changes.serialize())
  32. # Write preferences to archive
  33. preferences_file = zipfile.ZipInfo("Cura/preferences.cfg")
  34. preferences_string = StringIO()
  35. Preferences.getInstance().writeToFile(preferences_string)
  36. archive.writestr(preferences_file, preferences_string.getvalue())
  37. # Close the archive & reset states.
  38. archive.close()
  39. mesh_writer.setStoreArchive(False)
  40. return True