# 🎨 Graph Pipeline Phase 4: ν™œμš© 및 μ‹œκ°ν™” (Application & Visualization) 이 λ¬Έμ„œλŠ” P&ID Graph Pipeline의 μ΅œμ’… 단계인 **ν™œμš© 및 μ‹œκ°ν™”**의 상세 κ΅¬ν˜„ κ³„νšμ„ λ‹€λ£Ήλ‹ˆλ‹€. μ•žμ„  λ‹¨κ³„μ—μ„œ κ΅¬μΆ•ν•œ [κΈ°ν•˜ν•™μ  데이터 $\rightarrow$ μœ„μƒ κ·Έλž˜ν”„ $\rightarrow$ μ‹œμŠ€ν…œ νƒœκ·Έ λ§€ν•‘] 결과물을 κ²°ν•©ν•˜μ—¬, μš΄μ˜μžκ°€ 도면 μƒμ—μ„œ μ‹€μ‹œκ°„ 곡정 μƒνƒœλ₯Ό νŒŒμ•…ν•˜κ³  μž₯μ•  영ν–₯도λ₯Ό 뢄석할 수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€. --- ## πŸ“¦ 1. ν•„μˆ˜ νŒ¨ν‚€μ§€ 및 기술 μŠ€νƒ ### 1.1 ν”„λ‘ νŠΈμ—”λ“œ (Visualization) | 기술/라이브러리 | μš©λ„ | λΉ„κ³  | |---|---|---| | `SVG / Canvas API` | P&ID 도면 λ Œλ”λ§ 및 데이터 μ˜€λ²„λ ˆμ΄ | 벑터 기반 μ •λ°€ λ Œλ”λ§ | | `Cytoscape.js` / `D3.js` | μœ„μƒ κ·Έλž˜ν”„ μ‹œκ°ν™” 및 μΈν„°λž™ν‹°λΈŒ 탐색 | κ·Έλž˜ν”„ 뢄석 λ·°μ–΄ | | `Vue.js` / `React` | 전체 UI ν”„λ ˆμž„μ›Œν¬ 및 μƒνƒœ 관리 | `src/Web` ꡬ쑰와 톡합 | | `Axios` / `WebSocket` | μ‹€μ‹œκ°„ OPC UA 데이터 μˆ˜μ‹  및 API 톡신 | μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈ | ### 1.2 λ°±μ—”λ“œ (API & Analysis) | 기술/라이브러리 | μš©λ„ | λΉ„κ³  | |---|---|---| | `ASP.NET Core` | Graph API 및 뢄석 μ—”λ“œν¬μΈνŠΈ 제곡 | `ExperionCrawler` 메인 μ„œλ²„ | | `NetworkX` (Python) | 영ν–₯도 뢄석 및 경둜 좔적 μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰ | 뢄석 μ—”μ§„ (Phase 2 ν™œμš©) | | `FastAPI` / `Flask` | Python 뢄석 μ—”μ§„κ³Ό C# μ„œλ²„ κ°„μ˜ λΈŒλ¦Ώμ§€ | 뢄석 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ | --- ## πŸ“ 2. 상세 섀계 ꡬ쑰 ### 2.1 μ‹€μ‹œκ°„ 데이터 μ˜€λ²„λ ˆμ΄ (Real-time Overlay) λ„λ©΄μ˜ μ’Œν‘œ 정보와 λ§€ν•‘λœ μ‹œμŠ€ν…œ νƒœκ·Έλ₯Ό μ—°κ²°ν•˜μ—¬ μ‹€μ‹œκ°„ 값을 ν‘œμ‹œν•©λ‹ˆλ‹€. 1. **λ§€ν•‘ 데이터 λ‘œλ“œ:** `(λ„λ©΄λ…Έλ“œID, μ‹œμŠ€ν…œνƒœκ·Έ, μ’Œν‘œ)` 리슀트λ₯Ό ν”„λ‘ νŠΈμ—”λ“œλ‘œ 전달. 2. **μ‹€μ‹œκ°„ 슀트리밍:** `OPC UA` $\rightarrow$ `C# Server` $\rightarrow$ `WebSocket` $\rightarrow$ `Frontend`. 3. **동적 λ Œλ”λ§:** νƒœκ·Έ 값이 λ³€κ²½λ˜λ©΄ ν•΄λ‹Ή μ’Œν‘œμ˜ SVG μš”μ†Œ 색상을 λ³€κ²½ν•˜κ±°λ‚˜ νˆ΄νŒμ— ν˜„μž¬ 값을 ν‘œμ‹œ. ### 2.2 영ν–₯도 뢄석 μ—”μ§„ (Impact Analysis Engine) νŠΉμ • μ„€λΉ„μ˜ 이상 λ°œμƒ μ‹œ ν•˜λ₯˜(Downstream) 영ν–₯을 κ³„μ‚°ν•©λ‹ˆλ‹€. 1. **뢄석 μš”μ²­:** μ‚¬μš©μžκ°€ λ„λ©΄μ—μ„œ νŠΉμ • λ…Έλ“œ(예: νŽŒν”„ P-101)λ₯Ό 클릭. 2. **κ·Έλž˜ν”„ 탐색:** Python 뢄석 μ—”μ§„μ—μ„œ `nx.descendants(G, 'P-101')` μ‹€ν–‰. 3. **κ²°κ³Ό λ°˜ν™˜:** 영ν–₯λ°›λŠ” λͺ¨λ“  λ…Έλ“œ ID λ¦¬μŠ€νŠΈμ™€ 경둜(Path)λ₯Ό λ°˜ν™˜. 4. **μ‹œκ°μ  κ°•μ‘°:** 도면 μƒμ—μ„œ 영ν–₯ 경둜λ₯Ό ν•˜μ΄λΌμ΄νŠΈ(예: 빨간색 μ„ ) 처리. --- ## πŸ’» 3. μ‹€μ œ κ΅¬ν˜„ μ½”λ”© κ°€μ΄λ“œ (Example) ### 3.1 [Backend] 영ν–₯도 뢄석 API (C# $\rightarrow$ Python Bridge) ```csharp // src/Web/Controllers/PidGraphController.cs [HttpGet("impact/{nodeId}")] public async Task GetImpactAnalysis(string nodeId) { // Python 뢄석 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ— μš”μ²­ var response = await _httpClient.GetAsync($"http://python-analysis-api/impact/{nodeId}"); var result = await response.Content.ReadFromJsonAsync(); return Ok(result); } ``` ### 3.2 [Frontend] SVG 데이터 μ˜€λ²„λ ˆμ΄ (JavaScript) ```javascript // src/Web/wwwroot/js/pid-viewer.js async function updateRealtimeValues(tagData) { // tagData: { "PT-101.PV": 12.5, "FT-101.PV": 150.2 } for (const [tag, value] of Object.entries(tagData)) { const element = document.getElementById(`tag-node-${tag}`); if (element) { // 값에 따라 색상 λ³€κ²½ (예: μž„κ³„μΉ˜ 초과 μ‹œ 빨간색) element.style.fill = value > threshold ? 'red' : 'green'; element.setAttribute('data-value', value); // 툴팁 μ—…λ°μ΄νŠΈ const tooltip = document.getElementById('pid-tooltip'); tooltip.innerText = `${tag}: ${value}`; } } } ``` ### 3.3 [Analysis] 경둜 좔적 μœ ν‹Έλ¦¬ν‹° (Python) ```python import networkx as nx def get_propagation_path(graph, start_node, end_node): """μž₯μ•  μ „νŒŒ 경둜λ₯Ό μ΅œλ‹¨ 경둜 기반으둜 μΆ”μΆœ""" try: path = nx.shortest_path(graph, source=start_node, target=end_node) return path except nx.NetworkXNoPath: return None # 예: P-101μ—μ„œ V-105κΉŒμ§€μ˜ 영ν–₯ 경둜 μΆ”μΆœ path = get_propagation_path(topology_graph, "P-101", "V-105") ``` --- ## πŸš€ 4. Phase 4 μ™„λ£Œ κΈ°μ€€ (Definition of Done) - [ ] P&ID 도면(SVG/Canvas) μœ„μ— **μ‹€μ‹œκ°„ OPC UA κ°’**이 μ •ν™•ν•œ μ’Œν‘œμ— ν‘œμ‹œλ˜λŠ”κ°€? - [ ] νŠΉμ • λ…Έλ“œ 클릭 μ‹œ **ν•˜λ₯˜ 영ν–₯도 뢄석(Impact Analysis)** κ²°κ³Όκ°€ μ‹œκ°μ μœΌλ‘œ ν•˜μ΄λΌμ΄νŠΈ λ˜λŠ”κ°€? - [ ] C# 메인 μ„œλ²„μ™€ Python 뢄석 μ—”μ§„ κ°„μ˜ **API 톡신**이 μ§€μ—° 없이 μ΄λ£¨μ–΄μ§€λŠ”κ°€? - [ ] μš΄μ˜μžκ°€ 도면을 톡해 **이상 μ§•ν›„μ˜ μ „νŒŒ 경둜**λ₯Ό μ§κ΄€μ μœΌλ‘œ νŒŒμ•…ν•  수 μžˆλŠ”κ°€? - [ ] 전체 νŒŒμ΄ν”„λΌμΈ(`μΆ”μΆœ $\rightarrow$ λͺ¨λΈλ§ $\rightarrow$ λ§€ν•‘ $\rightarrow$ μ‹œκ°ν™”`)이 ν†΅ν•©λ˜μ–΄ λ™μž‘ν•˜λŠ”κ°€?