#!/usr/bin/env python3 """Print a 3MF project's plates and filaments as JSON, without loading geometry. Usage: threemf_info.py [--images DIR] With --images, each plate's preview is written to DIR/.png and DIR/-small.png. """ import argparse import json import os import zipfile import threemf_stream def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("input") parser.add_argument("--images") args = parser.parse_args() try: project = threemf_stream.read_project(args.input) if args.images and project["plates"]: os.makedirs(args.images, exist_ok=True) with zipfile.ZipFile(args.input) as z: for plate in project["plates"]: for name, suffix in ((plate["thumbnail"], ""), (plate["thumbnail_small"], "-small")): if name: with open(os.path.join(args.images, f"{plate['index']}{suffix}.png"), "wb") as out: out.write(z.read(name)) except Exception as exc: print(json.dumps({"error": f"could not read 3MF: {str(exc)[:200]}"})) return 1 print(json.dumps({ "plates": [{"index": p["index"], "name": p["name"], "objectCount": len(p["objects"]), "thumbnail": bool(p["thumbnail"] or p["thumbnail_small"])} for p in project["plates"]], "filaments": project["filaments"], })) return 0 if __name__ == "__main__": raise SystemExit(main())