muse/book-reading-clip-lamp
A tscircuit package created by muse.
- Version
- 0.4.6
- License
- unset
- Stars
- 0
direct-50.py
exec(open('find-via-repair.py').read().split('obs=[]')[0].split("c=json.load")[0])
import json,math
c=json.load(open('dist/index/circuit.json'))
# Geometry helpers, independent of netlist labels.
text=open('find-via-repair.py').read();exec(text[text.index('def ds('):text.index('obs=[]')]);exec(text[text.index('def pointclear'):text.index('# Existing adjacent')])
patches=[]
for vid in ['pcb_via_50']:
v=next(e for e in c if e.get('type')=='pcb_via' and e['pcb_via_id']==vid);target=v['pcb_trace_id'];old=(v['x'],v['y'])
tr=next(e for e in c if e.get('type')=='pcb_trace' and e['pcb_trace_id']==target)
idx=next(i for i,p in enumerate(tr['route']) if p['route_type']=='via' and math.hypot(p['x']-old[0],p['y']-old[1])<1e-6)
a0=tr['route'][idx-3];b0=tr['route'][idx+4];a=(a0['x'],a0['y']);b=(b0['x'],b0['y']);la=a0['layer'];lb=b0['layer'];obs=[]
for e in c:
typ=e['type']
if typ=='pcb_trace' and e['pcb_trace_id']!=target:
for m,n in zip(e['route'],e['route'][1:]):
if m['route_type']==n['route_type']=='wire' and m['layer']==n['layer']:
obs.append(('seg',m['layer'],(m['x'],m['y']),(n['x'],n['y']),max(m['width'],n['width'])/2))
if typ=='pcb_via' and e.get('pcb_trace_id')!=target:obs.append(('point','all',(e['x'],e['y']),None,e['outer_diameter']/2))
if typ=='pcb_smtpad' and 'x' in e:
if e.get('shape')=='circle':obs.append(('point',e['layer'],(e['x'],e['y']),None,e.get('radius',e.get('diameter',0)/2)))
else:
x,y=e['x'],e['y'];w=e.get('width',0)/2;h=e.get('height',0)/2;obs.append(('rect',e['layer'],(x-w,y-h),(x+w,y+h),0))
# Restrict to neighborhood conservatively: anything intersecting candidate/connection bounds remains.
loX=min(old[0]-5,a[0],b[0])-1;hiX=max(old[0]+5,a[0],b[0])+1;loY=min(old[1]-5,a[1],b[1])-1;hiY=max(old[1]+5,a[1],b[1])+1
obs=[o for o in obs if not(max(o[2][0],(o[3] or o[2])[0])+o[4]<loX or min(o[2][0],(o[3] or o[2])[0])-o[4]>hiX or max(o[2][1],(o[3] or o[2])[1])+o[4]<loY or min(o[2][1],(o[3] or o[2])[1])-o[4]>hiY)]
a=(5.739478281478353,1.9082603437589902);b=(9.638109835992514,-.9419071965020689)
for ly in ['inner1','inner2','bottom','top']:
qs=sorted((lineclear(a,b,o)-.075,o) for o in obs if o[1] in ['all',ly])
print(ly,qs[:3])