Files
Jules NényandClaude Fable 5.1 2e249f1027 LOT Q0 : socle du démonstrateur Quelque part en 2035
Scaffold Vite + TypeScript + Three.js (scène vide : sol + boîte, marqueur de build),
store et encodage de l'état dans l'URL (5 tests), lint de frontières entre modules,
pipeline d'extraction Rhino (graine du 26/09) et première géométrie v0,
deploy.sh statique (releases + lien symbolique + smoke), AGENTS.md, RUNBOOK, licences MIT + CC BY-SA 4.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-27 15:21:40 +02:00

20 lines
1.0 KiB
Python

import sys, rhino3dm, collections
for p in sys.argv[1:]:
m = rhino3dm.File3dm.Read(p)
if m is None: print("FAIL", p); continue
types = collections.Counter(); dims = collections.Counter()
bb=None
for o in m.Objects:
g=o.Geometry; t=type(g).__name__; types[t]+=1
try:
b=g.GetBoundingBox()
if b.IsValid:
dims['3D' if (b.Max.Z-b.Min.Z)>0.01 else 'flat']+=1
bb = b if bb is None else rhino3dm.BoundingBox(min(bb.Min.X,b.Min.X),min(bb.Min.Y,b.Min.Y),min(bb.Min.Z,b.Min.Z),max(bb.Max.X,b.Max.X),max(bb.Max.Y,b.Max.Y),max(bb.Max.Z,b.Max.Z))
except Exception: pass
print("==", p.split('/')[-1], "| unités:", m.Settings.ModelUnitSystem, "| objets:", len(m.Objects), "| calques:", len(m.Layers))
print(" types:", dict(types.most_common(8)))
print(" 3D vs plat:", dict(dims))
if bb: print(" emprise: %.0f x %.0f x %.0f" % (bb.Max.X-bb.Min.X, bb.Max.Y-bb.Min.Y, bb.Max.Z-bb.Min.Z))
print(" calques:", [l.Name for l in m.Layers][:25])