FP_POC / packages /shared /src /generated /raummodell.ts
github-actions[bot]
Space-Deploy aus GitHub main
9de795a
Raw History Blame Contribute Delete
3.82 kB
/* AUTOGENERIERT aus packages/shared/schemas – nicht von Hand ändern (pnpm codegen). */
export type Uuid = string;
export type Semver = string;
export type RoomType = "bad" | "kueche" | "wohnen" | "schlafen" | "essen" | "flur" | "sonstig";
/**
* [x, z] in Metern (Grundriss-Ebene).
*
* @minItems 2
* @maxItems 2
*/
export type Vec2 = [number, number];
export type AnschlussTyp =
| "wasser"
| "abwasser"
| "elektro"
| "starkstrom"
| "lueftung"
| "heizung";
/**
* Vertrag 1: Output Raum-Engine → Input Solver/Viewer. y-up, rechtshändig, Meter; Grundriss in der x/z-Ebene. Quelle: Brain → Domaenenmodell-Schema-Spezifikation.
*/
export interface Raummodell {
id: Uuid;
schemaVersion: Semver;
name: string;
roomType: RoomType;
source: "scan" | "video" | "plan-import" | "sample" | "manuell";
units: "m";
shell: {
/**
* Wand-SEGMENTE (kein Polygon): nur Segmente tragen kind massiv/offen/virtuell je Kante (Grossraum). Validator: Hülle geschlossen.
*
* @minItems 3
*/
walls: [
{
id: Uuid;
start: Vec2;
end: Vec2;
height: number;
thickness: number;
kind: "massiv" | "offen" | "virtuell";
openings?: Uuid[];
},
{
id: Uuid;
start: Vec2;
end: Vec2;
height: number;
thickness: number;
kind: "massiv" | "offen" | "virtuell";
openings?: Uuid[];
},
{
id: Uuid;
start: Vec2;
end: Vec2;
height: number;
thickness: number;
kind: "massiv" | "offen" | "virtuell";
openings?: Uuid[];
},
...{
id: Uuid;
start: Vec2;
end: Vec2;
height: number;
thickness: number;
kind: "massiv" | "offen" | "virtuell";
openings?: Uuid[];
}[],
];
/**
* Wird aus den Wand-Segmenten ABGELEITET/validiert, nicht doppelt gepflegt.
*/
floor: {
/**
* @minItems 3
*/
polygon: [Vec2, Vec2, Vec2, ...Vec2[]];
area?: number;
};
ceiling: {
height: number;
};
};
openings: {
id: Uuid;
type: "door" | "window";
hostWall: Uuid;
/**
* Abstand des Öffnungs-Anfangs vom Wand-Start entlang der Wand (m).
*/
offset: number;
width: number;
height: number;
/**
* Brüstungshöhe; Türen: 0.
*/
sill: number;
}[];
/**
* Funktionsbereiche innerhalb einer Hülle (Grossraum). Regeln gelten pro Zone.
*/
zones: {
id: Uuid;
name: string;
roomType: RoomType;
/**
* @minItems 3
*/
polygon: [Vec2, Vec2, Vec2, ...Vec2[]];
}[];
/**
* Anschlüsse – die Brücke zu den harten connection-Regeln. Standort genügt.
*/
fixpoints: {
id: Uuid;
type: AnschlussTyp;
position: Vec2;
wall?: Uuid;
heightFromFloor?: number;
mount: "wand" | "boden";
origin: "bestand" | "vorwand" | "manuell";
zone?: Uuid | null;
}[];
/**
* Erkannte Bestandsobjekte (für Umbau ggf. entfernen/behalten).
*/
objects: {
id: Uuid;
label: string;
geometry: {
repr: "bbox" | "mesh-simpl" | "voxel";
bbox: Masse;
meshRef?: string;
};
pose: Pose;
movable: boolean;
confidence: number;
needsReview?: boolean;
}[];
meta: {
captureMethod: "ar" | "sfm" | "plan" | "sample" | "manuell";
coverageScore?: number;
estimatedError_cm: number;
/**
* Nutzer hat Masse bestätigt → Unsicherheits-Marge der Konfidenz-Ampel wird 0.
*/
geometryConfirmed: boolean;
geometryRef?: string;
};
}
export interface Masse {
w: number;
d: number;
h: number;
}
export interface Pose {
pos: Vec2;
/**
* Rotation um y in Grad (POC: 2D-Top-Down).
*/
yawDeg: number;
}