main
John Lauer Publish independent Astra ESC source and full-pad Kelvin review lesson d057af8 22d ago
from component_search import *
import sys
plans=json.load(open(sys.argv[1]));load(plans);out=[]
for p in plans:
 if p.get('stage')=='kelvin' or 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]))

Path("live-routes.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))