14 KiB
14 KiB
수로암거 및 날개벽 3D 외형·배근 통합 모델링 웹 시스템 (Wingwall 3D Modeler)
2D 토목 CAD 도면(DWG/DXF)을 브라우저에 업로드하여 암거 본체 및 날개벽의 3D 외형 솔리드(Solid Mesh)와 내부 19종 철근(총 508본) 배근 모델을 3단계 자동화 공정으로 생성·검증·내보내기하는 웹 기반 CAD/BIM 엔지니어링 솔루션입니다.
📌 목차
1. 프로젝트 개요
- 대상 구조물: 대산당진 고속도로 수로암거 (
STA.13+611.21, 내공B=2.0\text{ m}, 사각\theta=105.879^\circ) - 입력 도면 5종:
13. 수로암거 일반도(STA.13+611.21)(02).dwg(일반도)14. 수로암거 구조도(STA.13+611.21, 종점 우)(01).dwg(종점 우측 배근도 1)14. 수로암거 구조도(STA.13+611.21, 종점 우)(02).dwg(종점 우측 배근도 2)14. 수로암거 구조도(STA.13+611.21, 종점 좌)(03).dwg(종점 좌측 배근도 1)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단계: 도면 불러오기 및 판별]탭을 클릭합니다. - 좌측 패널의
[도면 파일 선택]버튼을 클릭하거나 점선 영역으로 DWG 파일들을 드래그합니다. - 목록에 표시된 각 도면의
[일반도]/[배근도/구조도]배지를 확인하고, 필요 시 클릭하여 분류를 변경합니다. - 도면 항목을 클릭하면 우측 뷰어에 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) 화면 조작 방법
- 상단
[2단계: 날개벽 외형 모델링]탭을 클릭합니다. - 좌측 제어판에서 날개벽 구성 모드를 실시간으로 테스트할 수 있습니다:
종점부만 (도면 기준): 본 도면의 기본 상태 (종점 2개소 모델링)양측 모두 (4개소): 시점·종점 4개 날개벽 시뮬레이션시점부만 (2개소)/날개벽 없음 (암거 본체 단독)
- 3D 뷰포트에서 마우스 조작:
- 좌클릭 드래그: 3D 회전 (Orbit)
- 우클릭 드래그: 화면 이동 (Pan)
- 마우스 휠: 줌 인/아웃 (Zoom)
- 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) 화면 조작 방법
- 상단
[3단계: 날개벽 철근 배근]탭을 클릭합니다. - 좌측 사이드바에서 검토할 날개벽(
종점 좌측또는종점 우측)을 선택합니다. - 하위 철근 기호 목록(
W1,C1,F1등)을 클릭하면:- 선택한 철근군만 선명한 색상으로 **단독 격리(Isolate)**되어 표시됩니다.
- 다른 철근과 콘크리트 외형은 반투명 처리되어 내부 간섭 및 피복 상태를 직관적으로 확인할 수 있습니다.
- 카메라 거리에 비례하여 3D 텍스트 라벨 크기가 자동 보정되어 시인성이 유지됩니다.
- 우측 상단 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 응답 크기 및 데이터 정합성 검증