# -*- coding: utf-8 -*- u"""把 `pinmap_base.py` 在原理图上做的 EFUSE/PRSNT 换脚**同步到 PCB 的焊盘网名**。 /c/Python314/python .claude/r2/pcb_pinswap.py # 只读回对比 /c/Python314/python .claude/r2/pcb_pinswap.py --push # 改焊盘网名 + 读回校验 ⚠ 为什么不走「从原理图导入变更」对话框:那条路会按内部通道 ID 重新配对, R1 §交接二 踩过一次(配错一格,把一个本来正确的风扇块打乱),修起来要 `pcb1_uid_sync.py`。这里只有 8 只脚换名、元件身份一个没动,**定点改焊盘更安全**, 判据也简单:读回这 8 只脚的网名逐个对上。 """ import json import os import sys HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.dirname(HERE)) sys.path.insert(0, HERE) from eda import run # noqa: E402 import pcb_base as B # noqa: E402 WANT = {'8': 'PRSNT1#', '9': 'PRSNT2#', '10': 'PRSNT3#', '11': 'PRSNT4#', '17': 'EFUSE_EN1', '18': 'EFUSE_EN2', '19': 'EFUSE_EN3', '20': 'EFUSE_EN4', '21': 'EFUSE_EN5'} # 2026-09-11 方案 B(原理图 `u20_remap_b.py` 已改):NTC 挪到南排 ADC1 的 IO4/IO5,风扇整组挪到西列北段, # 38/39(IO2/IO1)改空脚(目标网名 '')。与上面 §29.5 那 9 只一起读回核对。 WANT.update({'4': 'NTC1', '5': 'NTC2', '6': 'UP_VBUS_DET', '7': 'PRSNT5#', '22': 'FAN_TACH_OUT', '23': 'FAN_TACH_IN', '24': 'FAN_PWM', '25': 'FAN_EN', '38': '', '39': ''}) JS = u""" await eda.dmt_EditorControl.openDocument('%s'); await new Promise(r => setTimeout(r, 2000)); const WANT = %s, PUSH = %s; const out = []; for (const c of await eda.pcb_PrimitiveComponent.getAll()) { if (c.designator !== 'U20') continue; const ps = await eda.pcb_PrimitiveComponent.getAllPinsByPrimitiveId(c.getState_PrimitiveId()); for (const p of ps) { const n = String(p.getState_PadNumber()); if (!(n in WANT)) continue; const before = String(p.net || ''); if (PUSH && before !== WANT[n]) { try { p.toAsync().setState_Net(WANT[n]).done(); } catch (e) {} } out.push([n, before, WANT[n]]); } } if (PUSH) { await eda.pcb_Document.save(); await new Promise(r => setTimeout(r, 800)); } return out; """ def call(push): r = run(JS % (B.PCB, json.dumps(WANT, ensure_ascii=False), 'true' if push else 'false'), timeout=300) assert r.get('success'), json.dumps(r, ensure_ascii=False)[:400] return r['result'] if __name__ == '__main__': push = '--push' in sys.argv rows = call(push) rows.sort(key=lambda t: int(t[0])) for n, before, want in rows: flag = u'' if before == want else u' ← 改' print(u' pin%-3s %-11s → %-11s%s' % (n, before or '(空)', want, flag)) if push: after = {t[0]: t[1] for t in call(False)} bad = [n for n, w in WANT.items() if after.get(n) != w] print(u'[%s] 读回校验%s' % ('OK' if not bad else 'X', u'%d 只脚逐个对上' % len(WANT) if not bad else u' 不过: %s' % bad))