# 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 경로 완전 추적