Files
wingwall_3D_drawing/README.md
T

14 KiB

수로암거 및 날개벽 3D 외형·배근 통합 모델링 웹 시스템 (Wingwall 3D Modeler)

2D 토목 CAD 도면(DWG/DXF)을 브라우저에 업로드하여 암거 본체 및 날개벽의 3D 외형 솔리드(Solid Mesh)와 내부 19종 철근(총 508본) 배근 모델을 3단계 자동화 공정으로 생성·검증·내보내기하는 웹 기반 CAD/BIM 엔지니어링 솔루션입니다.


📌 목차

  1. 프로젝트 개요
  2. 전체 시스템 파이프라인
  3. 단계별 상세 기능 및 동작 방법
  4. 설치 및 실행 방법
  5. 프로젝트 디렉터리 구조
  6. 자동화 단위 및 파이프라인 검증

1. 프로젝트 개요

  • 대상 구조물: 대산당진 고속도로 수로암거 (STA.13+611.21, 내공 B=2.0\text{ m}, 사각 \theta=105.879^\circ)
  • 입력 도면 5종:
    1. 13. 수로암거 일반도(STA.13+611.21)(02).dwg (일반도)
    2. 14. 수로암거 구조도(STA.13+611.21, 종점 우)(01).dwg (종점 우측 배근도 1)
    3. 14. 수로암거 구조도(STA.13+611.21, 종점 우)(02).dwg (종점 우측 배근도 2)
    4. 14. 수로암거 구조도(STA.13+611.21, 종점 좌)(03).dwg (종점 좌측 배근도 1)
    5. 14. 수로암거 구조도(STA.13+611.21, 종점 좌)(04).dwg (종점 좌측 배근도 2)
  • 핵심 기술 스택:
    • 백엔드: Python 3.10+, Flask, Flask-CORS, ezdwg, numpy
    • 프론트엔드: Three.js (WebGL 3D), HTML5 Canvas 2D 벡터 뷰어, Vanilla JavaScript, CSS3
    • 상호운용성: OBJ, STL, AutoCAD 3D-DXF, CSV(Bar Bending Schedule)

2. 전체 시스템 파이프라인

flowchart TD
    subgraph Step1["1단계: 도면 불러오기 및 종류 판별"]
        DWG["DWG/DXF 5종 업로드"] --> AutoClassify["키워드 기반 도면 자동 분류<br>(일반 / 배근·구조 / 미분류)"]
        AutoClassify --> VectorViewer["2D CAD 벡터 뷰어 표출<br>(팬/줌/레이어 제어)"]
    end

    subgraph Step2["2단계: 일반도 기반 3D 외형 모델링"]
        VectorViewer --> CulvertExtract["평면도 점선 인식<br>암거 본체 기하 추출"]
        CulvertExtract --> WingwallExtract["종점부 좌/우 날개벽 치수 보간<br>(A-A/B-B, C-C/D-D 단면)"]
        WingwallExtract --> MeshGen["완전 폐합 수밀 솔리드 생성<br>(체적 75.45 m³)"]
    end

    subgraph Step3["3단계: 구조도 기반 3D 철근 배근"]
        MeshGen --> RebarExtract["재료표 & 단면 배근도 파싱"]
        RebarExtract --> RebarGen["19종 철근 3D 공간 폴리라인 생성<br>(총 508본, 피복두께 80mm 준수)"]
        RebarGen --> RebarBOM["철근 가공조립표 산출<br>(총연장 1,092.8m, 중량 1.543 TON)"]
    end

    subgraph Step4["4단계: 3D 인터랙션 & 내보내기"]
        RebarGen --> Interactive3D["Three.js 3D 뷰어 표출<br>(부재별 격리/거리비례 라벨)"]
        Interactive3D --> Export["BIM 내보내기<br>(OBJ / STL / 3D DXF / CSV / JSON)"]
    end

3. 단계별 상세 기능 및 동작 방법

1단계: 도면 불러오기 및 종류 판별

