2D-Plan-Renderer auf WebGL2 (GPU) + akkumulierter Funktionsstand
Neuer GPU-Renderer fuer den Grundriss (src/plan/glPlan/): Earcut-Tessellierung (konkav-faehig), gehrte Linienzuege (Miter), echte Papier-mm-Strichbreiten im Massstab (repliziert den SVG-printStrokeVb-Pfad), Hybrid mit scharfem SVG-Text- Overlay. GPU ist der Standardpfad; der SVG-Renderer bleibt automatischer Fallback, falls WebGL2/Shader nicht verfuegbar sind. Imperativer Pan (rAF + CSS-transform) fuer fluessige Interaktion ohne React-Re-Render je Frame. Enthaelt zudem den bisher nicht committeten Arbeitsstand des Browser-BIM (Oeffnungen, Treppen, Raeume, Decken, DXF-Export, Materialbibliothek, Kontext- Import, Tauri-Compute-Boundary-PoC).
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import puppeteer from "puppeteer";
|
||||
const b = await puppeteer.launch({
|
||||
headless: "new",
|
||||
args: ["--no-sandbox", "--use-gl=swiftshader", "--enable-unsafe-swiftshader"],
|
||||
});
|
||||
const p = await b.newPage();
|
||||
await p.setViewport({ width: 1500, height: 220, deviceScaleFactor: 2 });
|
||||
await p.goto("http://localhost:5187/", { waitUntil: "networkidle0", timeout: 20000 }).catch(() => {});
|
||||
await new Promise((r) => setTimeout(r, 900));
|
||||
|
||||
// Versuch: in eine Geschoss-/Grundriss-Ansicht wechseln, damit der Linien-Modus
|
||||
// (nur im Grundriss) aktiv ist. Klick auf das erste "grundriss"-View-Icon.
|
||||
const grund = await p.$('.view-icon[aria-label]');
|
||||
const tb = await p.$(".topbar");
|
||||
let box = await tb.boundingBox();
|
||||
const H = Math.ceil(box.height) + 10;
|
||||
|
||||
// 1) Topbar im Ruhezustand.
|
||||
await p.screenshot({ path: "scripts/probe-pills-1-topbar.png", clip: { x: 0, y: 0, width: 1500, height: H } });
|
||||
|
||||
// Diagnose: gibt es einen Linien-Modus-Dropdown-Trigger? (Label-Text.)
|
||||
const diag = await p.evaluate(() => {
|
||||
const triggers = [...document.querySelectorAll(".tb-dd-trigger")].map((t) => t.textContent.trim());
|
||||
const btns = [...document.querySelectorAll(".tb-btn")].map((b) => ({
|
||||
text: b.textContent.trim(),
|
||||
radius: getComputedStyle(b).borderRadius,
|
||||
border: getComputedStyle(b).borderTopWidth,
|
||||
bg: getComputedStyle(b).backgroundColor,
|
||||
}));
|
||||
// Hat irgendein Dropdown die Linien-Modus-Werte Display/Print?
|
||||
return { triggers, btns };
|
||||
});
|
||||
console.log("TRIGGERS:", JSON.stringify(diag.triggers));
|
||||
console.log("BTNS:", JSON.stringify(diag.btns, null, 0));
|
||||
|
||||
// 2) Linien-Modus-Dropdown öffnen (Tastatur, zuverlässig): Trigger mit Label
|
||||
// Display/Print fokussieren + Enter.
|
||||
const sel = await p.evaluate(() => {
|
||||
const t = [...document.querySelectorAll(".tb-dd-trigger")].find((t) => {
|
||||
const tx = t.textContent.trim();
|
||||
return tx === "Display" || tx === "Print";
|
||||
});
|
||||
if (!t) return null;
|
||||
t.id = "linemode-trigger-probe";
|
||||
return "#linemode-trigger-probe";
|
||||
});
|
||||
console.log("LINEMODE DROPDOWN FOUND:", !!sel);
|
||||
if (sel) {
|
||||
await p.focus(sel);
|
||||
await p.keyboard.press("Enter");
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, 350));
|
||||
// Vollbild, damit das (per Portal an body) gerenderte Popover sichtbar ist.
|
||||
await p.screenshot({ path: "scripts/probe-pills-2-linemode-open.png" });
|
||||
|
||||
// Popover-Inhalt prüfen (Optionen + Häkchen).
|
||||
const pop = await p.evaluate(() => {
|
||||
const menu = document.querySelector(".tb-dd-menu");
|
||||
if (!menu) return null;
|
||||
const items = [...menu.querySelectorAll(".tb-dd-item")].map((i) => ({
|
||||
label: i.querySelector(".ctx-item-label")?.textContent.trim(),
|
||||
checked: !!i.querySelector(".tb-dd-check"),
|
||||
}));
|
||||
return items;
|
||||
});
|
||||
console.log("LINEMODE OPTIONS:", JSON.stringify(pop));
|
||||
|
||||
// Menü schließen.
|
||||
await p.keyboard.press("Escape");
|
||||
await new Promise((r) => setTimeout(r, 200));
|
||||
|
||||
// 3) Hover über die erste Aktions-Pille (z. B. 100%), Hover-Optik zeigen.
|
||||
const hovered = await p.evaluate(() => {
|
||||
const btn = document.querySelector(".tb-btn:not(:disabled)");
|
||||
if (!btn) return null;
|
||||
btn.scrollIntoView({ block: "center", inline: "center" });
|
||||
return true;
|
||||
});
|
||||
const firstBtn = await p.$(".tb-btn");
|
||||
if (firstBtn) {
|
||||
const bb = await firstBtn.boundingBox();
|
||||
if (bb) await p.mouse.move(bb.x + bb.width / 2, bb.y + bb.height / 2);
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, 250));
|
||||
box = await tb.boundingBox();
|
||||
await p.screenshot({ path: "scripts/probe-pills-3-btn-hover.png", clip: { x: 0, y: 0, width: 1500, height: Math.ceil(box.height) + 10 } });
|
||||
console.log("HOVERED BTN:", hovered);
|
||||
|
||||
await b.close();
|
||||
Reference in New Issue
Block a user