# P&ID Parser Detailed Implementation Plan (by Gemma 4)

## 1. 개요 (Overview)
본 계획은 대용량 DXF 파일 처리 시 발생하는 LLM 프롬프트 복잡도 및 하드웨어 부하 문제를 해결하기 위해, 기존의 단일 프로세스 추출 방식을 **분산 처리 방식(Distributed Processing)**으로 전환하는 상세 설계도입니다.

## 2. 데이터 인터페이스 설계 (Data Interface Specification)

### 2.1 중간 데이터 포맷 (Intermediate JSON Schema)
메인 프로그램이 `ezdxf`로 전처리하여 서브 프로그램에 전달할 데이터 구조입니다. 서브 프로그램은 이 JSON을 읽어 패턴 매칭을 수행합니다.

```json
{
  "metadata": {
    "filename": "string",
    imtimestamp": "ISO8601"
  },
  "entities": [
    {
      "type": "TEXT | MTEXT | LINE | CIRCLE | LWPOLYLINE",
      "layer": "string",
      "content": "string (텍스트 내용)",
      "coordinates": { "x": 0.0, "y": 0.0, "z": 0.0 },
      "attributes": { "color": "int", "lineweight": "float" }
    }
  ]
}
```

## 3. 컴포넌트별 상세 설계 (Component Detailed Design)

### 3.1 [Python] Main Processor (Orchestrator)
**역할**: DXF 전처리, 서브 프로세스 생명주기 관리, 결과 통합 및 DB 저장 요청.

- **Class: `DXFPreprocessor`**
    - `load_and_parse(file_path)`: `ezdxf`를 사용하여 DXF를 로드하고 엔티티를 추출.
    - `generate_intermediate_json(output_path)`: 추출된 엔티티를 위 JSON 스키마로 변환하여 저장.
- **Class: `ExtractionOrchestrator`**
    - `run_parallel_extractors(input_json_path)`: `subprocess.Popen`을 사용하여 5개의 서브 프로그램을 병렬로 실행.
    - `monitor_processes(process_list)`: 모든 프로세스가 종료될 때까지 대기하며 에러 발생 시 로그 기록.
    - `aggregate_results(result_files)`: 각 서브 프로그램이 생성한 JSON 파일들을 읽어 하나의 `MasterExtractionResult`로 병합.
- **Class: `DatabaseIntegrator`**
    - `send_to_backend(merged_data)`: 병합된 데이터를 .NET API(C#)로 전송.

### 3.2 [Python] Specialized Extractors (Sub-programs)
**역할**: 전달받은 JSON에서 특정 정규표현식(Regex) 패턴을 찾아 추출.

- **Common Logic (Base Class: `BaseExtractor`)**
    - `load_input_json()`: 전처리된 JSON 로드.
    - `apply_regex_pattern(pattern)`: 엔티티의 `content` 필드에 대해 Regex 매칭 수행.
    - `save_output_json()`: 추출된 결과를 `result_{type}.json`으로 저장.

- **Specific Patterns (Regex Implementation)**
    1.  **`dxf_extract_transmitter.py`**: `r"(FIT|FT|LT|PT|TE)\s?-\s?\d+"`
    2.  **`dxf_extract_valve.py`**: `r"(FCV|LCV|TCV|PCV|XV)\s?-\s?\d+"`
    3.  **`dxf_extract_gague.py`**: `r"(PG|TG|LG)\s?-\s?\d+"`
    4.  **`dxf_extract_equipment.py`**: `r"(C|T|F|D|E|B|CT|CH|K)-?\d+"` (상세 규칙은 설계서 참조)
    5.  **`dxf_extract_pump.py`**: `r"(P|VP)-\d+"`

### 3.3 [C#] Backend Service (Data Persistence)
**역할**: Python으로부터 전달받은 데이터를 검증하고 `ExperionDbContext`를 통해 DB에 영구 저장.

- **Controller: `PidExtractionController`**
    - `[HttpPost] PostExtractionResult(ExtractionDto dto)`: Python의 요청을 수신.
- **Service: `PidProcessingService`**
    - `ProcessAndSave(ExtractionDto dto)`: 데이터 유효성 검사 후 `PidEquipment` 엔티티로 변환.
- **Repository: `PidRepository`**
    - `SaveAsync(PidEquipment entity)`: SQL Server에 저장.

## 4. 상세 구현 로드맵 (Implementation Roadmap)

### Phase 1: 데이터 규격 및 환경 구축
- [ ] `IntermediateDataFormat.json` 스키마 확정.
- [ ] Python `ezdxf` 기반의 `DXFPreprocessor` 프로토타입 개발.

### Phase 2: 서브 프로그램(Extractor) 개발
- [ ] `BaseExtractor` 클래스 구현 (JSON 로드/저장/Regex 공통 로직).
- [ ] 5종의 특화된 Regex 패턴 적용 및 개별 스크립트 완성.
- [ ] **검증**: `test_dxf_extract_pid1.py`를 활용한 추출 정확도 테스트.

### Phase 3: 메인 오케스트레이터 개발
- [ ] `subprocess`를 이용한 병렬 실행 및 프로세스 모int 모니터링 로직 구현.
- [ ] 결과 파일 병합(Aggregation) 및 중복 제거 로직 구현.

### Phase 4: 백엔드 연동 및 통합 테스트
- [ ] C# API 엔드포인트 구현 및 Python `DatabaseIntegrator` 연동.
- [ ] **E2E 테스트**: DXF 파일 투입 $\rightarrow$ 분산 추출 $\rightarrow$ DB 저장 전체 파이프라인 검증.

## 5. 예외 처리 및 안정성 전략 (Error Handling)
- **DXF 오류**: 파일 손상 시 `DXFPreprocessor`에서 에러 로그 남기고 프로세스 중단.
- **서브 프로세스 실패**: 특정 서브 프로그램 실패 시, 해당 결과는 제외하되 다른 프로세스 결과는 유지하며 `Partial Success` 상태로 보고.
- **DB 연결 오류**: 재시도(Retry) 로직 적용 및 실패 시 로컬 파일로 결과 백업.