1) 주요 기능

  • 다중 도면 업로드: 여러 개의 .dwg 또는 .dxf 파일을 동시에 선택하거나 드래그 앤 드롭으로 업로드합니다.
  • 키워드 자동 판별:
    • 도면명에 '일반' 포함 ➔ **일반도(GENERAL)**로 자동 분류
    • 도면명에 '배근' 또는 '구조' 포함 ➔ **배근도/구조도(REBAR)**로 자동 분류
    • 판별 키워드가 없을 경우 ➔ 미분류(UNCLASSIFIED) 상태로 지정
  • 수동 분류 오버라이드: 자동 판별 결과가 맞지 않거나 미분류된 경우, UI에서 즉시 '일반도' 또는 '배근도/구조도' 버튼을 클릭하여 수동으로 변경할 수 있습니다.
  • 2D CAD 벡터 뷰어: 업로드된 도면의 엔티티(선, 폴리라인, 텍스트, 원호 등)를 HTML5 Canvas 기반 벡터 뷰어에서 확인하고 레이어별 On/Off를 제어할 수 있습니다.

2) 화면 조작 방법

  1. 화면 상단의 [1단계: 도면 불러오기 및 판별] 탭을 클릭합니다.
  2. 좌측 패널의 [도면 파일 선택] 버튼을 클릭하거나 점선 영역으로 DWG 파일들을 드래그합니다.
  3. 목록에 표시된 각 도면의 [일반도] / [배근도/구조도] 배지를 확인하고, 필요 시 클릭하여 분류를 변경합니다.
  4. 도면 항목을 클릭하면 우측 뷰어에 2D CAD 도면이 즉시 렌더링되며, 마우스 휠(확대/축소)과 드래그(이동)로 검토할 수 있습니다.

2단계: 일반도 기반 암거 및 날개벽 3D 외형 모델링

1) 주요 기능

  • 암거 본체 자동 인식: 일반도 평면도 상단/하단 점선(CS-CONC-MINR 레이어, A-DASHD01 선형)을 감지하여 내공 스팬 B=2.00\text{ m}, 사각 \theta=105.879^\circ, 외폭 3.40\text{ m}, 높이 $H=2.60\text{ m}$를 자동 산출합니다.
  • 날개벽 위치 및 단면 보간:
    • 시점부 날개벽: 일반도 평면도 좌측 미표기 ➔ 규정에 따라 임의 생성 없이 모델링 제외
    • 종점부 좌측 날개벽 (END_LEFT): L=4.350\text{ m}, 설치각도 134^\circ, 단면 A-A(시점부) ↔ B-B(종점부) 선형 가변 보간
    • 종점부 우측 날개벽 (END_RIGHT): L=5.400\text{ m}, 설치각도 151^\circ, 단면 C-C(시점부) ↔ D-D(종점부) 선형 가변 보간
  • 수밀 솔리드 메시(Watertight Solid): 모든 면이 빈틈없이 닫힌 2-Manifold 솔리드로 생성되어 정확한 콘크리트 체적을 산출합니다:
    • 암거 본체: 59.04\text{ m}^3
    • 종점부 좌측 날개벽: 7.32\text{ m}^3
    • 종점부 우측 날개벽: 9.09\text{ m}^3
    • 총 콘크리트 체적: $75.45\text{ m}^3$

2) 화면 조작 방법

  1. 상단 [2단계: 날개벽 외형 모델링] 탭을 클릭합니다.
  2. 좌측 제어판에서 날개벽 구성 모드를 실시간으로 테스트할 수 있습니다:
    • 종점부만 (도면 기준) : 본 도면의 기본 상태 (종점 2개소 모델링)
    • 양측 모두 (4개소) : 시점·종점 4개 날개벽 시뮬레이션
    • 시점부만 (2개소) / 날개벽 없음 (암거 본체 단독)
  3. 3D 뷰포트에서 마우스 조작:
    • 좌클릭 드래그: 3D 회전 (Orbit)
    • 우클릭 드래그: 화면 이동 (Pan)
    • 마우스 휠: 줌 인/아웃 (Zoom)
  4. 3D 화면의 부재(암거 본체, 좌/우 날개벽)를 직접 클릭하면 해당 부재가 반투명 파란색으로 하이라이트되며 우측 하단에 상세 제원 카드가 표시됩니다.

