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:
@@ -827,6 +827,14 @@ export interface Wall {
|
||||
* Verhalten: Schichten symmetrisch −T/2 … +T/2 um die Achse).
|
||||
*/
|
||||
referenceLine?: WallReferenceLine;
|
||||
/**
|
||||
* Freier Referenz-Versatz der Achse entlang der +n-Normalen von der Wandmitte
|
||||
* (Meter). Ist er gesetzt, ÜBERSTEUERT er {@link referenceLine} — genutzt, um
|
||||
* bei mehrschichtigen Wänden eine SCHICHTTRENNLINIE (Fuge zwischen zwei
|
||||
* Schichten) als Referenzlinie zu wählen. +T/2 = Aussenfläche, 0 = Mitte,
|
||||
* −T/2 = Innenfläche; ein interner Fugenwert liegt dazwischen.
|
||||
*/
|
||||
referenceOffset?: number;
|
||||
/**
|
||||
* Vertikale Bindung der Unterkante (UK). Fehlt sie, sitzt die UK auf der
|
||||
* baseElevation des zugehörigen Geschosses (= heutiges Verhalten).
|
||||
|
||||
+23
-2
@@ -2,8 +2,8 @@
|
||||
// ceilingVerticalExtent): reine Datenschicht, kein React/Store.
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { ceilingVerticalExtent } from "./wall";
|
||||
import type { Ceiling, Project } from "./types";
|
||||
import { ceilingVerticalExtent, wallReferenceOffset } from "./wall";
|
||||
import type { Ceiling, Project, Wall } from "./types";
|
||||
|
||||
/** Minimalprojekt mit einem Geschoss (baseElevation 0, floorHeight 2.6) und
|
||||
* einem einschichtigen Wandtyp (0.2 m), den die Decke als Aufbau nutzt. */
|
||||
@@ -113,3 +113,24 @@ describe("ceilingVerticalExtent", () => {
|
||||
expect(zBottom).toBeCloseTo(2.9); // baseElevation(og)=2.8 + offset(0.1)
|
||||
});
|
||||
});
|
||||
|
||||
describe("wallReferenceOffset", () => {
|
||||
const w = (extra: Partial<Wall>): Wall => ({ referenceLine: "center", ...extra } as Wall);
|
||||
const T = 0.4; // Gesamtdicke → half = 0.2
|
||||
|
||||
it("bildet die benannten Linien ab (aussen/mitte/innen)", () => {
|
||||
expect(wallReferenceOffset(w({ referenceLine: "left" }), T)).toBeCloseTo(0.2, 6);
|
||||
expect(wallReferenceOffset(w({ referenceLine: "center" }), T)).toBeCloseTo(0, 6);
|
||||
expect(wallReferenceOffset(w({ referenceLine: "right" }), T)).toBeCloseTo(-0.2, 6);
|
||||
});
|
||||
|
||||
it("übersteuert die Referenzlinie mit einem freien Fugen-Versatz", () => {
|
||||
// Fuge z. B. nach einer 0.05-Aussenschale: offset = half − 0.05 = 0.15.
|
||||
expect(wallReferenceOffset(w({ referenceLine: "left", referenceOffset: 0.15 }), T)).toBeCloseTo(0.15, 6);
|
||||
});
|
||||
|
||||
it("klemmt den Fugen-Versatz auf ±halbe Dicke", () => {
|
||||
expect(wallReferenceOffset(w({ referenceOffset: 5 }), T)).toBeCloseTo(0.2, 6);
|
||||
expect(wallReferenceOffset(w({ referenceOffset: -5 }), T)).toBeCloseTo(-0.2, 6);
|
||||
});
|
||||
});
|
||||
|
||||
+7
-1
@@ -26,8 +26,14 @@ export function wallReferenceOffset(
|
||||
wall: Wall,
|
||||
totalThickness: number,
|
||||
): number {
|
||||
const ref = wall.referenceLine ?? "center";
|
||||
const half = totalThickness / 2;
|
||||
// Freier Fugen-Versatz (Schichttrennlinie als Referenz) übersteuert die
|
||||
// benannte Referenzlinie. Auf die Wanddicke geklemmt, damit die Achse nie
|
||||
// ausserhalb der Wand landet.
|
||||
if (wall.referenceOffset != null) {
|
||||
return Math.max(-half, Math.min(half, wall.referenceOffset));
|
||||
}
|
||||
const ref = wall.referenceLine ?? "center";
|
||||
if (ref === "left") return +half;
|
||||
if (ref === "right") return -half;
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user