32 lines
1.8 KiB
Python
32 lines
1.8 KiB
Python
"""Read sample folders, preserving conversion inventory and workbook conventions."""
|
|
import sys,json,re
|
|
from pathlib import Path
|
|
from concurrent.futures import ThreadPoolExecutor,as_completed
|
|
from openpyxl import load_workbook
|
|
ROOT=Path(__file__).resolve().parents[3]
|
|
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'src'))
|
|
from bridge_drawing_extractor.core import convert,write_json
|
|
from bridge_drawing_extractor.semantic import classify
|
|
OUT=ROOT/'outputs/sample_batch_20261029';OUT.mkdir(exist_ok=True)
|
|
EXE=ROOT/'Code/giyang_extract/libredwg/dwgread.exe'
|
|
folders=sorted([p for p in ROOT.glob('엔지니어(sample*') if p.is_dir()],key=lambda p:int(re.search(r'sample(\d+)',p.name)[1]))
|
|
inventory=[];templates=[]
|
|
for folder in folders:
|
|
for f in sorted(folder.glob('*.xlsx')):
|
|
w=load_workbook(f,data_only=False)
|
|
templates.append(dict(path=str(f),sheets={s.title:[dict(cell=c.coordinate,value=c.value,comment=c.comment.text if c.comment else None) for row in s for c in row if c.value is not None or c.comment] for s in w}))
|
|
write_json(OUT/'template_inventory.json',templates)
|
|
jobs=[p for folder in folders for p in folder.rglob('*') if p.suffix.lower()=='.dwg']
|
|
def read(p):
|
|
try:
|
|
d=convert(p,OUT/'.cache',EXE)
|
|
return dict(path=str(p),folder=p.parent.name,sha256=d['sha256'],roles=classify(d['texts']),count=len(d['texts']))
|
|
except Exception as e:return dict(path=str(p),folder=p.parent.name,error=str(e))
|
|
with ThreadPoolExecutor(max_workers=3) as pool:
|
|
futures={pool.submit(read,p):p for p in jobs}
|
|
for future in as_completed(futures):
|
|
item=future.result();inventory.append(item)
|
|
print(f'{len(inventory)}/{len(jobs)} {Path(item["path"]).name}: {item.get("roles",item.get("error"))}',flush=True)
|
|
write_json(OUT/'inventory.json',inventory)
|
|
print('DONE',len(inventory),flush=True)
|