# dwg-dxf-viewer-sample

**hmwebviewer 형제 폴더**에 분리된 DWG/DXF 2D 뷰어 샘플입니다.

`docs/modules-dwg-dxf.html` 모듈 지도의 카드
(`acadrust-dwg`, `dxf-parser`, `Viewer2D` …)를 **직접 조합**해 동작하는 독립 프로젝트입니다.
`hmwebviewer` 저장소 안에 의존하지 않습니다.

```
D:\MYCLAUDE_PROJECT\
  hmwebviewer\              ← 본 제품
  dwg-dxf-viewer-sample\    ← 이 샘플 (형제)
```

---

## 실행

```bash
cd D:\MYCLAUDE_PROJECT\dwg-dxf-viewer-sample
npm install
npm run dev
# → http://localhost:5173
```

| UI | 모듈 경로 |
|----|-----------|
| **Sample DWG** | `ext2d` → **acadrust-dwg WASM** → `Viewer2D` |
| **Sample DXF** | `ext2d` → **dxf-parser + hatch + adapter** → `Viewer2D` |
| 파일 드롭 / Open | 확장자로 위 둘 중 하나 |

모듈 지도: 브라우저에서 [`docs/modules-dwg-dxf.html`](./docs/modules-dwg-dxf.html)  
조합 코드: [`src/main.ts`](./src/main.ts)

---

## 레이아웃

```
dwg-dxf-viewer-sample/
  docs/modules-dwg-dxf.html   # 모듈 조합 레시피 HTML
  public/
    fonts/NanumGothic-Regular.ttf
    samples/BasicSample.dwg
    samples/simple.dxf
  src/
    main.ts                   # 모듈을 import 해서 조립
    viewer2d/                 # 재사용 모듈 본체
      acadrust-dwg/           # WASM
      Viewer2D.js
      dwgParser.ts
      parseDxf.ts
      dxfAdapter.js
      dxfHatchHandler.js
      ext2d.ts
      slugText.ts
      …
  package.json
  vite.config.ts
```

---

## 조합 파이프라인

```
File/URL
  → ext2d (isDwg / isDxf)
  → parseDwgBuffer  |  parseDxfBuffer
       │                    │
       └ acadrust-dwg       ├ decodeDxf
                            ├ dxf-parser + dxfHatchHandler
                            └ dxfAdapter
  → CadParseResult
  → Viewer2D.load()  (+ three, slugText/font)
```

---

## 의존성

| 패키지 | 역할 |
|--------|------|
| `three` | WebGL 렌더 / OrbitControls |
| `dxf-parser` | DXF 텍스트 파싱 |
| `opentype.js` | TTF 글리프 (slugText) |

WASM(`acadrust_dwg_bg.wasm`)은 `src/viewer2d/acadrust-dwg/` 에 포함되어 있으며
Vite `?url` import 로 로드됩니다.

---

## 다른 앱에 이식

1. `src/viewer2d/` 폴더 복사  
2. `npm i three dxf-parser opentype.js`  
3. 폰트 `public/fonts/NanumGothic-Regular.ttf`  
4. Vite: `assetsInclude: ['**/*.wasm']`  
5. `src/main.ts` 의 ①~④ 블록을 호스트에 붙이고 ⑤ UI만 교체  

소스 동기화(선택): 본가 `hmwebviewer/src/viewer2d` 가 업데이트되면 해당 파일을
이 프로젝트 `src/viewer2d` 로 다시 복사하면 됩니다.

---

## 알려진 이슈 / 원본 반영 메모

| 이슈 | 문서 |
|------|------|
| 구형 한글 DWG TEXT 깨짐 (CP949→Latin-1 mojibake) | [`docs/korean-dwg-text-encoding.md`](./docs/korean-dwg-text-encoding.md) |
| Model + Paper 동시 렌더로 글자 겹침 / Layout 탭 | [`docs/model-paper-space.md`](./docs/model-paper-space.md) |

샘플 패치: `fixDwgKoreanText`, `cadSpaces` + Viewer2D 공간 필터, Model/Layout 탭.  
원본 `hmwebviewer` 반영 절차는 각 문서를 따른다.

---

## 라이선스 메모

| 조각 | 라이선스 |
|------|----------|
| Viewer2D 포트 · 샘플 글루 | MIT (hmwebviewer 계열) |
| acadrust (WASM 내부) | MPL-2.0 |
| dxf-parser · three | MIT |
| NanumGothic | OFL |