3단계: 배근도 기반 날개벽 내부 3D 철근 배근

1) 주요 기능

  • 19종 철근 자동 3D 배치: 4종 구조도의 철근 재료표와 상세도를 파싱하여 피복두께(80mm)를 유지한 상태로 날개벽 내부 공간에 3D 중심선 폴리라인을 생성합니다.
  • 주요 철근 배근 내역 (총 508본):
    • 우각부 사각 보강근 (C1, C2): 암거-날개벽 접합부 전면/배면 사각 절곡 정착근 (H19 @250, 각 13본)
    • 벽체 수직 주철근 (W1, W5, W6): L형 기초정착 수직 주철근 (H16 @250, 1·2Cycle 교대 @125 배근)
    • 벽체 수평 배력철근 (W2~W4, W7~W9): 하부 연속 배력근(4단), 상부 경사 가변 배력근(8단), 천단 연단근(H13 @250)
    • 저판 횡방향 주철근 (F1, F2, F6): 양단 후크 가변 주철근 (H16 @250)
    • 저판 종방향 배력철근 (F3~F5, F7~F9): 저판 폭 변화 맞춤형 배력근 (H13 @250)
    • 헌치 및 전단 보강근 (K1, K2, S1~S3): 벽체-저판 접합부 헌치근 및 스터럽/타이바
  • 정밀 물량 집계:
    • 종점부 좌측 (L=4.35\text{m}): 231본, 총길이 485.111m, 중량 0.688 TON
    • 종점부 우측 (L=5.40\text{m}): 277본, 총길이 607.664m, 중량 0.855 TON
    • 합계: 총 508본, 총길이 1,092.775m, 총중량 1.543 TON (할증 3% 적용 시 1.590 TON)

2) 화면 조작 방법

  1. 상단 [3단계: 날개벽 철근 배근] 탭을 클릭합니다.
  2. 좌측 사이드바에서 검토할 날개벽(종점 좌측 또는 종점 우측)을 선택합니다.
  3. 하위 철근 기호 목록(W1, C1, F1 등)을 클릭하면:
    • 선택한 철근군만 선명한 색상으로 **단독 격리(Isolate)**되어 표시됩니다.
    • 다른 철근과 콘크리트 외형은 반투명 처리되어 내부 간섭 및 피복 상태를 직관적으로 확인할 수 있습니다.
    • 카메라 거리에 비례하여 3D 텍스트 라벨 크기가 자동 보정되어 시인성이 유지됩니다.
  4. 우측 상단 HUD 패널에서 규격(H13, H16, H19), 직경, 본당 길이, 수량, 총중량을 실시간 대조할 수 있습니다.

4단계: BIM 데이터 및 철근 가공조립표 내보내기

상단 우측의 [내보내기] 드롭다운 메뉴를 통해 5가지 엔지니어링 포맷으로 즉시 다운로드할 수 있습니다:

포맷 파일명 용도 및 호환 소프트웨어
OBJ wingwall_model.obj 3D 형상 + 철근 폴리라인 메시 (Blender, 3ds Max, Rhino)
STL wingwall_model.stl 콘크리트 외형 수밀 솔리드 메시 (3D 프린팅, BIM 검증도구)
DXF wingwall_model_3d.dxf AutoCAD 3D Face(외형) + 3D Polyline(철근) 레이어 분리 파일
CSV wingwall_rebar_bom.csv Excel 호환 철근 가공조립표 (BBS: 규격, 형상, 길이, 중량)
JSON model_3d.json 3D 정점 및 철근 좌표 원시 데이터 (API 연동용)

4. 설치 및 실행 방법

