import sys, json, re sys.path.insert(0, 'pylib') import ezdxf SRC = r"D:\★Pier 자료\심수석님 검토 파일\검토_옥성교P1\옥성교P1.dxf" OUT = r"D:\★Pier 자료\심수석님 검토 파일\검토_옥성교P1\옥성교P1_도면검토_색구분.dxf" S = json.load(open('ok_shapes.json', encoding='utf-8')) T = json.load(open('ok_texts.json', encoding='utf-8')) raw = json.load(open('ok_shape_raw.json', encoding='utf-8')) cell = {} for e in S: cell.setdefault(e['mark'], (e['x'], e['y'])) rowy = {} for x, y, l, t, h in T: if l == 'CS-TABL-TEX2' and round(x) == 715129 and 324000 < y < 340000 and re.match(r'^([A-Z]{1,2}\d+|UM)$', t.strip()): rowy[t.strip()] = y CODES = {} def add(code, marks): for m in marks: CODES.setdefault(m, []).append(code) add('M-1', ['UM']) add('M-2', ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B10', 'B11', 'B12', 'C14', 'C16', 'C17']) add('M-3', ['C7']) add('M-4', ['C8', 'C9', 'C10', 'C11', 'C12', 'C13']) add('M-5', ['C14', 'C15', 'C16', 'C17']) add('M-6', ['C18']) add('M-7', ['C8', 'C9', 'C10', 'C11', 'C12', 'C13', 'C14', 'C16', 'B9', 'B10', 'B11', 'B12', 'C18', 'C19', 'C20', 'S1', 'S2']) add('M-8', ['P3', 'P4']) CODES.setdefault('P5', []).append('미확인') def kind(codes): if any(c in ('M-1', 'M-2', 'M-3', 'M-4', 'M-5', 'M-6') for c in codes): return 'dm' if 'M-7' in codes: return 'kj' return 'mh' doc = ezdxf.readfile(SRC) msp = doc.modelspace() LAY = {'dm': ('검토_도면모델_주황', 30), 'kj': ('검토_기준모델_진한노랑', 41), 'mh': ('검토_미확인_회색', 9)} for k, (n, c) in LAY.items(): doc.layers.add(n, color=c) if 'KR_REVIEW' not in doc.styles: doc.styles.add('KR_REVIEW', font='malgun.ttf') def rect(x0, y0, x1, y1, k, w=40): msp.add_lwpolyline([(x0, y0), (x1, y0), (x1, y1), (x0, y1)], close=True, dxfattribs={'layer': LAY[k][0], 'const_width': w}) def label(x, y, s, k, h=420): msp.add_text(s, height=h, dxfattribs={'layer': LAY[k][0], 'style': 'KR_REVIEW', 'insert': (x, y)}) n = 0 for mk, codes in CODES.items(): k = kind(codes) s = '·'.join(codes) if mk in rowy: y = rowy[mk] rect(714800, y - 130, 722300, y + 150, k) label(722450, y - 130, s, k, 300) n += 1 if mk in cell: x, y = cell[mk] rect(x - 2100, y - 420, x + 3700, y + 330, k) label(x + 2300, y + 360, s, k, 260) n += 1 for mk, m_codes in (('C7', 'M-3'), ('C8', 'M-4'), ('C9', 'M-4')): x, y = cell[mk] rect(x - 2100, y + 330, x + 3700, y + 2650, 'dm', 30) label(x - 2000, y + 2700, m_codes + ' ' + mk + ' 형상', 'dm', 300) # j 글자 (M-2) for x, y, t, l in raw['texts']: if x > 600000 and re.match(r'\s*j\s*=', t): rect(x - 150, y - 120, x + 2100, y + 330, 'dm', 25) n += 1 # UM 기초 조립용 철근 상세 rect(649500, 318500, 661500, 326500, 'dm', 60) label(649600, 326700, 'M-1 UM 기초 조립용 철근 (모델에 없음)', 'dm', 450) # 범례 lx, ly = 690000, 349000 label(lx, ly, '【검토 표시 범례】 도면 ↔ 모델 상이점 (2026-10-19, 미확정)', 'dm', 420) label(lx, ly - 600, '주황: 도면↔모델 M-1 UM누락 / M-2 j 미작도 / M-3 C7 형상 / M-4 C8~C13 / M-5 C14~C17 / M-6 C18', 'dm', 300) label(lx, ly - 1000, '진한 노랑: 기준(KDS)↔모델 M-7 굽힘 내면지름', 'kj', 300) label(lx, ly - 1400, '회색: 미확인 M-8 P3·P4 이음 각도, P5 끝 길이', 'mh', 300) doc.saveas(OUT) print('saved', n)