# -*- coding: utf-8 -*- u"""D16 收尾:给指定的 GND 焊盘各打一个孔(route_base.plane_vias,只管给定的脚)—— 服务器跑。 DCDC_ROUTE_SERVER=1 /root/pypy/bin/pypy3 .claude/r2/d16_gndfix.py 位号.脚号 ... 为什么:拆束重布 + 重铺之后 DRC 报 J36.1 / J36.4 / Q6.2 的 GND 断开 —— 它们原来靠铺铜接地,新线把那块铺铜切成了孤岛 / 铺铜分块变了那块没填出来。给它们各自的孔最稳。读 _board_for_gnd.json(存档快照 + 采样线加宽 / 删重叠孔),写 _d16_gndfix.out.json。 """ import io import json import os import sys if os.environ.get('DCDC_ROUTE_SERVER') != '1': sys.exit(u'!! 布线运算只在服务器上跑(DCDC_ROUTE_SERVER=1),见 CLAUDE.md') if '--grid' not in sys.argv: sys.argv += ['--grid', '0.125'] HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.dirname(HERE)) sys.path.insert(0, HERE) import route_nets as N # noqa: E402 R = N.R def main(): want = set(tuple(a.split('.')) for a in sys.argv[1:] if '.' in a and not a.startswith('--') and a != '0.125') b = json.load(io.open(os.path.join(HERE, '_board_for_gnd.json'), encoding='utf-8')) segs = [tuple(s[:7]) for s in b['segs']] vias = [tuple(v[:3]) for v in b['vias']] pads = R.load_pads() skip = set((p[0], str(p[1])) for p in pads if (p[0], str(p[1])) not in want) N.INNER[:] = [s for s in segs if s[0] in (15, 16)] logs = [] _is_ep = R.is_ep R.is_ep = lambda p: False # 一律「短线 + 孔」,不在焊盘里打孔阵 s, v = R.plane_vias(pads, [x for x in segs if x[0] in (1, 2)], vias, [], logs, skip, 'late', set()) R.is_ep = _is_ep print(u'打孔 %d 个、引出线 %d 段;没打上:%s' % (len(v), len(s), [m for m in logs])) io.open(os.path.join(HERE, '_d16_gndfix.out.json'), 'w', encoding='utf-8').write(json.dumps( {'segs': [list(x) for x in s], 'vias': [list(x) for x in v], 'logs': logs}, ensure_ascii=False)) if __name__ == '__main__': main()