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(
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 = [

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 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):

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