minsungandClaude Opus 5 3480945b5a perf(viewer2d): toggle layers by visibility instead of reloading the drawing
setHiddenLayers() called load(result, {keepView:true}), so every layer
on/off re-parsed and re-tessellated the whole drawing — arc sampling,
hatch triangulation, complex linetypes and the Slug text batch all rebuilt
from scratch. On an 18 MB DWG a single eye-icon click took 5 s+.

Build every layer once, then switch geometry on and off:

- Merged LineSegments buffers get an index buffer plus a per-segment layer
  id (_registerIndexed). A toggle rewrites the index and setDrawRange;
  positions, colors and lineDistances are untouched, so draw order, dash
  phase and the selection-highlight offsets in meta.colStart stay valid.
- Per-entity meshes (hatch fills, SOLID quads, arrowheads, OLE images,
  sprites) are tagged by layer via _addObj and toggled with .visible.
- Slug text builds one merged mesh per CAD layer instead of one per
  draw order, so text hides with a visible flag. The shader source is
  identical across batches, so three still shares one WebGLProgram.
- Hidden geometry stays in the pick buffers, so _onClick now skips it via
  the _metaHidden mask.
- Fit keeps framing only what is drawn: per-layer Box3 + fit samples are
  recorded at build and unioned over the visible layers.
- getLayerInfo() caches the O(entities) name/color/count pass per load;
  only the visible flag is recomputed.

Layer panel: one delegated click listener instead of re-binding a handler
per row, and a toggle patches the affected row's opacity/icon in place
rather than regenerating the whole list's innerHTML.

Trade-off: hidden layers are now built and kept in memory, so loading a
file with layers already off costs what a full load costs.

Rebuilds dist2.

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

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\    ← 이 샘플 (형제)

실행

cd D:\MYCLAUDE_PROJECT\dwg-dxf-viewer-sample
npm install
npm run dev
# → http://localhost:5173
UI 모듈 경로
Sample DWG ext2dacadrust-dwg WASMViewer2D
Sample DXF ext2ddxf-parser + hatch + adapterViewer2D
파일 드롭 / Open 확장자로 위 둘 중 하나

모듈 지도: 브라우저에서 docs/modules-dwg-dxf.html
조합 코드: 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
Model + Paper 동시 렌더로 글자 겹침 / Layout 탭 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
S
Description
Standalone DWG/DXF 2D viewer sample — compose acadrust-dwg + dxf-parser + Viewer2D (Vite/Three.js)
Readme
13 MiB
Languages
JavaScript 50.7%
TypeScript 34.3%
HTML 15%