文件
phonerail/.claude/r2/d16_gndfix.py
T

46 行
2.1 KiB
Python

# -*- 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()