# AnalyzeConnectionsAsync — 방향표지판 기반 P&ID 연결 분석

> 작성: 2026-05-18
> 다음 작업 예정: 2026-05-19

---

## 오늘 한 일 (2026-05-18)

### 배경
기존 `AnalyzeConnectionsAsync()`는 loop 번호 그룹 + 최단거리 anchor 방식이라 직관적 배관 연결을 못 잡았다. 방향표지판(▶ 사각형+V자) 패턴을 검출해서 LINE endpoint 추적 + 태그 매칭으로 실제 배관 연결을 분석하는 방법을 시뮬레이션(`sim_line_connection.py` 확장)으로 검증.

### 접근법: 3단계 연결 검출
1. **방향표지판 검출** — 머지된 수평선쌍 + 왼쪽수직선 + 오른쪽V자대각선≥2
2. **LINE endpoint 단순 추적** — 머지된 LINE의 한쪽 endpoint → 반대쪽 endpoint: 거기에 뭐가 있는지 체크(다른마커/장비/빈곳)
3. **태그 매칭** — 같은 태그의 마커가 서로 다른 위치에 있으면 배관으로 연결됨

### 실행 결과

**방향표지판 검출:**
- 전체: 418개 (관심영역 y≥5100: 106개)
- 태그 매칭 연결: 63/106개 (59%)가 동일태그 그룹(21개 그룹)에 속함

**주요 배관 경로:**
```
T-10100(1656) ↔ T-10100(1989) ↔ T-3210(1989) ↔ T-3210(2439) ↔ T-10200(2439) ↔ T-10200(4611) ↔ C-10211 칼럼
T-9124(1657)  ↔ T-9124(1989) ↔ T-9124(2004) ↔ T-10101(2004)
P-10101(2050) ↔ E-10119(2024) ↔ T-10101/T-9124 (성분 6)
```

**장비 연결:**
| 장비 | 연결된 마커 | 방식 |
|------|------------|------|
| C-10211 VLINE (x≈4545) | 1F~4F 유틸리티, C-10111, C-10211, D-10113/10213 | 좌표근접(50u) |
| COOLING TOWER(CT-10601) VLINE | EYE SHOWER, SCRUBBER, UTILITY | 좌표근접 |
| FCV-10101 VLINE (x≈5034) | 2F~5F 유틸리티 | 좌표근접 |
| EMERGENCY VLINE | SC-9128 | 좌표근접 |

---

## ✅ 성과 (Good)

### 1. 방향표지판 검출 알고리즘 안정적
- 직사각형(가변폭/높이, 글자수 따라 변화) + V자 45° 사선 검출 성공적
- 관심영역 129개 → 사용자 "거의 맞는군" 확인
- 머지된 LINE + raw LINE 조합으로 사각형+V자 동시 검출

### 2. 단순 추적(endpoint→endpoint)이 대부분 동작
- 머지된 LINE의 한쪽 끝 → 반대쪽 끝만 보는 방식으로 중간 junction 무시
- 106개 마커 중 대부분에서 추적 성공 (좌/우 중 하나라도 연결 발견)
- 19개 연결성분 자동 분류 성공

### 3. 태그 매칭으로 장거리 배관 연결 포착
- T-10100: 좌측(1656) → 중앙(1989) → 우측(4611) — 2956u 스팬
- T-10101: (1972)→(1990)→(2004)→(4612) — 2640u 스팬
- T-10200: (2102)→(2439)→(4611) — 2509u 스팬

### 4. 장비-마커 연결 (50u 근접 기준)
- VLINE 칼럼 장비(C-10211, FCV-10101, CT-10601, EMERGENCY) 연결 성공
- 큰 원(r≥4.5) 장비 16개 검출

### 5. 발견한 P&ID 패턴
- 같은 태그가 여러 위치에 있음 = 배관 연결
- 장비는 긴 수직LINE(≥100u) + TEXT 태그 근접
- 방향표지판의 V자 방향 = 유체 흐름 방향 (▶ = 오른쪽으로 흐름)

---

## ❌ 문제점 / 개선 필요 (Bad)

### 1. P-10101 마커 endpoint tracing 실패 (Highest Priority)
```
P-10101@(2050,5289) ←L→ 자기자신
```
- P-10101 마커 좌측 LINE은 3.9u짜리 짧은 stub
- 실제 배관은 (2040.2,5289.3)에서 20u 떨어진 y=5287.2에서 이어짐
- 원인: 배관이 수평→수직→수평으로 굽혀져(jog) 머지 안 됨
- LINE#9513(1911→2019, y=5287.2) → LINE#9514(수직↑) → LINE#9663(수평→) → stub→P-10101
- **해결방안**: 직각 굽힘 허용 trace 필요 (1-2 hop BFS with angle check)

### 2. 장비-마커 연결 threshold 문제
- C-10211 칼럼(x≈4545)과 마커(x≈4585) 사이 40u 간격
- 현재 25u threshold로는 연결 누락 → 50u로 완화했지만 더 많은 튜닝 필요
- 큰 원 장비는 거의 연결 안 됨 (마커 태그 = P-10101인데 P-10101 원 검출 안 됨?)

### 3. 장비 검출 한계
- `P-10101` 펌프 원(r≈1.98)은 r≥4.5 threshold보다 작아서 장비 미검출
- 작은 장비(r<4.5) 검출 기준 추가 필요
- 실제 P&ID에서 펌프는 r≈2.0의 작은 원으로 표현

