Files
dwg-dxf-viewer-sample/README.md
T
minsungandClaude Opus 5 eec33820a6 feat(dwg): parse MESH (AcDbSubDMesh) and document the fix
The road-surface drawing (대산당진 2공구_노면) rendered nothing for its
노면/부체도로면 geometry. The cause was not the renderer: the parseResult
contained zero MESH entities.

Two faults, both in the wasm parser, fixed upstream in hmwebviewer 35f5b1c:

1. dwg-wasm never serialized MESH. acadrust reads the entity in full; only the
   JSON arm was missing.

2. acadrust's read_mesh clamped its array counts with the blanket 100_000-item
   corrupt-data guard. This drawing's road mesh has 105_497 vertices, so the
   count was truncated, the remaining vertex bits were never consumed, and the
   face/edge/crease lists after them decoded from the wrong bit offset —
   producing a plausible-looking vertex count next to a nonsense 14-face list.
   Counts are now bounded by the bits actually left in the object stream.

       before  verts=100000 faces=14      face sizes [64, 0, 64, 23, 0, 0, 0, 15]
       after   verts=105497 faces=185444  face sizes [3, 3, 3, ...]

This commit carries the vendored side of that work:

- the rebuilt wasm, which now emits MESH as flat arrays (vertices [x,y,z,...],
  faceList in DXF group-93 layout, deduplicated edges). The sample drawing goes
  from 116 MB to 130 MB of parseResult with parse time unchanged at ~3.2 s.
- a MESH case in the property inspector (vertex/face/edge counts, subdivision
  level, bbox and elevation range)
- docs/subdmesh-rendering.md, plus README pointers
- the acadrust licence notice, which can no longer say "consumed unmodified" —
  read_mesh now carries a local patch. MPL-2.0 is file-level copyleft, so the
  patched file stays under MPL and its source ships in hmwebviewer.

Verified: 9 MESH entities parsed from the drawing; entity histograms over six
other sample drawings are byte-identical to the previous wasm, so nothing else
moved.

Two deliberate omissions, both because a lineweight/fat-line refactor is in
flight in this working tree:

- Viewer2D.js is not included. Its _meshSegs helper and three MESH dispatch
  sites share hunks with that refactor and cannot be separated; the same
  renderer code is committed upstream in hmwebviewer 35f5b1c and will land here
  with the refactor. docs/subdmesh-rendering.md records this.
- dist2/ is not rebuilt here. The current build embeds the half-wired
  lineweight button and progress-bar markup; deploy per
  docs/deploy-dist2-static-build.md once that work lands.

The wasm binary also carries the new lineweight parser fields (lwdisplay,
celweight, layer and entity lineWeight), since it was built from a tree that
already had them. They are additive JSON keys with no consumer in this commit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 17:05:39 +09:00

128 lines
3.6 KiB
Markdown

# 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) |
| `dist2` 정적 빌드 배포 절차 (공식 배포 스크립트 없음) | [`docs/deploy-dist2-static-build.md`](./docs/deploy-dist2-static-build.md) |
| SubDMesh(MESH) 미표시 — parseResult 누락 + 큰 메쉬 잘림 | [`docs/subdmesh-rendering.md`](./docs/subdmesh-rendering.md) |
샘플 패치: `fixDwgKoreanText`, `cadSpaces` + Viewer2D 공간 필터, Model/Layout 탭.
원본 `hmwebviewer` 반영 절차는 각 문서를 따른다.
---
## 라이선스 메모
| 조각 | 라이선스 |
|------|----------|
| Viewer2D 포트 · 샘플 글루 | MIT (hmwebviewer 계열) |
| acadrust (WASM 내부, `read_mesh` 로컬 패치 포함) | MPL-2.0 |
| dxf-parser · three | MIT |
| NanumGothic | OFL |