main
John Lauer Corrected Astra ESC routing: native zero-open result, full accounting and voiceover handoff a80479d 23d ago
from component_search import *
import sys
plans=json.load(open(sys.argv[1]));load(plans);out=[]
for p in plans:
 if p['net'] not in ['+VBAT','GND_OUT','/DRV_SHA','/DRV_SHB','/DRV_SHC']:
  out.append(p);continue
 a=masks(p['net'],1.0);narrow=[];wide=[]
 for path in p['paths']:
  z=path[0].get('layer','F.Cu') if isinstance(path[0],dict) else 'F.Cu'
  pos=lambda v:(v['x'],v['y']) if isinstance(v,dict) else v
  for u,v in zip(path,path[1:]):
   aa,bb=pos(u),pos(v);newz=v.get('layer',z) if isinstance(v,dict) else z
   if aa!=bb:
    length=math.dist(aa,bb);num=max(2,math.ceil(length/.025)+1)
    ok=length>=.6
    for t in np.linspace(0,1,num):
     x=aa[0]+(bb[0]-aa[0])*t;y=aa[1]+(bb[1]-aa[1])*t;i,j=ij(x,y)
     if a[1 if z=='B.Cu' else 0,j,i]:ok=False;break
    (wide if ok else narrow).append([dict(x=aa[0],y=aa[1],layer=z),list(bb)])
   if z!=newz:narrow.append([dict(x=bb[0],y=bb[1],layer=z),dict(x=bb[0],y=bb[1],layer=newz)]);z=newz
 for width,paths in [(.5,narrow),(1.,wide)]:
  for i in range(0,len(paths),128):out.append(dict(net=p['net'],width=width,paths=paths[i:i+128]))
# Short nets first, each commit carries only one net. Shared planes last.
out.sort(key=lambda p:(p['net'] in ['GND','+3V3'],max(math.hypot(a['x']-b['x'],a['y']-b['y']) for a in by[p['net']] for b in by[p['net']]),p['width']))
# Native KiCad detected a pad-edge tangency at U5.5; extend 0.05 mm into the pad.
next(p for p in out if p['net']=='/HSE_IN')['paths'].append([[121.4,100.25],[121.35,100.25]])
Path('corrected-final-plan.json').write_text(json.dumps(out,indent=2));print('commits',len(out),'wide paths',sum(len(p['paths']) for p in out if p['width']==1))