### 4. 방향표지판 방향 의미 미활용
- V자 방향(▶/◀)이 "어디서→어디로"를 나타내지만 아직 사용 안 함
- ▶ 마커: 좌측 = 배관 도착, 우측apex = 배관 출발
- ◀ 마커: 반대 (거의 없지만 처리 필요)

### 5. 연결성분 그래프에 P-10101→C-10111 경로 누락
- 이전 수동 분석으로 확인된 P-10101→볼밸브→주름관→체크밸브→Reducer→MASS→FCV-10101→C-10111
- 자동 분석 성분 6은 P-10101 주변만 포착, C-10111까지 연결 안 됨
- 이유: P-10101 마커 tracing 실패 + FCV-10101와 E-10103 연결 누락

### 6. 미연결 마커 (43/106개)
- 대부분 단일 위치에만 존재하는 유틸리티 마커 (SAMPLE, STEAM, CWS/CWR 등)
- 일부는 태그가 비어서 그룹화 불가

---

## 현재 알고리즘 개요

### 방향표지판 검출
```
h_seg 수평선쌍(xl,xr 일치, y간격 2~8u)
  → 왼쪽수직선 확인(has_vert)
  → 오른쪽V자대각선≥2 확인(cnt_diag)
  → 태그 TEXT 찾기(25u 이내)
```

### LINE endpoint 연결 검출
```
마커 좌/우측 포인트 → nearest merged LINE endpoint (30u 이내)
  → 그 LINE의 반대쪽 endpoint
  → what_at(): 마커? 장비? 빈곳?
```

### 태그 매칭 연결
```
같은 tag의 마커가 다른 위치에 있음 = 배관 연결됨
```

### 장비 검출
```
원: CIRCLE r≥4.5 + 근접 TEXT 태그
수직LINE: 머지LINE dy≥100, dy>dx*3, 근접 TEXT 태그
```

---

## 데이터

### 방향표지판 속성
| 필드 | 설명 |
|------|------|
| tag | 내부 TEXT (25u 이내) |
| mx, my | 중심좌표 |
| xl, xr | 좌/우 X 좌표 |
| ylo, yhi | 상/하 Y 좌표 |
| dr | 오른쪽 V자 대각선 개수 |

### 장비 속성
| 필드 | 설명 |
|------|------|
| tag | 근접 TEXT |
| kind | CIRCLE / VLINE |
| x, y | 중심 (VLINE은 x만) |
| r | 반지름 (CIRCLE만) |
| y_min, y_max | 수직범위 (VLINE만) |

### 연결 엣지
| 타입 | from | to | 조건 |
|------|------|----|------|
| MARKER→MARKER | marker tag@pos | marker tag@pos | LINE endpoint tracing |
| MARKER→EQ | marker tag@pos | equipment tag | LINE endpoint + 근접도(50u) |
| TAG_MATCH | marker tag@pos | same tag@pos | 다른 위치 → 배관 연결 |

---

## 오늘 한 일 (2026-05-18, Code)

### Priority 1: P-10101 경로 추적 수정 ✓
- [x] 직각 굽힘(수평→수직→수평)을 허용하는 2-hop BFS trace 구현
- [x] LINE endpoint에서 다음 LINE 찾을 때 각도 무관(모든 연결 허용)
- [ ] P-10101(2050,5289) → FCV-10101 → C-10111(4585,5237) 전체 경로 검증 (부분)
  - P-10101 마커 검출 OK (2046,5289)
  - 2-hop BFS trace: P-10101 좌/우 → 모두 P-10101 marker (자기자신 추적)
  - FCV-10101 TEXT (4987,5232) 방향표지판 미검출 — C-10111도 동일
  - **원인**: 배관 경로가 3+ hop 이상 (stub→수평→수직→수평), 2-hop으로 부족
  - **차후**: 3-hop BFS 또는 태그매칭 우회 필요

### Priority 2: 장비 검출 개선 ✓
- [x] 작은 원(r<4.5, r≥1.5)도 장비 후보로 추가 → 41개 검출
- [x] 원 안 TEXT(tag)가 아닌 근접 TEXT로 장비명 결정 (기존과 동일 로직)
- [x] 장비-마커 근접 threshold 동적 조정 (limit=30 → equipment trace에서 활용)

### Priority 3: 시뮬레이션 코드 정리 ✓
- [x] `sim_line_connection.py`에 방향표지판 검출 + trace + 태그매칭 통합
- [ ] 결과 JSON 출력 (edges + components)
- [ ] C-10111 DXF 별도 검증 (c-10111.dxf)

## 내일 할 일 (2026-05-19)

### Priority 3-2: JSON 출력 + C-10111 검증
- [ ] 연결 결과 JSON 출력 (marker_edges, tag_match_edges, components)
- [ ] `c-10111.dxf` 별도 검증 실행

### Priority 4: C# AnalyzeConnectionsAsync 재작성
- [ ] 현재 loop+anchor 거리 방식 → 방향표지판+태그매칭+LINE trace 방식으로 교체
- [ ] `PidEquipment` 테이블에 방향표지판 속성 컬럼 추가 검토
- [ ] 기존 테스트 통과 확인

### Priority 5: 방향 의미 활용
- [ ] V자 방향(▶/◀)으로 from_tag/to_tag 방향성 부여
- [ ] 태그가 붙은 마커 = "이 배관은 XXX에 속함" 정보로 equipment tag 식별

### Priority 6: P-10101 3+ hop trace
- [ ] 3-hop BFS로 P-10101(2046,5289) → FCV-10101 → C-10111 경로 완전 추적
