Schichttrennlinie als Wand-Referenzlinie (mehrschichtige Wände)

Bei mehrschichtigen Wänden lässt sich neben Aussen/Mitte/Innen jetzt auch
eine SCHICHTTRENNLINIE (Fuge zwischen zwei Schichten) als Referenzlinie
wählen — z. B. die Achse auf die Innenkante der Aussenschale legen.
- Neues Feld Wall.referenceOffset (freier Achsversatz entlang +n); wenn
  gesetzt, übersteuert es referenceLine. wallReferenceOffset bleibt die
  EINE Quelle → Grundriss, Schnitt und 3D erben das Verhalten automatisch.
- Object-Info-Panel: das Referenzlinien-Dropdown listet zusätzlich je
  interne Fuge einen Eintrag (Kürzel der angrenzenden Schichten); Auswahl
  setzt den Versatz, Aussen/Mitte/Innen löscht ihn wieder.
- selectionInfo berechnet die Fugen-Versätze (kumulierte Schichtdicken).
+3 Tests. tsc + vitest grün.
This commit is contained in:
2026-07-09 01:21:28 +02:00
parent 9a65900377
commit 938d6421f9
9 changed files with 104 additions and 8 deletions
+37
View File
@@ -14,6 +14,7 @@ import {
ceilingThickness,
flattenCategories,
getCeilingType,
getComponent,
getWallType,
wallTypeLabel,
wallTypeThickness,
@@ -69,6 +70,16 @@ export interface FloorChoice {
name: string;
}
/**
* Eine wählbare Schichttrennlinie (Fuge zwischen zwei Schichten) als
* Referenzlinie einer mehrschichtigen Wand. `offset` ist der fertige
* Achsversatz entlang +n (Meter), `label` benennt die angrenzenden Schichten.
*/
export interface LayerBoundaryChoice {
offset: number;
label: string;
}
/**
* Wand-spezifische Attribute für das Object-Info-Panel (nur bei Auswahl einer
* einzelnen Wand gesetzt). Effektiv aufgelöste, anzeigefertige Werte plus die
@@ -76,6 +87,14 @@ export interface FloorChoice {
*/
export interface WallInfo {
referenceLine: WallReferenceLine;
/** Freier Achsversatz (Schichttrennlinie), falls gesetzt — sonst undefined. */
referenceOffset?: number;
/**
* Interne Schichttrennlinien der Wand als wählbare Referenz (leer bei
* einschichtigen Wänden). Aussen-/Innenfläche stecken bereits in
* left/right — hier stehen nur die FUGEN dazwischen.
*/
layerBoundaries: LayerBoundaryChoice[];
/** Terminierungs-Regel am Deckenanschluss (Default "both" = heutiges Verhalten). */
sliceTermination: SliceTermination;
wallTypeId: string;
@@ -435,8 +454,26 @@ function wallSelection(project: Project, wall: Wall): Selection {
.filter((o) => o.hostWallId === wall.id)
.reduce((sum, o) => sum + o.width * o.height * thickness, 0);
const netVolume = Math.max(0, grossVolume - openingVolume);
// Interne Schichttrennlinien als wählbare Referenz: von aussen (Schicht 0)
// nach innen aufsummiert; der Achsversatz +n = halbe Dicke Fugenlage.
const half = thickness / 2;
const layerBoundaries: WallInfo["layerBoundaries"] = [];
let cum = 0;
const abbrevOf = (componentId: string): string => {
const c = getComponent(project, componentId);
return c ? c.abbrev ?? c.name : "?";
};
for (let i = 0; i < wt.layers.length - 1; i++) {
cum += wt.layers[i].thickness;
layerBoundaries.push({
offset: half - cum,
label: `${abbrevOf(wt.layers[i].componentId)}|${abbrevOf(wt.layers[i + 1].componentId)}`,
});
}
const wallInfo: WallInfo = {
referenceLine: wall.referenceLine ?? "center",
referenceOffset: wall.referenceOffset,
layerBoundaries,
sliceTermination: wall.sliceTermination ?? "both",
wallTypeId: wall.wallTypeId,
thickness,