app
adom-layout-viewer
Public Made by Adomby adom
Interactive PCB layout viewer: your EDA's own render plus live net/trace highlighting and per-pad stock, price and wiki lookup
import puppeteer from 'puppeteer';
const b = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox'] });
const p = await b.newPage();
await p.setViewport({ width: 1000, height: 800, deviceScaleFactor: 2 });
const errs = []; p.on('pageerror', e => errs.push(String(e)));
await p.goto('file://' + process.argv[2], { waitUntil: 'networkidle0' });
await new Promise(r => setTimeout(r, 500));
// TOP view (default)
await p.screenshot({ path: '/tmp/pcbtest/side_top.png' });
// click a pad's net to test click-highlight brightness
const netInfo = await p.evaluate(() => {
const pad = [...document.querySelectorAll('.adom-pad')].find(p => p.getAttribute('data-net') !== '0');
pad.dispatchEvent(new MouseEvent('click', { bubbles: true }));
return { net: pad.getAttribute('data-net'), lit: document.querySelectorAll('.hl').length, dim: document.querySelector('#svgbox svg').classList.contains('dim') };
});
await new Promise(r => setTimeout(r, 200));
await p.screenshot({ path: '/tmp/pcbtest/side_top_net.png' });
console.log('NET_CLICK', JSON.stringify(netInfo));
// clear, then BOTTOM view
await p.evaluate(() => { document.querySelector('#svgbox svg').dispatchEvent(new MouseEvent('click', { bubbles: true })); });
const flipped = await p.evaluate(() => {
document.querySelector('.sidebtn[data-side="bottom"]').click();
const flip = document.querySelector('.adom-flip');
return { transform: flip.getAttribute('transform'), silkBopacity: document.querySelector('.adom-layer-silkB').style.opacity, silkFopacity: document.querySelector('.adom-layer-silkF').style.opacity };
});
await new Promise(r => setTimeout(r, 300));
await p.screenshot({ path: '/tmp/pcbtest/side_bottom.png' });
console.log('FLIP', JSON.stringify(flipped));
console.log('ERRS', JSON.stringify(errs));
await b.close();