340f950f9c
Zwei Klicks (Start -> Ende) legen die Grundriss-Schnitt-/Ansichtslinie einer DrawingLevel fest. Ziel: genau eine Platzhalter-Ebene ohne Linie wird belegt, sonst neue Ebene (Schnitt B/C ...). Live-Vorschau mit Richtungspfeil, Art (Schnitt/Ansicht) als Inline-Option umschaltbar. Registry-Aliase schnittlinie/ ansichtslinie, Ribbon-Gruppe 'Schnitte' im BIM-Tab, i18n de/en, Datenpfad-Tests.
101 lines
3.6 KiB
TypeScript
101 lines
3.6 KiB
TypeScript
// Schnittlinien-Befehl: der reine Datenpfad (commitLine/nextLevelName) — setzt
|
|
// die Grundriss-Schnittlinie auf die richtige Ziel-Ebene bzw. legt eine neue an.
|
|
|
|
import { describe, it, expect } from "vitest";
|
|
import { _test } from "./sectionline";
|
|
import type { DrawingLevel, Project } from "../../model/types";
|
|
|
|
const { commitLine, nextLevelName } = _test;
|
|
|
|
function projectWith(levels: DrawingLevel[]): Project {
|
|
return {
|
|
id: "p",
|
|
name: "T",
|
|
layers: [],
|
|
drawingLevels: levels,
|
|
walls: [],
|
|
drawings2d: [],
|
|
} as unknown as Project;
|
|
}
|
|
|
|
const a = { x: 0, y: 0 };
|
|
const b = { x: 5, y: 0 };
|
|
|
|
describe("sectionline — commitLine", () => {
|
|
it("belegt die EINE Platzhalter-Schnittebene ohne Linie", () => {
|
|
const p = projectWith([
|
|
{ id: "eg", name: "EG", kind: "floor", visible: true, locked: false },
|
|
{ id: "s1", name: "Schnitt A", kind: "section", visible: true, locked: false },
|
|
]);
|
|
const out = commitLine(p, a, b, "section");
|
|
const s = out.drawingLevels.find((z) => z.id === "s1")!;
|
|
expect(s.linePoints).toEqual([a, b]);
|
|
expect(s.directionSign).toBe(1);
|
|
// Keine neue Ebene angelegt.
|
|
expect(out.drawingLevels).toHaveLength(2);
|
|
});
|
|
|
|
it("legt eine NEUE Schnittebene an, wenn keine Platzhalter-Ebene existiert", () => {
|
|
const p = projectWith([
|
|
{ id: "eg", name: "EG", kind: "floor", visible: true, locked: false },
|
|
{
|
|
id: "s1",
|
|
name: "Schnitt A",
|
|
kind: "section",
|
|
visible: true,
|
|
locked: false,
|
|
linePoints: [{ x: 1, y: 1 }, { x: 2, y: 2 }],
|
|
},
|
|
]);
|
|
const out = commitLine(p, a, b, "section");
|
|
expect(out.drawingLevels).toHaveLength(3);
|
|
const created = out.drawingLevels[out.drawingLevels.length - 1];
|
|
expect(created.kind).toBe("section");
|
|
expect(created.linePoints).toEqual([a, b]);
|
|
// Zweite Ebene → Buchstabe B.
|
|
expect(created.name).toContain("B");
|
|
});
|
|
|
|
it("legt bei ZWEI Platzhaltern (mehrdeutig) eine neue Ebene an", () => {
|
|
const p = projectWith([
|
|
{ id: "s1", name: "Schnitt A", kind: "section", visible: true, locked: false },
|
|
{ id: "s2", name: "Schnitt B", kind: "section", visible: true, locked: false },
|
|
]);
|
|
const out = commitLine(p, a, b, "section");
|
|
expect(out.drawingLevels).toHaveLength(3);
|
|
// Die bestehenden Platzhalter bleiben unangetastet.
|
|
expect(out.drawingLevels[0].linePoints).toBeUndefined();
|
|
expect(out.drawingLevels[1].linePoints).toBeUndefined();
|
|
});
|
|
|
|
it("verwirft entartete (zu kurze) Linien", () => {
|
|
const p = projectWith([
|
|
{ id: "s1", name: "Schnitt A", kind: "section", visible: true, locked: false },
|
|
]);
|
|
const out = commitLine(p, a, { x: 0.02, y: 0 }, "section");
|
|
expect(out).toBe(p);
|
|
});
|
|
|
|
it("trennt Schnitt- und Ansichts-Ebenen (kind)", () => {
|
|
const p = projectWith([
|
|
{ id: "s1", name: "Schnitt A", kind: "section", visible: true, locked: false },
|
|
]);
|
|
// Ansichtslinie darf die Schnitt-Platzhalter-Ebene NICHT belegen.
|
|
const out = commitLine(p, a, b, "elevation");
|
|
expect(out.drawingLevels).toHaveLength(2);
|
|
expect(out.drawingLevels[0].linePoints).toBeUndefined();
|
|
expect(out.drawingLevels[1].kind).toBe("elevation");
|
|
});
|
|
});
|
|
|
|
describe("sectionline — nextLevelName", () => {
|
|
it("zählt Buchstaben je Art hoch (A, B, C …)", () => {
|
|
const p0 = projectWith([]);
|
|
expect(nextLevelName(p0, "section")).toContain("A");
|
|
const p1 = projectWith([
|
|
{ id: "s1", name: "Schnitt A", kind: "section", visible: true, locked: false },
|
|
]);
|
|
expect(nextLevelName(p1, "section")).toContain("B");
|
|
});
|
|
});
|