- P&ID: 연결 분석 API, Prefix 규칙 관리, 카테고리 분류, DXF 그래프 빌드 - LLM: 대화 요약, tool card 영구 보존, 시계열 차트(uPlot), 에이전트 모드 - KB: 청크 미리보기, Field Instrument Inference, 인증/Qdrant 클라이언트 - MCP: 서버 기능 확장, 파이프라인 수정, timeout 개선 - Frontend: P&ID UI, LLM UI, KB UI, OPC UA Write 탭 추가 - 설정: AGENTS.md, plant_context, README, opencode.json 업데이트 - 정리: 진단 체크리스트 문서 삭제
205 lines
8.2 KiB
Markdown
205 lines
8.2 KiB
Markdown
# 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 경로 완전 추적
|