feat(ui): options panel with an IndexedDB-backed lineweight display scale
Set the default lineweight scale to 11 px/mm: the value the user matched against AutoCAD on the actual screen. The 20 px/mm derived from their screenshot was too heavy in practice - the capture and the monitor do not share a DPI - so the constant is now only a starting point. Move the lineweight controls off the toolbar into an Options panel: display toggle, scale slider plus number box, a readout of what the drawing's own weights come out to, grid toggle, zoom speed, and a reset. Settings persist in IndexedDB (hmw-viewer/options) rather than localStorage, so values keep their type and the store has room to grow per-drawing later; every call degrades quietly if storage is blocked. Scale changes still apply to the live materials - each fat batch now remembers its weight in mm - so dragging the slider retunes a 37MB drawing instantly. Verified headless: 0.35mm renders 3-4px at scale 11 and 8-9px at 25, matching the readout, and the value survives a reload via IndexedDB. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -96,17 +96,21 @@ lineweight 는 **화면 픽셀 폭**이다. 줌해도 굵기가 변하지 않는
|
||||
따라서 월드 단위가 아니라 스크린 스페이스로 그려야 한다.
|
||||
|
||||
```
|
||||
px = mm × 20 (LW_PX_PER_MM, 최대 48px)
|
||||
0.35mm = 7px · 0.50mm = 10px · 2.11mm = 42px ← AutoCAD 기본 표시 배율(0.05mm당 1px)
|
||||
px = mm × 11 (LW_PX_PER_MM 기본값, 최대 48px)
|
||||
0.35mm = 3.9px · 0.50mm = 5.5px · 2.11mm = 23px
|
||||
```
|
||||
|
||||
배율은 `setLineweightScale(pxPerMm)` 로 조정 가능하다(AutoCAD "표시 배율" 슬라이더 대응,
|
||||
`null` 이면 기본값 복귀).
|
||||
**이 배율은 상수로 확정할 수 있는 값이 아니다.** AutoCAD 도 모델 공간에서는 선가중치를
|
||||
줌과 무관한 픽셀로만 그리고, 그 환산은 "선가중치 설정 → 표시 배율" 슬라이더가 정한다.
|
||||
즉 화면 DPI·모니터에 따라 맞는 값이 달라진다.
|
||||
|
||||
> **처음에는 8px/mm 로 넣었다가 손테스트에서 "얇다"고 반려됐다.** 정답지(AutoCAD
|
||||
> 캡처)의 `도로 가장자리`(0.50mm) 선이 약 10px 인데 8px/mm 면 4px 밖에 안 된다.
|
||||
> lineweight 는 줌 무관 화면 픽셀이므로 두 캡처의 픽셀 두께를 직접 비교하면 되고,
|
||||
> 그 결과가 20px/mm 다. 자세한 대조는 5-5 절.
|
||||
- 코드 기본값: `LW_PX_PER_MM = 11` (사용자가 실제 화면에서 AutoCAD 와 나란히 놓고 맞춘 값)
|
||||
- 런타임 조정: **옵션 패널 → 선가중치 → 표시 배율**, 또는 `setLineweightScale(pxPerMm)`
|
||||
- 조정은 **재파싱 없이 즉시 반영**된다 (3-6 절)
|
||||
|
||||
> 시행착오 기록: 처음 8px/mm(96dpi 어림) → 손테스트 "얇다" 반려 → 정답지 캡처에서
|
||||
> 역산해 20px/mm → 실제 화면 대조 후 최종 11px/mm. 상수 추정이 두 번 빗나갔고,
|
||||
> 그래서 값을 코드에서 빼 옵션으로 노출했다.
|
||||
|
||||
### 3-2. 0.25mm 이하는 헤어라인 유지 — **회귀 방지 장치**
|
||||
|
||||
@@ -137,6 +141,17 @@ px = mm × 20 (LW_PX_PER_MM, 최대 48px)
|
||||
- **레이어 토글** — 인스턴스 지오메트리는 인덱스 재작성이 불가
|
||||
- **선택 하이라이트** — 색상 배열이 여러 버퍼로 쪼개짐
|
||||
|
||||
### 3-6. 배율 조정은 리빌드 없이
|
||||
|
||||
헤어라인 컷오프가 **mm 값**(0.25mm)이라 배율이 바뀌어도 어떤 세그먼트가 어느 버킷에
|
||||
들어가는지는 변하지 않는다. 모든 굵기가 같은 배수로 움직일 뿐이다.
|
||||
|
||||
→ 각 fat 배치가 자기 굵기를 **mm 로 기억**(`_fatBufs[].lwMm`)하고,
|
||||
`setLineweightScale()` 은 `material.linewidth` 만 다시 쓴다. 37MB 도면에서도 슬라이더를
|
||||
끄는 동안 지연이 없다.
|
||||
|
||||
반면 **표시 on/off** 는 굵기가 0이 되어 버킷 구성이 바뀌므로 재빌드가 필요하다.
|
||||
|
||||
### 3-5. 표시 on/off — AutoCAD LWDISPLAY 와 동일하게
|
||||
|
||||
굵기 표시는 CAD 에서 원래 켜고 끌 수 있는 옵션이다. 도면의 헤더 값을 기본으로 따르되
|
||||
@@ -188,9 +203,21 @@ entity lineWeight = { -3:15176, -1:2613, 13:8794, 35:37944, 40:119, 50:849 }
|
||||
|
||||
### 4-3. UI
|
||||
|
||||
- `index.html` · `src/main.ts` — 툴바 **선가중치** 버튼 (상태에 따라 강조, 툴팁에 ON/OFF)
|
||||
- `src/propertyInspector.ts` — `선가중치 (Lineweight)` 행 추가.
|
||||
`-1`→`BYLAYER`, `-2`→`BYBLOCK`, `-3`→`DEFAULT (0.25mm)`, 그 외 `0.35mm` 형식
|
||||
툴바 **옵션** 버튼 → `옵션 (Options)` 패널 (`index.html` · `src/main.ts`).
|
||||
|
||||
| 항목 | 동작 |
|
||||
|------|------|
|
||||
| 표시 (LWDISPLAY) | on/off. 체크 해제 시 전부 헤어라인 (재빌드) |
|
||||
| 표시 배율 | 슬라이더 + 숫자 입력 (px/mm). 즉시 반영 |
|
||||
| 환산 표시 | 그 도면이 실제로 쓰는 굵기만 `0.35mm → 3.9px` 식으로 표기 |
|
||||
| ↺ 기본값 | 배율·표시·그리드·줌속도 초기화 |
|
||||
|
||||
설정은 **IndexedDB** (`hmw-viewer` DB → `options` 스토어)에 저장한다
|
||||
([`../src/optionsStore.ts`](../src/optionsStore.ts)). 키: `lineweightScale`,
|
||||
`lineweightOn`, `grid`, `zoomSpeed`. 스토리지가 막혀 있어도 조용히 기본값으로 동작한다.
|
||||
|
||||
속성 패널에는 `선가중치 (Lineweight)` 행이 있다 (`src/propertyInspector.ts`).
|
||||
`-1`→`BYLAYER`, `-2`→`BYBLOCK`, `-3`→`DEFAULT (0.25mm)`, 그 외 `0.35mm` 형식.
|
||||
|
||||
### 4-4. 배포
|
||||
|
||||
@@ -263,14 +290,16 @@ cyan 픽셀 수가 감소(11502→11486) → fat 배치의 정점이 강조색
|
||||
|
||||
lineweight 는 줌과 무관한 화면 픽셀이므로, 두 캡처의 **절대 픽셀 두께**를 그대로 비교한다.
|
||||
|
||||
| | `도로 가장자리` 0.50mm | 헤어라인(MESH, Default) |
|
||||
| 배율 | `도로 가장자리` 0.50mm | `노면측구` 0.35mm (헤드리스 실측) |
|
||||
|--|--|--|
|
||||
| AutoCAD 정답지 | **≈10 px** | 1 px |
|
||||
| 뷰어 (8px/mm, 반려) | ≈4 px | 1 px |
|
||||
| 뷰어 (20px/mm, 현재) | **10 px** | 1 px |
|
||||
| 8 px/mm (최초, 반려) | 4 px | 2–3 px |
|
||||
| 20 px/mm (캡처 역산) | 10 px | 7 px |
|
||||
| **11 px/mm (현재 기본값)** | **5.5 px** | **3–4 px** |
|
||||
| 25 px/mm (참고) | 12.5 px | 8–9 px |
|
||||
|
||||
헤드리스 재측정으로 교차 확인: 시안색 `노면측구`(0.35mm)가 화면에서 **≈7 px**
|
||||
(= 0.35 × 20). 두 클래스가 같은 배율로 맞는다.
|
||||
캡처 이미지에서 역산한 20 은 실제 화면에서 과했다 — 캡처 DPI 와 사용자 모니터가 달라서다.
|
||||
최종값은 사용자가 뷰어와 AutoCAD 를 나란히 놓고 맞춘 **11**. 이래서 상수로 못 박지 않고
|
||||
옵션으로 뺐다.
|
||||
|
||||
### 5-6. 회귀 없음
|
||||
|
||||
@@ -282,10 +311,9 @@ lineweight 는 줌과 무관한 화면 픽셀이므로, 두 캡처의 **절대
|
||||
|
||||
## 6. 남은 과제
|
||||
|
||||
1. **표시 배율 UI 부재** — 값은 `setLineweightScale(pxPerMm)` 로 조절되지만 툴바에는
|
||||
on/off 버튼만 있다. 슬라이더가 필요하면 이 API 에 붙이면 된다.
|
||||
0.35mm 가 7px 라 `비탈면방향`(34,758개)이 있는 구간은 화면이 상당히 무거워 보인다 —
|
||||
도면이 지정한 수치대로이긴 하나, 배율을 낮추고 싶으면 이 API 를 쓴다.
|
||||
1. **배율 기본값은 환경 의존** — 11 은 특정 모니터에서 맞춘 값이다. 다른 화면에서는
|
||||
옵션 패널로 다시 맞춰야 한다. `devicePixelRatio` 로 자동 보정하는 것은 검토만 하고
|
||||
넣지 않았다(캡처·원격 데스크톱 등에서 오히려 어긋난다).
|
||||
2. **ByBlock 근사** — 블록 자식의 `-2` 는 INSERT 굵기를 상속하지만, 중첩 블록에서
|
||||
중간 INSERT 가 `-2` 인 경우까지는 추적하지 않는다(점선 처리와 동일한 기존 정책).
|
||||
3. **DXF 레이어 굵기 없음** — `dxf-parser` 의 LAYER 핸들러가 코드 370 을 무시한다.
|
||||
|
||||
Reference in New Issue
Block a user