const sleep = ms => new Promise(r => setTimeout(r, ms)); 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 out = {}; // 「包含设计规则」复选框 let ruleBox = null, ruleTxt = null; for (const el of document.querySelectorAll('*')) { if (el.children.length === 0 && /设计规则/.test((el.textContent||'').trim()) && el.offsetParent !== null) { ruleTxt = (el.textContent||'').trim(); let r = el; for (let i = 0; i < 6 && r; i++) { const cb = r.querySelector && r.querySelector('input[type=checkbox]'); if (cb) { ruleBox = cb; break; } r = r.parentElement; } break; } } out.ruleTxt = ruleTxt; out.ruleChecked = ruleBox ? ruleBox.checked : null; if (ruleBox && ruleBox.checked) { nat(ruleBox); await sleep(400); out.ruleAfter = ruleBox.checked; } const btn = [...document.querySelectorAll('button')].find(b => b.offsetParent !== null && (b.innerText||'').trim() === '应用修改'); if (!btn) return Object.assign(out, {err: 'no 应用修改'}); nat(btn); await sleep(12000); // 可能还有确认框 for (const b of document.querySelectorAll('button')) if (b.offsetParent !== null && /^(确定|确认|是)$/.test((b.innerText||'').trim())) { nat(b); await sleep(3000); out.confirmed = (b.innerText||'').trim(); } await sleep(3000); const comps = await eda.pcb_PrimitiveComponent.getAll(); const layers = {}; for (const c of comps) { const L = c.getState_Layer(); layers[L] = (layers[L]||0)+1; } out.n = comps.length; out.layers = layers; const c801 = comps.find(c => c.getState_Designator() === 'C801'); if (c801) { const pins = await eda.pcb_PrimitiveComponent.getAllPinsByPrimitiveId(c801.getState_PrimitiveId()); out.c801 = pins.map(p => [p.padNumber, p.net, p.layer, JSON.stringify(p.pad)]); } out.buttons = [...document.querySelectorAll('button')].filter(b => b.offsetParent !== null).map(b => (b.innerText||'').trim()).filter(Boolean).slice(0,20); return out;