From 1a2d57a306bee08964cfc655abb277ab87b4a964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=84=B1?= Date: Thu, 17 Jul 2025 17:02:45 +0900 Subject: [PATCH] =?UTF-8?q?tag=20mappin=20=EC=86=8C=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 22 ++++++ gemini_analyzer.py | 60 +++++++------- mapping_table_json.json | 169 ++++++++++++++++++++++++++++++++++++++++ multi_file_main.py | 8 +- python_mapping_usage.py | 90 +++++++++++++++++++++ 5 files changed, 313 insertions(+), 36 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 mapping_table_json.json create mode 100644 python_mapping_usage.py diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..13295e4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요. + // 기존 특성에 대한 설명을 보려면 가리킵니다. + // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요. + "version": "0.2.0", + "configurations": [ + { + "name": "Python 디버거: main.py", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/main.py", + "console": "integratedTerminal" + }, + { + "name": "Python 디버거: 현재 파일", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + } + ] +} diff --git a/gemini_analyzer.py b/gemini_analyzer.py index c7558d5..5d8b9b0 100644 --- a/gemini_analyzer.py +++ b/gemini_analyzer.py @@ -33,54 +33,53 @@ ValueWithCoords = types.Schema( SCHEMA_EXPRESSWAY = types.Schema( type=types.Type.OBJECT, properties={ - "사업명": ValueWithCoords, - "시설_공구": ValueWithCoords, - "노선이정": ValueWithCoords, - "설계사": ValueWithCoords, - "시공사": ValueWithCoords, - "건설분야": ValueWithCoords, - "건설단계": ValueWithCoords, - "계정번호": ValueWithCoords, - "계정날짜": ValueWithCoords, - "개정내용": ValueWithCoords, - "작성자": ValueWithCoords, - "검토자": ValueWithCoords, - "확인자": ValueWithCoords, - "설계공구_Station": ValueWithCoords, - "시공공구_Station": ValueWithCoords, - "도면번호": ValueWithCoords, - "도면축척": ValueWithCoords, "도면명": ValueWithCoords, "편철번호": ValueWithCoords, + "도면번호": ValueWithCoords, + "Main Title": ValueWithCoords, + "Sub Title": ValueWithCoords, + "수평축척": ValueWithCoords, + "수직축척": ValueWithCoords, "적용표준버전": ValueWithCoords, - "Note": ValueWithCoords, - "Title": ValueWithCoords, - "기타정보": ValueWithCoords, + "사업명": ValueWithCoords, + "시설_공구": ValueWithCoords, + "설계공구_Station": ValueWithCoords, + "시공공구_Station": ValueWithCoords, + "건설분야": ValueWithCoords, + "건설단계": ValueWithCoords, + "설계사": ValueWithCoords, + "시공사": ValueWithCoords, + "노선이정": ValueWithCoords, + "계정번호": ValueWithCoords, + "계정날짜": ValueWithCoords, + "계정내용": ValueWithCoords, + "작성자": ValueWithCoords, + "검토자": ValueWithCoords, + "확인자": ValueWithCoords }, ) SCHEMA_TRANSPORTATION = types.Schema( type=types.Type.OBJECT, properties={ + "도면명": ValueWithCoords, + "편철번호": ValueWithCoords, + "도면번호": ValueWithCoords, + "Main Title": ValueWithCoords, + "Sub Title": ValueWithCoords, + "수평축척": ValueWithCoords, + "수직축척": ValueWithCoords, + "적용표준": ValueWithCoords, "사업명": ValueWithCoords, "시설_공구": ValueWithCoords, "건설분야": ValueWithCoords, "건설단계": ValueWithCoords, "계정차수": ValueWithCoords, "계정일자": ValueWithCoords, - "개정내용": ValueWithCoords, "과업책임자": ValueWithCoords, "분야별책임자": ValueWithCoords, "설계자": ValueWithCoords, - "위치정보": ValueWithCoords, - "축척": ValueWithCoords, - "도면번호": ValueWithCoords, - "도면명": ValueWithCoords, - "편철번호": ValueWithCoords, - "적용표준": ValueWithCoords, - "Note": ValueWithCoords, - "Title": ValueWithCoords, - "기타정보": ValueWithCoords, + "위치정보": ValueWithCoords }, ) @@ -142,6 +141,7 @@ class GeminiAnalyzer: "\n\n--- 지시사항 ---\n" "위 텍스트와 좌표 정보를 바탕으로, 이미지의 내용을 분석하여 JSON 스키마를 채워주세요." "각 필드에 해당하는 텍스트를 찾고, 해당 텍스트의 'value'와 시작 'x', 'y' 좌표를 JSON에 기입하세요." + "해당하는 값이 없으면 빈 문자열을 사용하세요." ) contents = [ diff --git a/mapping_table_json.json b/mapping_table_json.json new file mode 100644 index 0000000..19fa197 --- /dev/null +++ b/mapping_table_json.json @@ -0,0 +1,169 @@ +{ + "mapping_table": { + "ailabel_to_systems": { + "도면명": { + "molit": "DI_TITLE", + "expressway": "TD_DNAME_MAIN", + "railway": "TD_DNAME_MAIN", + "docaikey": "DNAME_MAIN" + }, + "편철번호": { + "molit": "DI_SUBTITLE", + "expressway": "TD_DNAME_BOT", + "railway": "TD_DNAME_BOT", + "docaikey": "DNAME_BOT" + }, + "도면번호": { + "molit": "DA_PAGENO", + "expressway": "TD_DWGNO", + "railway": "TD_DWGNO", + "docaikey": "DWGNO" + }, + "Main Title": { + "molit": "DI_DRWNO", + "expressway": "TD_DWGCODE", + "railway": "TD_DWGCODE", + "docaikey": "DWGCODE" + }, + "Sub Title": { + "molit": "UD_TITLE", + "expressway": "TB_MTITIL", + "railway": "TB_MTITIL", + "docaikey": "MTITIL" + }, + "수평축척": { + "molit": "UD_SUBTITLE", + "expressway": "TB_STITL", + "railway": "TB_STITL", + "docaikey": "STITL" + }, + "수직축척": { + "molit": "", + "expressway": "TD_DWGCODE_PREV", + "railway": "", + "docaikey": "DWGCODE_PREV" + }, + "도면축척": { + "molit": "DA_HSCALE", + "expressway": "TD_HSCAL", + "railway": "", + "docaikey": "HSCAL" + }, + "적용표준버전": { + "molit": "DA_STDNAME", + "expressway": "STDNAME", + "railway": "", + "docaikey": "" + }, + "사업명": { + "molit": "DA_STDVER", + "expressway": "TD_VERSION", + "railway": "TD_VERSION", + "docaikey": "VERSION" + }, + "시설_공구": { + "molit": "PI_CNAME", + "expressway": "TB_CNAME", + "railway": "", + "docaikey": "TBCNAME" + }, + "설계공구_Station": { + "molit": "UD_CDNAME", + "expressway": "TB_CSCOP", + "railway": "", + "docaikey": "CSCOP" + }, + "건설분야": { + "molit": "PA_CCLASS", + "expressway": "TD_FIELD", + "railway": "TD_FIELD", + "docaikey": "FIELD" + }, + "건설단계": { + "molit": "PI_STAGE", + "expressway": "TD_CSTEP", + "railway": "TD_CSTEP", + "docaikey": "CSTEP" + }, + "설계사": { + "molit": "TD_DCOMP", + "expressway": "TD_DCOMP", + "railway": "", + "docaikey": "DCOMP" + }, + "시공사": { + "molit": "TD_CCOMP", + "expressway": "TD_CCOMP", + "railway": "", + "docaikey": "CCOMP" + }, + "노선이정": { + "molit": "TD_LNDST", + "expressway": "", + "railway": "", + "docaikey": "LNDST" + }, + "계정번호": { + "molit": "DC_RNUM1", + "expressway": "TR_RNUM1", + "railway": "TR_RNUM1", + "docaikey": "RNUM1" + }, + "계정날짜": { + "molit": "DC_RDATE1", + "expressway": "TR_RDAT1", + "railway": "TR_RDAT1", + "docaikey": "RDAT1" + }, + "개정내용": { + "molit": "DC_RDES1", + "expressway": "TR_RCON1", + "railway": "TR_RCON1", + "docaikey": "RCON1" + }, + "작성자": { + "molit": "DC_RDGN1", + "expressway": "TR_DGN1", + "railway": "TR_DGN1", + "docaikey": "DGN1" + }, + "검토자": { + "molit": "DC_RCHK1", + "expressway": "TR_CHK1", + "railway": "TR_CHK1", + "docaikey": "CHK1" + }, + "확인자": { + "molit": "DC_RAPP1", + "expressway": "TR_APP1", + "railway": "TR_APP1", + "docaikey": "APP1" + } + }, + "system_mappings": { + "expressway_to_transportation": { + "TD_DNAME_MAIN": "DNAME_MAIN", + "TD_DNAME_BOT": "DNAME_BOT", + "TD_DWGNO": "DWGNO", + "TD_DWGCODE": "DWGCODE", + "TB_MTITIL": "MTITIL", + "TB_STITL": "STITL", + "TD_DWGCODE_PREV": "DWGCODE_PREV", + "TD_HSCAL": "HSCAL", + "TD_VERSION": "VERSION", + "TB_CNAME": "TBCNAME", + "TB_CSCOP": "CSCOP", + "TD_FIELD": "FIELD", + "TD_CSTEP": "CSTEP", + "TD_DCOMP": "DCOMP", + "TD_CCOMP": "CCOMP", + "TR_RNUM1": "RNUM1", + "TR_RDAT1": "RDAT1", + "TR_RCON1": "RCON1", + "TR_DGN1": "DGN1", + "TR_CHK1": "CHK1", + "TR_APP1": "APP1" + } + } + } +} \ No newline at end of file diff --git a/multi_file_main.py b/multi_file_main.py index ab623d3..ef1fc7d 100644 --- a/multi_file_main.py +++ b/multi_file_main.py @@ -8,18 +8,14 @@ Version: 1.0.0 """ import flet as ft -import asyncio import logging import os -from datetime import datetime -from typing import List, Optional import time # 프로젝트 모듈 임포트 from config import Config from multi_file_processor import MultiFileProcessor, BatchProcessingConfig, generate_default_csv_filename from ui_components import MultiFileUIComponents -from utils import DateTimeUtils # 로깅 설정 logging.basicConfig(level=logging.INFO) @@ -297,10 +293,10 @@ class MultiFileApp: # 상위 Container에서 텍스트 찾아서 업데이트 try: settings_container = e.control.parent.parent # Column -> Container - text_control = settings_container.content.controls[2].controls[1].controls[0] # 해당 텍스트 + text_control = settings_container.controls[0] text_control.value = f"동시 처리 수: {value}개" self.page.update() - except: + except e: # noqa: E722 logger.warning("슬라이더 레이블 업데이트 실패") def on_browse_csv_path_click(self, e): diff --git a/python_mapping_usage.py b/python_mapping_usage.py new file mode 100644 index 0000000..e434123 --- /dev/null +++ b/python_mapping_usage.py @@ -0,0 +1,90 @@ +import json + +# JSON 매핑 테이블 로드 +def load_mapping_table(json_file_path): + """매핑 테이블 JSON 파일을 로드합니다.""" + with open(json_file_path, 'r', encoding='utf-8') as file: + return json.load(file) + +class FieldMapper: + def __init__(self, mapping_data): + self.mapping_data = mapping_data + self.ailabel_to_systems = mapping_data['mapping_table']['ailabel_to_systems'] + self.system_mappings = mapping_data['mapping_table']['system_mappings'] + + def ailabel_to_expressway(self, ailabel): + """AI 라벨을 고속도로공사 필드명으로 변환""" + if ailabel in self.ailabel_to_systems: + return self.ailabel_to_systems[ailabel]['expressway'] + return None + + def expressway_to_transportation(self, expressway_field): + """고속도로공사 필드명을 교통부 필드명으로 변환""" + if expressway_field in self.system_mappings['expressway_to_transportation']: + return self.system_mappings['expressway_to_transportation'][expressway_field] + return None + + def ailabel_to_transportation_via_expressway(self, ailabel): + """AI 라벨 → 고속도로공사 → 교통부 순서로 변환""" + expressway_field = self.ailabel_to_expressway(ailabel) + if expressway_field: + return self.expressway_to_transportation(expressway_field) + return None + + def get_all_system_fields(self, ailabel): + """AI 라벨에 해당하는 모든 시스템의 필드명을 반환""" + if ailabel in self.ailabel_to_systems: + return self.ailabel_to_systems[ailabel] + return None + +# 사용 예제 +if __name__ == "__main__": + # 매핑 테이블 로드 + mapping_data = load_mapping_table('mapping_table.json') + mapper = FieldMapper(mapping_data) + + # 사용 사례 1: AILABEL => EXPRESSWAY + print("=== AI 라벨 → 고속도로공사 필드명 변환 ===") + test_labels = ["도면명", "편철번호", "도면번호", "Main Title", "계정번호"] + + for label in test_labels: + expressway_field = mapper.ailabel_to_expressway(label) + print(f"{label} → {expressway_field}") + + print("\n=== 고속도로공사 → 교통부 필드명 변환 ===") + # 사용 사례 2: EXPRESSWAY => TRANSPORTATION + expressway_fields = ["TD_DNAME_MAIN", "TD_DWGNO", "TD_DWGCODE", "TR_RNUM1"] + + for field in expressway_fields: + transportation_field = mapper.expressway_to_transportation(field) + print(f"{field} → {transportation_field}") + + print("\n=== AI 라벨 → 고속도로공사 → 교통부 (연속 변환) ===") + # 연속 변환 예제 + for label in test_labels: + transportation_field = mapper.ailabel_to_transportation_via_expressway(label) + expressway_field = mapper.ailabel_to_expressway(label) + print(f"{label} → {expressway_field} → {transportation_field}") + + print("\n=== 특정 AI 라벨의 모든 시스템 필드명 ===") + # 모든 시스템 필드명 조회 + all_fields = mapper.get_all_system_fields("도면명") + if all_fields: + print("도면명에 해당하는 모든 시스템 필드:") + for system, field in all_fields.items(): + print(f" {system}: {field}") + +# 배치 처리 함수 +def batch_convert_ailabel_to_expressway(mapper, ailabels): + """여러 AI 라벨을 한번에 고속도로공사 필드명으로 변환""" + results = {} + for label in ailabels: + results[label] = mapper.ailabel_to_expressway(label) + return results + +def batch_convert_expressway_to_transportation(mapper, expressway_fields): + """여러 고속도로공사 필드를 한번에 교통부 필드명으로 변환""" + results = {} + for field in expressway_fields: + results[field] = mapper.expressway_to_transportation(field) + return results \ No newline at end of file