# DXF 그래프 데이터로 할 수 있는 작업

DXF 파일에서 추출한 P&ID 그래프 데이터는 **설비, 배관, 태그 간의 위상 관계**를 구조화한 것입니다. 이 데이터로 다음과 같은 작업을 수행할 수 있습니다.

---

## 1. 영향도 분석 (Impact Analysis)

특정 설비가 고장 났을 때 **하류(downstream)에 영향을 받는 설비**를 자동으로 찾아냅니다.

- **구현**: [`analyze_impact()`](mcp-server/pipeline/topology.py:287) — NetworkX의 `descendants()`를 사용하여 BFS 탐색
- **API**: [`AnalyzeImpactAsync()`](src/Core/Application/Services/PidGraphService.cs:54) — MCP 도구 `analyze_pid_impact` 호출
- **UI**: [`pid_graph_view.html`](src/Web/wwwroot/pid_graph_view.html:21) — 영향도 분석 결과 패널

**사용 시나리오**: "펌프 P-101이 고장났을 때 어떤 설비가 영향을 받나?" → 하류 밸브, 탱크, 컨트롤러 등을 시각화

---

## 2. P&ID 태그 → Experion 시스템 태그 매핑

DXF에서 추출한 태그명(예: `FIC-6113`)을 실제 Experion HS 시스템 태그(예: `ficq-6113.pv`)에 매핑합니다.

- **구현**: [`IntelligentMapper`](mcp-server/pipeline/mapper.py:15)
  - **1차**: RapidFuzz로 문자열 유사도 기반 후보 추출
  - **2차**: LLM(Qwen3.6-27B)이 위상 컨텍스트(이웃 노드, 연결 관계)를 고려하여 최종 매핑
- **컨텍스트 추출**: [`get_node_context()`](mcp-server/pipeline/mapper.py:21) — 1-hop, 2-hop 이웃 정보를 포함

**사용 시나리오**: 도면에 `FT-101`이 있으면 → 시스템 태그 `ft-101.pv`에 매핑 → 실시간 데이터 조회 가능

---

## 3. 배관 기반 물리적 연결 추론

DXF의 LINE/LWPOLYLINE 객체를 분석하여 설비 간 **배관 연결 관계**를 자동으로 추론합니다.

- **구현**: [`build_graph()`](mcp-server/pipeline/topology.py:153) — 배관 라인이 설비 BBox와 교차하거나 근접하면 연결 엣지 생성
- **흐름 방향 추론**: 좌표 기반으로 왼쪽→오른쪽, 위→아래 방향으로 흐름 방향 결정
- **성능 최적화**: SpatialGrid 인덱스로 O(n) → O(1) 탐색

**사용 시나리오**: "어떤 설비가 어떤 배관으로 연결되어 있는가?" → 공정 흐름도 자동 생성

---

## 4. 태그-설비 논리적 연결 (Association)

텍스트 태그(예: `FIC-6113`)와 가까운 설비 노드를 **거리 + 연결성 가중치**로 매핑합니다.

- **구현**: [`_find_nearest_equipment()`](mcp-server/pipeline/topology.py:212)
  - 거리 점수 + 배관 연결성 보너스 조합
  - SpatialGrid로 후보 집합을 빠르게 필터링

**사용 시나리오**: 도면에 적힌 태그명이 실제 어떤 설비 기호에 해당하는지 자동 연결

---

## 5. 위상 무결성 검증

그래프 구조의健全性을 검증합니다.

- **구현**: [`validate_topology()`](mcp-server/pipeline/topology.py:258)
  - 고립 노드(isolated nodes) 감지
  - 노드/엣지 카운트 통계

**사용 시나리오**: 추출 품질 확인 — 연결되지 않은 노드가 있으면 도면 파싱 실패 가능성

---

## 6. 시각화

Canvas 기반 P&ID 그래프 시각화 UI가 준비되어 있습니다.

- **구현**: [`pid_graph_view.html`](src/Web/wwwroot/pid_graph_view.html:14) — Canvas 렌더링
- 노드 클릭 시 상세 정보 표시
- 영향도 분석 결과를 시각적 목록으로 표시

---

## 7. OPC UA 실시간 데이터 연동 (간접)

매핑된 Experion 태그를 통해 실시간/히스토리 데이터와 연결할 수 있습니다.

- P&ID 태그 → Experion 태그 매핑 완료 후 → 시계열 데이터 조회
- NL2SQL을 통해 자연어로 P&ID 설비 데이터 조회 가능

---

## 요약 테이블

| # | 기능 | 핵심 함수 | 입력 | 출력 |
|---|------|-----------|------|------|
| 1 | 영향도 분석 | [`analyze_impact()`](mcp-server/pipeline/topology.py:287) | graph_id, start_node_id | 영향받는 노드 목록 |
| 2 | 태그 매핑 | [`IntelligentMapper`](mcp-server/pipeline/mapper.py:15) | P&ID 태그 + 시스템 태그 | 매핑 결과 + 신뢰도 |
| 3 | 배관 연결 추론 | [`build_graph()`](mcp-server/pipeline/topology.py:153) | DXF 기하 데이터 | 방향성 그래프 (노드+엣지) |
| 4 | 태그-설비 연결 | [`_find_nearest_equipment()`](mcp-server/pipeline/topology.py:212) | 태그 노드 + SpatialGrid | 매칭된 설비 노드 |
| 5 | 위상 검증 | [`validate_topology()`](mcp-server/pipeline/topology.py:258) | 그래프 | 고립 노드, 통계 |
| 6 | 시각화 | [`pid_graph_view.html`](src/Web/wwwroot/pid_graph_view.html:1) | 그래프 JSON | Canvas 렌더링 |

---

## 핵심 가치

DXF에서 추출한 기하학적 데이터를 **위상 그래프**로 변환하면, 다음을 수행할 수 있습니다:

- **공정 흐름 분석**: 설비 간 연결 관계와 흐름 방향을 자동 추론
- **장애 전파 시뮬레이션**: 특정 설비 고장 시 영향 범위 예측
- **태그 자동 매핑**: 도면 태그와 시스템 태그를 위상 컨텍스트로 매핑
- **실시간 모니터링 연동**: 매핑된 태그로 OPC UA 데이터와 연결
