"""Rebuild paths from a hash-verified current-CAD layout audit, never saved model paths.""" import argparse,copy,hashlib,json,sys from pathlib import Path sys.path.insert(0,str(Path(__file__).resolve().parents[1])) def main(): p=argparse.ArgumentParser(description=__doc__) p.add_argument('job',type=Path);p.add_argument('audit',type=Path);p.add_argument('output',type=Path) a=p.parse_args() import server server.require_modeling_rules() from adaptive_block1_rebar import _frames,_body_group from local_face_layout_discovery import retain_authored_symbol_owners from slab_pair_contract import audit_slab_pairs from cad_source_access import source_manifest from cad_rebar_recipe import DrawingSource raw=a.job.read_bytes();plan=json.loads(raw)['result'];audit=json.loads(a.audit.read_text()) if hashlib.sha256(raw).hexdigest()!=audit['source_job_sha256']:raise ValueError('job changed since source audit') manifest=source_manifest(json.loads(raw)['sourceContext']['analysis'],server.UPLOAD_ROOT)['sources'] if sorted(x['sha256']for x in manifest)!=sorted(audit['source_hashes']):raise ValueError('source changed') sources={} for source in manifest: if hashlib.sha256(Path(source['path']).read_bytes()).hexdigest()!=source['sha256']: raise ValueError('source bytes changed') sources[source['sha256']]=DrawingSource(Path(source['path']).read_bytes()) frames={f['block']:f for f in _frames(plan)} layouts=copy.deepcopy(audit['layouts']) for block,frame in frames.items(): frame.update(source_plan=plan,drawing_sources=sources,standard_section_layout=layouts.get(f'BLOCK{block}')) if frame['standard_section_layout']: retain_authored_symbol_owners(frame['standard_section_layout']['rows']) groups=[];errors=copy.deepcopy(audit['errors']) for original in audit['rebar_groups']: block=int(original['schedule_row_id'].split(':')[0].removeprefix('block')) row=dict(block=block,mark=original['mark'],diameter_mm=original['diameter_mm'], count=original['schedule_count'],unit_length_m=original['unit_length_m'],fact={}) try:groups.append(_body_group(frames[block],row)) except ValueError as e:errors.append(dict(block=block,mark=row['mark'],reason=str(e))) result={**audit,'layouts':layouts,'rebar_groups':groups,'errors':errors, 'pair_audit':audit_slab_pairs(frames,groups),'published':False, 'path_inputs':'hash-verified CAD layout evidence; no saved model paths', 'source_audit_sha256':hashlib.sha256(a.audit.read_bytes()).hexdigest()} with a.output.open('x')as out:json.dump(result,out,ensure_ascii=False,allow_nan=False) print(json.dumps(dict(groups=len(groups),errors=len(errors),pairs=result['pair_audit']['pass']))) if __name__=='__main__':main()