# Studio model — geometry audit (Model registry constants) Date: 2026-07-03 Source geometry: `assets/Studio Files/structural-full-studio-highest-resolution.obj` (722 MB Rhino export, 2026-05-05, units = inches, y-up). 110 `usemtl` blocks, 6,675,021 vertices. Every constant in `zomestruct.models.STUDIO` is derived below, with the reproduction command. Where the office model recorded an analogous constant by a different method, the difference is noted explicitly. ## Reproduction ```bash python tools/extract_panels_from_obj.py \ --obj "assets/Studio Files/structural-full-studio-highest-resolution.obj" \ --out reports/studio/panels_npz python tools/fit_panels.py --npz-dir reports/studio/panels_npz python tools/build_panel_inventory.py --model studio ``` ## Block classification (110 usemtl blocks) | Group | Blocks | Count | Identification | |---|---|---|---| | Foundation curb strips | 2–12 | 11 | material tag `diffuse_42_35_46_255`, thin strips at grade (y ≈ 0–10 in) | | Structural rhombic panels | 1, 13–94, 100–110 | 94 | PCA rhombic-prism fit, residual ≤ 29 mm, all `is_rhombic` | | Door jambs | 95, 96 | 2 | vertical posts 9.1 × 78.0 × 24.6 in flanking the door bay at z ≈ −111 in | | Door header trim | 97 | 1 | 61.6 × 5.0 × 8.7 in strip at y = 78–83 in over the door | | Door leaves | 98, 99 | 2 | 57.7 × 83.0 × 3.0 in slabs, 1,003 mesh points each (CAD boxes) | Blocks 95–99 are excluded from the structural panel inventory (`Model.non_structural_blocks`): the leaves are operable doors, and the jambs/header are framing whose load path is not panel plate action. This mirrors the office convention of excluding door hardware from panel checks while it remains visible in the assembly OBJ. Door-adjacent **partial panels are kept**: blocks 100–103 (four half-panels, 703 mm edge) and 104 (808.9 mm panel over the header) are structural and are carried in the inventory as their own types (types 7 and 8). ## Constants | Constant | Value | Derivation | |---|---|---| | `footprint_diameter_m` | **6.691** | Mean of the OBJ bounding-box footprint axes: x = 263.03 in = 6.681 m, z = 263.80 in = 6.701 m. Same averaging convention as office (which used Rhino-measured 5.755/5.505 m). | | `height_m` | **3.970** | OBJ apex y_max = 156.3 in above the foundation plane (y = 0). Structural panels only; no apex cap piece exists in the studio OBJ. | | `total_panels` | **94** | Exact count of structural rhombic blocks (see classification above). Office used 73 (70 rhombic + 3 door-frame) with DXF-count rescaling; the studio inventory carries exact per-type counts and needs no rescaling. | | `base_ring_panels` | **11** | Blocks 13–23: the ring of 862.5 mm panels bearing on the 11 foundation curbs. 11-fold rotational symmetry (office is 9-fold). | | `base_panel_slope_from_vertical_deg` | **40.3** | Mean tilt of the 11 base-ring panel planes from vertical, via per-panel PCA plane fit: 40.26° ± 0.04°. | | `panel_thickness_mm` | **76.2** | Same 3-inch foam stock as office. Cross-checked against the PCA prism fit: the flattest studio panels fit at 77.7 mm minimum vs 78.2 mm minimum on the office set whose thickness is known to be 76.2 mm (the fit inflates thickness slightly on warped panels; the two distributions match). | ## Panel inventory (from `reports/studio/panel-inventory.json`) | # | Count | Edge (mm) | Acute (°) | Area (m²) | Role | |---|---|---|---|---|---| | 1 | 11 | 1011.2 | 80.37 | 1.008 | **worst panel** (largest, near-square), upper ring | | 2 | 12 | 1004.2 | 77.40 | 0.984 | upper-mid ring | | 3 | 20 | 1017.1 | 63.75 | 0.928 | two mid rings sharing one shape | | 4 | 11 | 1019.2 | 57.15 | 0.873 | mid ring | | 5 | 12 | 1002.7 | 52.49 | 0.798 | lower-mid ring | | 6 | 11 | 862.5 | 52.77 | 0.592 | base ring (bears on curbs) | | 7 | 4 | 703.0 | 81.15 | 0.488 | door-bay half-panels | | 8 | 1 | 808.9 | 45.77 | 0.469 | panel over door header | | 9 | 12 | 1004.6 | 26.50 | 0.450 | apex ring (narrow diamonds) | Total panel area 75.0 m² → foam volume 5.71 m³ → dead weight 13.44 kN at ρ = 240 kg/m³ (values as reported by `run_check`). ## Discrepancy noted on the office model (not changed here) Measuring the office base-ring panel planes by the same PCA method gives a tilt of **42.8° from vertical**, not the 15° recorded in the office run's `BASE_PANEL_SLOPE_DEG`. The angle enters only the base-ring membrane compression check as a 1/cos(θ) amplification (1.36× at 42.8° vs 1.04× at 15°). Office base-compression D/C was 0.05–0.15, so the corrected value still passes with wide margin and no office verdict changes; the studio run uses its measured 40.3° from the start. ## DXF nest-sheet cross-check (why the studio inventory is OBJ-sourced) Parsing `assets/Studio Files/Studio Pieces/*-L1-*.dxf` (the office-style route) yields panel edges ~987 mm for the type-1 panel vs 1011 mm as-assembled in the OBJ — the available studio DXFs are a different revision than the assembly export, and 8 of 21 piece folders parse to zero closed profiles under the office layer conventions. Since plate-bending demand scales with edge², using the DXFs would have understated demand ~5%. The inventory is therefore fitted from the assembly OBJ — the same geometry the FE pipelines mesh. (For the office model the DXF and OBJ routes agree at 1012 mm, so the office results are unaffected.)