shibosoftwaredev/f1c100s-linux-nema17-stepper-controller

A four-layer NEMA 17 motor-controller PCB combining an Allwinner F1C100S Linux computer, USB‑PD/buck power system, W5500 Ethernet, STM32 real-time motion control, DRV8825 stepper driver, protection/temperature/current telemetry, USB interfaces, and local LED/buzzer diagnostics.

Version
0.4.56
License
unset
Stars
0

scripts/merge-local-session.py

"""Merge reviewed explicit polylines only; this never searches for routes."""
from route_geometry import *
import sys
tree=parse_sexpr(Path(sys.argv[1]).read_text())
rs=one(tree,'routes');res=one(rs,'resolution');scale={'um':.001,'mm':1}[res[1]]/float(res[2])
network=one(rs,'network_out');nets={n[1]:n for n in entries(network,'net')}
for file in sys.argv[3:]:
    for t in json.loads(Path(file).read_text()):
        n=t['connection_name']
        if n not in nets:nets[n]=['net',n];network.append(nets[n])
        for a,b in zip(t['route'],t['route'][1:]):
            if a['route_type']!=b['route_type'] or a['route_type']!='wire' or a['layer']!=b['layer'] or math.dist((a['x'],a['y']),(b['x'],b['y']))<1e-7:continue
            nets[n].append(['wire',['path',a['layer'],str(round(max(a['width'],b['width'])/scale)),*[str(round(v/scale)) for v in [a['x'],a['y'],b['x'],b['y']]]]])
        for p in t['route']:
            if p['route_type']=='via':nets[n].append(['via','VIA',str(round(p['x']/scale)),str(round(p['y']/scale))])
def enc(v):return '('+' '.join(enc(x) for x in v)+')' if isinstance(v,list) else str(v)
Path(sys.argv[2]).write_text(enc(tree)+'\n')