Files
2026-11-09 12:34:50 +03:30

43 خطوط
2.5 KiB
Python

"""PCB render and comparison inside the existing parser resource boundary."""
from . import parse_task # Apply CPU/address-space/output/FD limits before parsing.
import json
import sys
from pathlib import Path
from .documents import parse_document
from .pcb_diff import compare_pcbs
from .parser.record_decoder import ParseError
from .render import svg_document
def run():
source,destination,filename,identifier,kind=sys.argv[1:]
dest=Path(destination)
try:
if kind=='pcb_comparison':
manifest=json.loads(Path(source).read_text())
if manifest.get('schema_version')!='1.0' or manifest.get('document_type')!='pcb_comparison':
raise ParseError('Unsupported PCB comparison manifest')
old=parse_document((dest/'old.PcbDoc').read_bytes(),manifest['old_filename'],identifier+'-old',document_type='pcb')
new=parse_document((dest/'new.PcbDoc').read_bytes(),manifest['new_filename'],identifier+'-new',document_type='pcb')
report=compare_pcbs(old,new)
(dest/'data.json').write_text(json.dumps(report,ensure_ascii=False),encoding='utf-8')
for side,doc in [('old',old),('new',new)]:
annotations={c[f'{side}_id']:dict(id=c['id'],status=c['status'],bounds=c[f'{side}_bounds']) for c in report['changes'] if c[f'{side}_id'] is not None}
(dest/f'{side}.svg').write_bytes(svg_document(doc,annotations,id_prefix=side+'-'))
summary=dict(summary=report['summary'],total_changed=report['total_changed'])
elif kind=='pcb_render':
doc=parse_document(Path(source).read_bytes(),filename,identifier,document_type='pcb')
(dest/'data.json').write_text(doc.model_dump_json(),encoding='utf-8')
(dest/'drawing.svg').write_bytes(svg_document(doc))
summary={k:doc.metadata[k] for k in ('compatibility','record_count','component_count','primitive_count','net_count')}
summary.update(schema_version=doc.schema_version,diagnostics=[d.model_dump() for d in doc.diagnostics],layers=[l.model_dump() for l in doc.layers])
else:raise ParseError('Unsupported PCB job kind')
result=dict(ok=True,summary=summary)
except (ParseError,ValueError) as exc:
result=dict(ok=False,code='invalid_pcb',message=str(exc)[:500])
except Exception:
result=dict(ok=False,code='pcb_processing_error',message='PCB processing could not be completed')
(dest/'result.json').write_text(json.dumps(result),encoding='utf-8')
if __name__=='__main__':run()