// ⚠️ 必须自己 openDocument:桥接打的是**当前打开的文档**, // 2026-09-05 就因为上一条命令开了 PCB1,把下板的 14 块铜面重铺了一遍。 const sleep = ms=>new Promise(r=>setTimeout(r,ms)); await eda.dmt_EditorControl.openDocument('f126ffb29c92f9b2'); await sleep(2000); const propsOf = el => { for (const k of Object.keys(el)) if (k.startsWith('__reactProps$')) return el[k]; return null; }; const fire = (el) => { let t=el; for(let i=0;i<8&&t;i++){const q=propsOf(t); if(q&&typeof q.onClick==='function'){q.onClick({target:t,currentTarget:t,stopPropagation(){},preventDefault(){},nativeEvent:{},button:0,detail:1});return true;} t=t.parentElement;} return false; }; const leaf = t => { for (const el of document.querySelectorAll('*')) if (el.children.length===0 && (el.textContent||'').trim()===t) return el; return null; }; const btn = t => { for (const b of document.querySelectorAll('button')) if ((b.innerText||'').trim()===t && b.offsetParent!==null) return b; return null; }; const nat = b => { const o={bubbles:true,cancelable:true,view:window,button:0}; for (const t of ['pointerdown','mousedown','pointerup','mouseup','click']) b.dispatchEvent(new (t.startsWith('pointer')?PointerEvent:MouseEvent)(t,o)); }; const cancel = btn('取消'); if (cancel) { nat(cancel); await sleep(1200); } if (!fire(leaf('工具'))) return {err:'no 工具'}; await sleep(900); if (!fire(leaf('铺铜管理器...'))) return {err:'no 铺铜管理器'}; await sleep(2500); const b = btn('重建所有'); if (!b) return {err:'no 重建所有'}; nat(b); const log=[]; for (let i=0;i<6;i++){ await sleep(2500); log.push((await eda.pcb_PrimitivePoured.getAll()).length); } return {log, pour:(await eda.pcb_PrimitivePour.getAll()).map(p=>p.getState_PourName())};