# -*- coding: utf-8 -*- u"""在**现有布线缓存 + 缝合孔**之上,只跑 `router.gnd_vias()` 给铺铜够不着的 GND 脚打孔下 L2(2026-09-14,BLADE-PCB_1)。 MODE=gndvia bash .claude/r2/remote_blade.sh # 服务器上跑(打孔落点是搜索,CLAUDE.md 规定只在 10.5.5.13) # 服务器上实际执行:DCDC_ROUTE_SERVER=1 pypy3 .claude/r2/gndvia_blade1.py 结果拉回 `_blade_routes.gndvia.json`(**只含新增**的段 / 孔 + 打不下的脚),本机核过再并进缓存下发。 为什么单独跑:整板重布会把 6 轮服务器 + 手工收尾 + 主板南移后的补线全部推翻;这里只加孔、不动别的铜。 `EXTRA_REFS`:DRC 连接性报出来、但不在 `router.GND_VIA_REFS` 里的去耦件 / 分压电阻的地脚。 """ import io import json import os import sys sys.stdout.reconfigure(encoding='utf-8') HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.dirname(HERE)) sys.path.insert(0, HERE) if not os.environ.get('DCDC_ROUTE_SERVER'): sys.exit(u'⛔ 打孔落点只在 10.5.5.13 上算:MODE=gndvia bash .claude/r2/remote_blade.sh') import router as RT # noqa: E402 EXTRA_REFS = ('C10', 'C11', 'C12', 'C40', 'C65', 'R2') RT.GND_VIA_REFS = tuple(RT.GND_VIA_REFS) + EXTRA_REFS cache = json.load(io.open(os.path.join(HERE, '_blade_routes.json'), encoding='utf-8')) segs = [tuple(s) for s in cache['segs']] vias = [tuple(v) for v in cache['vias']] stitch = json.load(io.open(os.path.join(HERE, '_blade_stitch_pts.json'), encoding='utf-8')) board_vias = [[x, y, 'GND', RT.VIA_D] for x, y in stitch] pads = RT.load_pads() s3, v3, l3 = RT.gnd_vias(pads, segs, vias, board_vias) print(u'GND 打孔 %d 个 / 引出 %d 段;打不下 %d 只脚' % (len(v3), len(s3), len(l3))) for m in l3: print(u' ' + m) json.dump({'segs': [list(s) for s in s3], 'vias': [list(v) for v in v3], 'logs': l3}, io.open(os.path.join(HERE, '_blade_routes.gndvia.json'), 'w', encoding='utf-8'), ensure_ascii=False)