사전 요구사항

  • Python: 3.10 이상 권장
  • 운영체제: Windows 10/11, macOS, Linux (WSL2 지원)
  • 웹 브라우저: Chrome, Edge, Firefox, Safari (WebGL 2.0 지원 브라우저)

의존성 패키지 설치

pip install -r requirements.txt

실행 모드 선택 (3가지 방식 지원)

방법 1. 로컬 Flask 웹 서버 실행 (권장)

  • Windows: run_server.bat 더블클릭 또는 터미널에서 실행:
    python app.py
    
  • 서버 구동 후 브라우저에서 http://127.0.0.1:5000/ 에 접속합니다.
  • 동적 DWG 파일 업로드 및 실시간 파싱, 내보내기 API가 모두 활성화됩니다.

방법 2. 독립형 정적 브라우저 실행 (서버 불필요)

  • index.html 파일을 웹 브라우저로 직접 더블클릭하여 엽니다.
  • static/data/에 사전 번들링된 도면 및 3D 모델 데이터를 기반으로 서버 없이도 1단계~3단계 모든 3D 뷰어 기능이 오프라인에서 100% 작동합니다.

방법 3. Linux / WSL2 환경 실행

  • 제공된 쉘 스크립트를 실행합니다:
    bash run_wsl.sh
    

5. 프로젝트 디렉터리 구조

├── app.py                                # Flask 백엔드 REST API 서버
├── cad_parser.py                         # ezdwg 기반 DWG 파서 및 도면 자동 판별 엔진
├── model_3d.py                           # 일반도 기반 3D 외형 솔리드 메시 생성 엔진
├── rebar_model.py                        # 구조도 기반 19종 철근 3D 공간 배근 엔진
├── exporters.py                          # OBJ, STL, 3D-DXF, CSV 파일 내보내기 변환기
├── bundle_data.py                        # 정적 오프라인 구동용 데이터 번들러
├── index.html                            # Three.js 3D 뷰어 단일 페이지 프론트엔드 (SPA)
├── requirements.txt                      # 필수 파이썬 패키지 목록 (flask, ezdwg 등)
├── test_pipeline.py                      # 1~3단계 전체 공정 E2E 통합 검증 테스트
├── static/
│   ├── css/
│   │   └── style.css                     # 3단계 반응형 UI 레이아웃 스타일시트
│   ├── js/
│   │   ├── app.js                        # UI 이벤트 및 단계별 상태 관리 로직
│   │   ├── viewer3d.js                   # Three.js 3D 씬, 조명, 카메라, 철근 격리 렌더러
│   │   └── cad2d.js                      # 2D CAD 벡터 뷰어 캔버스 제어기
│   ├── libs/
│   │   ├── three.min.js                  # Three.js r128 코어 라이브러리
│   │   └── OrbitControls.js              # 카메라 마우스 궤도 제어기
│   └── data/
│       ├── drawing_data.js               # 번들링된 도면 파싱 데이터
│       └── model_3d.js                   # 번들링된 3D 외형 및 배근 데이터
├── DOC/
│   └── 04_실행/                          # 버전별 개발 및 검증 보고서 (v0.1.00 ~ v0.1.10)
└── README.md                             # 본 시스템 명세서

6. 자동화 단위 및 파이프라인 검증

프로젝트 루트에서 다음 명령을 실행하여 도면 파싱, 외형 수밀성, 19종 철근 508본 배근, 내보내기 API의 정상 동작을 한 번에 검증할 수 있습니다:

python test_pipeline.py

주요 검증 단정문 (Assertions)

  • 도면 판별: classify_drawing_by_name()의 '일반' ➔ GENERAL, '구조' ➔ REBAR 일치 검증
  • 수밀성 검사: 날개벽 솔리드 메시의 Open Boundary Edge = 0, Non-manifold Edge = 0 검증
  • 철근 제원 일치: 종점 좌(231본) + 종점 우(277본) = 총 508본, 총길이 1,092.775m, 중량 1.543 TON 일치 검증
  • 내보내기 무결성: OBJ, STL, DXF, CSV, JSON 응답 크기 및 데이터 정합성 검증