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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user