Browser-BIM (cad): semantisches Modell, abgeleitete 2D/3D-Sichten, Zeichenwerkzeuge
Standalone-Browser-Port von DOSSIER. Enthaelt das semantische Modell mit Plan-/3D-Ableitung, Zeichen- und Editierwerkzeuge, Rhino-artiges Befehlssystem, dockbares Panel-System, Resource-Manager, DXF/.lin/.pat-Import, i18n (de/en) sowie Projektdokumentation und Probe-Harness.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
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:1280,height:820,deviceScaleFactor:1});
|
||||
const errs=[]; p.on("pageerror",e=>errs.push(e.message));
|
||||
await p.goto("http://localhost:5173/",{waitUntil:"networkidle0",timeout:20000}).catch(()=>{});
|
||||
await new Promise(r=>setTimeout(r,700));
|
||||
// Screen-bbox aller Wand-Polygone bestimmen, dann auf die obere Bandkante klicken.
|
||||
const bb=await p.evaluate(()=>{
|
||||
const polys=[...document.querySelectorAll(".plan-svg polygon")];
|
||||
if(!polys.length) return null;
|
||||
let minX=1e9,minY=1e9,maxX=-1e9,maxY=-1e9;
|
||||
for(const pl of polys){ const r=pl.getBoundingClientRect(); minX=Math.min(minX,r.left);minY=Math.min(minY,r.top);maxX=Math.max(maxX,r.right);maxY=Math.max(maxY,r.bottom);}
|
||||
return {minX,minY,maxX,maxY};
|
||||
});
|
||||
let sel=false;
|
||||
if(bb){
|
||||
const cx=(bb.minX+bb.maxX)/2;
|
||||
// ein paar Punkte auf der oberen Bandkante probieren
|
||||
for(const dy of [4,8,12,16]){
|
||||
await p.mouse.click(cx, bb.minY+dy); await new Promise(r=>setTimeout(r,120));
|
||||
const k=await p.evaluate(()=>document.querySelector(".objinfo-kind")?.textContent||"");
|
||||
if(/Wand/.test(k)){ sel=true; break; }
|
||||
}
|
||||
}
|
||||
const dims=()=>p.evaluate(()=>[...document.querySelectorAll(".objinfo-input")].map(i=>i.value));
|
||||
const before=await dims();
|
||||
const tri=await p.evaluate(()=>{
|
||||
const el=document.querySelector(".plan-edge-grip"); if(!el) return null;
|
||||
const pts=el.getAttribute("points").trim().split(/\s+/).map(s=>s.split(",").map(Number));
|
||||
const svg=el.ownerSVGElement; const ctm=svg.getScreenCTM();
|
||||
const cs=pts.map(([x,y])=>{const pt=svg.createSVGPoint();pt.x=x;pt.y=y;const sp=pt.matrixTransform(ctm);return [sp.x,sp.y];});
|
||||
return {cx:cs.reduce((a,c)=>a+c[0],0)/3, cy:cs.reduce((a,c)=>a+c[1],0)/3, count:document.querySelectorAll(".plan-edge-grip").length};
|
||||
});
|
||||
let after=before, dragged=false;
|
||||
if(tri){
|
||||
await p.mouse.move(tri.cx,tri.cy); await p.mouse.down();
|
||||
for(let i=1;i<=6;i++){ await p.mouse.move(tri.cx, tri.cy - i*8); await new Promise(r=>setTimeout(r,20)); }
|
||||
await p.mouse.up(); await new Promise(r=>setTimeout(r,200));
|
||||
after=await dims(); dragged=true;
|
||||
}
|
||||
await p.screenshot({path:"scripts/probe-edge2.png"});
|
||||
console.log(JSON.stringify({wallSelected:sel, edgeGripCount:tri&&tri.count, dims_before:before, dims_after:after, errs}, null, 2));
|
||||
await b.close();
|
||||
Reference in New Issue
Block a user