8.3 KiB
R2C DXF → 3D 웹 뷰어
drawing/R2C_일반도_20260601.dxf를 읽어 단면 기반 3D 모델, 원본 벡터 도면, 독립 HTML 페이지를 생성하고 웹 서버로 게시하는 Python 프로그램입니다. Python 3.9 이상에서 외부 패키지 없이 실행합니다.
실행 및 로컬 웹 게시
Windows 탐색기에서는 프로젝트 폴더의 뷰어 실행.cmd를 더블클릭하세요. WSL 서버가 꺼져 있으면 시작하고, 응답을 확인한 다음 브라우저를 엽니다. 서버 창은 사용하는 동안 열어 두세요. index.html 자체는 서버를 시작하지 않으므로 클릭 실행에는 뷰어 실행.cmd를 사용하세요.
WSL 터미널에서 다음 명령을 실행합니다.
cd /home/b19203/3d-drawing-web
python3 r2c.py serve
브라우저에서 http://localhost:8000 을 엽니다. 서버 종료는 Ctrl+C입니다. 실행할 때마다 DXF에서 모델과 웹페이지를 다시 생성합니다. 생성된 루트 index.html을 더블클릭해도 서버 뷰어로 자동 이동합니다. DXF 파일 첨부 변환은 serve로 실행한 웹사이트에서 사용합니다. 프로그램을 수정한 경우 기존 서버를 종료하고 다시 실행하세요.
HTML 파일을 더블클릭하면 file://에서 http://localhost:8000/로 자동 이동합니다. --port를 지정해 빌드하거나 서버를 실행하면 해당 포트로 이동하도록 생성됩니다. HTTP로 접속한 페이지에서는 이동하지 않습니다. HTML은 서버 프로그램을 직접 시작할 수 없으므로 먼저 위 명령으로 서버를 실행하세요.
다른 포트 또는 로컬 네트워크에 게시하려면 다음처럼 실행합니다.
python3 r2c.py serve --host 0.0.0.0 --port 8080
다른 기기에서는 이 PC의 IP 주소와 포트로 접속합니다. WSL의 네트워크 모드 및 Windows 방화벽 설정에 따라 접근 범위가 달라집니다. 서버는 생성된 dist/만 제공하므로 저장소의 Git 파일이나 프로그램 소스를 노출하지 않습니다.
규격별 보기
상단 규격 선택 또는 변화치수표의 내경 D를 누르면 Ø700·800·900·1,000·1,100·1,200·1,350의 7개 R2C 모델을 볼 수 있습니다. 선택한 규격의 외형 치수·관 중심 높이·사각 입구·원형 유로·소켓이 함께 바뀌며, 다운로드하는 OBJ와 근거 JSON에도 현재 규격을 반영합니다. 원본 변화치수표의 20개 항목을 모두 표시합니다.
Ø1,000은 원본에 실제로 그려진 단면과 원호를 유지합니다. 나머지는 각 행의 치수로 생성하는 파라메트릭 모델이며, 단순한 비례 확대·축소를 하지 않습니다. 원심력 콘크리트관은 종단 폴리라인이 그려진 원본 규격만 제공하며 R2C 규격에 맞춰 임의로 늘리지 않습니다.
치수표의 일부 행은 L1과 L2−L3−10 mm 모따기가 일치하지 않습니다. 모델은 소켓 전체 길이 L2, 끝단 위치 L3, 도면의 10×10 모따기 기준을 사용하고 표기 차이를 화면에 안내합니다. Ø700은 끝단 모따기를 확장하면 하부 외곽과 간섭하므로, 끝단 모따기 표현을 생략하고 D2 내경을 유지합니다. 이 차이도 해당 규격을 선택하면 표시됩니다.
웹사이트에서 DXF 첨부
python3 r2c.py serve로 실행한 사이트에 접속합니다.- DXF 파일 첨부 버튼을 누르거나 첨부 영역에 파일을 놓습니다.
- 변환 후 새 파일의 규격 목록·치수표·원본 벡터 도면·3D 모형이 함께 바뀝니다.
- 기본 도면으로 버튼으로 시작할 때의 도면으로 돌아올 수 있습니다.
최대 10 MB의 ASCII DXF를 지원하며 UTF-8/CP949 인코딩을 읽습니다. 첨부 파일은 서버 메모리에서만 분석하고 디스크에 저장하지 않습니다. 원본 샘플 DXF와 다른 사용자의 화면을 덮어쓰지 않습니다. 지원하지 않는 도면, 손상된 파일, 잘못된 치수는 오류로 알리고 이전 모델을 유지합니다.
이 기능은 R2C 일반도의 단면 A-A/B-B와 변화치수표를 포함하는 도면 형식을 대상으로 합니다. 임의의 2D 도면을 자동으로 입체화하거나 바이너리 DXF/DWG를 변환하지는 않습니다.
서버 API는 POST /api/convert이며 파일 바이트를 요청 본문으로 보내고 X-Filename 헤더에 URL 인코딩한 파일명을 전달합니다. 성공 시 {model, drawingSvg}, 실패 시 {error} JSON을 반환합니다.
정적 호스팅에 게시
python3 r2c.py build
생성된 dist/ 폴더 전체를 정적 웹 호스팅의 게시 폴더로 지정하면 됩니다. 빌드 후 웹 서버 측 Python이나 CAD 소프트웨어는 필요하지 않습니다. HTML은 모델과 벡터 도면을 포함하고 외부 CDN을 사용하지 않습니다. 정적 호스팅만으로는 새 DXF 첨부 변환 API를 제공하지 않습니다. 규격 선택은 정적으로도 동작하지만, 파일 첨부까지 운영하려면 Python 서버를 실행하고 /api/convert가 같은 사이트 주소로 연결되도록 구성하세요.
입력 및 출력 경로를 바꾸려면 다음 옵션을 사용합니다.
python3 r2c.py build --dxf './drawing/R2C_일반도_20260601.dxf' --output ./dist
화면 기능
- R2C 전환관과 원심력 콘크리트관의 3D 보기
- 마우스 회전, 휠 확대, 방향키 회전, 입구/소켓/측면/평면 시점
- 덮개 분리, 상부를 제거한 내부 보기, 윤곽선 표시
- DXF 벡터 도면 확대·이동 및 A-A/B-B 단면 비교
- 변화치수표 7개 규격 선택 및 규격별 3D 모델·치수·OBJ 갱신
- 웹사이트 DXF 파일 첨부/드래그 앤드 드롭, 새 도면 변환, 기본 도면 복원
- OBJ 모델, 원본 DXF, 추출 근거 JSON 다운로드
- JavaScript 실행 전에도 미리 생성한 SVG 3D 형상 표시
도면에서 추출한 형상
현재 DXF의 제목은 R2C관, 연결 원심력관은 Ø1000 일반 B형입니다. 이전의 2,500 × 1,620 직사각형 관 모델은 교체했습니다.
| 항목 | 추출값 |
|---|---|
| R2C 길이 L | 1,620 mm |
| 외형 폭 B | 1,540 mm |
| 외형 높이 H | 1,486 mm |
| 원형 유로 내경 D | 1,000 mm |
| 관 중심 높이 h6 | 666 mm |
| 사각 입구 | 1,310 × 1,205 mm |
| 사각→원형 전환 구간 | X = 100 ~ 1,400 mm |
| 소켓 구간 | X = 1,500 ~ 1,620 mm |
R2C의 A-A 외곽선과 치수표가 일치하는지 검증한 후 단면을 연결합니다. B-B 원호에서 소켓 반지름을 추출하며, 원심력관은 실제 폴리라인 195의 종단을 회전하여 만듭니다. 추출 근거에는 DXF 엔티티 핸들과 원본 파일 SHA-256이 남습니다.
2D 도면을 기반으로 단면 사이의 면을 직선 보간합니다. 상·하부 접합 홈, 철근, 개스킷은 3D에서 생략했습니다. 원본 SVG에는 외곽선·숨은선·원호·타원·스플라인·문자·치수 블록을 표시하고, 해치 채움과 SOLID 치수 화살표는 생략합니다.
이 프로그램은 이 R2C 일반도의 구성에 맞춘 변환기입니다. 임의의 모든 2D CAD 도면을 자동으로 3D화하는 범용 변환기가 아닙니다. 필수 단면이나 치수표를 찾지 못하면 오류로 종료합니다.
파일 구성 및 수정
r2c.py: DXF 파서, 치수 추출, 규격별 모델 생성, SVG 변환, 첨부 변환 API, 웹 서버web/viewer.html: 웹페이지 원본 템플릿web/viewer.js: 화면 조작·첨부·도면 영역 맞춤 코드. 빌드 시 HTML 안에 포함됩니다.tests/test_r2c.py: 규격별 치수·폐곡면, 원본 형상 유지, 정적 패키지, 첨부 API 성공·실패 검증dist/: 웹 게시 산출물 (index.html,drawing.svg,model.json,model.obj, 원본 DXF)index.html: 직접 열기용으로 함께 생성하는 단일 HTML
화면 수정은 web/viewer.html에 하고 python3 r2c.py build로 반영합니다.
python3 -m unittest discover -s tests -v
첨부 도면의 모든 내부 단면은 외곽 안에 있고 양수의 벽 두께를 유지해야 합니다. SPLINE의 차수·노트·가중치가 잘못된 파일은 변환 오류로 반환합니다. 원본 도면의 전체 영역은 실제 SVG 경계에서 계산하고, 부분 영역은 도면 표제 위치를 기준으로 맞춥니다.