Model/backend/magic_plan/audit_script.py

60 lines
2.1 KiB
Python

from dataclasses import dataclass
from typing import Optional
from datatypes.magicplan.domain.models import Plan
@dataclass
class AuditRow:
floor_level: Optional[int] = None # set only on floor-separator rows
room_name: Optional[str] = None
room_width_m: Optional[float] = None
room_length_m: Optional[float] = None
room_area_m2: Optional[float] = None
window_label: Optional[str] = None
window_location: Optional[str] = None
window_width_m: Optional[float] = None
window_height_m: Optional[float] = None
window_area_m2: Optional[float] = None
window_opening_type: Optional[str] = None
door_location: Optional[str] = None
door_width_mm: Optional[float] = None
def _build_rows(plan: Plan) -> list[AuditRow]:
rows: list[AuditRow] = []
window_counter = 1
for floor in plan.floors:
rows.append(AuditRow(floor_level=floor.level))
for room in floor.rooms:
n_rows = max(1, len(room.windows), len(room.doors))
for i in range(n_rows):
window = room.windows[i] if i < len(room.windows) else None
door = room.doors[i] if i < len(room.doors) else None
row = AuditRow(
room_name=room.name if i == 0 else None,
room_width_m=room.width_m if i == 0 else None,
room_length_m=room.length_m if i == 0 else None,
room_area_m2=room.area_m2 if i == 0 else None,
)
if window is not None:
row.window_label = f"W{window_counter}"
row.window_location = room.name
row.window_width_m = window.width_m
row.window_height_m = window.height_m
row.window_area_m2 = window.area_m2
row.window_opening_type = window.opening_type
window_counter += 1
if door is not None:
row.door_location = room.name
row.door_width_mm = door.width_mm
rows.append(row)
return rows