Files
ExperionCrawler/pid_parser_coding_byGemma4.md

4.8 KiB

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을 읽어 패턴 매칭을 수행합니다.

{
  "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) 로직 적용 및 실패 시 로컬 파일로 결과 백업.