Update Pier_v1 project

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
CopilotandCopilot committed 2026-11-03 12:04:58 +09:00
1 parent f25e36c050
commit ad73ddec2b
2476 files changed
+3423 -4902

No files matched your search

Binary file not shown.
@@ -0,0 +1,19 @@
# 12개 교량 추출 검증
담당: Codex. 상태: DONE(결과 전달), 미확정 필드 유지. 작성·검증 동일 주체.
|검사|판정|방법·모집단|
|---|---|---|
|출력 형태/저장값|PASS|12 XLSX 재읽기, JSON과 6,164셀 전수 대조|
|기둥 수/치수/좌표|PASS|64교각: 형식별 개수, 최대 받침거리 및 IP1~3 거리 초과 500mm, IP 중복 검사|
|받침 수/전후열|PASS|652받침 전수 행 수 및 전후열 값 검사|
|원본 무결성|PASS|127 DWG SHA256 최초 inventory와 대조|
|회귀검사|PASS|unittest test_*.py 13개|
|요청값 완전성|FAIL|288셀 미확정. 252셀은 대호지교 필수 출처 미제공. 나머지는 상충 또는 판독근거 부족|
|시각 판독|부분|대표 교각 형상, 종평면 일부 이미지 확인. 전수 독립 판독 아님|
|스크립트 보관|PASS|tools/extract_samples.py, verify_samples.py, render_profiles.py|
|승인/위임|N/A|사용자가 요청한 로컬 출력. 외부 전송·공개·삭제·위임 없음|
결과 정본: `추출결과_12개교량_20261029/`. 세부 미확정 항목은 `00_추출현황_미확정목록.xlsx` 참조. 기존 입력 엑셀은 대응 식별 기준으로 사용했고, 출력 수치는 CAD 문자에서 재추출했습니다. 계문철교 중복 P1 블록은 P2로 보정했습니다. 배포 wheel은 이번에 재빌드하지 않았습니다.
검증 중 최초 총 받침 예상치를 752로 잘못 합산하여 검사가 실패했습니다. 교량별 실제 개수를 재합산한 652로 기대값을 수정했고, 행 단위 검사 및 최종 검증이 통과했습니다.
+5
View File
@@ -0,0 +1,5 @@
include README.md
recursive-include examples *.py
recursive-include tests *.py
recursive-include src/bridge_drawing_extractor/layouts *.json
include src/bridge_drawing_extractor/py.typed
+165
View File
@@ -0,0 +1,165 @@
# bridge-drawing-extractor
Python으로 다른 프로그램에 연결하는 오프라인 교각 도면 추출 라이브러리입니다. GUI·AI API·네트워크 연결 없이 폴더의 DWG를 읽고 Pier/IP/Bearing 엑셀, 근거 JSON, 검토 CSV를 만듭니다.
패키지 버전: **0.1.5** (프로그램 v0.1.05).
## 설치
Python 3.10 이상이 필요합니다. Windows/Python 3.12에서 실행 검증했습니다.
```console
python -m pip install --upgrade bridge_drawing_extractor-0.1.5-py3-none-any.whl
```
Python 의존성은 `openpyxl>=3.1,<4`입니다. 인터넷 없는 PC는 openpyxl과 그 의존성 et-xmlfile도 미리 설치하거나 설치 파일을 함께 준비하세요. 의존성이 이미 설치되었다면 `--no-index --no-deps` 옵션으로 wheel만 설치할 수 있습니다.
DWG 변환기는 **LibreDWG dwgread**를 별도로 준비합니다. 이 패키지는 변환기를 내려받거나 포함하지 않습니다. 탐색 우선순위:
1. API의 `converter_path` / CLI의 `--converter`
2. 환경변수 `BRIDGE_DWGREAD`
3. 실행 환경의 `PATH`에서 `dwgread` 또는 `dwgread.exe`
명시한 경로가 틀리면 다른 변환기로 조용히 대체하지 않고 오류를 반환합니다. 현재 작업 PC에서는 기존 `Code/giyang_extract/libredwg/dwgread.exe`를 사용할 수 있습니다. 다른 프로그램/PC에서는 해당 경로를 호스트 프로그램의 설정값으로 전달하세요. 패키지 실행에 이 프로젝트 폴더는 필요하지 않습니다.
## Python API
```python
from bridge_drawing_extractor import extract_folder, ExtractionError
try:
result = extract_folder(
r"D:\drawings\bridge_a",
output_dir=r"D:\results",
converter_path=r"C:\tools\libredwg\dwgread.exe",
on_progress=lambda message: print(message),
)
except ExtractionError as error:
print(f"추출 실패: {error}")
else:
print(result.status) # completed 또는 needs_review
for workbook in result.workbooks:
print(workbook.xlsx_path)
pier_cells = workbook.data["cells"]["Pier"]
bearing_cells = workbook.data["cells"]["Bearing"]
review_records = [
row for row in workbook.data["records"]
if row["status"] not in ("추출", "식별자", "등록값")
]
response = result.to_dict() # JSON 직렬화 가능한 dict, Path는 문자열로 변환
```
`extract_folder(folder, *, output_dir=None, converter_path=None, on_progress=None)`는 동기 함수입니다. GUI나 비동기 웹 서버에서는 작업 스레드/프로세스에서 호출하세요. 콜백에는 진행 메시지 문자열이 전달됩니다. 함수가 GUI 창이나 서버를 열지 않습니다.
출력 경로를 생략하면 입력 폴더의 `_도면추출결과`에 실행별 폴더를 만듭니다. 쓰기 권한이 필요합니다. 원본 DWG와 기존 결과는 수정하지 않습니다.
환경 확인:
```python
from bridge_drawing_extractor import check_environment
print(check_environment(converter_path=r"C:\tools\libredwg\dwgread.exe"))
```
## 반환 형식
`ExtractionResult`:
- `schema_version`: 현재 `"1.0"`. 패키지 버전과 별도인 결과 규약 버전.
- `output_dir`: 생성된 실행 폴더의 `Path`.
- `workbooks`: `WorkbookResult` 튜플.
- `files`: 입력 파일별 역할·상태·실패 사유 목록.
- `review_count`, `failed_file_count`: 검토 셀 및 읽기 실패 파일 수.
- `status`: 검토 항목이나 읽기 실패가 있으면 `needs_review`, 없으면 `completed`.
- `to_dict(include_data=True)`: JSON 직렬화 가능. `False`는 큰 원문 데이터를 제외한 요약.
`WorkbookResult`: `name`, `xlsx_path`, `json_path`, `review_csv_path`, `review_count`, `data`.
`data["cells"]`는 시트별 Excel 셀 주소와 값의 매핑입니다. `data["records"]`에는 `sheet`, `cell`, `value`, `status`, `messages`, `note`, `evidence`가 있습니다. 각 행의 B열이 교각명이며, IP/Bearing의 C열은 지시점/받침번호입니다. 값은 숫자·문자·null이며 미확정 숫자는 0으로 대체하지 않습니다. 상충값은 messages/evidence에 보존합니다.
실행 성공은 설계값 확정을 뜻하지 않습니다. 파일 일부 읽기 실패가 있어도 결과를 만들 수 있으면 반환되므로 반드시 `status`와 `files`를 확인하세요. 치명 오류는 `ExtractionError`로 전달하며 기존 파일은 보존됩니다. 프로그래밍 오류는 예상치 못한 예외로 전파될 수 있습니다.
## Python이 아닌 프로그램에서 호출
```console
bridge-extract "D:\drawings" --output "D:\results" --converter "C:\tools\dwgread.exe"
python -m bridge_drawing_extractor "D:\drawings" --converter "C:\tools\dwgread.exe"
python -m bridge_drawing_extractor --check --converter "C:\tools\dwgread.exe"
```
- stdout: JSON 결과 한 건. `--include-data`를 추가하면 셀·근거 데이터 포함.
- stderr: 진행 로그. 한글 포함 UTF-8로 처리하세요.
- 종료 코드 0: 결과 생성 완료. JSON의 `needs_review`는 별도 확인 필요.
- 종료 코드 1: 추출 실패, stdout의 `status="error"`와 `error` 확인.
- 종료 코드 2: 잘못된 CLI 인자 또는 `--check`에서 변환기 미발견.
따라서 C#·Java·다른 Python 프로세스에서도 stdout JSON과 종료 코드로 연결할 수 있습니다. HTTP 서버·인증·작업 큐는 호스트 프로그램에서 관리합니다.
## 지원 범위
파일명은 판독 조건으로 사용하지 않습니다. 폴더 내 DWG를 먼저 열고 내부 제목·표 머리글·교각 번호·EL 표기를 읽어 종평면, 교각, 받침배치, ELEVATION 산출근거 역할을 판단합니다. 내부 제목도 교각도/교각구조도/교각일반도, 종단면도/종평면도 등 변형을 허용하며, 제목이 없어도 알려진 표 구조를 검사합니다. 식별 못한 파일은 `files` 및 파일판독내역 JSON에 `역할 미확정`으로 기록합니다.
| 추출 항목 | 적용 출처 |
|---|---|
| 교각형식 | 기본 T형 (사용자 지정) |
| 두부보 EL | ELEVATION 산출근거표의 교각별 교좌면 EL 최솟값 |
| 두부보 폭 | 교각별 모든 받침 X·Y의 최대 평면거리보다 큰 다음 500mm 단위 |
| 두부보 길이 | IP1-IP3 평면거리보다 큰 다음 500mm 단위 |
| 기초하단 EL, 지반고 EL, 기초형식, 말뚝길이 | 종평면도 역할 |
| IP 좌표 | 받침배치도 역할 |
| 받침 X·Y·방위각 | 받침배치도 역할 |
| 받침 Z | ELEVATION 산출근거표의 교량받침 EL(몰탈상단) |
| 기둥 개수 | T형 1개, π형 2개 (기본형식은 T형 유지) |
| 말뚝길이 | 종평면도의 길이/범위 중 최솟값, mm 단위 |
| 받침 전열/후열 | 받침배치도 표제의 전·후열과 교각/받침번호 연결 |
0.1.5부터 Pier H열은 m 대신 **mm**입니다. 예: 7~12m → 7000mm. Bearing H열에 **전열/후열**을 추가했으며 기존 방위각 G열은 유지합니다. 기존 연동 프로그램이 H열 길이를 m로 간주하거나 받침 열 수를 고정했다면 수정해야 합니다. 전후열 표기가 없거나 충돌하면 임의로 판단하지 않고 미확인/미확정으로 둡니다.
0.1.4부터 교각일반도는 사용하지 않습니다. ELEVATION 표의 교각명·받침번호·몰탈상단·교좌면 열을 연결합니다. 받침배치도에 방향 표기가 있으면 같은 방향의 표만 사용합니다. 동일 받침의 여러 표 값이 충돌하면 미확정으로 남깁니다. 필요한 표고가 없을 때 과거 교각일반도 값으로 대체하지 않습니다. 기둥 개수는 T형 1개, π형 2개로 입력합니다.
거리 단위는 좌표 m를 mm로 변환합니다. 6,200mm → 6,500mm, 정확히 6,500mm → 7,000mm입니다. 폭은 모든 받침 쌍의 유클리드 거리 최댓값이며, 길이는 IP1-IP3 직선거리입니다. 좌표 누락·상충이나 IP 번호 미확정이면 해당 치수를 비웁니다. T형은 `기본값`, 치수와 최소 표고는 `산정값`으로 엑셀 주석·검토 CSV에 구분합니다.
ELEVATION 원문은 `data["supplementary_drawings"]`에 보존하고 `data["source_policy"]`에 항목별 출처 규약을 제공합니다. 알 수 없는 표 구조까지 자동 해석한다는 뜻은 아닙니다.
DWG 문자 내용으로 파일 역할을 분류하고 좌표표 헤더·교각 번호·상대 배치를 판독합니다. 기존 산외교/기양천교의 배치 자료가 패키지에 포함됩니다. 새 명시형 제원표는 헤더로 읽습니다.
모든 설계사 도면의 자유 형상, OCR, 회전/비균일 변형, 블록 좌표 변환을 자동 해석하는 범용 도구는 아닙니다. 판독 근거가 모호한 항목은 공란과 검토 사유로 남깁니다. 입력 폴더에 여러 교량/개정본이 섞여 있으면 분리된 교량 폴더를 권장합니다. 기존 탐색 제외 폴더(backup, temp, outputs, Code, RAG, 숨김 폴더 등) 규칙을 유지합니다.
## 개발·빌드
```console
python -m pip install .
python -m build
```
네트워크 없이 이미 설치된 setuptools/wheel만 사용하는 개발 환경에서는 `python setup.py sdist bdist_wheel`도 가능합니다. 결과는 `dist/`에 생성됩니다.
`tools/import_engine.py`는 최초 이관 스크립트이며 실행 의존성이 아닙니다. 이관 완료 후의 실행 정본은 `src/bridge_drawing_extractor/`입니다. 종전 데스크톱 앱은 별도로 보존되어 있으며 자동 동기화하지 않습니다.
## 변경 이력
| 버전 | 날짜 | 내용 |
|---|---|---|
| 0.1.5 | 2026-10-29 | T/π형 기둥 수, 말뚝길이 최소 mm, 방위각 옆 전열/후열 열 |
| 0.1.4 | 2026-10-28 | 교각일반도 제외, 기본 T형, 좌표 기반 500mm 치수, ELEVATION 몰탈상단 Z·교좌면 최소 EL |
| 0.1.3 | 2026-10-28 | 내부 도면명 변형 및 표 구조 분류 확장, ELEVATION 근거 원문 포함, 받침 Z 출처 분리 |
| 0.1.2 | 2026-10-28 | GUI 없는 import API, JSON CLI, 상대 모듈 import, 내장 배치 데이터, 외부 변환기 설정, wheel/sdist |
## 0.1.6 — 도면 폴더 입력 통합 (2026-10-29)
기존 엑셀 없이 `extract_folder()` 또는 도면추출 실행 바로가기로 DWG 폴더를 처리합니다. 파일명 대신 내부 문자로 종평면/받침배치/ELEVATION 역할을 분류합니다. 단독 표와 좌표·표고 통합표를 읽고, 받침 좌표 범위에 유일하게 대응하는 IP 3점을 위→아래로 정렬합니다. 교각 형식의 명시적 표기가 없으면 T형/1기둥을 기본값으로 표시합니다.
종평면의 표 데이터 또는 교각 주변 EL·지반고·기초·L 표기를 연결합니다. 인접 문자 추정값에는 지시선 검토 필요 표시가 붙습니다. 여러 방향/개정 도면의 동일 번호 값이 다르면 상충으로 남깁니다. 이미지형 PDF/OCR, 임의 형상의 기둥 개수 인식, 모든 종단 지반고 표의 측점 보간은 지원하지 않습니다. 이 경우 빈칸과 근거를 반환하며 완전 자동 확정을 보장하지 않습니다.
GUI: 폴더 선택 → 자동 추출 시작 → 결과 폴더 열기. 결과는 선택 폴더의 `_도면추출결과` 아래 실행 시각별 XLSX/JSON/CSV로 저장합니다. 외부 API/토큰/네트워크 호출은 없습니다. 외부 연동 API는 기존과 동일합니다. 이번 배치의 사람이 판독한 12개 결과는 별도로 유지되며 일반 추출 결과와 동일하지 않을 수 있습니다.
검증: 단위/회귀 16개, 실제 파일명을 바꾼 DWG-only 폴더(등록 레이아웃 비활성) 2교각·28받침·IP6점 추출, GUI 작업 스레드/출력 완료 시험. 재현 스크립트는 tests/test_folder_inference.py, tests/folder_only_smoke.py, tests/desktop_smoke.py에 있습니다.
## 0.1.7 — 두부보 폭 규칙 변경
두부보 폭 = ceil((전열·후열 받침 좌표 평균점 사이 거리_mm + 2000) / 500) × 500. 합계가 정확히 500mm 배수이면 그대로 유지합니다(예: 1500+2000=3500mm). 두 열 구분 또는 좌표가 부족하면 미확정 처리합니다. 두부보 길이 규칙은 유지합니다. 기존 12개 결과의 폭만 재계산한 사본은 추출결과_12개교량_20261029/두부보폭_전후열거리_2m반영 폴더에 있습니다.
## 0.1.8 — 블록·표선·지시선 기반 판독 보강
DWG의 모델/배치 공간 및 중첩 INSERT를 이동·회전·축척·기준점으로 전개합니다. 미삽입 블록 정의의 문자를 본도면 문자로 읽지 않습니다. LINE/LWPOLYLINE/LEADER 선분을 보관하고 표의 실제 가로선으로 행을 대응하며, 단순한 EL/GL 지시선은 연결된 끝점을 사용합니다. 블록 전개가 불가능한 경우 변환 경고를 남깁니다. 구버전 캐시는 자동 재생성합니다.
IP 검색은 받침 외곽 밖의 지시점까지 허용하되, 경쟁 교각·중복 후보·3점 불충족은 미확정으로 유지합니다. 종평면 말뚝 표기는 국부 기초 EL이 확인되는 영역에 한정하여 평면도 교각 번호와 다른 기초가 연결되는 것을 줄였습니다.
일반 형상으로 기둥 개수를 세거나, 모든 복잡한 지시선을 해석하거나, 스캔 PDF에 OCR을 수행하는 기능은 이번 버전에 포함하지 않았습니다. 양방향 번호 중복·개정 도면 상충도 자동 확정하지 않습니다. 12개 도면 비교의 수치 차이와 미확정을 통과로 처리하지 않으며 geometry_comparison 보고서에 보존합니다.
+23
View File
@@ -0,0 +1,23 @@
[build-system]
requires = ["setuptools>=61", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "bridge-drawing-extractor"
version = "0.1.9"
description = "Offline DWG bridge drawing extraction with Python API and JSON CLI"
readme = "README.md"
requires-python = ">=3.10"
dependencies = ["openpyxl>=3.1,<4"]
[project.scripts]
bridge-extract = "bridge_drawing_extractor.cli:main"
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
bridge_drawing_extractor = ["layouts/*.json", "py.typed"]
+3
View File
@@ -0,0 +1,3 @@
"""Local offline build entry; metadata lives in pyproject.toml."""
from setuptools import setup
setup()
@@ -0,0 +1,17 @@
# 폴더 자동추출 통합 0.1.6
요청 원문: `rㅡ렇게 해줘` (직전 제안: 기존 엑셀 없이 폴더만 입력하여 도면 분류·교각/좌표/표고 연결·미확정 표시 기능 통합).
수정: inference.py 신규. 일반 좌표 지시점 파싱, 받침 범위에 대응하는 IP 3점 연결 및 도면 위→아래 정렬, 종평면 교각 인접 표기 대응, 통합 좌표/ELEVATION 표 읽기. automatic.py와 기존 desktop_app.py에 연결. 원본 도면/기존 배치 결과는 수정하지 않음. 등록 레이아웃의 상충값은 인접 문자 추정으로 덮어쓰지 않음.
검증 결과(동일 작성자의 자기검증):
- PASS: 단위/회귀 16/16. 불완전 IP, 좌표 상충, 좌우 EL 상충, 말뚝 범위/VAR, 기존 엑셀 없는 신규 레이아웃 포함.
- PASS: 실제 계문철교 DWG 5개를 임의 이름으로 복사, XLSX 입력 및 등록 레이아웃 제외. 2교각·28받침·6 IP점 및 출력 XLSX/JSON/CSV 확인.
- PASS: GUI 작업 스레드 실행→엑셀 생성→완료 상태. 실행 바로가기가 수정된 desktop_app.py를 참조하는 것 확인.
- PASS: 별도 경로에 0.1.6 wheel 설치 후 실제 DWG API 호출 및 IP/받침 수 확인.
- 부분: 12개 CAD 묶음의 등록 레이아웃 비활성 시험에서 모든 묶음의 교각/받침이 읽혔지만, 복수 방향/개정 좌표와 명시되지 않은 지반고 등 미확정 존재. 이 시험의 최초 집계에는 주변 다른 교각 번호가 포함되어, 받침/ELEVATION에 관측된 교각으로 범위를 제한하는 보정을 추가함.
지원 한계: DWG 문자 기반. OCR/스캔 PDF, 임의 기둥 형상 자동 인식, 모든 종단 측점 보간 미지원. 형식 표기 불명확 시 사용자 지정 T형 기본값. 종평면 인접 문자 대응값은 검토필요. 미확정·상충은 빈칸/근거로 반환. 모든 신규 도면의 완전 추출을 보장하지 않음.
배포: Code/bridge_extractor_package/dist/bridge_drawing_extractor-0.1.6-py3-none-any.whl. 외부 API나 토큰 사용 없음. 기존 extract_folder API 유지. 설치본 검증: outputs/folder_only_016/wheel_verification.json. 재현 코드: tests/test_folder_inference.py, folder_only_smoke.py, desktop_smoke.py, wheel_folder_smoke.py.
+10
View File
@@ -0,0 +1,10 @@
{
"files": 12,
"piers": 64,
"bearings": 652,
"serialized_cells_checked": 6484,
"corrections": 518,
"unresolved": 12,
"result": "PASS",
"scope": "엑셀 재읽기·JSON값 대조·IP4 공란·폭/길이 산식 확인. 샘플 엑셀 보정값 자체의 설계 적합성 검증은 아님."
}
+13
View File
@@ -0,0 +1,13 @@
# 12개 샘플 추출·대조 보정 결과
`00_추출보정현황.xlsx`에서 교량별 결과 파일과 보정 셀을 확인할 수 있습니다. 각 결과 XLSX의 Pier/IP/Bearing 시트는 연동용 형식을 유지하고 셀 메모에 보정 근거를 표시했습니다.
- 현재 배포 프로그램으로 도면을 읽은 뒤, 각 폴더의 최신 샘플 엑셀을 기준으로 부족하거나 다른 값을 보정했습니다. 자동 추출 원본은 `자동추출원본`에 보존했습니다.
- 12개 교량, 교각64개, 받침652개. 보정518셀. 승천천교 방위각12셀은 도면·샘플 엑셀 모두 값이 없어 미확인으로 남겼습니다.
- 두부보 폭은 전후열 평균점 거리+2000mm를 500mm 올림, 길이는 IP1-IP3 거리 초과 다음500mm. 샘플의 기존 폭/길이를 그대로 복사하지 않았습니다.
- 말뚝길이는 최소 mm. 샘플 헤더가 m이어도 7000처럼 이미 mm로 입력된 값은 중복으로1000배 하지 않았고 근거를 보정내역에 남겼습니다.
- T형1기둥/π형2기둥. IP4 좌표·꺾임각 공란. 계문철교 두 번째 P1 IP블록은 도면 위치에 맞춰 P2로 대응했습니다.
- 대호지교 누락 도면 관련 값, 기양천교 상충 기초EL 등은 이번 사용자의 샘플 엑셀 대조·수정 지시에 따라 샘플 값을 채택했습니다. 자동 원본 JSON에 기존 미확정 상태를 보존했습니다.
- 보정값은 샘플 엑셀 기준값이며 도면에서 새로 판독한 값과 구분됩니다. 프로그램이 모든 값을 스스로 정확히 판독했다는 의미가 아닙니다.
검증: 12 XLSX 재읽기, JSON6484셀 대조, 64교각 IP4공란/치수 산식,652받침 행 수 PASS. 검증결과.json 참조. 원본 도면/샘플 엑셀은 덮어쓰지 않았습니다.
+55
View File
@@ -0,0 +1,55 @@
# 교각 도면 엑셀 추출 프로그램 정본
| 버전 | 수정일 | 수정자 | 주요 변경 내용 | 비고 |
|---|---|---|---|---|
| v0.1.00 | 2026-10-26 | Codex | 재사용 Python 프로그램 정본 등록 | 담당자 성명 미확인 |
| v0.1.01 | 2026-10-26 | Codex | 폴더 단독 자동 분류·판독 기본 화면 | 사용자 후속 요청 |
- 현행 프로그램: `Code/bridge_extract/`, 실행 `start.cmd`. 향후 반복 추출은 이 프로그램을 사용.
- 현행 사용 안내: `DOC/04_실행/실행_교각도면엑셀추출프로그램_2026-10-26_v0.1.01.md`.
- 기본 화면은 `auto_gui.AutoApp`: 폴더만 선택. `automatic.run_folder`가 하위 DWG를 내용으로 분류하고 엑셀 생성. 기존 app.App/--profile은 호환용.
- `semantic.py`의 헤더·행 판독으로 두 교량 받침 162개와 신규 명시형 제원표 대응. `layouts/`의 제목·주변 문자 3개 이상으로 위치·축척·handle 변경 대응. 이동·축척 수치 755개 일치 시험 완료.
- 파일명을 바꾼 3개 실제 DWG를 다른 하위 폴더에 넣고 폴더 단독 GUI 실행 성공, 575필드 대조. 자동판독 8개 및 기존10개 시험 통과.
- 최초 추출 결과·근거인 `Code/giyang_extract/`, `Code/sanoe_extract/`는 원문 대조 자산으로 보존. 새 프로그램은 그곳의 extracted.json 또는 과거 엑셀을 런타임 입력으로 사용하지 않음.
- 변환기 의존 경로만 `Code/giyang_extract/libredwg/dwgread.exe` 재사용. 환경변수/GUI로 대체 경로 지정 가능.
- 등록 프로파일은 현재 2개. 수치는 현재 문자에서 재추출. 형식·기둥 수 등 형상 판독값은 등록값으로 구분하며 근거 DWG 해시가 바뀌면 비움.
- 새 도면은 기본 자동 판독으로 먼저 처리. 명시형 표는 사전 등록 없이 판독하며, 자유 배치·형상/IP 지시선 연결 등 근거가 모호한 항목은 공란과 검토 사유로 제공. 과거 CSV 등록은 CLI 호환용으로 남아 있음. 임의 도면 범용 형상 해석이나 OCR이 아님.
- 사용자 요청이 Python 기반 반복 실행 프로그램이므로 XLSX 작성도 openpyxl 기반으로 구현. Node/Artifact Tool은 실행 의존성이 아님.
- 995개 필드 회귀, 단위시험 10개, 실제 DWG CLI 2교량, GUI 실행 경로 검증. 표고 상충·말뚝 범위·미확인값은 검토 대상으로 보존.
- Windows sandbox 기본 tempfile 위치가 쓰기 거부되는 환경. 테스트는 tests 하위, 변환은 사용자가 지정한 저장 폴더의 .cache 하위 임시 경로 사용.
- 외부 프로그램 연동 정본(2026-10-29): `Code/bridge_extractor_package/src/bridge_drawing_extractor/`, 패키지 0.1.5. 종전 GUI와 별도 유지하며 자동 동기화하지 않음.
- 0.1.5 현행 추가 규칙: T형 1기둥, π형 2기둥. 말뚝길이 최소 선택 후 mm 변환(Pier H열 단위 변경). Bearing H열 전열/후열 추가, G열 방위각 유지. 산외교 전열38/후열40, P1말뚝7000mm. 신규 4시험·기존 정책6시험 및 설치본 API/CLI/XLSX·GUI PASS, 유지필드395개 대조. 외부 연동 시 길이 단위 및 추가열 확인 필요.
- 현행 규칙 0.1.4 (이전 출처 규칙 대체): 교각일반도 제외. 기본 T형, 두부보 EL=ELEVATION 교좌면 EL 최소, 받침 Z=교량받침 EL(몰탈상단). 폭=받침 최대 평면거리, 길이=IP1-IP3 평면거리 초과 다음 500mm 단위. 기둥 수 미지정. 실제 ELEVATION에 울산/함양 방향이 함께 있어 받침배치도 방향으로 연결. 산외교 17교각/78받침 추출, 기존 유지 412필드 회귀, 새 정책 6시험 및 내용분류 3시험 PASS. 설치본 및 GUI PASS. 바로가기 재실행하면 최신 소스 사용.
- 간편 실행(2026-10-28): 작업 폴더의 `도면추출 실행.lnk` → `Code/bridge_extractor_package/tools/desktop_app.py`. 기존 GUI 레이아웃을 재사용하되 0.1.3 소스 API에 연결. 현재 PC의 준비된 Python/openpyxl/변환기를 사용하여 수동 설치 불필요. 다른 PC 독립 실행 EXE는 아님. tests/desktop_smoke.py 실제 도면 작업 스레드·엑셀 생성·완료 상태 PASS.
- 0.1.3: 도면 내부 제목 변형·EL-X 표 기반 역할 인식 확장. ELEVATION 산출근거 원문은 supplementary_drawings에 보존하고 받침 Z를 대체하지 않음. 종단면도(A-A)만으로 종평면 판정 금지. 실제 5개 DWG 이름 변경 후 575필드 일치 및 추가 3개 회귀 시험 통과. outputs/package_renamed_013/verification.json 참조.
- 배포 파일: `Code/bridge_extractor_package/dist/`의 wheel 및 sdist. API `extract_folder`, `check_environment`, CLI `python -m bridge_drawing_extractor`. 연동 안내는 같은 프로젝트의 README.md.
- 변환기는 배포물에 포함하지 않음. converter_path → BRIDGE_DWGREAD → PATH 순서로 연결. Python 의존성 openpyxl>=3.1,<4.
- 설치된 wheel로 실제 산외교 575필드 일치, API/CLI/JSON/오류 반환 통과. `outputs/package_smoke/verification.json`, 재현 스크립트 `Code/bridge_extractor_package/tests/installed_smoke.py`. 기존 의존성이 있는 Windows 환경에서 검증, 다른 OS는 미검증.
- 최근 확인: 2026-10-28. 재확인 조건: DWG 내용/배치 또는 Python·변환기 변경.
## 2026-10-29 12개 샘플 배치 결과
- 정본: 추출결과_12개교량_20261029/. 12 XLSX + JSON/CSV, 현황/미확정 목록 XLSX.
- 교각64, 받침652, 미확정288셀. 대호지교 필수 도면 미제공252셀 포함.
- tools/extract_samples.py: 기존 입력폼으로 대상 대응, CAD 문자 재추출 및 샘플별 판독 보정. tools/verify_samples.py:6164셀/127DWG 해시·산식 검사 PASS. 회귀13시험 PASS.
- 사용자 최신 규칙: 형상으로 T/π 판단, T1/π2, IP위→아래, 두부보 EL=교좌면 최소, 받침Z=몰탈상단, 말뚝최소mm, 치수 다음500mm. 기존 일반도 제외 규칙은 표고 출처에 적용, 형상 판독에는 일반도 사용.
- 소스 reader 보완됨. dist0.1.5 wheel은 재빌드하지 않았고 GUI에 샘플 배치 보정은 통합하지 않음. 최신 배치 결과를 GUI 일반화 완료로 설명하면 안 됨.
## 2026-10-29 폴더 자동추출 0.1.6 통합
- 사용자 입력: rㅡ렇게 해줘. 기존 엑셀 없이 자동 분류/연결/출력 통합 요청으로 수행.
- 정본 소스 src/bridge_drawing_extractor/inference.py + automatic.py. GUI/바로가기 연결 완료. 배포 wheel0.1.6 설치본 실제 API 확인.
- 기능: 받침 범위 기반 IP3점 대응·위아래 순서, 종평면 인접 명시 표기/말뚝범위, 통합좌표표. 명시 형식 없으면T1. 레이아웃 미상에서도 XLSX 없이 작동.
- 검증16시험, 이름변경DWG5개·등록레이아웃없이 2교각28받침IP6점, GUI 완료, 설치wheel 실제API PASS. DOC/05_검증/검증_폴더자동추출통합_2026-10-29_v0.1.00.md.
- 한계: 이미지OCR/임의기둥형상/모든지반고보간 미지원. 복수방향·개정상충은 미확정. 수동12샘플 결과와 자동출력은 동일하지 않을 수 있음. 모든 새도면 완전추출이라고 설명하지 말 것.
## 2026-10-29 0.1.7 폭 규칙 (최신)
사용자 원문: 두부보폭은 받침전열과후열사이의 거리보다 2m 더 크게 만들자 500mm단위로
폭=전열/후열 각각 좌표 평균점 거리+2000mm를 500mm 올림. 정확한 배수는 그대로. 열구분/좌표 불명확 시 미확정. GUI와 API 소스 및 wheel0.1.7 반영. 17단위/회귀 PASS. update_sample_widths.py로12교량64교각 폭만 수정한 사본 생성, 나머지 셀 불변 대조. 정본 결과경로: 추출결과_12개교량_20261029/두부보폭_전후열거리_2m반영/. 길이는 기존규칙 유지.
## 2026-11-02 IP4 인덱스 오류 수정
IP4 행 생성 시 points[3]을 조회하여 IndexError 발생. 실제 IP1~3 범위 안에서만 좌표를 조회하고 IP4는 빈칸 유지하도록 수정. 등록 레이아웃 IP4도 D/E/F 공란 유지. 원본 소스 및 portable 소스 동기화. 현재 12샘플의 종평면/받침/ELEVATION 실제 DWG를 재읽고 엑셀 저장·재읽기 및64교각 IP4 공란 검증 PASS. 목동교·승천천교는 현재 변경된 파일명 기준으로 재수행. 결과: outputs/IP4_12샘플검증_20261102/검증결과.json. 실행 중인 GUI는 다시 시작해야 수정 반영.
## 2026-11-02 종평면 기초 4항목 보완
inference.py: 지반고 종단표의 일반 측점 격자와 교각 추가점 구분, 기초하단 EL 하부 표기군 분리, 말뚝 인접영역 확대. portable 소스 동기화. 운곡교6/계문철교2 교각32필드(EL/지반/기초/말뚝mm) 저장엑셀 도면 확인값 대조 PASS. testscripts: tools/check_profile_values.py. 샘플12개 엑셀 생성/IP4 검사 통과(7번은 root입력xlsx를 폴더로 잡던 검증 스크립트 수정 후 재수행). 값 상충 및 도면상 직접기초 표기 부재, VAR 길이는 계속 검토필요. 모든64교각 수치 전수확정으로 표현하지 말 것.
## 2026-11-02 사용자 승인 샘플 엑셀 보정 결과
요청: 프로그램으로12개 추출 후 틀린/애매한값 폴더샘플엑셀로수정. 정본 12개샘플_프로그램추출_엑셀대조보정_20261102/. 12XLSX+JSON/CSV, 보정현황, 자동원본 별도.64교각652받침518보정셀, 미확인 승천천교 방위각12셀.6484셀 재읽기/치수/IP4 검증 PASS. 이전 도면출처만사용 규칙과 다르게 이번 산출물은 사용자명시지시에 따라 샘플 값을 사용. 기양천교 상충EL도 샘플값 채택(미확정원본 보존). 코드 tools/create_reviewed_samples.py,verify_reviewed_samples.py. 보정은 이번12개 산출물 처리이며 일반자동엔진에서항상샘플엑셀을읽도록변경한것은아님.
@@ -0,0 +1,123 @@
[
{
"sample": 1,
"bridge": "산외교",
"piers": 17,
"bearings": 78,
"corrections": 22,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample01_산외교_추출보정.xlsx"
},
{
"sample": 2,
"bridge": "운곡교",
"piers": 6,
"bearings": 60,
"corrections": 60,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample02_운곡교_추출보정.xlsx"
},
{
"sample": 3,
"bridge": "대호지교",
"piers": 12,
"bearings": 192,
"corrections": 264,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample03_대호지교_추출보정.xlsx"
},
{
"sample": 4,
"bridge": "목동교",
"piers": 4,
"bearings": 48,
"corrections": 20,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample04_목동교_추출보정.xlsx"
},
{
"sample": 5,
"bridge": "승천천교",
"piers": 1,
"bearings": 12,
"corrections": 9,
"missing": [
"Bearing!G3",
"Bearing!G4",
"Bearing!G5",
"Bearing!G6",
"Bearing!G7",
"Bearing!G8",
"Bearing!G9",
"Bearing!G10",
"Bearing!G11",
"Bearing!G12",
"Bearing!G13",
"Bearing!G14"
],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample05_승천천교_추출보정.xlsx"
},
{
"sample": 6,
"bridge": "계문철교",
"piers": 2,
"bearings": 28,
"corrections": 23,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample06_계문철교_추출보정.xlsx"
},
{
"sample": 7,
"bridge": "기양천교",
"piers": 6,
"bearings": 84,
"corrections": 9,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample07_기양천교_추출보정.xlsx"
},
{
"sample": 8,
"bridge": "옥성교",
"piers": 6,
"bearings": 60,
"corrections": 65,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample08_옥성교_추출보정.xlsx"
},
{
"sample": 9,
"bridge": "새재1교",
"piers": 1,
"bearings": 10,
"corrections": 4,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample09_새재1교_추출보정.xlsx"
},
{
"sample": 10,
"bridge": "도하4교",
"piers": 4,
"bearings": 16,
"corrections": 22,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample10_도하4교_추출보정.xlsx"
},
{
"sample": 11,
"bridge": "곡천교",
"piers": 3,
"bearings": 36,
"corrections": 12,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample11_곡천교_추출보정.xlsx"
},
{
"sample": 12,
"bridge": "감북교",
"piers": 2,
"bearings": 28,
"corrections": 8,
"missing": [],
"file": "C:\\Users\\User\\Desktop\\도면추출\\12개샘플_프로그램추출_엑셀대조보정_20261102\\sample12_감북교_추출보정.xlsx"
}
]
+11
View File
@@ -0,0 +1,11 @@
{
"version": "0.1.9",
"samples": 12,
"bundled_runtime": "PASS",
"gui_runtime": "PASS",
"real_dwg_cli": "PASS",
"workbooks": 1,
"result_status": "needs_review",
"xlsx": "C:\\Users\\User\\Desktop\\도면추출\\outputs\\통합패키지연동검증_20261102\\20261102_115305_141033\\엔지니어(sample9)_T형교각_새재1교_1_교각입력데이터.xlsx",
"note": "실제 새재1교 도면 폴더에서 생성. 값 검토 상태는 API 결과 그대로 유지."
}