tag mappin 소스 추가.

This commit is contained in:
김민성
2025-07-17 17:02:45 +09:00
parent 4b9161db45
commit 1a2d57a306
5 changed files with 313 additions and 36 deletions

22
.vscode/launch.json vendored Normal file
View File

@@ -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"
}
]
}

View File

@@ -33,54 +33,53 @@ ValueWithCoords = types.Schema(
SCHEMA_EXPRESSWAY = types.Schema( SCHEMA_EXPRESSWAY = types.Schema(
type=types.Type.OBJECT, type=types.Type.OBJECT,
properties={ properties={
"사업명": ValueWithCoords,
"시설_공구": ValueWithCoords,
"노선이정": ValueWithCoords,
"설계사": ValueWithCoords,
"시공사": ValueWithCoords,
"건설분야": ValueWithCoords,
"건설단계": ValueWithCoords,
"계정번호": ValueWithCoords,
"계정날짜": ValueWithCoords,
"개정내용": ValueWithCoords,
"작성자": ValueWithCoords,
"검토자": ValueWithCoords,
"확인자": ValueWithCoords,
"설계공구_Station": ValueWithCoords,
"시공공구_Station": ValueWithCoords,
"도면번호": ValueWithCoords,
"도면축척": ValueWithCoords,
"도면명": ValueWithCoords, "도면명": ValueWithCoords,
"편철번호": ValueWithCoords, "편철번호": ValueWithCoords,
"도면번호": ValueWithCoords,
"Main Title": ValueWithCoords,
"Sub Title": ValueWithCoords,
"수평축척": ValueWithCoords,
"수직축척": ValueWithCoords,
"적용표준버전": ValueWithCoords, "적용표준버전": ValueWithCoords,
"Note": ValueWithCoords, "사업명": ValueWithCoords,
"Title": ValueWithCoords, "시설_공구": ValueWithCoords,
"기타정보": ValueWithCoords, "설계공구_Station": ValueWithCoords,
"시공공구_Station": ValueWithCoords,
"건설분야": ValueWithCoords,
"건설단계": ValueWithCoords,
"설계사": ValueWithCoords,
"시공사": ValueWithCoords,
"노선이정": ValueWithCoords,
"계정번호": ValueWithCoords,
"계정날짜": ValueWithCoords,
"계정내용": ValueWithCoords,
"작성자": ValueWithCoords,
"검토자": ValueWithCoords,
"확인자": ValueWithCoords
}, },
) )
SCHEMA_TRANSPORTATION = types.Schema( SCHEMA_TRANSPORTATION = types.Schema(
type=types.Type.OBJECT, type=types.Type.OBJECT,
properties={ 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, "분야별책임자": ValueWithCoords,
"설계자": ValueWithCoords, "설계자": ValueWithCoords,
"위치정보": ValueWithCoords, "위치정보": ValueWithCoords
"축척": ValueWithCoords,
"도면번호": ValueWithCoords,
"도면명": ValueWithCoords,
"편철번호": ValueWithCoords,
"적용표준": ValueWithCoords,
"Note": ValueWithCoords,
"Title": ValueWithCoords,
"기타정보": ValueWithCoords,
}, },
) )
@@ -142,6 +141,7 @@ class GeminiAnalyzer:
"\n\n--- 지시사항 ---\n" "\n\n--- 지시사항 ---\n"
"위 텍스트와 좌표 정보를 바탕으로, 이미지의 내용을 분석하여 JSON 스키마를 채워주세요." "위 텍스트와 좌표 정보를 바탕으로, 이미지의 내용을 분석하여 JSON 스키마를 채워주세요."
"각 필드에 해당하는 텍스트를 찾고, 해당 텍스트의 'value'와 시작 'x', 'y' 좌표를 JSON에 기입하세요." "각 필드에 해당하는 텍스트를 찾고, 해당 텍스트의 'value'와 시작 'x', 'y' 좌표를 JSON에 기입하세요."
"해당하는 값이 없으면 빈 문자열을 사용하세요."
) )
contents = [ contents = [

169
mapping_table_json.json Normal file
View File

@@ -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"
}
}
}
}

View File

@@ -8,18 +8,14 @@ Version: 1.0.0
""" """
import flet as ft import flet as ft
import asyncio
import logging import logging
import os import os
from datetime import datetime
from typing import List, Optional
import time import time
# 프로젝트 모듈 임포트 # 프로젝트 모듈 임포트
from config import Config from config import Config
from multi_file_processor import MultiFileProcessor, BatchProcessingConfig, generate_default_csv_filename from multi_file_processor import MultiFileProcessor, BatchProcessingConfig, generate_default_csv_filename
from ui_components import MultiFileUIComponents from ui_components import MultiFileUIComponents
from utils import DateTimeUtils
# 로깅 설정 # 로깅 설정
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
@@ -297,10 +293,10 @@ class MultiFileApp:
# 상위 Container에서 텍스트 찾아서 업데이트 # 상위 Container에서 텍스트 찾아서 업데이트
try: try:
settings_container = e.control.parent.parent # Column -> Container 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}" text_control.value = f"동시 처리 수: {value}"
self.page.update() self.page.update()
except: except e: # noqa: E722
logger.warning("슬라이더 레이블 업데이트 실패") logger.warning("슬라이더 레이블 업데이트 실패")
def on_browse_csv_path_click(self, e): def on_browse_csv_path_click(self, e):

90
python_mapping_usage.py Normal file
View File

@@ -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