kintex/docs/analysis/cad-extraction.md
zio d80b761983 feat(m2): V65 measured exit positions + canvas real trench data
Owner directives 2026-07-16 (items 2-3 of follow-up batch).

- tools/cad/extract_exit_seed.py: boundary door clusters (+-2m band) from CAD
  DOOR layers projected onto hall edges -> V65 replaces assumed exits for
  H1-H8 (34 measured); H9/H10 keep assumed (0-1 boundary doors - low trust).
  Cross-validated against V63/V64 obstacle door strips (same source, matching)
- Canvas trench layer: renders real supply points (HallInfo.trenches, r=0.5m
  dots with supplies tooltip) when present; falls back to synthetic 9m grid

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:18:42 +09:00

136 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CAD(DWG) 실측 추출 파이프라인 — 1차 분석 (2026-07-14)
> 소유자 지시 "dwg 파이프라인 진행해" 결과 보고. 도구: `tools/cad/dwg_extract.py`.
> 목적: 가정값으로 시드된 트렌치(6m 격자, `is_assumed=true`)·비상구(변 중앙 4개소)·기둥(미반영)을
> CAD 실측치로 대체(PLANNING R4).
## 1. 파이프라인 구성 (검증 완료)
```
DWG ──(LibreDWG dwg2dxf.exe, 무료·오픈소스)──> DXF ──(ezdxf)──> 레이어 추출·좌표 정규화
```
- **변환기**: LibreDWG 0.14 win64 (github.com/LibreDWG/libredwg/releases). ODA File Converter 불필요.
`전기,설비 트렌치.dwg`(10.3MB) → DXF 33.2MB 변환 성공(경고 무해).
- **단위**: KINTEX 도면 INSUNITS=4(**mm**) — 파이프라인이 m로 환산.
- **파서**: `pip install ezdxf` (1.4.x).
## 2. 제1전시장 `전기,설비 트렌치.dwg` 분석 결과
| 항목 | 발견 |
|---|---|
| 트렌치 레이어 | `5-트렌치`(급배수 추정)·`7-트렌치`(전기 추정) — 968 세그먼트 |
| 기둥 레이어 | `4-COL-H`·`ST-COL-H`·`ST-COL-PIPE` 등 8종 — 0.2~3m 각형 폴리라인 812개 |
| 구조 그리드 앵커 | **Y축 라벨이 63m 피치**(y=80.1→143.1→206.1→269.1→332.1→395.1) = 홀 깊이 베이 5개 → 홀1~5 Y밴드 식별 가능. X축 라벨은 y=456.1m 행 |
| 도면 성격 | **트렌치 상세도** — 홀 전면 트렌치 그리드가 아니라 ①세로 트렌치 라인 스트립(밴드2·3: 홀 깊이 63m 관통, 폭 9~15m) ②단면·확대 상세(밴드1·5) 위주 |
### 판정 — V61 실측 시드 보류 사유
Y밴드(홀) 앵커는 확보했으나, 이 상세도만으로는 **홀별 전체 트렌치 그리드의 완전한 실좌표**를
단정할 수 없다(상세도 특성상 대표 구간만 작도). 잘못된 "실측" 시드는 가정 그리드보다 해롭다.
→ 현행 V5 가정 그리드(`is_assumed=true`) 유지.
## 3. 다음 단계 (승인 시 진행)
1. **평면도 교차 분석**: `A3002(지상1층평면도)-z2.dwg` 변환 후 동일 그리드 앵커로 트렌치
센터라인·기둥·비상구(문 심볼) 레이어를 교차 대조 — 상세도와 평면도가 일치하는 구간만 실측 채택.
2. **기둥 반영**: `원본-철골기둥 주심도.dwg`(제2전시장)·`4-COL-H`(제1전시장)에서 기둥 실좌표 추출 →
신규 `hall_pillar` 테이블(V61) + 자동배치 엔진 회피(예약 영역) + 캔버스 표시.
3. **좌표 변환 규약**: CAD(mm, 전건물 좌표) → 홀 로컬 m. 홀 h의 Y밴드 [y0..y0+63], X원점은
평면도의 홀 외벽선에서 확정(트렌치 상세도 x범위는 불충분).
4. **비상구**: 평면도 문 심볼(`4-DOOR`·`4-출입구` 계열) 위치에서 실좌표 재유도.
## 4. 자산 목록 (zip 내용)
- `kintex1_cad_all_halls.zip`: 지상1/2/3층 평면도 + **전기,설비 트렌치.dwg**
- `kintex2_cad_all_halls.zip`: 원본-1층 평면도(24.6MB) + **원본-철골기둥 주심도.dwg** + 전력간선 평면도(77MB) + FORM
> 주의: CAD 원본은 gitignore(로컬 보존). DXF·중간 산출물도 커밋 금지(용량) — 리포트(txt/md)만 기록.
## DWG 파이프라인 산출 (2026-07-15 진행분)
- **파이프라인 도구**: `tools/cad/dwg_extract.py`(inventory/extract/anchors, recover 폴백) ·
`tools/cad/render_hall_png.py`(홀 밴드 PNG 렌더). 변환기 = LibreDWG 0.14 win64.
- **좌표 확정(제1전시장, `전기,설비 트렌치.dwg`)**: 홀 바닥 X원점 293.5m·폭 171m,
Y밴드 80.1m 시작·63m 피치 — 렌더 시각 검증 2회(try1→try2)로 캘리브레이션.
트렌치 실배치 = 가로 7열(약 9m 피치) + 중앙 세로 피더. 현행 V5 가정 6m 격자와 다름 확인
→ 실측 시드(V61)는 트렌치 레이어 세그먼트의 열 좌표 정규화 후 별도 진행.
- **DWG 탭 언더레이**: 홀1~5 바닥면 크롭 PNG(margin 3m) 생성 → `public/media/floorplans/dwg/`
빌드 내장. 에디터 좌측 "도면" 툴그룹에 JPG/DWG 탭 — DWG 미보유 홀은 탭 비활성.
캘리브레이션은 렌더 파라미터에서 결정적(margin/(W+2m) 분율).
- **주의/한계**: ①밴드 번호↔홀 번호 방향(남→북 가정) 도면 라벨로 미확증 — K1 홀 5개는 구조
동일해 언더레이 표시는 유효하나 표기 확정 필요 ②A3002 평면도 DWG는 LibreDWG 크래시
(r2000 다운컨버전 산출물도 ezdxf 파싱 실패) — 트렌치 통합도면으로 대체 ③제2전시장(H6~10)
렌더는 `원본-1층 평면도.dwg` 변환 검증 후 확장.
## K2(제2전시장) 홀 6~10 렌더 확정 (2026-07-15)
원본-1층 평면도.dwg(24.6MB → DXF 106.6MB) 기준. 대형 DXF 대응: 구조 레이어 슬림 추출(`k2_slim.py` 패턴,
지하층 xref·TOIL·INSUL 등 제외 145k→53k 엔티티) + **고속 렌더러 `tools/cad/fast_render.py`**
(LineCollection 일괄 — ezdxf drawing addon의 10분+ 병목을 수십 초로) + `--rotate/--center`(기울어진 홀 축정렬).
**확정 좌표(전건물 m 좌표계, floor=바닥면·crop=floor+3m):**
| 홀 | 회전 | 기준(center) | floor u(폭) | floor v(깊이) |
|---|---|---|---|---|
| H6 | -12° | (530,405) | 482..542 (60m) | 350.5..443.5 (93m) |
| H7 | 0° | — | 439..529 (90m) | 215.5..341.5 (126m) |
| H8 | 0° | — | 439..529 (90m) | 89.5..215.5 (126m) |
| H9 | -11° | (245,155) | 196..295 (99m) | 95.5..227.5 (132m) |
| H10 | +11° | (255,330) | 194.5..293.5 (99m) | 250..382 (132m) |
검증: 장선 각도 클러스터(`k2_hall_finder/tilt_measure`)로 각도·깊이 프로그램 측정(H6 93m·H9/H10 132m·
H7/H8 블록 252m=126×2·폭 90m 정확 일치) + 회전 프로브 렌더 시각 확인(6·9·10) + 최종 crop 확인(8).
홀 번호 배치 근거: 미니맵(6 북동→7→8 남측 축정렬 스택, 9 남서·10 북서 날개) + 치수 일치.
한계: 홀 번호는 미니맵·치수 정합 기반(도면 내 텍스트 라벨 직접 확인은 아님 — 치수가 홀별로 상이해
오배정 가능성 낮음). 트렌치 실좌표 V61 시드는 K1과 함께 후속.
## V61 트렌치 실측 시드 (2026-07-15)
- **레이어 표기 함정**: 실측 채널은 `5-트랜치`(트랜치) — 앞선 `트렌치` 키워드 탐색이 놓쳤던 표기.
추출 키워드는 두 표기 모두 매칭(`extract_trench_seed.py`).
- **실측 구조(K1 홀1~5 공통, 홀 간 완전 일치 — 밴드 정렬 교차 검증)**: 가로 채널 7개,
로컬 y = 5.85/14.8/23.9/32.9/41.9/50.9/59.8m(피치 9.0m), 연장 x[20.6..170.2]m(쌍선 폭 ~1.3m 병합 중심선).
- **V61**: 홀별 가정(is_assumed) 포인트 삭제 → 채널 따라 6m 간격 실측 포인트 875개
(`H{n}-RT-{행}-{k}`, is_assumed=false). 공급 플래그는 V5 정책 유지(위치만 실측 대체).
K2(H6~10)는 가정 유지 — K2 도면(원본-1층 평면도)에 트렌치 레이어 부재, 전력간선 평면도(77MB) 분석 후속.
- **후속**: FloorplanCanvas의 합성 트렌치 그리드(9m 가정선)를 HallInfo.trenches 실데이터 표시로 교체 검토.
## V62 기둥 실측 시드 + 자동배치 회피 (2026-07-15)
- **K1(H1~H5)**: CAD 4-COL-H 사각 중심 추출(0.3~3m 각형·0.8m dedupe) — 공식 주석 교차검증
(남측 벽 기둥 x=54/117m ↔ CAD 53.6/116.6m 일치). 홀별 10~29개(벽면·부속실 기둥 포함).
- **K2(H7~H10)**: CAD에서 기둥 원 미검출(주심도는 별도 원점·심볼 원 r0.1m뿐, 사이트 평면은 블록 내 부재)
→ **공식 홀 도면 치수 주석**으로 시드: midline 내부 기둥 1개(H7/H8 x=40.1·H9/H10 x=48.9, ø2.3m).
H6는 근거 없음 — 미시드(한계).
- **V62**: hall_pillar 테이블(+GIST 불필요·hall_id 인덱스) + 74개 시드 + **V61 트렌치 y축 보정**
(RT 포인트가 CAD y 미반전으로 시드됨 — 도면 상단 y=0 기준으로 63-y 반전, 생성기도 정본 수정).
- **엔진**: autoGenerate가 기둥 반경+0.6m 버퍼를 예약 영역으로 — 겹치는 부스 셀 배치 제외.
- **캔버스**: 구조 레이어(기둥·비상구 토글)에 기둥 원 표시(HallInfo.pillars 계약 확장, NON_NULL 호환).
## V63 벽·계단·엘리베이터·문 장애물 인식 (2026-07-15)
- **추출(K1 H1~H5)**: 장애물 레이어(WALL/DRYWALL/조적/석고/판넬·STAIR/계단·ELEVATOR·DOOR/출입구)를
1m 셀 래스터 → 연결 성분 → **행 스트립 분해**(L자 벽 런의 bbox 뻥튀기 방지) → 60개 사각 영역.
좌측 벽선(x0~1m)·우측 에지 문(x169~171)·H1 하단 부속실·H5 상단 부속실 벽 등.
- **V63**: hall_obstacle(kind: stair|elevator|door|wall) + 시드. 자동배치 회피 버퍼: 문 1.0m(접근
클리어)·기타 0.3m. 캔버스 구조 레이어에 사각 표시(문=녹색톤 구분).
- **한계**: ①벽선 기반 — 밀폐 실내 채움 아님(단, 외곽 여유 5m+벽 스트립 차단으로 실배치 유입 방지)
②K2(H6~10)는 장애물 레이어 구조 상이(석고보드·경량철골 등 xref 평탄화)로 신뢰 추출 보류.
## V64 K2 장애물 시드 (2026-07-15)
- K1과 동일 방식 + 홀 프레임 회전 변환(±11~12°)으로 H6~H10에서 31개 스트립 추출.
- 특기: H9/H10 midline(y≈66)의 전폭 door 스트립 = **9A/9B·10A/10B 분리 셔터 트랙**(가동벽) —
door 1.0m 버퍼 회피로 셔터 가동선 클리어 확보(운영 정합). H7/H8은 서/동측 에지 문 + midline 포켓.
- 레이어: ELEVATOR·STAIR·DOOR·석고보드·경량철골·시멘트판넬·WALL 계열(k2_slim 구조 추출본).
## V65 비상구 실좌표 + 캔버스 트렌치 실데이터 (2026-07-16)
- **V65 비상구**: CAD DOOR 레이어 경계 문 클러스터(±2m 밴드) 변 투영 — H1~H8 실측 34개로 가정
비상구(변 중앙 4개소) 대체, H9/H10은 경계 문 신뢰 부족(0~1개)으로 가정 유지.
V63/V64 장애물 door 스트립과 좌표 교차 일치(같은 소스) 검증. 생성기 extract_exit_seed.py.
- **캔버스 트렌치**: 합성 9m 그리드 → HallInfo.trenches 실데이터 공급 포인트 도트(r0.5m,
supplies 툴팁) 표시, 실데이터 없으면 합성 그리드 폴백 유지.
- **잔여**: K2 트렌치(전력간선 77MB 도면) — 별도 진행.