"""Replay current-CAD seed evidence through the shared placement and gates.""" import argparse import copy import json import sys from pathlib import Path root=Path(__file__).resolve().parents[1] sys.path.insert(0,str(root/'src/backend' if (root/'src/backend').is_dir() else root)) def run(args): import server from authorized_quantity_generation import generate_seed from haunch_contact_surface import bind server.require_modeling_rules() job=json.loads(args.job.read_text());plan=job['result'] cache=json.loads(args.seeds.read_text());authorization=cache['authorization'] source_hashes={r['source_sha256'] for r in plan['drawingEvidence']['cad_fabrication_inventory']['rows']} if not set(authorization['source_sha256']).issubset(source_hashes): raise ValueError('seed source hashes differ from current drawing inventory') bind(plan['concrete_components'],server.component_surface_z_at_xy) groups=[];failures=[] for seed in cache['seeds']: if args.block and seed['rebar_block']!=args.block:continue try: g=generate_seed(plan,seed,node=args.node);groups.append(g) print(json.dumps({'block':g['rebar_block'],'mark':g['mark'],'count':g['count'], 'rhythm':g['quantity_distribution'].get('rhythm'),'pass':True}),flush=True) except ValueError as error: failures.append({'block':seed['rebar_block'],'mark':seed['mark'],'error':str(error)}) print(json.dumps(failures[-1]),flush=True) ids={g['id'] for g in groups} plan['rebar_groups']=[g for g in plan['rebar_groups'] if g.get('id') not in ids]+groups plan['quantityDistributionReview']={'group_ids':sorted(ids),'failures':failures,'engineering_approved':False} with args.output.open('x') as stream: json.dump({'result':plan,'authorization':authorization,'failures':failures},stream,ensure_ascii=False,allow_nan=False) print(json.dumps({'generated':len(groups),'failures':len(failures)}),flush=True) if __name__=='__main__': parser=argparse.ArgumentParser(description=__doc__) parser.add_argument('job',type=Path);parser.add_argument('seeds',type=Path) parser.add_argument('--output',type=Path,required=True);parser.add_argument('--node',required=True) parser.add_argument('--block') run(parser.parse_args())