#!/usr/bin/env bash # SUM Parts - prove the exported files are actually readable # # "I made you some files" is worth nothing if they do not open. This reads every # one back with a parser and reports what a viewer will find inside. set -uo pipefail ROOT="${1:-/mnt/d/AI_Test/sum-part}" source "$HOME/miniconda3/etc/profile.d/conda.sh" conda activate sumparts python - "$ROOT" <<'PY' import sys from pathlib import Path import numpy as np from plyfile import PlyData root = Path(sys.argv[1]) print(f"root: {root}\n") print(f" {'folder':<10} {'file':<6} {'points':>10} {'properties':<34} {'extent (m)'}") ok = True for d in sorted(p for p in root.iterdir() if p.is_dir()): for f in sorted(d.glob("*.ply")): try: v = PlyData.read(str(f))["vertex"] props = ",".join(p.name for p in v.properties) xyz = np.stack([v["x"], v["y"], v["z"]], axis=1) ext = np.round(xyz.max(0) - xyz.min(0), 1) print(f" {d.name:<10} {'ply':<6} {len(v):>10,} {props:<34} {ext.tolist()}") except Exception as e: ok = False print(f" {d.name:<10} {'ply':<6} UNREADABLE: {type(e).__name__}: {e}") for f in sorted(d.glob("*.obj")): n = sum(1 for line in f.open(encoding="utf-8") if line.startswith("v ")) faces = sum(1 for line in f.open(encoding="utf-8") if line.startswith("f ")) note = "" if faces else " <- no faces; most viewers show nothing" print(f" {d.name:<10} {'obj':<6} {n:>10,} {'v x y z r g b':<34} {faces} faces{note}") print() print("ALL PLY READABLE" if ok else "SOME FILES FAILED TO PARSE") PY