# 도면에서 모델·보고서까지 — 전체 흐름과 ERD 현재 코드 확인 기준: 2026-09-11 **도면 입력 → 도면 정보 추출 → 객체·형상 생성 → 철근 배치 → 검사·보고서** 전체 그림과 아래 설명을 같은 **①~⑤ 순서**로 구성했습니다. 그림은 왼쪽에서 오른쪽으로, 각 단계 안에서는 위에서 아래로 읽습니다. ## 전체 그림 ```mermaid flowchart LR subgraph S1["① 도면 입력"] direction TB A1["DWG · DXF"] A2["원본 식별
도면명 · SHA-256"] A1 --> A2 end subgraph S2["② 도면 정보 추출"] direction TB B1["문자 · 선분 · 치수"] B2["평면 · 입면 · 단면
상세 · 배근도 · 재료표"] B1 --> B2 end subgraph S3["③ 객체·형상 생성"] direction TB C1["객체 구분
블럭 · 부재 · 좌우"] C2["콘크리트 생성
외곽 · 두께 · 표고"] C1 --> C2 end subgraph S4["④ 철근 배치"] direction TB D1["한 본 형상 + 설치기준
시작 · 끝 · 간격"] D2["객체에 귀속
본별 3D 경로"] D1 --> D2 end subgraph S5["⑤ 검사·보고서"] direction TB E1["전체 콘크리트
합집합 이탈 검사"] E2["객체별 이미지
위치 · 철근명"] E3["PDF · 작업 JSON"] E1 --> E2 --> E3 end S1 --> S2 --> S3 --> S4 --> S5 classDef input fill:#edf4fc,stroke:#6689af,color:#17324d; classDef evidence fill:#eef6f8,stroke:#679ba8,color:#173c46; classDef concrete fill:#eef5ef,stroke:#739b7b,color:#23412b; classDef rebar fill:#eef2ff,stroke:#7c8ac4,color:#2c3861; classDef report fill:#fff3eb,stroke:#c69c79,color:#634127; class A1,A2 input; class B1,B2 evidence; class C1,C2 concrete; class D1,D2 rebar; class E1,E2,E3 report; ``` | 순서 | 들어오는 정보 | 코드가 하는 일 | 다음 단계로 전달 | |---|---|---|---| | ① 입력 | DWG·DXF 원본 | 원본 식별, DWG 변환 경로 처리 | 읽을 수 있는 CAD 원본 | | ② 추출 | CAD 원본 | 문자·벡터·치수·도면 뷰·재료표 판독 | 도면 근거 | | ③ 형상 | 도면 근거 | 실제 객체 구분, 외곽·두께·표고 연결 | 콘크리트 객체 | | ④ 철근 | 콘크리트 + 철근 근거 | 한 본 형상과 설치선 연결, 객체별 배치 | 실제 철근 경로 | | ⑤ 보고서 | 콘크리트 + 철근 경로 | 구조물 이탈 검사, 객체별 이미지 구성 | 모델·보고서·저장 파일 | 작업의 기본 순서는 **도면 → 형상 확인 → 철근 → 결과 확인**입니다. 위 그림은 그 내부 처리를 다섯 단계로 펼친 것입니다. ## ① 도면 입력 DWG는 변환 경로를 거쳐 DXF로 읽습니다. 도면명·원본 내용 식별값은 원본 추적과 캐시 판단에 사용합니다. | 정보 | 필드 예시 | |---|---| | 도면명 | `filename` | | 원본 내용 식별 | `sha256` | | 원본 접근 | `uploadId` | **저장된 결과를 여는 것과 원본에서 다시 생성하는 것은 다른 동작**입니다. ## ② 도면 정보 추출 DXF 문자, BLOCK/INSERT, 벡터 좌표, 철근 표기와 재료표를 읽습니다. 초기 예비 치수와 최종 형상 근거를 구별합니다. ```mermaid erDiagram direction LR DRAWING ||--o{ EVIDENCE : "도면 근거 추출" ``` | 구분 | 의미 | 주요 데이터 | |---|---|---| | DRAWING | 입력 도면 | 원본·도면명·내용 식별값 | | EVIDENCE | 도면에서 읽은 근거 | 문자·치수·선분·뷰·재료표 | 도면 판독에는 로컬 CAD 추출·결정론적 연결 함수뿐 아니라 `call_model_plan`의 Codex 판독 경로도 존재합니다. 모든 정보를 순수 수식으로만 판독하는 구조는 아닙니다. ## ③ 객체 구분과 콘크리트 형상 생성 평면의 외곽·위치, 입면·종단의 높이·경사, 단면·상세의 두께를 실제 부재와 연결합니다. 같은 날개벽 이름이라도 블럭·좌우·시종점이 다르면 별도 객체입니다. ```mermaid erDiagram direction LR EVIDENCE }o--o{ COMPONENT : "형상 근거 연결" ``` | 구분 | 의미 | 주요 데이터 | |---|---|---| | EVIDENCE | 여러 도면 뷰의 근거 | 외곽·치수·표고·접합 근거 | | COMPONENT | 실제 콘크리트 부재 | `concrete_components[].id`, 종류, 외곽·표고 또는 메시 | 예: **날개벽 평면 + 입면 + 단면 → 블럭1 · 좌측 날개벽** 객체별로 생성하되 **접합부는 인접 객체와 함께** 확인합니다. ## ④ 객체별 철근 배치 콘크리트와 철근은 별도 데이터로 관리합니다. 철근 그룹에 상세·설치기준을 연결하고, 실제 철근 한 본마다 귀속 객체와 3D 경로를 저장합니다. ```mermaid erDiagram direction LR COMPONENT }|--o{ REBAR_GROUP : "호스트 연결" REBAR_GROUP ||--o{ REBAR_INSTANCE : "본별 배치" ``` | 도면 정보 | 배치에 사용하는 내용 | |---|---| | 철근 상세 | 한 본의 절곡 형상·구간 치수 | | 배근도·치수선 | 시작·끝·간격·설치선 배열 | | 재료표 | 직경·본수·길이 대조 | | 데이터 | 연결 필드 | |---|---| | 콘크리트 객체 | `concrete_components[].id` | | 철근 그룹 | `mark`, `host_component_ids`, `rebar_assembly_id` | | 한 본의 경로와 귀속 | `instance_paths_m[i]` ↔ `occurrence_instance_ids[i]` | | 도면 설치기준 | `source_station_contract` | `REBAR_INSTANCE`는 별도 테이블이 아니라 그룹 안의 두 배열을 같은 인덱스로 연결한 개념입니다. 정착·접합 철근은 도면 근거에 따라 복수 객체에 걸칠 수 있습니다. **객체별 공통 구조**이지 모든 부재를 동일한 함수 하나로 생성한다는 뜻은 아닙니다. 부재 종류별 생성 함수와 공통 연결·검사 규칙이 함께 사용됩니다. 부분 처리의 기준은 **실패한 항목만 건너뛰고 독립적으로 생성 가능한 항목을 계속 처리하며, 기존 결과를 보존하는 것**입니다. 관련 예외 분리 수정과 회귀테스트는 진행했으나, 이 문서 작성 시 실행 중인 형상 작업을 보호하기 위해 8097 서버 재시작 적용은 대기 중입니다. ## ⑤ 검사·보고서·저장 보고서는 객체별로 정리하지만, 이탈 판정 범위는 **전체 콘크리트 합집합**입니다. 다른 부재 내부에 정착된 구간을 원래 호스트 밖이라는 이유만으로 이탈 처리하지 않습니다. ```mermaid erDiagram direction LR REPORT ||--o{ REPORT_ROW : "객체별 결과" REPORT_ROW ||--o{ EXPOSURE_SEGMENT : "이탈 구간" ``` | 데이터 | 의미 | 표시·저장 내용 | |---|---|---| | REPORT | 현재 모델의 검사 스냅샷 | 입력 확인값·검사 버전·완료 여부 | | REPORT_ROW | 객체·철근별 결과 | 위치·철근명·이미지 재구성 데이터 | | EXPOSURE_SEGMENT | 검출된 구조물 밖 구간 | `airSegments` → 빨간 선·점 | PDF는 이탈 항목을 **객체별 작은 이미지 + 위치·철근명**으로 구성합니다. 작업 JSON을 복원하면 저장된 모델·검사 좌표로 이미지를 다시 구성합니다. ### 작업 저장 구조 `JOB`은 전 단계의 도면·생성 결과를 묶는 작업 단위입니다. 작업 저장과 출력 흐름을 혼동하지 않도록 전체 그림의 교차 연결선에서는 생략했습니다. | 저장 위치 | 담기는 내용 | |---|---| | `result` | 현재 생성 모델 | | `partialResult` | 생성 중 누적된 부분 결과 | | 작업 JSON의 `modelPlan` | 콘크리트·철근 모델 | | 작업 JSON의 `modelReport` | 검사 결과·이탈 좌표·인쇄 구성 | ## 같은 순서로 보는 예시 — 블럭1 · 좌측 날개벽 WR2 | 순서 | 예시 | |---|---| | ① 입력 | 해당 날개벽이 있는 원본 도면 입력 | | ② 추출 | 날개벽 평면·입면·단면 및 WR2 상세·배근도·재료표 판독 | | ③ 형상 | 블럭1 · 좌측 날개벽 콘크리트 생성 | | ④ 철근 | WR2 설치선과 한 본 형상을 해당 날개벽에 연결 | | ⑤ 보고서 | 전체 콘크리트와 대조 → 이탈 선·점 → 객체별 이미지 출력 | ## 해석 범위와 한계 - 위 ERD는 실제 DB 테이블이 아니라 **현재 JSON·코드의 논리 관계**입니다. - ERD에서 `||`는 하나, `o{`는 0개 이상, `}|`는 1개 이상입니다. 연결되지 않은 후보는 별도 보류 항목입니다. - 객체별 공통 구조만으로 모델별 예외나 과거 보정 경로가 모두 제거됐다고 단정할 수 없습니다. 이 문서는 전체 하드코딩 감사 결과가 아닙니다. - 파란색 표시는 승인 판정이 아닙니다. 사용자 확인 기록과 계산 결과는 분리합니다. - `auditComplete`는 검사 계산 종료이지, 모든 철근의 도면 일치·시공 적합성 보증이 아닙니다. - 현재 보고서는 원주 샘플 기반 검사이므로 미지원 형상과 샘플 사이 미세 노출의 한계가 있습니다. ## 코드 위치 — 위 순서와 동일 | 순서 | 코드 | |---|---| | ① 입력·변환 | `server.py` 업로드 처리, `dwg_conversion.py` | | ② 문자·벡터·재료표 | `server.py`: `build_analysis`, `drawing_evidence_schema` | | ③ 형상·단계 관리 | `server.py`: `call_model_plan`, `run_model_job` | | ④ 객체별 누적 생성 | `progressive_rebar.py`: `stream_current_source` | | ④ 그룹·본별 귀속 | `server.py`: `enforce_object_local_rebar_geometry_contract` | | ④ 화면 표시 대상 | `rebar_review_visibility.js`: `isCurrentSourceDrawable` | | ③·④ 화면 형상 | `model_kernel.js`, `app.js` | | ⑤ 전체 합집합 검사 | `air_exposure.js`: `prepare`, `inspect`, `segment` | | ⑤ 보고서·JSON | `model_report.js`, `app.js` |