Fenster: Rahmen-Kontur in Aufsicht separat von den geschnittenen Laibungsblöcken stylebar
Bisher teilten sich die geschnittenen Laibungs-/Stulp-Blöcke (O-Blöcke, Schnittfläche des Rahmenmaterials) und die durchlaufende Rahmen-Kontur zwischen ihnen (Aufsicht, nicht geschnitten) dieselbe frameLine-Farbe. Neues Opening.frameViewLine übersteuert nur noch die Kontur; ohne Angabe fällt sie weiterhin auf frameLine zurück (bisheriges Verhalten unverändert). frameLine im UI zu "Rahmen (Schnitt)" umbenannt, um die beiden Kategorien zu unterscheiden.
This commit is contained in:
@@ -2281,23 +2281,29 @@ function addOpeningSymbol(
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Linien-Kategorien einzeln übersteuerbar (Nutzer-Wunsch): Rahmen (Blend-
|
||||
// rahmen-Kontur + Stulp-/Laibungsblöcke), Fenster (Flügelrahmen/Sprossen),
|
||||
// Sims (Auf-/Untersicht-Andeutung, s. u.). `undefined` ⇒ bisheriges
|
||||
// Verhalten (strokeColor/SYMBOL_HAIRLINE_MM).
|
||||
// Linien-Kategorien einzeln übersteuerbar (Nutzer-Wunsch): Rahmen-Schnitt
|
||||
// (Laibungs-/Stulp-Blöcke, geschnittenes Profil), Rahmen-Aufsicht (die
|
||||
// durchlaufende Kontur DAZWISCHEN, projiziert statt geschnitten), Fenster
|
||||
// (Flügelrahmen/Sprossen), Sims (Auf-/Untersicht-Andeutung, s. u.).
|
||||
// `undefined` ⇒ bisheriges Verhalten (strokeColor/SYMBOL_HAIRLINE_MM);
|
||||
// `frameViewLine` fällt zusätzlich auf `frameLine` zurück (eine Farbe für
|
||||
// Schnitt+Aufsicht, bis der Nutzer sie explizit trennt).
|
||||
const frameColor = o.frameLine?.color ?? strokeColor;
|
||||
const frameWeight = o.frameLine?.weight ?? lwMm;
|
||||
const frameHairline = o.frameLine?.weight ?? SYMBOL_HAIRLINE_MM;
|
||||
const frameViewColor = o.frameViewLine?.color ?? frameColor;
|
||||
const frameViewWeight = o.frameViewLine?.weight ?? frameWeight;
|
||||
const sashColor = o.sashLine?.color ?? strokeColor;
|
||||
const sashWeight = o.sashLine?.weight ?? SYMBOL_HAIRLINE_MM;
|
||||
|
||||
// Blendrahmen-Rechteck (mittel + fein).
|
||||
// Blendrahmen-Rechteck in Aufsicht (mittel + fein) — die durchlaufende
|
||||
// Kontur zwischen den geschnittenen Laibungs-/Stulp-Blöcken.
|
||||
out.push({
|
||||
kind: "polygon",
|
||||
pts: sym.frame,
|
||||
fill: "none",
|
||||
stroke: frameColor,
|
||||
strokeWidthMm: frameWeight,
|
||||
stroke: frameViewColor,
|
||||
strokeWidthMm: frameViewWeight,
|
||||
hatch: NO_HATCH,
|
||||
greyed,
|
||||
openingId: o.id,
|
||||
|
||||
@@ -390,6 +390,42 @@ describe("generatePlan — Linien-Übersteuerung je Kategorie (Opening.frameLine
|
||||
expect(sill[0].kind === "line" && sill[0].weightMm).toBeCloseTo(0.4, 6);
|
||||
});
|
||||
|
||||
it("frameViewLine ohne Übersteuerung: die Rahmen-Kontur (Aufsicht) fällt auf frameLine zurück", () => {
|
||||
const p = project(
|
||||
{ ...baseWindow, typeId: "wt1", frameLine: { color: "#ff0000", weight: 0.5 } },
|
||||
[baseWindowType],
|
||||
);
|
||||
const frame = generatePlan(p, "eg", visible, undefined, "mittel").primitives.find(
|
||||
(pr) => pr.kind === "polygon" && pr.openingId === "F1" && pr.stroke !== "none",
|
||||
);
|
||||
expect(frame).toBeDefined();
|
||||
expect(frame!.kind === "polygon" && frame!.stroke).toBe("#ff0000");
|
||||
expect(frame!.kind === "polygon" && frame!.strokeWidthMm).toBeCloseTo(0.5, 6);
|
||||
});
|
||||
|
||||
it("frameViewLine übersteuert NUR die Rahmen-Kontur (Aufsicht) — die Laibungs-Blöcke (Schnitt) bleiben beim frameLine-Default", () => {
|
||||
const p = project(
|
||||
{
|
||||
...baseWindow,
|
||||
typeId: "wt1",
|
||||
frameLine: { color: "#ff0000", weight: 0.5 },
|
||||
frameViewLine: { color: "#00ffff", weight: 0.2 },
|
||||
},
|
||||
[baseWindowType],
|
||||
);
|
||||
const out = generatePlan(p, "eg", visible, undefined, "mittel").primitives;
|
||||
const frame = out.find((pr) => pr.kind === "polygon" && pr.openingId === "F1" && pr.stroke !== "none");
|
||||
expect(frame!.kind === "polygon" && frame!.stroke).toBe("#00ffff");
|
||||
expect(frame!.kind === "polygon" && frame!.strokeWidthMm).toBeCloseTo(0.2, 6);
|
||||
// Laibungs-Blöcke (window-stulp) bleiben unverändert bei frameLine, NICHT frameViewLine.
|
||||
const stulp = out.filter((pr) => pr.kind === "line" && pr.cls === "window-stulp");
|
||||
expect(stulp.length).toBeGreaterThan(0);
|
||||
for (const l of stulp) {
|
||||
expect(l.kind === "line" && l.color).toBe("#ff0000");
|
||||
expect(l.kind === "line" && l.weightMm).toBeCloseTo(0.5, 6);
|
||||
}
|
||||
});
|
||||
|
||||
it("sashLine wirkt auch bei 'grob' (1:100) auf die einzige dort sichtbare Glaslinie", () => {
|
||||
const p = project(
|
||||
{ ...baseWindow, typeId: "wt1", sashLine: { color: "#00ff00", weight: 0.3 } },
|
||||
|
||||
Reference in New Issue
Block a user