OpenCAD DWG·DXF
브라우저에서 DXF·DWG 도면을 열거나 새로 만들어 그리고, 재고, 고쳐서 저장하는 무료 2D CAD입니다.
보기 전용 뷰어가 아니라 그리기·수정·치수·블록·도면층·배치 편집과 DWG·DXF 저장까지 하는 편집기입니다.
설치할 것이 없고, 서버도 쓰지 않습니다. 연 파일은 사용자 컴퓨터 밖으로 나가지 않습니다.
바로 쓰기: https://gyutae-kim.github.io/opencad-dwgdxf/
CAD·CAM 분야는 파일을 만든 프로그램이 없으면 도면을 열어 보기도 어렵습니다.
OpenCAD는 이 벽을 낮추려는 프로젝트이고, 이 저장소는 그 첫 번째인 DWG·DXF 2D 캐드입니다.
2026-10-16에 저장소 이름을 2dcad-viewer에서 다른 OpenCAD 저장소처럼 opencad-dwgdxf로 바꿨습니다.
SKP·STEP·NC 형식은 별도 저장소에서 개발합니다:
opencad-nc · opencad-step ·
opencad-skp, 공용 3D 뷰어 opencad-viewer3d.
할 수 있는 것
- 열기·새 도면: DXF R12
R2018(ASCII·이진), DWG R13R2018. 시작 화면의 ‘새 도면’(Ctrl+N)으로 빈 도면에서 바로 그릴 수 있습니다. 파일을 끌어다 놓거나 고르면 됩니다. 수백만 객체 도면도 열리며, 장면을 다 만들기 전에 첫 화면부터 차례로 그려 보입니다.
- 보기: 휠 확대·축소, 가운데 버튼 이동, 전체 보기. 모형 탭과 배치 탭(용지·뷰포트·뷰포트별 동결 도면층과 색·선가중치·투명도 재지정, PSLTSCALE), 채우기 끄기(FILL)·빠른 문자(QTEXT)
- 보기 링크: 리본 뷰 탭의 "보기 링크"(VIEWLINK)나 휴대폰 보기의 더 보기 메뉴로 지금 화면(가운데·배율·배치 탭)을 담은 주소(
#view=)를 복사합니다.
그 주소로 열면 같은 범위를 화면에 맞춥니다(화면 크기가 달라도 같은 곳이 보입니다). 파일은 주소에 담지 않으니 받는 사람도 같은 파일을 열거나 ?sample·?open=주소와 함께 씁니다.
- 휴대폰 보기 모드: 손가락 기기(휴대폰·태블릿)에서 좁거나 낮은 화면이면 편집 리본·명령행·제도 상태 막대 대신 보기·치수 확인 화면으로 엽니다.
- 보기 단추 한 줄: 전체 보기, 거리·반지름·각도·면적 재기, 도면층, 치수 목록, 더 보기(⋯: 점 좌표 ID·문자 찾기·참조 파일 고르기·보기 링크 복사). 처음 열 때 도면 전체를 화면에 맞춥니다(파일에 저장된 화면은 데스크톱 비율이라 잘리므로).
단추 이름은 12px이고, 이름이 긴 언어에서 한 줄에 넘칠 때만 11.5px·10.5px로 줄이며, 그래도 넘치면 단추 최소 폭을 44px에서 40px로 줄입니다(360px 폭 독일어). 더 보기는 이름 없는 아이콘 단추입니다.
- 누르는 곳: 손가락 기기에서는 응용프로그램 메뉴(A)·파일 탭 닫기 단추를 보이는 크기는 그대로 두고 투명한 테두리로 40×36px까지 넓혔습니다.
- 측정 띠: 도면 아래에 명령 안내(예: "첫 번째 점 지정:")와 옵션·<기본값> 단추(Enter 대신), 취소 단추. 끝나면 결과와 "다시 재기"
결과는 명령이 넘긴 측정값으로 큰 값 한 줄(예: 171.08 mm)과 작은 보조 줄(거리는 각도·ΔX·ΔY, 반지름은 지름, 두 선 사이 각도는 보각, 면적은 둘레)로 보이고,
누르면 명령행 원문(AutoCAD 문장)을 펼칩니다. 편집 화면의 명령행 글은 그대로입니다.
점을 고를 때는 객체 스냅 칩(끝점·중간점·중심·교차점·수직 발·근처점)으로 스냅을 켜고 끕니다. 보기 모드의 스냅은 이 브라우저에 따로 기억합니다.
도면 위에 남는 결과 글(점 옆의 거리·면적·좌표)은 보통 점 오른쪽 위에 두고, 화면 가장자리에서 잘리거나 측정 띠·명령행·시트에 가릴 때만 점 왼쪽이나 아래,
그래도 안 되면 띠 바로 위로 옮깁니다. 커서 옆 안내 상자도 띠·명령행에 걸리면 커서 반대쪽으로 갑니다(넓은 화면에서 겹치지 않던 자리는 그대로).
- 빠진 참조 파일: 도면이 쓰는 외부 참조·이미지·PDF·SHX 글꼴이 이 기기에 없으면 안내 카드를 한 번 보이고, 고른 파일을 확장자대로 이어 다시 그립니다.
- 정보 카드: 객체를 누르면 그 하나만 고르고 길이·각도·반지름·지름·면적·치수 측정값·표시 문자 같은 치수 정보를 보입니다("특성 전체"는 팔레트).
- 정밀 조준: 측정 중이거나 보기 모드에서 한 손가락을 움직이지 않고 잠깐(0.35초) 누르고 있으면 손가락 위에 십자선이 뜹니다.
끌면 화면은 움직이지 않고 십자선이 따라가며 스냅·거리를 미리 보여 주고, 떼면 그 자리를 누른 것으로 칩니다. 조준 없이 손가락으로 찍은 점은 객체 스냅 조준창을 두 배로 넓힙니다.
- 도면층 시트: 보기 모드에서는 켜기·색·이름·객체 수만 보이고(새로 만들기·지우기·필터 나무·동결·잠금·선종류·선가중치 칸을 숨김) 켜기 단추와 목록 행을 손가락 크기로 키웁니다. 시트가 열려 있으면 정보 카드는 목록을 가리지 않게 숨기고, 명령 안내 띠는 시트 위로 올립니다.
- 시작 화면: 보기 모드에서는 "새로 그리기" 카드를 숨겨 "예제 도면 열기"가 먼저 보이고, 도면이 없을 때 보기 단추는 누를 수 없습니다.
소개 문구와 지원 범위도 보기·치수 확인(열기, 전체 보기, 거리·반지름·각도·면적, 도면층, 치수 목록) 중심으로 바꾸고, 그리기·고치기·저장은 연필 단추(편집 화면)나 컴퓨터에서 한다고 안내합니다.
- 보기 모드에서는 그립 편집·두 번 눌러 고치기·도면 영역 오른쪽 클릭(안드로이드 길게 누르기) 메뉴를 열지 않습니다. 제목 막대의 연필 단추로 편집 화면, 눈 단추로 보기 모드를 오가고, 고른 모드는 이 브라우저에 기억합니다.
- 파일 고르기: 손가락 기기는 형식을 거르지 않습니다(iOS가 .dwg·.dxf를 흐리게 막지 않게 — 연 뒤 알립니다).
- 홈 화면에 추가: 웹 앱 매니페스트와 아이콘이 있어 주소창 없는 앱 창으로 열립니다. 한 번 연 뒤에는 인터넷이 끊겨도 앱·편집기·최근 문서가 열리고(아래 "홈 화면 앱과 오프라인"), 안드로이드에서는 다른 앱의 "공유"로 DWG·DXF를 바로 받습니다. 막대를 아래로 끌어도 당겨서 새로고침으로 연 도면을 잃지 않습니다.
언어 페이지(
/en/ 등)는 빌드가 만든 <언어>/manifest.webmanifest를 걸어, 그 언어 이름으로 설치되고 그 언어 페이지에서 열립니다(범위·아이콘은 앱 전체).
- 도면 요소: 선·호·원·타원·폴리선(폭·볼록도)·스플라인, 문자·여러 줄 문자(서식·쌓기·열 — R2000~R2013 형식에 단마다 따로 저장된 여러 단 문자는 한 단을 눌러도 모든 단을 함께 고릅니다), 블록·속성,
치수(치수 블록, 블록이 없으면 치수 스타일대로 다시 만들어), 지시선·다중 지시선, 해치(무늬·단색·그라데이션), 가리기, 여러 줄, 표, 선종류(복합 선종류 문자 포함), 선가중치,
영역·3D 솔리드의 모서리 선(ACIS 자료에서)
- 확인·측정: 객체 선택과 특성(길이·면적·반지름 등), 거리·각도·면적·반지름 측정, 좌표(ID), LIST,
객체 스냅(끝점·중간점·중심·사분점·교차점·삽입점·노드·수직·근처점), 직교.
DIST·MEASUREGEOM 거리는 모형 공간에서 두 점의 높이까지 넣은 3D 거리를 재고, Z 증분과 XY 평면으로부터의 각도(아래로 기울면 270~360)를 함께 보입니다.
점의 높이는 좌표에 준 Z, 객체 스냅으로 잡은 점의 Z(OSNAPZ 1이면 고도), 둘 다 없으면 지금 고도이고, 배치의 도면 공간에서는 평면 거리(도면 공간 단위)입니다.
도면 공간의 DIST는 뷰포트에 보이는 모형 객체에도 스냅합니다. 두 점이 모두 같은 뷰포트 하나에 보이는 모형 객체의 스냅이면
화면과 나란한 평면에 투영한 모형 공간 거리를 보이고(증분과 각도는 화면 방향의 모형 단위 값), 다중 점도 모든 점이 그럴 때 모형 공간 누적 거리입니다.
한 점만 모형 스냅이거나, 두 점의 뷰포트가 다르거나, 뷰포트가 겹친 자리이거나, 길이를 쳐서 더한 구간이 있으면 도면 공간 거리입니다.
MEASUREGEOM(거리·반지름·각도·면적)과 다른 조회 명령은 이전처럼 도면 공간 객체만 보고, 거리는 도면 공간 거리입니다(치수 명령은 아래 치수 항목).
ID는 지금 UCS의 X·Y와 그 점의 Z를 보이고, 상태 막대 좌표의 Z는 커서가 잡은 스냅 점의 높이, 없으면 지금 고도입니다
(AutoCAD 도움말 DIST·ID·COORDS가 설명하는 것을 따랐습니다).
DIST의 둘째 점에서 Enter나 M을 누르면 다중 점입니다(MEASUREGEOM 거리는 M). 점을 이어 찍을 때마다 누적 거리를 명령행에 보이고,
커서 옆에는 지금 고무줄 선까지 더한 거리를 보입니다. 호(A)로 호 구간(각도·중심·방향·반지름·두 번째 점, PLINE과 같은 옵션)을,
길이(L)로 앞 구간과 같은 방향의 정한 길이를 더하고, 명령 취소(U)는 마지막 구간을 빼며, 닫기(C)는 시작점까지 더하고 끝냅니다. Enter로 끝냅니다.
선 구간은 두 점 DIST처럼 높이까지 재고, 호 구간은 앞 점 높이의 평면 호입니다. 다른 명령의 프롬프트에서
'DIST를 치면 재고 그 명령으로 돌아갑니다
(리본·휴대폰 단추로 시작하면 이전처럼 하던 명령을 끝냅니다).
LIST는 위치(시작점·끝점·중심·삽입점·첫 정점 등)를 지금 UCS의 X·Y·Z로 보이고, 원·호·문자·블록처럼 객체 좌표계로 저장된 점은 돌출 방향을 반영합니다.
BYLAYER가 아닌 색상·선종류·선가중치·투명도, 0이 아닌 두께, Z축과 다른 돌출 방향도 보입니다(AutoCAD 도움말 LIST). 델타·각도와 특성 팔레트·DBLIST의 좌표는
도움말에 기준이 없어 이전처럼 저장된 좌표입니다.
상태 막대 좌표는 COORDS를 따릅니다. 1(기본)은 커서를 따라 계속, 0은 점을 지정할 때만 바뀌고, 2는 명령이 둘째 점을 물을 때 기준점에서 거리<각도, Z로 보입니다.
점을 물을 때 좌표 표시를 누르거나 Ctrl+I를 누르면 0 → 1 → 2로 돌고, 이 브라우저에 기억합니다(지리 좌표 3은 없습니다).
점을 묻는 동안에는 커서가 도면 밖으로 나가도 마지막 좌표가 남아 있어 누를 수 있습니다(AutoCAD 도움말 COORDS, "상태 막대의 좌표 표시 바꾸기").
AREA·MEASUREGEOM 면적은 객체(원·호·타원·타원호·폴리선·닫힌 스플라인·해치·영역, 열린 곡선은 현으로 닫은 면적)를 재고, 면적 추가(A)·빼기(S)로 합계를 냅니다.
MASSPROP은 영역과 닫힌 객체의 면적·둘레·도심·관성 모멘트·주 모멘트를 알리고 .mpr 파일로 씁니다.
영역은 ACIS 모서리의 정확한 곡선(선·원호·타원호·넙스)으로 재고, 같은 면의 안쪽 고리만 구멍으로 뺍니다(서로 다른 영역은 더합니다).
EXPLODE는 영역을 모서리 곡선대로 선·원·호·타원·스플라인으로 나누고, 3D 솔리드·바디는 ACIS 형상을 새로 만들어야 해서 분해하지 않습니다.
- 도면층: 켜기·끄기·동결·잠금·격리, 병합(LAYMRG)·삭제(LAYDEL)·일치(LAYMCH), 도면층별 객체 선택, 객체 격리·숨기기,
도면층 탐색(LAYWALK)·도면층에 복사(COPYTOLAYER)·도면층 변환기(LAYTRANS), 명령행 도면층(-LAYER, 스크립트용),
도면층 상태 저장·복원(LAYERSTATE, Shift+Ctrl+L, AutoCAD 형식과 .las), 도면층 이전(LAYERP), ByLayer로 설정(SETBYLAYER),
도면층 팔레트의 특성 필터·그룹 필터(AutoCAD 필터와 같은 형식)
- CAD 표준·디자인센터: 표준 파일 연결과 위반 검사·수정(STANDARDS·CHECKSTANDARDS), 다른 도면의 블록·도면층·스타일·배치를 미리보기와 함께 가져오기(ADCENTER, Ctrl+2)
- 치수 목록: 모든 치수의 표시 문자와 실제 측정값을 나란히 보여 주고, 문자를 바꿔 적은 치수를 찾습니다.
- 찾기 및 대치: 문자·속성·치수 재지정·표·다중 지시선의 글을 찾아 이동하거나 바꿉니다(서식 유지, 대소문자·전체 단어·범위).
- 그리기: 선, 폴리선, 원, 호, 직사각형, 폴리곤, 타원, 스플라인, 점(등분할·길이 분할), 구성선, 광선, 도넛, 문자, 여러 줄 문자,
다중 지시선, 여러 줄(MLINE), 구름형 수정 기호, 가리기, 경계 폴리선, 나선(HELIX), 스케치(SKETCH), 원호 정렬 문자(ARCTEXT), 3D 폴리선·3D 면·트레이스.
3D 폴리선·3D 면은 좌표에 준 Z를 씁니다:
x,y,z, 앞 점의 Z를 잇는 @dx,dy[,dz], 원통 좌표 d<각도,z, 구 좌표 d<각도<각도, 점 필터(.XY 뒤 Z 값),
끝점·중간점·중심처럼 객체의 점에 붙인 스냅의 Z. Z를 주지 않은 점은 고도(ELEVATION)입니다.
선(LINE)도 좌표에 준 Z로 3D 선을 그리고(0,0,5 → @10,0은 Z 5에서, @0,0,3은 Z축 방향 선), 원(CIRCLE)은 중심점에 준 Z가 원의 고도입니다.
AutoCAD 도움말 ELEV가 3D 점에 X·Y만 주었을 때 지금 고도를 새 객체의 Z로 쓴다고 설명하는 것을 따랐습니다.
선의 점과 원의 중심을 객체 스냅으로 잡으면 그 점의 Z를 씁니다. 끝점·중간점·중심은 객체의 그 점, 근처점·수직·접점은 객체 위 그 자리의 높이
(3D 선·3D 폴리선은 선을 따라, 고도가 있는 폴리선·원은 그 고도), 교차점은 두 객체가 3D에서도 만날 때의 높이입니다.
평면도에서만 겹쳐 보이는 교차점과 블록 안 객체처럼 높이를 모르는 점은 지금 고도입니다.
AutoCAD 도움말 "About Using Object Snaps in 3D"가 객체 스냅 위치의 Z는 객체의 3D 위치가 정한다고 설명하는 것을 따랐습니다.
평면도에서 고도에만 그리고 싶으면 OSNAPZ를 1로 하거나 OPTIONS 제도 탭의 "Z 값을 현재 고도로 대체"를 켭니다(선·원·3D 폴리선·3D 면의 스냅 점이 지금 고도가 됩니다).
AutoCAD처럼 저장하지 않는 값이라 새로 열면 다시 꺼져 있습니다.
폴리선·호 같은 다른 2D 객체는 Z를 주어도 지금처럼 고도에 평면으로 그립니다.
명령 옵션은 AutoCAD와 같습니다: RECTANG 모따기·모깎기·폭·회전·영역, CIRCLE Ttr·접선 접선 접선(리본), ARC 11가지 방법(이어 그리기, 시작·끝·방향 등, Ctrl로 방향 전환), PLINE 호 옵션(Ctrl로 방향 전환), XLINE 이등분·간격띄우기, SPLINE 맞춤/CV·차수·매듭·닫기.
- 수정: 이동, 복사, 회전, 축척, 대칭, 간격띄우기, 자르기, 연장, 모깎기, 모따기, 끊기, 결합, 신축, 길이 조정, 분해, 배열,
지우기, 그립 편집(신축·이동·회전·축척·대칭, 회전·축척의 참조), 잘라내기·복사·붙여넣기(블록으로·원래 좌표에), 명령 취소·복구, 경로 배열(ARRAYPATH),
연관 배열(직사각형·원형·경로, ARRAYEDIT·배열 그립·특성 팔레트, AutoCAD가 만든 DXF 배열도 고침),
정렬(ALIGN), 혼합 곡선(BLEND), 폴리선·스플라인 편집(PEDIT·SPLINEDIT), 중복 정리(OVERKILL), 경계 한쪽 자르기(EXTRIM), 여러 줄 편집(MLEDIT),
명령행 ARRAYRECT·ARRAYPOLAR(만든 뒤 그립·옵션으로), UNDO 표식·묶음, MOCORO, TRIM·EXTEND 걸치기·울타리·Shift 전환, LENGTHEN 동적,
TRIM으로 해치 자르기와 문자를 절단·경계 모서리로, PEDIT 결합 퍼지 거리·결합 유형, JOIN 닫기(호 → 원), FILLET·CHAMFER Shift로 구석, 폴리선과 선 모깎기 결합
- 직접 조작: 선택한 객체를 끌어 옮기기(Ctrl이면 복사)와 오른쪽 버튼으로 끌어 놓은 자리의 메뉴(여기로 이동·여기로 복사·블록으로 붙여넣기·취소), 올가미 선택(스페이스로 걸침·윈도우·울타리), 두 번 눌러 고치기(문자 편집기·빠른 특성·PEDIT·블록 편집기),
오른쪽 클릭 Enter와 상황별 메뉴, 동적 입력(상대 좌표, 거리·각도 칸 Tab 잠금), 객체 스냅 재지정 입력(END·MID·CEN… FROM·M2P·TT·점 필터),
접점(원·호·폴리선 호 구간·타원·타원호·스플라인)·연장선·평행·가상 교차점·기하학적 중심 스냅, 스냅 표식 위 Tab으로 겹친 스냅 점 돌기, Shift 임시 직교, Ctrl 제도 키(Ctrl+G·B·L·F·U·I 등).
가상 교차점은 선을 무한선으로, 호를 원으로, 타원호를 타원으로 늘려 객체의 정확한 형상으로 만나는 점을 구합니다(블록 안 객체도).
- 오른쪽 버튼 끌어 놓기: 명령이 없을 때 고른 객체 위(그립이 아닌 곳)를 마우스 오른쪽 버튼(펜은 옆 단추)으로 누른 채 끌면 미리보기가 따라오고,
놓은 자리에 메뉴가 뜹니다. 여기로 이동·여기로 복사는 왼쪽 버튼 끌기와 같고, 블록으로 붙여넣기는 고른 객체의 사본을 새 블록(기준점은 누른 자리)으로 만들어
놓은 자리에 넣습니다(원본은 그대로). 어느 것이든 명령 취소(U) 한 번으로 되돌립니다. 취소·Esc·메뉴 바깥 누르기는 아무것도 바꾸지 않고, 끄는 동안 Esc를 누르면 끌기를 그만둡니다.
AutoCAD 도움말 "About Copying Objects"가 오른쪽 버튼으로 끌면 끈 뒤 바로 가기 메뉴가 뜬다고 설명하는 것과
그 항목(Move Here·Copy Here·Paste as Block·Cancel)을 따랐습니다. 끌지 않은 오른쪽 클릭은 이전과 같습니다.
휴대폰·태블릿에서 손가락으로 쓸 때는 오른쪽 버튼이 없고 길게 누르기가 정밀 조준이라 이 메뉴가 없습니다. 이동·복사 명령을 쓰십시오(한 손가락 끌기는 그대로 화면 이동입니다).
- 지연된 접점: LINE·XLINE의 첫 점, PLINE의 시작점을 접점 스냅으로 원·호·폴리선 호·타원·스플라인 위에 찍으면 다음 점에서 그은 접선이 되고,
다음 점도 접점이면 두 곡선의 공통 접선이 됩니다(PLINE은 AutoCAD 도움말에 없는 이 앱의 확장입니다). CIRCLE 3P는 세 점을 각각 점이나 원·호·타원·스플라인·선의 접점으로 받고,
Ttr·접선 접선 접선은 객체 스냅이 꺼져 있어도 접점 스냅으로 객체 위 점을 고릅니다. 타원은 해석적으로, 스플라인은 곡선 위 매개변수의 뉴턴법으로 접점을 구하고,
풀리지 않으면 접선을 긋지 않고 다시 묻습니다. 원이 곡선에 한 점으로만 닿는 경계(예: 타원 꼭짓점과 선 사이를 지름으로 채우는 원)도 그립니다.
- 다기능 그립: 그립 위에 커서를 올리면 폴리선 정점 추가·제거·호/선 변환, 선·호 길이 조정·반지름, 스플라인 맞춤점, 치수 문자 위치·연속·기준선.
그립을 눌러 신축하는 중 Ctrl을 한 번 눌렀다 떼면 이 옵션으로 차례로 돕니다. 커서를 올리면 뜨는 메뉴와 Ctrl 순환은 GRIPMULTIFUNCTIONAL
(OPTIONS 선택 탭의 동적 그립 메뉴 표시·Ctrl+순환 동작 허용)로 켜고 끕니다.
그립 편집 모드 전환(ST·MO·RO·SC·MI), 회전·축척의 참조(R), Ctrl 다중 복사, Shift로 여러 핫 그립, 신축 중 입력한 값이 결과 길이가 되는 동적 치수
- 해치: 내부 점·객체 선택, 무늬 66개·사용자 정의, 그라데이션 9종(GRADIENT), 섬 검출, 틈 허용, 경계를 고치면 따라가는 연관 해치
- 치수: 객체에 맞춰 고르는 스마트 치수(DIM), 선형, 정렬, 각도(사분점), 반지름, 지름, 세로좌표, 호 길이(부분·지시선), 연속, 기준선(각도 치수도), 꺾기 반지름, 빠른 치수(QDIM). 치수 스타일대로 AutoCAD와 같은 치수 블록을 만듭니다.
하위 치수 스타일(선형·각도·반지름·지름·세로좌표·지시선, 이름$n)을 만들고 그 종류의 치수에 씁니다.
끊기(DIMBREAK)·꺾기선(DIMJOGLINE)·간격 조정·문자 편집·변수 재지정, 기하 공차(TOLERANCE), 중심 표식·중심선,
형상을 고치면 따라가는 연관 치수(DIMASSOC·DIMREASSOCIATE), 검사 치수(DIMINSPECT).
배치의 도면 공간에서 선형·정렬·각도·세로좌표 치수와 스마트 치수(DIM)의 점, 연속·기준선의 두 번째 원점은 뷰포트에 보이는 모형 객체에도 스냅하고,
반지름·지름·호 길이·각도·꺾기 반지름 치수, 선형·정렬 치수의
<객체 선택>, DIM의 마우스 아래 객체는 그 자리에 배치 객체가 없으면 뷰포트 하나에 보이는
모형 객체를 고릅니다(뷰포트가 겹친 자리는 고르지 않습니다).
치수는 그 뷰포트로 보이는 자리에 그리고, 길이 값(선형·정렬·반지름·지름·호 길이·꺾기 반지름·세로좌표)은 뷰포트 축척만큼 맞춘 측정 축척(DIMLFAC 재지정,
음수라 도면 공간에서만 씀)을 넣어 모형 공간 값을 보입니다. 각도는 축척과 무관해 그대로 잽니다. 이 치수는 아직 모형 객체와 연관되지 않습니다.
연속·기준선 치수는 모형 끝점에 스냅해도 값을 도면 공간 거리로 잽니다(앞 치수의 축척 맞춤을 이어받는지는 도움말에 없어 남은 일입니다). QDIM은 배치 객체만 고릅니다.
모형 공간에 놓인 치수는 DIMLFAC가 음수여도 1로 잽니다(AutoCAD 도움말 DIMLFAC — 저장된 값은 그대로).
- 파라메트릭 구속: 기하 구속 12종(일치·평행·직교·접선·동심·대칭 등)과 치수 구속(선형·정렬·각도·반지름·지름),
자동 구속(AUTOCONSTRAIN), 식과 사용자 매개변수(PARAMETERS). 구속된 객체를 옮기면 이어진 객체가 따라옵니다.
AutoCAD에서 만든 구속도 읽어 고치고 같은 형식으로 저장합니다.
- 지시선: 다중 지시선 작성·추가·제거·정렬·수집, 다중 지시선 스타일, 빠른 지시선(QLEADER), 옛 지시선(LEADER)
- 문자 편집기: 문자·여러 줄 문자·치수·다중 지시선 문자를 도면 위에서 바로 고칩니다(스타일·글꼴·굵게·기울임·밑줄·색·스택·목록·열·기호·필드).
한 줄 문자(TEXT)도 도면 위에서 입력하고, 특성 팔레트에서 치수·다중 지시선·공차·표 셀을 고칩니다. 한 창짜리 치수 스타일 관리자와 문자 스타일 대화상자
- 문자 도구: 한 줄 문자를 여러 줄 문자로 합치기(TXT2MTXT), 문자 줄 세우기(TEXTALIGN), 속성 바로 편집(ATTIPEDIT)
- 표·필드: 표 삽입과 셀 편집(행·열 삽입·삭제, 병합, 정렬), 테이블 스타일, 날짜·파일 이름·객체 특성 필드와 필드 업데이트.
표는 DWG·DXF 모두 AutoCAD 표 객체로 저장하고, AutoCAD 필드(FIELD)를 읽고 씁니다.
- 블록·그룹: 블록 정의·재정의(모든 참조 갱신)·삽입·속성, 블록 편집기, 동적 블록 참조 편집(가시성·뒤집기·선형·XY·회전·조회·점·극좌표, 동적 그립, RESETBLOCK, DXF·DWG — 매개변수·동작·가시성 상태 작성(BPARAMETER 등)은 아직 안내만), 블록 속성 관리자(BATTMAN)·동기화, 블록 쓰기(WBLOCK), 블록 개수·대치·속성 남기고 분해,
그룹(GROUP, 그룹 단위 선택), 도면층·선종류·문자 스타일 관리, 특성 팔레트에서 값 바꾸기, 특성 일치(설정(S)으로 옮길 특성 고르기),
소거(PURGE: 블록·도면층·선종류·문자·치수·다중 지시선·테이블·다중선 스타일, 빈 그룹, 등록된 응용프로그램, 0 길이 형상·빈 문자 객체 — 0 길이·빈 문자는 AutoCAD처럼 모형·배치 공간만)
- 선택·관리: 신속 선택(QSELECT), 유사 선택, 선택 필터(FILTER), 이름 바꾸기(RENAME), 감사(AUDIT), 상태, 도면 한계, 계산기(QUICKCALC·CAL), OOPS,
시스템 변수 이름 바로 입력(PDMODE 등)·SETVAR·SYSVDLG, 별칭 편집(ALIASEDIT), 옵션(OPTIONS — 그립·십자선·조준창·선택·오른쪽 클릭·휠이 바로 반영), 도면 특성(DWGPROPS, DWG 요약 정보 보존)
- 제도 보조: 객체 스냅, 직교, 극좌표 추적(F10), 객체 스냅 추적(F11), 격자(F7)·스냅(F9), 등각투영 제도(ISODRAFT, F5로 평면 전환, 등각원), 사용자 좌표계(UCS), 명명된 뷰(VIEW).
극좌표 추적과 객체 스냅 추적은 AutoCAD처럼 AUTOSNAP 8·16과 같은 상태입니다. F10·F11, 상태 막대 단추, 제도 설정(DSETTINGS), AUTOSNAP 값 중 어디서 바꿔도 함께 바뀌고,
이 브라우저에 남아 다음에 열어도 같은 상태로 시작합니다(처음에는 둘 다 켜져 있습니다). 직교를 켜면 극좌표 추적이 꺼지고, 극좌표 추적을 켜면 직교가 꺼집니다.
AutoSnap 마그넷(OPTIONS 제도 탭, AUTOSNAP 4)을 켜 두면 십자선이 잡은 스냅점에 붙고, 끄면 표식기만 스냅점에 보입니다(누르면 어느 쪽이든 스냅점을 씁니다).
추적하는 각도는 AutoCAD처럼 POLARANG(증분 각도), POLARADDANG(추가 각도), POLARMODE(비트)로 정하고 이 브라우저에 남습니다.
제도 설정의 극좌표 추적 탭에서 증분 각도를 목록에서 고르거나 직접 치고(예: 7.5), 추가 각도를 켜고(POLARMODE 4) 목록의 [새로 만들기]·[삭제]로 고치며,
객체 스냅 추적에도 극좌표 각도를 쓸지(2), 각도를 마지막으로 그린 선분에서 잴지(1, 상대 극좌표)를 고릅니다.
추가 각도는 10개까지이고, 같은 방향은 다시 넣지 않으며, 0도보다 작거나 360도 이상이면 같은 방향(예: -15 → 345)으로 넣고 알려 줍니다.
목록에서는 위·아래 화살표로 고르고 Delete로 지우며, 새 각도 칸에서는 Enter로 넣고 Esc로 그만둡니다.
객체 스냅 추적점을 Shift를 누른 채로만 얻는 설정(8)은 OPTIONS 제도 탭의 정렬점 획득에 있습니다. 상태 막대 극좌표 단추의 오른쪽 클릭 메뉴에서도 증분 각도를 고릅니다.
- 극좌표 각도의 단위: 제도 설정과 상태 막대 메뉴는 증분 각도와 추가 각도를 도면의 각도 단위(AUNITS)와 정밀도(AUPREC)로 보입니다
(도/분/초 도면이면 22d30', 그라드면 25g, 측량 단위면 추가 각도를 N 80d E 같은 방위로). 그 칸에는 같은 단위로 치면 되고, 단위 표시(22d30'·25g·0.3927r)를 붙여도 됩니다.
AutoCAD 도움말의 POLARADDANG에 "The AUNITS system variable sets the format for display of angles"라고 되어 있어 이를 따랐습니다.
저장하는 값은 이전처럼 도입니다(POLARANG 22.5, POLARADDANG "10;75"). 명령행·SETVAR·SYSVDLG도 이 저장값을 그대로 보이고 단위 표시 없는 수를 도로 받으므로
예전 스크립트가 그대로 동작합니다(단위 표시나 방위를 붙이면 도로 바꿔 받습니다). AutoLISP
getvar로 읽는 POLARANG은 AutoCAD처럼 라디안입니다.
AutoCAD 도움말은 AUPREC보다 자세한 추가 각도를 넣으면 반올림된다고 적고 있지만, 이 앱은 친 값을 그대로 두고 보일 때 자릿수를 늘려 실제 값을 보입니다
(정밀도 0인 도면에서도 22.5는 23이 아니라 22.5로 보입니다).
- 극좌표 각도의 0 방향과 방향: 극좌표 추적은 각도를 도면 단위(UNITS)의 0 방향(ANGBASE)에서 양의 방향(ANGDIR)으로 잽니다.
북쪽을 0으로 하고 시계 방향으로 재는 도면(ANGBASE 90·ANGDIR 1)이면 증분 각도 30의 정렬선이 북쪽에서 시계 방향으로 30도마다 생기고, 추가 각도 10은 북쪽에서 시계 방향 10도입니다.
360을 나누지 않는 증분(50도)은 시계 방향으로 셉니다. 상대 극좌표(POLARMODE 1)는 마지막 선분이 0이고 ANGDIR 쪽으로 잽니다.
객체 스냅 추적의 "직교로만 추적"은 이전처럼 UCS의 수평·수직이고, "전체 극좌표 각도 설정을 사용하여 추적"은 극좌표 추적과 같은 방향입니다.
AutoCAD 도움말 "About Polar Tracking and PolarSnap"이 0의 방향은 도면 단위 대화상자에서 정한 각도를, 스냅 방향(시계·반시계)은 도면 단위에서 정한 방향을
따른다고 설명하는 것을 따랐습니다.
추적 툴팁(극좌표·상대 극좌표·객체 스냅 추적·등각 추적)의 각도도 같은 0 방향에서 재서 AUNITS·AUPREC로 보입니다(도/분/초면
< 30d, 측량 단위면 < N 30d E).
동적 입력의 각도 칸과 명령행 극좌표(@50<0·50<0·원통·구 좌표)도 같은 기준이라, 툴팁에 보인 각도를 그대로 치면 같은 방향입니다
(도움말 "About Entering 2D Polar Coordinates": 극좌표 입력의 각도 규칙은 UNITS로 바꾼다).
기본 도면(ANGBASE 0·ANGDIR 0)은 이전과 같습니다.
- 회전 각도와 거리의 각도: ROTATE에 친 회전 각도는 시계 방향 도면(ANGDIR 1)이면 시계 방향으로 돌립니다(AutoCAD 도움말 "About Rotating Objects").
참조(R)의 참조 각도·새 각도에 친 숫자는 절대 각도라 도면의 0 방향(ANGBASE)에서 잽니다. 점으로 준 각도는 이전처럼 그 방향입니다.
DIST·MEASUREGEOM 거리는 X·Y·Z 증분과 XY 평면 각도를 지금 UCS에서 재고, XY 평면 각도를 도면의 0 방향에서 양의 방향으로 보입니다
(북쪽 0·시계 방향 도면이면 동쪽이 90, 측량 단위면 방위). 그립 회전·문자·블록 회전 각도와 LIST의 각도는 명령마다 도움말 근거를 찾지 못해 이전과 같습니다.
- POLARMODE를 예전처럼 쓰던 경우: 이전 판은 POLARMODE 0·1을 극좌표 추적 끄기·켜기로 받았습니다. 지금은 AutoCAD와 같이 각도 측정·추적 방식이고,
켜기·끄기는 F10(AUTOSNAP 8)만 합니다. 옮기는 규칙은 이렇습니다.
- 이전 판도 켜기·끄기 상태는 AUTOSNAP 8로 이 브라우저에 저장했으므로 그 값을 그대로 씁니다. 업데이트해도 F10 상태는 바뀌지 않습니다.
- POLARMODE와 증분 각도는 이전 판에서 저장한 적이 없어 옮길 값이 없습니다. 처음에는 AutoCAD 초기값(POLARMODE 0, 90도, 추가 각도 없음)이고,
이 값에서 추적하는 방향은 이전 판과 같습니다(90도 증분에서는 객체 스냅 추적을 직교로만 하든 극좌표 각도로 하든 방향이 같습니다).
이전 판에서 증분 각도를 바꾸면 객체 스냅 추적도 그 각도를 썼는데, 이제는 제도 설정에서 "전체 극좌표 각도 설정을 사용하여 추적"(POLARMODE 2)을 골라야 합니다.
- 스크립트에서
POLARMODE 1로 극좌표 추적을 켜던 줄은 이제 상대 극좌표를 켜고, POLARMODE 0으로 끄던 줄은 추적을 끄지 않습니다.
AutoLISP (setvar "POLARMODE" 1)도 같습니다. 켜고 끄는 줄은 AUTOSNAP(또는 F10)으로 고쳐 주십시오.
명령행·SETVAR·스크립트로 POLARMODE를 바꾸면 페이지를 연 뒤 처음 한 번 이 내용을 알려 줍니다(AutoLISP setvar는 알리지 않습니다).
- 배치 뷰포트: MVIEW로 만들고 VPCLIP·VPLAYER로 다듬으며, 뷰포트 안을 두 번 눌러(MSPACE) 모형을 직접 고치고 확대합니다.
뷰포트 안에서 ZOOM(윈도우·범위·전체·객체·중심·축척·이전)과 PAN은 그 뷰포트의 뷰를 바꿉니다. 창은 뷰포트를 채우고, nX는 뷰포트 가운데를 두고 배율을,
nXP는 뷰포트 축척을 바꾸며(0.05XP면 1:20), 이전 뷰는 뷰포트마다 10개까지 돌아갑니다. 화면표시가 잠긴 뷰포트에서는 줌이 배치 전체에 걸리고 축척은 그대로입니다.
ZOOM에 접미사 없이 친 숫자는 도면 한계(LIMITS)에 대한 배율입니다. 2를 치면 한계가 화면(뷰포트 안이면 그 뷰포트)을 꼭 채울 때의 두 배로, 뷰 가운데는 그대로 둡니다.
모형 공간과 뷰포트 안은 모형 한계, 배치의 도면 공간은 그 배치의 한계를 씁니다.
ZOOM 전체(A)는 객체 범위와 같은 한계를 함께 담게 줌합니다(한계가 범위 안이면 범위(E)와 같고, 범위보다 크면 한계까지). 리본·휴대폰의 전체 보기 단추는 범위 줌입니다.
뷰포트를 화면 가득 키워 고치고(VPMAX·VPMIN), 다른 뷰포트를 기준 뷰포트의 축척·위치에 맞춥니다(VPSYNC).
모형 화면은 타일 뷰포트(VPORTS)로 나눌 수 있고, 배치는 EXPORTLAYOUT으로 새 도면의 모형으로 내보냅니다.
- 참조·링크: 블록·이미지·PDF 자르기(CLIP·XCLIP·IMAGECLIP·PDFCLIP), 참조 제자리 편집(REFEDIT, 외부 참조를 두 번 누르기), 전자 전송(ETRANSMIT, 도면과 참조 파일을 zip으로),
하이퍼링크(Ctrl+클릭으로 열기), 데이터 추출(블록 개수·속성을 표나 CSV로), 블록 개수 창(COUNT)
- 주석 축척: 축척 리스트(SCALELISTEDIT)와 현재 주석 축척, 주석 문자·블록·치수·해치·다중 지시선을 축척마다 같은 용지 크기로 보이게 하고 뷰포트마다 다른 축척으로 그립니다.
축척별 표현은 AutoCAD와 같은 축척 레코드로 DXF·DWG에 저장합니다.
- 도면 비교: 다른 도면과 비교해 같은 것·이 도면에만 있는 것·비교 도면에만 있는 것을 색과 구름형 리비전으로 보이고, 비교 도면의 객체를 가져옵니다(COMPARE).
다시 불러온 외부 참조의 바뀐 곳도 같은 방식으로 보입니다(XCOMPARE).
- Express Tools: 문자 대소문자·번호·방향·폭 맞춤·가리기·둘레·분해(TCASE·TCOUNT·TORIENT·TEXTFIT·TEXTMASK·TCIRCLE·TXTEXP),
특성으로 선택(SSX·GETSEL), 중첩 객체 정보·복사(XLIST·NCOPY), 전체 속성 편집(GATTE), 끊기선(BREAKLINE), 확장 간격띄우기(EXOFFSET),
평면화(FLATTEN), 색상 순서(CDORDER), 선종류 만들기(MKLTYPE), 하이퍼링크 목록(SHOWURLS), 경로 바꾸기(REDIR)
- 스크립트·AutoLISP: .scr 파일을 끌어 놓거나 SCRIPT로 고르면 명령행에 차례로 넣습니다(RSCRIPT·RESUME·DELAY).
명령행·스크립트에서 AutoLISP 식을 평가하고 .lsp를 불러옵니다(APPLOAD,
(defun c:이름 …), command, entget·ssget 등).
스크립트에서 쓰는 명령행 버전 명령(-INSERT·-HATCH·-ARRAY·-PURGE·-STYLE·-DIMSTYLE·-UNITS·-PLOT 등)과 페이지 설정 가져오기(PSETUPIN)
- 자동 저장: 바뀐 도면을 SAVETIME마다 이 브라우저에 저장해 두고, 브라우저가 갑자기 닫히면 도면 복구 관리자로 엽니다.
- 저장: DWG R2000
R2018, DXF R12R2018(ASCII·이진). DWG로 연 도면은 같은 버전으로 저장합니다(R2007은 R2004로).
저장하면 빠지거나 바뀌는 객체(다른 버전으로 쓸 수 없는 ACIS·OLE·동적 블록 객체, DXF로 옮길 수 없는 연관 동작 등)가 있으면 파일을 내기 전에 목록을 보이고 묻습니다(원본 파일은 그대로).
R2013+ DWG의 자료 저장소(ACIS 형상)는 같은 버전으로 저장할 때 그대로 남기고, DXF의 OLE 객체(붙여 넣은 표·그림)도 남깁니다.
영역·3D 솔리드를 다른 버전으로 저장할 때 SAT 자료가 있으면(R2000 DWG·R2000R2010 DXF에서 연 도면) R2000 DWG와 R2000R2010 DXF에 ACIS 객체로 쓰고, 그 밖에는 모서리 선(3D 폴리선)으로 남깁니다.
원본 자료로 쓸 수 없는 사용자 객체는 빼는 대신 그 그림(선·호·문자)으로 남깁니다. R2004 이후 DWG의 외부 참조 블록도 그대로 읽고 씁니다(불러오지 않은 상태 포함, DXF↔DWG 저장에서도 그대로).
맞춤점 스플라인은 AutoCAD처럼 DWG에 맞춤점 자료(맞춤점·끝 접선·매듭 매개변수)로 쓰고, DWG의 맞춤점 자료를 읽으면 AutoCAD와 같은 곡선을 만듭니다.
R2000~R2010 DWG에는 제곱근·균일 매듭을 담을 자리가 없어 그런 스플라인은 모양 그대로 조정점 스플라인으로 쓰고 저장 전 확인에 알립니다.
새 도면은 acadiso·acad 서식으로 만듭니다.
- 외부 파일: 외부 참조 창(XR)에서 폴더나 파일을 고르면 같은 이름의 래스터 이미지, DWG·DXF 외부 참조, PDF 언더레이를
연결해 그립니다. PDF의 벡터 형상·채우기·문자는 도면 객체로 가져올 수 있습니다(PDFIMPORT). 파일은 서버로 보내지 않습니다.
- 출력: 플롯(용지·축척·흑백·회색조, 선가중치, 미리보기, 간격띄우기·매수·브라우저 인쇄), 열린 도면들의 배치·모형을 골라 한 PDF로(PUBLISH), 페이지 설정 관리자(명명된 페이지 설정), 배치 만들기·이름 바꾸기·이동·삭제, PNG·JPEG·BMP·SVG(EXPORT).
용지는 ISO A0
A4·B0B5, JIS B4·B5, Letter·Legal·ANSI BE, ARCH AE1과 사용자 크기(mm)입니다.
축척은 AutoCAD처럼 "용지 mm(또는 인치) = 도면 단위"이고, 도면 단위(INSUNITS)를 알면 실제 크기 기준 축척을 함께 보입니다. 윈도우·범위·한계 플롯은 그 영역 밖을 그리지 않고,
배치도 대화상자의 용지·방향·축척·플롯 대상(배치·범위·화면표시·윈도우)·간격띄우기로 플롯합니다(도면 공간 먼저, "도면 공간을 나중에 플롯"·"선가중치 축척"·"투명도 플롯" 옵션).
배치 용지가 목록에 없으면(ARCH D·사용자 크기) "배치 용지" 항목으로 그 용지 그대로 플롯합니다.
PDF는 도면층(PDF 도면층으로 켜고 끔)·투명도·검색과 복사가 되는 문자(보이지 않는 글자 층, 글자마다 실제 폭이라 낱말로 찾아집니다)를 담고, 같은 색 채우기는 한 경로로 칠해 이음매가 생기지 않습니다.
- 한글과 SHX: CP949(ANSI_949) DXF·DWG, SHX 큰 글꼴 자리의 한글은 Noto Sans KR로 그립니다.
이 컴퓨터의 SHX 글꼴 폴더를 고르면(SHXFONTS) 원래 SHX 글꼴과 도형으로 그립니다. 글꼴 파일은 이 브라우저에만 보관합니다.
GDT 글꼴(gdt.shx·amgdt.shx)을 불러오지 않아도 공차 기호(직각도·위치도·지름·Ⓜ 등과 카운터보어·카운터싱크·깊이)는 이 앱의 도형으로 그리고, 세로 문자 스타일도 그립니다(DWG·DXF 모두).
AutoCAD를 쓰던 사람이 따로 배우지 않도록 화면 배치, 명령 이름·별칭(DI, MEA, LA, Z 등),
단축키(F3·F8·Ctrl+1 등), 마우스 동작을 AutoCAD와 같게 맞췄습니다. 도움말은 F1입니다.
구조
src/
core/ 문서 모델, 새 도면 서식, 색(ACI), 코드 페이지, 단위, 치수 변수
io/dxf/ DXF 리더(ASCII·이진)와 쓰기(R12~R2018)
io/dwg/ DWG 리더(R13~R2018)와 쓰기(R2000~R2018), ODA 공개 명세로 새로 작성
geom/ 변환 행렬, 곡선 나누기(볼록도·NURBS·맞춤점 보간)
edit/ 편집 세션(명령 취소), 편집 기하 커널(geom), 치수 생성기(dim), 주석·표·필드·여러 줄·유틸리티 계산
text/ 단선 글꼴, SHX 해석, 윤곽 글꼴 조각 받기, TEXT·MTEXT 배치
render/ 장면 빌더(블록 펼치기·선종류·해치·치수·지시선), 표시 목록, WebGL2 렌더러
worker/ 파일 해석·장면 만들기·저장(DXF·DWG)을 맡는 웹 워커
app/ 화면·명령·선택·스냅·추적·그립(다기능 그립)·문자 편집기(textedit/)·팔레트·출력
파일 해석과 그리기 준비는 웹 워커에서 하고, 화면 스레드는 확대·이동과 선택만 맡습니다.
워커는 장면을 만드는 동안 첫 화면에 보이는 객체부터 조각으로 보내 먼저 그리게 하고(점진 빌드), 문서는 장면 뒤에 객체 묶음으로 나눠 부호화해 보냅니다(화면 스레드가 오래 멈추지 않게).
문서의 폴리선(경량·2D·3D·메시·폴리페이스) 정점, 해치 경계(폴리선·모서리), MESH 정점·면, 지시선 정점, 스플라인 조정점·맞춤점은 점마다 객체를 두지 않고 수 배열(평탄 좌표)로 둬 큰 도면의 메모리와 GC를 줄입니다.
좌표는 공간 격자 묶음 기준 float32로 올려 큰 좌표(예: 500000, 300000)에서도 확대했을 때 떨리지 않습니다.
전체 보기처럼 멀리서 볼 때는 작은 묶음을 큰 칸 무리로 합쳐 한 번에 그리고, 크게 확대하면 원래 묶음으로 그립니다.
같은 모양의 글자는 한 번만 GPU에 올리고 글자마다 변환만 둡니다.
개발
npm install
npm run dev # http://localhost:5173
npm test # 비교용 도면이 없으면 해당 테스트는 건너뜁니다
npm run build # dist/
로컬 대조 시험: DXF·DWG 리더와 쓰기, 치수 생성기 같은 시험의 일부는 각자 가진 표본 도면을 ezdxf 결과와 DWG 기준 도구의 결과에 견줍니다
(scripts/oracle/, 설정은 tests/oracle/ezdxf.ts). 표본과 도구는 저장소에 넣지 않고 환경 변수로만 줍니다.
주지 않거나 쓸 수 없으면(ezdxf를 불러오지 못하는 파이썬, 불러오지 못하는 모듈) 그 시험은 건너뜁니다. CI도 이렇게 돕니다.
| 변수 | 내용 |
|---|
CAD_PYTHON | ezdxf가 있는 파이썬 실행 파일 |
CAD_FIXTURES | 표본 도면 폴더(samples/·samples-dxf/·all-samples/·templates/ 등, 읽기만 합니다) |
CAD_DWG_ORACLE | read_dwg(bytes)를 내보내는 파이썬 모듈 이름. 결과의 doc(ezdxf와 같은 꼴의 문서)·warnings·version을 블랙박스로 씁니다 |
CAD_DWG_PYTHON | (선택) 그 모듈을 불러올 수 있는 파이썬. 기준 도구와 ezdxf가 다른 환경에 있을 때만 줍니다(없으면 CAD_PYTHON) |
CAD_PYTHON=~/envs/cad/bin/python CAD_FIXTURES=~/cad-fixtures CAD_DWG_ORACLE=<모듈 이름> npm run test:oracle
npm run test:oracle -- tests/dwg # 일부만
npm run test:oracle은 세 변수를 모두 쓸 수 있는지 먼저 보고, 하나라도 쓸 수 없으면 무엇이 없는지 알리고 시험을 돌리지 않습니다.
npm test는 이때 대조 시험을 조용히 건너뛰어 통과한 것처럼 보이고, CI도 대조 시험을 건너뛰므로 대조 시험의 실패는 이 명령으로만 드러납니다.
리더·쓰기·도형 계산처럼 파일 해석 결과가 바뀔 수 있는 변경은 고치기 전과 후에 npm run test:oracle을 돌려 실패 목록이 같은지(새 실패가 없는지) 확인합니다.
ezdxf 요약과 기준 도구가 바꾼 DXF는 .runtime/에 캐시해 두 번째부터 빠릅니다.
기준은 DWG를 같은 판의 DXF로 바꿔 견주므로 DXF 표현에서만 생기는 차이(예: R2000~R2007 DXF는 동적 블록 정의를 *U<n> 익명 블록으로 씁니다 — AutoCAD도 같습니다)는
근거와 함께 tests/dwg/normalize.ts에서 맞춥니다. 기준 DXF는 맞춤점 자료만 담은 스플라인을 맞춤점만으로 쓰고, AutoCAD와 이 앱의 DWG 리더는
같은 자료로 구한 조정점·매듭을 함께 둡니다. 이 차이는 기준을 AutoCAD DXF 꼴로 바꿔 견줍니다(맞춤점 수·좌표·끝 접선과 채운 조정점 좌표는 그대로 견줍니다).
실제 도면 훑기
가진 도면 폴더를 앱과 같은 길(읽기 → 모형·모든 배치 장면 → DXF R2018·DWG R2018·DWG R2000·원본과 같은 판으로 쓰기 → 다시 읽기)로 한꺼번에 확인합니다.
표본은 저장소에 없으니 각자 로컬 폴더를 줍니다(--dirs 또는 환경 변수 OPENCAD_SWEEP_DIRS, 쌍점으로 여러 개). 폴더를 주지 않으면 쓰는 법만 보이고 끝납니다.
npm run sweep -- --dirs ~/drawings:/data/cad --out .runtime/sweep/before
npm run sweep -- --dirs ~/drawings --jobs 4 --limit 200 --filter dwg,R2000 # 빠른 부분 훑기(확장자·판으로 거르기)
npm run sweep:compare -- .runtime/sweep/before .runtime/sweep/after --fail-on-change
폴더를 재귀로 훑어 .dxf·.dwg·.dwt만 고르고, 내용이 같은 파일은 sha256으로 한 번만 봅니다.
결과 폴더에는 records.jsonl(파일마다 한 줄, 경로는 이 로컬 결과에만)과 summary.json(분류·판별·형식별 개수, 예외, 경고 코드, 왕복 차이 종류별 파일 수, 품질 지표, 시간)이 남습니다.
왕복 비교는 종류별 개수와 핸들별 값(치수 측정값·문자·속성 값·도면층·블록)을 봅니다. sweep:compare는 분류가 바뀐 파일, 지표가 바뀐 파일(내용 해시), 새 예외를 보입니다.
DWG에 자리가 없는 값(스플라인의 평면·직선 비트, R2000 DWG의 맞춤점 방식 비트)은 견주지 않습니다. DWG에는 스플라인의 맞춤점 자료와 조정점 자료 중 하나만 남으므로
그 형식 차이로 생기는 수(맞춤점만 있던 스플라인을 다시 읽을 때 채워지는 조정점·매듭, 조정점만 남은 맞춤점 방식 스플라인에 되살린 맞춤점, R2000~R2010의 제곱근·균일 매듭에서 빠지는 맞춤점)도 견주지 않습니다. 다른 형식·판으로 저장할 때 설계대로 빠지는 비그래픽 객체
(쓰기 경고로 알린 것, 그 판에 없는 종류, DWG 표 보조 자료 — 재질·비주얼 스타일 등은 AutoCAD가 열 때 다시 만듭니다)는 summary.json의 objectsDropped에 따로 세고,
알리지 않고 빠진 객체만 왕복 차이(object:종류:-)와 품질 지표 silent-object-loss로 남깁니다.
--oracle은 CAD_PYTHON(ezdxf가 있는 파이썬)이 있을 때만 ezdxf와도 견줍니다(DXF 원본, 우리가 쓴 DXF와 audit, DWG 옆의 같은 이름 DXF).
공용 사이트 도구
다섯 언어 페이지·검색 정보·사이트맵·내용 수정일·언어별 앱 정보·서비스 워커 빌드, 공용 번역기, 언어 메뉴, 서비스 워커 등록·새 판 알림,
방문 통계, 휴대폰 성능 비교는 다른 OpenCAD 앱과 함께 쓰는 opencad-site-kit
(github:GyuTae-Kim/opencad-site-kit#v0.1.4, 잠금 커밋 a1de400, 빌드 때만 써서 devDependencies)에 있습니다.
이 앱에만 있는 것은 tools/site.mjs(앱 정보 원본 public/manifest.webmanifest, 처음 설치 때 담을 파일, 쓸 때만 받는 덩어리, 따로 판을 매기는 fonts/·pdfjs/·samples/),
tools/sw-template.js(서비스 워커 본문), src/app/pwa.ts의 공유 받기 실패 안내입니다. check:seo·check:i18n·test:seo·update:content-dates는 도구의 opencad-site 명령입니다.
도구 판을 올릴 때는 빌드 결과를 견줍니다.
npx vite build && cp -R dist .runtime/dist-before # 올리기 전
npm install -D "opencad-site-kit@github:GyuTae-Kim/opencad-site-kit#<태그>" # package.json·잠금 파일을 함께
npx vite build && npx opencad-site compare-dist .runtime/dist-before dist # 바뀐 파일과 처음 다른 곳
도구의 판 설명에 적힌 것 밖의 차이가 없으면, 스크립트가 바뀐 경우 내용 수정일을 갱신하고(아래 "검색 및 링크 공유") 빌드·시험을 돌립니다.
main 브랜치에 올리면 GitHub Actions가 빌드해 gh-pages 브랜치로 배포합니다.
로드맵
docs/ROADMAP.md, 지금까지의 작업 내역은 docs/CHANGELOG.md
라이선스
MIT. 함께 배포하는 글꼴 등은 THIRD_PARTY_NOTICES.md를 보십시오.
AutoCAD는 Autodesk의 상표이며, 이 프로젝트는 Autodesk와 관계가 없습니다.
검색 및 링크 공유
대표 주소는 https://gyutae-kim.github.io/opencad-dwgdxf/입니다. site/metadata.json에서 제목·검색 설명·대표 주소·공유 이미지·작성자를 관리하고, 공용 사이트 도구가 tools/site.mjs 설정으로 canonical, Open Graph·Twitter, WebApplication·탐색경로 구조화 데이터를 함께 생성합니다. index.html의 <!-- site-metadata -->가 개발·배포 빌드에서 같은 메타데이터로 치환되므로 개별 태그에 제목이나 설명을 중복 작성하지 않습니다. 앱 실행 전에도 기능 안내와 포트폴리오 링크를 읽을 수 있고, 실행 후에는 같은 안내를 시작 화면에서 제공합니다. 공유 이미지는 public/og-opencad.jpg(1200×630)입니다.
sitemap.xml은 같은 생성 코드에서 만들며 이 앱 주소와 lastmod를 포함합니다. 개발 서버에서도 같은 주소로 제공합니다. 호스트 전체의 robots.txt와 통합 사이트맵은 포트폴리오 저장소에서 관리합니다. 하위 프로젝트의 robots.txt로 호스트 수집 규칙을 바꿀 수는 없습니다. 새 공개 도구를 추가하면 포트폴리오의 OPENCAD_TOOLS에도 실제 주소를 등록합니다.
site/content-history.json에 실제 수정 시각과 콘텐츠 지문을 기록합니다. 본문·메타데이터·공유 이미지·실행 코드 또는 CSS가 바뀌면 아래 명령으로 실제 수정 시각을 UTC로 지정하세요. 예시 시각은 작업 시각으로 바꿉니다.
npm run update:content-dates -- --at 2026-10-16T00:00:00Z
npm run test:seo
npm run build
내용이 그대로면 재빌드해도 날짜를 유지합니다. 미래 날짜와 이전 수정일보다 이른 날짜는 거부하고, 콘텐츠 지문만 바뀌었는데 날짜 기록을 갱신하지 않으면 빌드가 실패합니다. 사이트맵 lastmod와 WebApplication dateModified는 이 기록 하나를 사용합니다. 기록 파일을 소스와 함께 커밋하고, 배포 뒤 포트폴리오에서 npm run sync:viewer-date를 실행해 통합 사이트맵에도 반영합니다. CI에서도 메타데이터·날짜 테스트와 실제 빌드 검사를 수행합니다.
상단 ‘← 포트폴리오’는 작업 중에도 표시되며, 시작 화면에는 OpenCAD 도구 목록과 포트폴리오 링크가 있습니다.
검색 제목과 설명은 무료 DWG·DXF 웹 캐드(보기·그리기·편집·저장)와 실제 지원 기능을 중심으로 작성합니다. index.html의 #viewer-guide는 지원 형식·무료 사용 범위·도면 처리 방식·제작자를 안내하며, 앱 시작 화면에서도 같은 요소를 사용합니다. 검색어를 반복하거나 지원하지 않는 형식·인증·호환성을 홍보하지 않습니다.
웹 사용 안내와 초기 로딩
시작 화면의 사용 안내에서 DWG·DXF 열기와 측정·PDF 출력으로 이동할 수 있습니다. 안내 링크는 JavaScript 실행 전 HTML과 실행 후 시작 화면에 함께 제공됩니다.
주소를 열면 별도의 소개 화면에서 버튼을 누르지 않아도 리본·파일 탭·작업 영역을 갖춘 CAD 화면으로 바로 진입합니다. 도구막대의 열기(Ctrl+O), 시작 탭의 파일 열기·최근 문서·예제 도면, 드래그 앤 드롭을 사용합니다. ?sample과 ?open=주소는 기존대로 해당 도면을 바로 엽니다. 주소에 보기 링크(#view=)가 있으면 처음 연 도면에 그 화면을 맞춥니다. 편집기를 내려받지 못하면 정적 사용 안내와 새로고침 버튼을 표시합니다.
2D 해석 워커는 첫 엔진 요청에서 시작합니다. 저장해 둔 SHX 글꼴을 복원하는 경우에도 엔진 요청이 발생할 수 있습니다. 워커 초기화 메시지가 파일 요청보다 먼저 전달되며, 이후 요청은 같은 워커를 재사용합니다. 메인 UI 번들은 별도로 로드되므로 이 변경을 모바일 Core Web Vitals 개선 수치로 해석하지 않습니다.
홈 화면 앱과 오프라인
빌드가 서비스 워커(dist/sw.js)를 만듭니다. 본문은 tools/sw-template.js이고, 미리 담을 목록과 판 이름은 공용 사이트 도구가 tools/site.mjs 설정으로 정합니다. 페이지가 다 뜨고 한가할 때 등록하므로 첫 화면은 늦어지지 않습니다.
- 처음 방문 뒤 미리 담는 것: 다섯 언어 쪽과 앱 정보·아이콘, 시작 스크립트·스타일, 편집기, 해석 워커, DWG 저장 모듈, 글꼴 해석기(합쳐 약 4.6MB, 압축 전송 약 1.6MB).
편집기처럼 페이지가 이미 받은 것은 브라우저 캐시에서 가져오므로, 처음 방문에 더 받는 양은 약 0.5MB입니다(해석 워커·저장 모듈·글꼴 해석기·다른 언어 쪽·아이콘).
- 쓸 때만 받는 것: 글꼴(
fonts/, 약 6MB)·PDF 자료(pdfjs/)·예제 도면, 다른 언어 사전, PDF 해석기는 미리 담지 않고 쓴 것만 담습니다. 서비스 워커가 맡기 전에 받은 것(첫 방문의 사전·글꼴)도 앱이 알려 담게 합니다.
첫 방문에 바로 연 도면이 해석 워커에서 받은 글꼴은 다음에 그 글꼴을 쓸 때 담깁니다.
- 쪽(HTML)은 늘 네트워크를 먼저 보고, 안 되면 담아 둔 쪽을 엽니다(
?sample도 오프라인에서 열립니다). 같은 출처의 ?open= 도면과 앱 범위 밖 주소는 손대지 않습니다.
- 새 판: 새 서비스 워커는 설치만 하고 기다리다가 "새 버전이 있습니다 · 새로 고침" 알림을 한 번 띄웁니다. 홈 화면 앱으로 다시 돌아올 때도 새 판이 있는지 봅니다. 저장하지 않은 도면이 있으면 묻고, 새로 고치기 전에 이 브라우저에 자동 저장해 두므로 다시 열린 뒤 도면 복구 관리자(DRAWINGRECOVERY)로 되살릴 수 있습니다.
- 공유 받기(안드로이드
share_target): 서비스 워커가 받은 파일을 최근 문서 저장소(IndexedDB opencad-2d)에 넣고 ?recent=<id>로 엽니다. 60MB보다 크면 받지 않고 "파일 열기로 여십시오"라고 알립니다. 열지 못한 파일은 최근 문서에 남기지 않습니다.
- 파일 연결(데스크톱 Chrome·Edge에 설치한 앱,
file_handlers + launchQueue): .dwg·.dxf와 스크립트(.scr)·AutoLISP(.lsp·.mnl)를 "연결 프로그램"으로 열면 이미 열린 창의 새 탭으로 엽니다(launch_handler).
- 휴대폰 브라우저 검사(
tools/mobile-browser-check.js)는 편집기 받기 실패를 흉내 내야 해서 서비스 워커를 막은 창에서 돕니다(tools/mobile-browser.json). 오프라인 동작은 tests/app/sw.test.ts가 가짜 캐시·네트워크로 확인합니다.
키보드와 화면 읽기 프로그램
- 키보드로 초점을 옮긴 단추·링크·탭은 Enter·Space로 누릅니다. 마우스로 누른 뒤의 Enter·Space는 AutoCAD처럼 입력 마침·명령 반복입니다.
- 대화상자는 열면 주 단추에 초점을 두고, Tab은 상자 안에서만 돌며, Esc로 닫으면 열기 전 자리로 초점이 돌아갑니다(명령 중에 연 도움말을 닫아도 명령은 이어집니다).
- 응용프로그램 메뉴 같은 바로가기 메뉴는 위·아래 화살표·Home·End로 옮기고 Esc로 닫습니다. 리본 탭과 도면 탭은 Tab 한 번에 지나가고 왼쪽·오른쪽 화살표로 옮기며, 도면 탭은 Delete로 닫습니다.
오른쪽 버튼 끌어 놓기 메뉴는 Esc로 닫으면 [취소]와 같고(선택은 그대로), 끄는 동안 Esc를 누르면 끌기를 그만둡니다.
- 제도 설정의 추가 각도 목록은 화면 읽기 프로그램에 "추가 각도 목록"으로 읽히고 고른 각도를 알립니다. 위·아래 화살표·Home·End로 고르고 Delete로 지우며 Insert로 새로 만들고,
새 각도 칸에서 Enter로 넣고 Esc로 그만둡니다(대화상자는 닫히지 않습니다). 같은 값이나 읽지 못한 값은 목록 아래에 알려 줍니다.
- 도면을 열지 못하면 무엇이 문제인지와 할 일(다시 저장할 형식, PURGE, 암호 해제 등)을 함께 알립니다. 시작 화면이면 그 위에 남고, 도면을 보는 중이면 바로 읽히는 알림(role="alert")으로 보입니다. 100MB가 넘는 파일은 열기 전에 시간과 메모리를 많이 쓴다고 알리고, 해석 워커가 멈추면(메모리 부족·오프라인에서 모듈을 못 받음) "여는 중" 상자를 남기지 않고 까닭을 알립니다.
- 최근 문서는 줄마다 지우기 단추와 "모두 지우기"가 있고, 날짜는 고른 언어로 적습니다. 제목 막대의 해·달 단추(좁은 휴대폰은 응용프로그램 메뉴)로 밝은·어두운 화면 테마를 바꾸며 이 브라우저에 기억합니다(COLORTHEME과 같은 값).
다국어 UI와 정적 소개
한국어 기본 주소와 영어(/en/), 일본어(/ja/), 중국어 간체(/zh-CN/), 독일어(/de/) 페이지를 제공합니다. 각 언어의 소개 본문과 검색·공유 메타데이터를 빌드할 때 생성하며, hreflang과 사이트맵이 같은 페이지의 언어들을 연결합니다. site/locales/*.json에 한국어 원문과 번역을 저장하고, 브라우저는 선택한 언어의 사전만 내려받습니다. 방문 중 외부 번역 서비스는 호출하지 않습니다.
우측 상단 지구본 아이콘에서 언어를 선택합니다. 방향키로 이동하고 Escape나 바깥 클릭으로 닫을 수 있습니다. 언어 선택은 URL에 반영하며, 열린 문서나 편집 상태를 다시 만들지 않고 화면 문구·접근성 설명·오류·도움말을 갱신합니다. 명령 식별자·입력값·파일명·모델 이름·원본 도면의 문자는 번역하지 않습니다. 새 데이터 이름을 표시하는 요소에는 translate="no"를 지정하고, UI 문구의 {0} 같은 변수 자리를 변경하지 마세요. 여러 줄 메시지와 새 한국어 문구도 번역 사전에 추가해야 합니다.
번역기는 공용 사이트 도구의 것을 씁니다. 줄바꿈으로 이은 글은 줄마다, ··|·—로 이은 문장은 조각마다 사전에서 찾아 옮기므로, 이은 글 전체를 사전에 따로 넣지 않아도 됩니다.
npm run test:i18n은 언어 전환과 문서 데이터 보존을, npm run check:i18n은 다섯 언어의 정적 소개·canonical·언어 링크·사전 변수·에셋 경로를 검사합니다. 번역이나 앱을 수정하면 기존 콘텐츠 수정일 갱신 절차를 따른 뒤 다시 빌드합니다. 자동 번역 초안의 주요 메뉴와 제품명은 교정했으며, 긴 기술 설명에는 추가 원어민 감수가 필요합니다.