#!/usr/bin/env python3
"""Analyze Window_20x60mm_-_liso.stl - basic properties + slices."""
import struct, numpy as np

path = "/app/projects/esp32-box/original/Window_20x60mm_-_liso.stl"

with open(path, "rb") as f:
    f.read(80)
    n = struct.unpack("<I", f.read(4))[0]
    pts = []
    for i in range(n):
        f.read(12)
        for j in range(3):
            x, y, z = struct.unpack("<fff", f.read(12))
            pts.append([x, y, z])
        f.read(2)

pts = np.array(pts)
cx, cy = pts[:,0].mean(), pts[:,1].mean()
pts[:,0] -= cx
pts[:,1] -= cy

print("Triangulos:", n)
print("X: %.2f .. %.2f (%.2f)" % (pts[:,0].min(), pts[:,0].max(), pts[:,0].max()-pts[:,0].min()))
print("Y: %.2f .. %.2f (%.2f)" % (pts[:,1].min(), pts[:,1].max(), pts[:,1].max()-pts[:,1].min()))
print("Z: %.2f .. %.2f (%.2f)" % (pts[:,2].min(), pts[:,2].max(), pts[:,2].max()-pts[:,2].min()))

print()
print("=== FATIAS Z ===")
for z in np.arange(0, 5.0, 0.2):
    z = round(z, 1)
    mask = np.abs(pts[:,2] - z) < 0.1
    if mask.any():
        xs = pts[mask, 0]
        ys = pts[mask, 1]
        xs_u = np.unique(np.round(xs, 1))
        gaps = [(xs_u[i], xs_u[i+1]) for i in range(len(xs_u)-1) if xs_u[i+1]-xs_u[i] > 2]
        gp = " ".join("%.0f-%.0f" % g for g in gaps) if gaps else "-"
        y_u = np.unique(np.round(ys, 1))
        ygaps = [(y_u[i], y_u[i+1]) for i in range(len(y_u)-1) if y_u[i+1]-y_u[i] > 2]
        ygp = " ".join("%.0f-%.0f" % yg for yg in ygaps) if ygaps else "-"
        print("Z=%.1f: X=[%.1f,%.1f] Y=[%.1f,%.1f] pts=%d Xgaps=%s Ygaps=%s" % (
            z, xs.min(), xs.max(), ys.min(), ys.max(), mask.sum(), gp, ygp))
