main
John Lauer Publish independent Astra ESC source and full-pad Kelvin review lesson d057af8 22d ago
from planner import *

def search2(a,start,target,goalgeo,width=.25,plane=False):
 goal=np.zeros((2,H,W),dtype=np.uint8)
 if plane:goal[0]=1-a[2]
 else:
  for z,g in goalgeo:raster(goal[z],g.buffer(width/2-.005))
 goal[a[:2]>0]=0
 starts=np.zeros((H,W),dtype=np.uint8);raster(starts,start['g'].buffer(width/2-.005));starts[a[0]>0]=0
 ids=np.flatnonzero(starts)
 if not len(ids) or not np.any(goal):return None
 a.tofile('mask.bin');goal.tofile('goal.bin');tx,ty=ij(*target)
 r=subprocess.run(['./search2'],input=f'{W} {H} 0 {tx} {ty} {len(ids)} '+ ' '.join(map(str,ids)),capture_output=True,text=True)
 raw=json.loads(r.stdout)
 if not raw:return None
 ps=compress(raw);out=[];curz=0
 for i,j,z in ps:
  x,y=xy(i,j)
  if z!=curz:out.append(dict(x=x,y=y,layer='B.Cu' if z else 'F.Cu'))
  elif [x,y]!=(out[-1] if out else None):out.append([x,y])
  curz=z
 return out