Files
ExperionCrawler/AnalyzeConnectionsAsync.md
windpacer 302183c97e feat: P&ID 연결 분석, LLM 에이전트 모드, KB 확장, MCP 서버 리팩토링
- 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 업데이트
- 정리: 진단 체크리스트 문서 삭제
2026-05-21 23:36:57 +09:00

8.2 KiB

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 경로 추적 수정 ✓

  • 직각 굽힘(수평→수직→수평)을 허용하는 2-hop BFS trace 구현
  • 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: 장비 검출 개선 ✓

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

Priority 3: 시뮬레이션 코드 정리 ✓

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