master
John Lauer Preserve BQ independent routing, narration and native copper-retention evidence a4b7711 1mo ago
"""Capture native Fusion copper creation from the independently validated plan."""
import sys,json,time
from pathlib import Path
sys.path.insert(0,str(Path(__file__).resolve().parents[1]));from call import call
ROOT=Path(__file__).resolve().parent;TAKE_ID=sys.argv[1] if len(sys.argv)>1 else '01';DOC_ID=sys.argv[2] if len(sys.argv)>2 else TAKE_ID;START=int(sys.argv[3]) if len(sys.argv)>3 else 0;TAKE=ROOT/('live-take-'+TAKE_ID);TAKE.mkdir(exist_ok=False);doc='bq25792-astra-live-'+DOC_ID;host='C:/Users/john/Documents/Adom Routing Demos/BQ25792/live-'+DOC_ID;log=[]
END=int(sys.argv[4]) if len(sys.argv)>4 else 100000
def invoke(v,a,transport=False,check=True):
 t=time.time();r=call(v,a,script_transport=transport);log.append({'verb':v,'args':a,'start':t,'end':time.time(),'result':r});(TAKE/'calls.json').write_text(json.dumps(log,indent=2))
 if check:assert r.get('success'),r
 return r
s=invoke('fusion_routing_state',{'expectDocument':doc},True);assert s['pourCount']==0
if not START:assert s['segmentCount']==s['viaCount']==0
(TAKE/'before.json').write_text(json.dumps(s,indent=2))
w=invoke('desktop_list_windows',{})['windows'];main=next(x for x in w if x['image']=='Fusion360.exe' and x['owner']==0);palette=next(x for x in w if x['image']=='Fusion360.exe' and x['title']=='ADOM');assert not main['minimized'] and not palette['minimized']
records=[]
try:
 for name,hwnd in [('board',main['hwnd']),('panel',palette['hwnd'])]:
  r=invoke('desktop_record_window_start',{'hwnd':hwnd,'fps':30,'audio':False,'maxDurationMs':600000,'reason':'Record Astra creating all BQ25792 traces and vias natively in Fusion'});records.append((name,r));(TAKE/(name+'-start.json')).write_text(json.dumps(r,indent=2))
 args={k:s[k] for k in ['boardId','revision']};args['expectedRevision']=args.pop('revision');args['expectDocument']=doc
 args['startPrimitive']=START
 args['endPrimitive']=END
 if START:args['baselineSignatures']=json.loads((ROOT/'live-take-02/live-result.json').read_text())['baselineSignatures']
 while True:
  args['maxPrimitives']=40
  script='from pathlib import Path\nREPLAY_ROOT='+repr(host)+'\nPLAN_CONTEXT='+repr(args)+'\nexec(compile((Path(REPLAY_ROOT)/"replay_live.py").read_text(),str(Path(REPLAY_ROOT)/"replay_live.py"),"exec"))'
  r=invoke('fusion_run_modeling_script',{'expectDocument':doc,'script':script},check=False);(TAKE/('chunk-'+str(args['startPrimitive'])+'.json')).write_text(json.dumps(r,indent=2));assert r.get('success'),r
  result=r['result'];assert result.get('success'),result
  if result['final']:(TAKE/'final.json').write_text(json.dumps(result,indent=2));break
  if result['nextPrimitive']>=END:(TAKE/'checkpoint.json').write_text(json.dumps(result,indent=2));break
  assert result['nextPrimitive']>args['startPrimitive']
  args.update(startPrimitive=result['nextPrimitive'],expectedRevision=result['revision'],baselineSignatures=result['baselineSignatures'])
 time.sleep(4)
finally:
 paths=[]
 for name,r in records:
  stop=invoke('desktop_record_window_stop',{'recordingId':r['recordingId']},check=False);(TAKE/(name+'-stop.json')).write_text(json.dumps(stop,indent=2));paths.append(stop.get('path',r['path']))
 if paths:invoke('pull_file',{'filePaths':paths,'saveTo':str(TAKE)})
 invoke('pull_file',{'filePaths':[host+'/live-events.jsonl',host+'/live-result.json'],'saveTo':str(TAKE)},check=False)