Commit Graph
666 Commits
Author SHA1 Message Date
eomsangdonandClaude Opus 5 462b71e896 fix(B04): 도엽 서피스 npz에 bounds를 넣어 등고선과 메시 원점을 맞춘다
dtm_sheet.npz에 bounds가 없어 등고선 API가 LAS structured.npz bounds로
폴백했고, 메시(glb)는 sheet 격자 중심으로 만들어져 등고선이 X -7.1m,
Y +3.4m, Z +3.3m 떠 보였다. LAS 없는 프로젝트면 등고선 생성 자체가 실패한다.
glb와 같은 bounds(3x2)를 npz에 저장해 두 산출물이 같은 원점을 공유한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 14:38:24 +09:00
eomsangdonandClaude Opus 5 3572694f73 feat(B03/B04): LAS 없이 도엽등고선으로 3D 서피스를 만들어 설계한다
- B03: 'LAS 없이 설계' 토글 — LAS 필수카드 비활성화, las_free 플래그로
  업로드·완료 검증 면제, 계획노선 CSV를 WF1 분석 입력으로 사용
- B04: 신규 Engine_SheetSurface — 도엽_등고선.geojson을 노선 bbox+300m
  직사각형으로 절취, 배수유역 엔진의 등고선 정점구름·Delaunay TIN 보간을
  재사용해 dtm_sheet.npz(1m 격자, LAS DTM과 동일 형식) + 프리뷰 glb 생성.
  build_surface_sampler('sheet','dtm')로 종·횡단·배수 하류 계산 무수정 동작
- WF1: las_free면 run_sheet_surface_analysis로 분기, sheet/dtm 자동 확정.
  VWorld·도엽 확보 블록을 download_geodata()로 추출해 두 경로가 공유
- LAS가 있어도 도엽 서피스를 함께 생성·등록(참고용), B04에
  '도엽등고 3D 서피스' 별도 컨테이너로 표시

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 14:27:41 +09:00
eomsangdonandClaude Opus 5 6d8fd46d87 fix(B06): BOX암거를 고르면 그 끝이 강조되게 한다
좌·우 끝을 골라도 횡단도에 아무 표시가 없었다. 강조 토글(`is-active`)은 이미
클릭 판정용 **투명 겹면**에 걸리고 있었는데, 그 클래스에는 강조 규칙이 없어
그대로 투명했다.

겹면에 `b06-chart__box-hit`를 하나 더 달고 그 클래스에만 강조를 준다 — 기슭막이·
집수정과 같은 색 계열이되 면이 넓어 채도를 낮췄다(danger 16% + 점선 테두리).
구체 부재(저판·상판·내공)는 좌·우가 한 몸이라 그쪽을 칠하면 어느 끝을 고른
것인지 되레 흐려진다.

자체검증(공용 브라우저 5174, 측점 10+0.9 BOX암거):
- tsc --noEmit 통과.
- 우측 끝 선택 → 그 겹면만 `is-active`, 계산 스타일 fill
  `color(srgb 0.909804 0.411765 0.352941 / 0.16)` · stroke `rgb(232, 105, 90)`.
  수정 전에는 `fill: transparent`라 아무것도 안 보였다.
- 스크린샷 `tmp/browser/shots/110_boxhl.png` — 구체 우측 절반이 붉게 칠해진다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 13:41:30 +09:00
eomsangdonandClaude Opus 5 1c9ff90dfd feat(B06): BOX암거 좌측 폼을 세월교와 같은 규칙으로 연결한다
세월교와 같은 문제가 BOX암거에도 있었다 — 좌측 「구조물 배치」의 본체 규격·날개벽을
바꿔도 도면이 그대로였고, 폼 기본값이 스펙에서 오지 않았으며, 구체를 골라도 좌측
칸이 서지 않았다. `applyPipeOptionsToCache`가 `section.box`를 모르고 즉시 return하던
것이 뿌리다(세월교와 동일).

- `applyBoxFormOptions()` — 폼 옵션(`body_*`·`wing_*`)을 제어기로 보낸다.
  `BoxControl`에 `setBody`·`setWing`을 더했다: 캐시(`section.box`)를 먼저 고치고
  (`span_m`은 백엔드 `_box_set`과 같은 식으로 다시 잡는다) 정본 예약 + 카드 갱신.
- 날개벽 옵션 조립·해석을 `wingOptions()`·`wingPatchFrom()`으로 묶어 세월교와 나눠
  쓴다 — 세월교 쪽 중복 코드가 사라졌다.
- `withBoxSpec()` — 폼 기본값을 `section.box`(내공 폭·높이, 날개벽)에서 읽는다.
- 좌·우 끝을 고르면 폼의 **날개벽(유입)/(유출)** 칸이 선다. 좌·우 ↔ 유입/유출
  매핑은 기하가 날개벽을 고르는 기준(`uphill_side`)과 같다. 조정창은 결국 지우고
  폼 이름(유입/유출)만 쓰기로 한 사용자 확정(2026-08-30)을 따랐다.

구체 길이·표고는 폼에 대응 칸이 없어 조정창 축으로 남는다(본체 높이는 규격이 이미
정한다 — 2026-08-30 사용자).

자체검증(공용 브라우저 5174 + 워크트리 백엔드 8001, 측점 10+0.9 BOX암거):
- tsc --noEmit 통과.
- 구체 선택 시 좌측 `날개벽(유입) (BOX암거)` 칸 강조(수정 전 강조 없음).
- 본체 규격 2.0×2.0 → 3.0×3.0 → 도면 라벨 `BOX 3.0×3.0`, 다시 2.0×2.0 → `BOX
  2.0×2.0`. 한 번 고른 상태에서 연속 조작도 그대로 먹는다. 수정 전에는 라벨이
  5.34m 구체와 함께 전혀 움직이지 않았다.
- 회귀: 세월교 날개 길이 2→4→2에서 조정창 표시가 4.0m→2.0m로 따라온다
  (`wingOptions`/`wingPatchFrom` 공용화 뒤에도 동일).
- 조작값은 원래대로(BOX 2.0×2.0 · 세월교 날개 길이 2m) 되돌려 놓았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 13:37:43 +09:00
eomsangdonandClaude Opus 5 8106b1ed9b fix(B06): 월류 전 노면 점선을 측벽 상단 꼭짓점에 붙인다
날개벽 상단(바닥판 바깥 끝)까지 내려 이으니 점선이 구체 밖으로 크게 벌어져 읽기
나빴다. 좌측 벽이면 **좌상단**, 우측 벽이면 **우상단** — 측벽 상단의 계류측
꼭짓점에 붙인다(2026-08-30 사용자, 각도는 무시).

- `FordSideLayout.wingTop` → `wallTopOuter`로 바꿨다. 벽 폴리곤의 상단 두 점 중
  계류측 것이라 날개벽 설치 여부와 무관하게 항상 있다(널 분기가 사라졌다).

자체검증(공용 브라우저 5174 + 워크트리 백엔드 8001, 측점 7+9.7):
- tsc --noEmit 통과.
- 점선 오른쪽 끝 `404.125,89.644` = 우측 벽 폴리곤의 우상단 꼭짓점과 좌표 일치
  (벽 = `399.25,133.519 399.25,89.644 404.125,89.644 404.125,133.519`).
  왼쪽 끝도 대칭으로 좌상단에 붙는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 13:19:58 +09:00
eomsangdonandClaude Opus 5 8fa1652e62 feat(B06): 세월교 월류 전 노면 점선을 날개벽 상단까지 대각으로 잇는다
점선(월류가 없었을 때의 계획고)이 노견에서 뚝 끊겨, 구체 밖에서 노면이 어디로
떨어지는지 읽히지 않았다. 양 끝을 그 측 **날개벽 상단**까지 대각으로 내려 잇는다
(2026-08-30 사용자).

- `FordSideLayout.wingTop` — 바닥판 바깥 끝(계류측 극점) × 바닥판 상면 + 날개벽
  짧은쪽 높이. 날개벽 설치가 없으면 null이고, 그 측은 노견에서 끊는다.
- `appendFordSurfaceDropPlan`이 세월교 기하를 받아 한 폴리라인으로 그린다:
  좌 날개벽 상단 → 좌 노견 → 우 노견 → 우 날개벽 상단.

자체검증(공용 브라우저 5174 + 워크트리 백엔드 8001, 측점 7+9.7):
- tsc --noEmit 통과.
- 점선 폴리라인 4점 확인(수정 전 2점). 양 끝이 바닥판 바깥 상단 자리로 나간다.
- 날개벽 상단이 원래 계획고보다 21.70px 아래 = 0.890m (y축 1m = 24.375px).
  바닥판 상면~원래 계획고 1.89m − 날개 짧은쪽 높이 1.0m = 0.89m와 일치.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 13:12:23 +09:00
eomsangdonandClaude Opus 5 353ccc2b4e chore(config): vite API 프록시 포트를 AISLO_API_PORT로 바꿀 수 있게 한다
병행 작업(CLAUDE.md 7장)에서 워크트리마다 자기 백엔드를 봐야 하는데 프록시 대상이
8000으로 하드코딩돼 있었다. 워크트리 vite(5174)를 `AISLO_API_PORT=8001`로 띄우면
그쪽 백엔드를 본다. 기본값이 8000이라 메인 폴더 동작은 그대로다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 12:54:36 +09:00
eomsangdonandClaude Opus 5 933f513da0 feat(B06): 세월교 노면을 월류 높이만큼 내려 앉힌다
횡단도에 그려지던 노면은 사실 월류부 가장 아래를 자른 자리다 — 구체 위 노면은
월류 높이만큼 낮게 앉아야 한다(2026-08-30 사용자 확정). 계획고를 통째로 내려
잡아 측벽·바닥판·십자선·절성토 면적이 한 번에 따라오게 했다. 전폭 평행 하강이라
횡단경사·측구·사면 규칙은 그대로다.

백엔드
- `_ford_set`이 `ford_height_m`을 `overflow_depth_m`으로 스펙에 싣는다.
- `compute_cross_design(surface_drop_m=)` — 계획고를 그만큼 내려 계산하고, 내린
  양을 `surface_drop_m`으로 echo한다(프론트가 점선을 되그리는 데 쓴다).
- `ford_surface_drops()`·`ford_drop_at()` — 관 지점 정본에서 측점별 하강량을 읽는다
  (포장 구간과 같은 방식). 설계 계산 경로 전부(기본값·재계산·프리뷰·종횡단 확정)에
  물렸다.
- `enforce_ford_surface_drops()` — 저장분이 옛 계획고면 상세 조회에서 다시 계산한다.
  월류 높이를 지우면 같은 경로로 원래 계획고로 되돌아온다.

프론트
- 십자선을 하강량만큼 내려 찍는다(`cardDesignElevation`). 종단 계획고를 그대로
  쓰던 자리다.
- `appendFordSurfaceDropPlan()` — "월류가 없었다면" 노면을 점선으로 남긴다.
  물넘이포장의 「기존 계획고 점선」과 같은 표기라 한 규칙으로 읽힌다.
- 측벽·바닥판은 내려간 설계선(`design_line`)에 그대로 붙으므로 따로 손대지 않았다.

자체검증(공용 브라우저 5174 + 워크트리 백엔드 8001, 측점 7+9.7, 월류 높이 0.39m):
- `tmp/tests/test_ford_surface_drop.py` 2건 통과 — 계획고·좌우 노견이 정확히
  0.39m 내려가고, 절토는 늘고 성토는 줄며, 하강이 없으면 `surface_drop_m` 키 자체가
  없다.
- 화면 실측: y축 눈금 1m = 24.375px에서 십자선이 점선보다 9.50px 아래
  (= 0.390m, 오차 0.001m). 수정 전에는 두 선이 같은 자리였다.
- 세월교 측벽 자동 높이 1.70m → 1.50m. 이론값 1.31m이나 하한(관경 1.0 + 최소 토피
  0.5 = 1.5m)에 걸린 값이다 — 기존 규칙 그대로다.
- 성토 면적 18.46 → 13.85 ㎡. 이웃 일반 측점에는 점선이 그려지지 않는다.
- 검증에 쓴 `pipe_points.json` 임시 옵션은 백업본으로 되돌렸다(정본 무변경).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 12:54:29 +09:00
eomsangdonandClaude Opus 5 7385b4d76f fix(B06): 월류 폭을 바꾸면 월류 높이(필요 수심)가 따라오게 한다
`syncFordSummary`가 "빈 칸이거나 계산값보다 작을 때만" 높이를 채워 넣어, 폭을
바꿔 필요 수심이 **낮아지는** 쪽으로 움직이면 칸이 옛 값 그대로 남았다. 안내문
(설계유량·필요 수심·필요 단면)만 바뀌고 높이는 안 바뀌는 것으로 보였다.

칸이 아직 **직전에 자동으로 채운 값 그대로**인지 본다(±0.005m). 그대로면 자동
상태로 보고 계산값을 계속 따라가고, 사용자가 다른 값을 넣었으면 그때부터 그
값이 이긴다. 시설을 새로 폼에 올릴 때는 추적을 끊어(`fordAutoDepthM = null`)
저장돼 있던 높이를 사용자 값으로 대접한다.

자체검증(공용 브라우저 5174, 측점 7+9.7 세월교, 설계유량 36.734 ㎥/s):
- tsc --noEmit 통과.
- 자동 상태(폭 10 → 높이 0.39)에서 폭 5 → 0.63(올라감), 폭 20 → 0.25(내려감).
  수정 전에는 0.63에서 내려오지 않았다.
- 높이를 2.5로 직접 넣은 뒤 폭 20→5 → 2.5 유지(사용자 값 우선).
- 조작값은 원래대로(폭 10 · 높이 자동 0.39) 되돌려 놓았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 12:23:38 +09:00
eomsangdonandClaude Opus 5 f8086e786d fix(B06): 세월교 월류 높이가 자동 계산되지 않던 것을 고친다
B06 좌측 폼이 계곡 통과 시설 목록을 만들 때 `design_flow_m3s: null`을 그대로
박아 넣고 있었다. 개략 단면(필요 수심 = 월류 높이 자동값)은 담당 유역의 설계
유량에서 나오므로, 값이 없으면 "담당 유역의 설계유량이 아직 없습니다" 안내만
뜨고 월류 폭을 넣어도 높이가 채워지지 않았다.

같은 응답(`/drainage/pipe-points`)에 유역(`basins`)이 함께 오므로 B05
(`B05_Profile_UI_Drainage_Panel`)와 같은 규칙 — 누가거리 0.51m 이내 짝짓기 —
으로 설계유량을 실어 준다.

자체검증(공용 브라우저 5174, 측점 7+9.7 세월교):
- tsc --noEmit 통과.
- 벽 선택 시 안내문 "설계유량 36.734 ㎥/s · 필요 수심 0.39 m · 필요 단면
  3.89 ㎡ · 유속 9.43 m/s", 월류 높이 칸 자동 0.39 (수정 전 빈 칸).
- 월류 폭 10→5 → 필요 수심 0.63으로 다시 계산되고 높이도 0.63으로 올라간다.
  (폭을 10으로 되돌려도 0.63은 유지 — 계산값 이상은 사용자 입력으로 본다는
  기존 규칙 그대로다.)
- 조작값은 원래대로(폭 10·높이 0.39) 되돌려 놓았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 12:16:50 +09:00
eomsangdonandClaude Opus 5 e78feab5ed feat(B06): 세월교 좌측 폼을 배관 측점과 같은 양식으로 맞춘다
사용자 지시 3건(2026-08-30).

1) 횡단도에서 세월교 측벽을 고르면 좌측 폼의 그 측 칸이 선다 — 배관 기슭막이가
   쓰던 경로를 그대로 탄다. `SideSlots`에 `wingInlet`·`wingOutlet`을 더하고
   `slotOf()`가 배관 칸 → 독립 기슭막이 칸 → 날개벽 칸 순으로 지금 서 있는 쪽을
   고른다. 세월교 조정창은 `dataset.side`·`dataset.panelTitle`을 세워 어느 칸을
   가리키는지 알린다. 벽 선택 뒤 `refreshAdjustSlots()`도 배관과 같게 붙였다.

2) 월류 폭·높이·수량·개략 단면 결과를 관경 바로 다음으로 옮겼다(바닥 경사도 같은
   묶음에 둔다 — 물넘이포장 전용이라 세월교에서는 숨는다). 개략 단면 안내문은
   읽는 글이라 10px·opacity 0.75로 줄였다.

3) 세월교·날개벽 숫자 칸을 기슭막이·집수정과 같은 [-][값][+] 묶음으로 바꿨다
   (월류 폭·높이·바닥 경사·수량·날개 높이·길이·각도). `stepper()`에 표시 자릿수
   인자를 더해 련·각도는 정수로 보인다("1.0련"·"45.0°" 방지). 기본값 1이라 기존
   호출부는 그대로다.

자체검증(공용 브라우저 5174, 측점 7+9.7 세월교):
- tsc --noEmit 통과.
- 유입 측벽 선택 → `날개벽(유입) (세월교)` 칸 강조, 유출 측벽 → `날개벽(유출)
  (세월교)`. 한 번에 한 칸만 선다.
- 폼 항목 순서 실측: 관종 > 관경 > 월류 폭 > 월류 높이 > 수량 > 날개벽(유입) …
  안내문 font-size 10px, 보이는 스텝 묶음 9개.
- 수량 + → 폼 "2"·조정창 "2련", 각도 + → 폼 "50"·조정창 "50°" (소수점 없음).
- 회귀: 배관 측점 기슭막이 선택 → `유출구 (기슭막이(유출))` 강조 + 높이·길이·
  기준측점 전/후 행 이식 정상.
- 조작값은 원래대로(수량 1·각도 45) 되돌려 놓았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 12:05:22 +09:00
eomsangdonandClaude Opus 5 03840ff3d6 feat(B06): 세월교 좌측 「구조물 배치」 폼을 조정창 로직에 연결한다
좌측 폼의 세월교 상세 항목(관종·관경·수량·월류 폭·날개벽 유입/유출)이 도면에
전혀 반영되지 않았다. `applyPipeOptionsToCache`가 `section.culvert`만 보고
세월교 측점(`section.ford`)에서는 즉시 return했기 때문이다.

프론트는 구조물 배치의 상세 UI를 쓰고 로직은 조정창 제어기 것을 쓴다
(2026-08-30 사용자 확정).

- `applyFordFormOptions()` 신설 — 폼 옵션 키를 `FordControl.setPipe`/`setWing`
  인자로 옮긴다. 캐시 반영·바닥판 연장 재계산·정본 예약·카드 갱신은 제어기에
  이미 있어 새로 만들지 않았다.
- `FordControl.setPipe` 확장 — `pipe_kind`(관종)·`ford_width_m`(월류 폭 =
  `span_m`) 추가. 두 값은 조정창에 칸이 없고 폼만 보낸다.
- `withFordSpec()` — 폼 기본값을 `section.ford` 스펙에서 읽는다. 두 창이 같은
  스펙을 보므로 어느 쪽에서 만졌든 값이 갈리지 않는다(수량(련) 빈 칸 해소).

월류 높이(`ford_height_m`)는 백엔드 `_ford_set`이 읽지 않는다 — 세월교는 구체
위 노면이라 파임이 없고, 물넘이포장 전용 값이다. 폼에는 남되 도면 반영처는 없다.

자체검증(공용 브라우저 5174, 측점 7+9.7 세월교):
- tsc --noEmit 통과.
- 폼 날개 길이(유입) 2→4 → 조정창 「날개 길이 4.0m」, 바닥판 7.63m→9.04m
  (= +2×cos45°). 수정 전에는 둘 다 그대로였다.
- 폼 수량 3 → 조정창 「3련」, 폼 관경 Ø1200 → 조정창 select 1200.
- 재선택 왕복: 월류폭 12·수량 3·관경 1200·날개길이 4 그대로 되읽힘(스펙 정본).
- 진입 시 수량(련) 칸 = 1(수정 전 빈 칸), 관종 파형강관.
- 조작값은 원래 값(10/1/1000/2)으로 되돌려 놓았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 11:44:54 +09:00
eomsangdonandClaude Opus 5 c8ce7ae02a fix(B06): 추가 기슭막이 선택 시 부모 칸의 단 수·옵션 유지
단 수·옵션 행은 조정창 사본에서 DOM째 빌려온 행이라, 다단 벽을 고르면
clearSideSlots()가 되돌린 뒤 다시 채우지 못해 유입구·유출구 칸이 비었다.
다단 벽에서도 tierChannel을 부모 채널로 열어 두 행을 살리고(revetWall에
isExtra 포함), 이식은 부모 칸으로 보낸다. 추가 기슭막이 칸에는 형태·
높이·구간값만 남긴다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 00:32:09 +09:00
eomsangdonandClaude Opus 5 c8b5a8bf38 fix(B05): 종단테이블 구조물 측점 빈 칸의 세로선 제거
구조물 측점(세월교·BOX암거 등) 빈 칸의 border-left가 이웃 규칙 측점 값
한가운데를 지나고, 곡선 L/R 칸 경계와 x가 정확히 겹쳐 절토고~곡선 R를
관통하는 한 줄로 보였다. 값 행에서만 선을 지우고 곡선 행 구분선은 유지한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 00:32:09 +09:00
eomsangdon 60bbe89edb fix(B03): rerun analysis on reupload
Clear derived browser caches so B05 loads the newly generated route and section data.
2026-08-29 20:17:37 +09:00
eomsangdon 3640591c46 fix(B03): skip polling for unchanged uploads 2026-08-29 19:52:18 +09:00
eomsangdon e6ac071f58 merge: 구조물 패널 후속 수정 4건을 통합한다 2026-08-29 19:29:39 +09:00
eomsangdonandClaude Opus 5 4a587012a9 feat(B06): 기슭막이 기준벽에서 단 수·옵션 행을 항상 세운다
배관 유입·유출과 독립 좌·우 기준벽에서는 [추가 기슭막이(단)]과 [옵션]이
상태와 무관하게 자리를 지킨다. 링크 카드에서 만져도 제어기가 소유 측점 값을
고치므로 안전하다. 집수정 유입은 종전대로 계류측 단 자리가 있을 때만 뜬다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:21:46 +09:00
eomsangdonandClaude Opus 5 f0af311d4b feat(B06): 추가 기슭막이 칸을 그 단이 딸린 쪽 아래로 붙인다
다단은 유출 채널(extra)과 유입·계류측 채널(bextra)로 갈린다. 칸이 늘 유출구
아래 고정이라 어느 쪽 단인지 자리로 읽히지 않았다. 고른 단의 채널을 창이
알려 주고, 칸을 그 쪽(배관 유입구·유출구 / 독립 좌·우) 바로 아래로 옮겨 세운다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:18:08 +09:00
eomsangdonandClaude Opus 5 2ee71eff19 fix(B05,B06): 독립 기슭막이 폼에서 단 수를 뺀다
조정창에서 옮겨 오는 [추가 기슭막이(단)] 행과 같은 값이라 두 벌이었다.
단 수 정본은 횡단 설계 patch(extra_wall_counts)이고 조작은 그 행이 한다 —
폼 칸과 그 값을 나르던 배선(tierCount·setTierCount)을 함께 걷어낸다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:17:07 +09:00
eomsangdonandClaude Opus 5 8b385a62b0 fix(B06): 카드마다 다른 clipPath 이름을 써 해칭이 사라지지 않게 한다
clipPath id는 문서 전역인데 이름을 벽 키 + 배면 offset으로 지어, 같은 벽을
소유 측점과 연동 측점이 함께 그리면 이름이 겹쳤다. url(#id)는 문서에서 처음
만난 clipPath를 쓰므로 뒤 카드의 해칭이 앞 카드 좌표로 잘려 통째로 사라졌다.
벽을 옮기면 두 카드가 같은 offset으로 다시 겹쳐 증상이 재발했다.

측정(14+0.0 화면): 6개 중 4개 id가 중복 → 수정 후 10개 전부 고유, 모든 카드의
해칭 그룹이 화면에 폭을 갖는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:15:07 +09:00
eomsangdon 184afa6e89 merge: B05·B06 구조물 패널 일원화 작업을 B07 작업 브랜치로 가져온다
다른 브랜치(feat/B05B06-구조물패널-일원화)의 B05·B06 구조물 배치 폼 일원화
결과를 받는다. 충돌 없음 — 그쪽은 B05/B06만, 이쪽은 B07/B08만 건드렸다.

그쪽 브랜치에 남아 있던 옛 폴더(B08_DesignDetail, B07_Quantity)는 이쪽 삭제가
반영돼 사라진다. main.py·라우트·척도 등 B07 작업물은 이쪽 것이 유지된다.
2026-08-29 19:13:03 +09:00
eomsangdonandClaude Opus 5 9f014bdbff fix(B06): 시설이 바뀌어도 고른 칸이 강조되게 이식을 다시 돌린다
벽 선택은 카드가 먼저 처리하고 폼 교체가 뒤따른다. 그래서 다른 기슭막이를 보다가
배관 유출 벽을 고르면, 이식 시점의 목적지 칸이 아직 이전 시설 것이라 행이 엉뚱한
칸으로 가고 강조도 남지 않았다. 폼이 갈아 끼워진 뒤 refreshAdjustSlots()로 한 번 더
이식한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:10:28 +09:00
eomsangdonandClaude Opus 5 091a30286e fix(B05,B06): 독립 기슭막이 단 수를 좌·우로 나누고 그 칸을 강조한다
- 단 수를 바깥 행에서 좌·우 칸 안으로 옮긴다. 저장 키도 좌·우 각각
  (inlet_revet_tiers·outlet_revet_tiers, 옛 tiers는 폴백·호환 기록).
  폼 값은 다단 채널(extra·bextra)로 가고, 폼은 그 채널 값을 되읽는다.
- 좌·우 칸에도 조정창 행 이식 자리를 두어, 벽을 고르면 배관 유입구·유출구와
  같이 그 칸이 강조되고 조정 항목이 옮겨 온다. 칸 이름표는 좌·우 그대로 둔다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:09:42 +09:00
eomsangdon 86a3266e0e auto: 2026-08-29 19:05 (EOMSANGDON-HOME) 2026-08-29 19:05:09 +09:00
eomsangdonandClaude Opus 5 1165c657e7 feat(B05,B06): 독립 기슭막이를 좌·우 칸으로 나누고 단 수를 도면에 잇는다
- 설치 측·단 수를 컨테이너 밖 한 행으로 빼고, 벽 제원은 [기슭막이 (좌)]·
  [기슭막이 (우)] 두 칸으로 나눈다. 설치 측이 한쪽이면 그 칸만 뜬다.
  좌·우 이름표는 그 측점 오르막 방향(uphill_side)이 정한다.
- 두 칸은 배관 유출구와 같은 양식이다 — [구조][형태] + 길이·높이·전/후.
  구조 선택지는 기슭막이 하나뿐이지만 레이아웃을 맞추려 그대로 둔다.
- 값은 유입/유출 키로 좌·우 따로 저장한다(옛 한 벌 저장분은 양쪽으로 펼쳐 읽는다).
- 단 수에 [-][값][+] 조정칸을 붙이고, 폼 단 수를 다단 채널(extra·bextra)로
  보낸다 — 배수관 측점처럼 횡단도에 단이 선다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 19:05:07 +09:00
eomsangdonandClaude Fable 5 d4b8b08852 refactor(B07): 한 장짜리 도면은 컨테이너 없이 버튼만 둔다
도면이 한 장뿐인 그룹(종단면도)과 아직 만들지 않은 그룹은 접이식 컨테이너에
항목 하나를 넣을 이유가 없다. 그룹 이름을 단 버튼 하나로 바꾼다.

- 0~1장: 컨테이너 없이 버튼 하나 (없으면 비활성 + '준비 중')
- 2장 이상(횡단면도): 기존 접이식 컨테이너 유지
- 버튼 생성은 drawingButton() 헬퍼로 합침

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 19:00:10 +09:00
eomsangdonandClaude Fable 5 09c85fe602 feat(B07): 사이드 패널에 도면 12분류 컨테이너를 만든다
도면 구성이 확정된 12분류(표지~용지도)를 좌측 패널에 순서대로 세운다.
아직 만들지 않는 도면은 접힌 채 '준비 중'으로 자리만 잡는다.

- DRAWING_GROUPS 상수로 12개 그룹 정의, kind가 있는 둘(종단면도·횡단면도)만
  서버 목록으로 채운다
- 빈 그룹은 data-pending=true + is-collapsed, 제목만 흐리게

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 18:54:45 +09:00
eomsangdonandClaude Fable 5 a0a737768e feat(B07): 횡단면도를 1/100 척도로 고정하고 한 장에 여러 단면을 배치
작성 척도(횡단 1/100)를 도면 좌표에 넣고, A1 한 장에 들어가는 만큼 단면을 담는다.

- 횡단 좌표를 종이 mm로(x10). 수량표도 종이 치수로 재조정(폭 108mm, 행 5mm)
- 단면 폭 = 설계선이 원지반에서 갈라졌다 만나는 구간 + 여유 1.5m.
  지표선도 그 범위로 자른다. 실측 갈라짐 폭 4.0~15.0m (종전 전폭 40m)
- Engine_Cad_Sheet 신설: 칸 크기는 최대 블록 기준, 좌하단부터 아래→위,
  그다음 오른쪽 열로 채우고 넘치면 다음 장. 23측점 -> 4장(3열x2행)
- 목록·확정을 장 단위로. 확정 시 담긴 측점 전부의 B06 단면적을 재계산하고
  수량표는 측점별로 매니페스트에 보관
- 700줄 제한: 수량표를 Engine_Cad_Table로, 라우터 동기 헬퍼를 Router_Support로 분리

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 18:47:16 +09:00
eomsangdon 54262f9eda auto: 2026-08-29 18:42 (EOMSANGDON-HOME) 2026-08-29 18:42:34 +09:00
eomsangdonandClaude Opus 5 f7ec239625 fix(B06): 폼 형태·높이를 지금 그려진 값으로 맞춘다
배관 유출구 기슭막이가 폼과 다른 형태로 그려졌다. 폼은 저장된 옵션을,
그림은 조정값(m·h)을 쓰는데 둘이 어긋나도 맞추는 자리가 없었다.
조작이 정본이므로 폼이 그려진 값을 따라간다 — wallForm 의존성을 추가하고
형태·높이는 빈칸 채우기가 아니라 덮어쓰기로 바꾼다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 18:42:33 +09:00
eomsangdon 07089e285a auto: 2026-08-29 18:37 (EOMSANGDON-HOME) 2026-08-29 18:37:18 +09:00
eomsangdonandClaude Opus 5 c100daabce fix(B06): 고른 것 없이 폼을 만지면 이유를 알린다
좌측 폼의 실시간 반영은 **고른 항목**에만 걸린다. 아무것도 고르지 않은 상태에서
형태·높이를 바꾸면 값이 조용히 버려져 "형태별 모양이 안 그려진다"로 보였다.
패널에 hasSelection()을 열고, B06에서 선택 없이 폼이 바뀌면 안내한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 18:37:16 +09:00
eomsangdonandClaude Fable 5 e40dc97b09 feat(B07): 종단면도를 작성 척도(1/1,000 x 1/200)로 고정
도면에 척도 개념이 없어 도각을 콘텐츠 크기에 맞춰 늘렸다 줄였다. 사용자가 정한
작성 척도로 그림 크기가 결정되도록 좌표를 종이 밀리미터로 옮긴다.

- config_system에 DRAWING_SCALE_* 상수 추가 (종단 1/1,000 x 1/200, 횡단 1/100, A1)
- 종단 좌표를 종이 mm로: 거리 x1.0, 표고는 기준선 기준 x5.0 (세로 5배 과장)
- 기준선(datum)을 종이 y=0으로 정규화, Y축 눈금 라벨은 실제 표고 유지
- frame_entities(fit=False) 추가 — 도각을 실치수 1:1로 두고 위치만 맞춘다.
  콘텐츠가 작도 영역(693x468mm)을 넘으면 경고 로그
- 실측: 도각 840x594mm(A1 실치수), 콘텐츠 370x213mm (노선 350m = 350mm)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 18:25:21 +09:00
eomsangdon 9268bfe72b auto: 2026-08-29 18:24 (EOMSANGDON-HOME) 2026-08-29 18:24:16 +09:00
eomsangdonandClaude Opus 5 13965e468f fix(B06): 그룹 이름표에 고른 구조물을 적고 형태 누락을 막는다
- 유입구·유출구 이름표에 지금 만지는 구조물을 괄호로 단다 — "유입구 (기슭막이)".
  추가 기슭막이 칸은 "추가 기슭막이 (2단)". 선택이 풀리면 원래 문구로 돌아간다.
- 추가 기슭막이 칸이 설 때 그 자리로 스크롤한다(칸이 화면 밖에서 생겼다).
- 독립 기슭막이 형태·높이가 그림에 안 실리던 두 자리를 고친다:
  ① 정본 읽기가 옛 전용 키(form·height_m)만 봐서 배관 키 한 벌로 저장된
     값을 놓쳤다 → 배관 키 우선, 옛 키는 폴백.
  ② 다단 전개에 소유 벽 형태를 안 넘겨 단들이 늘 메쌓기로 그려졌다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 18:24:15 +09:00
eomsangdonandClaude Opus 5 f7be3f9765 feat(B06): 기슭막이를 형태대로 그리고 다단 칸을 따로 세운다
- 옵션 토글 켜짐 색을 주 액션 색으로 바꾼다(붉은 채움이 경고처럼 읽혔다).
- 같은 문구 토스트가 연달아 오면 앞 토스트가 떠 있는 동안 무시한다.
- 벽 내부 표현을 형태별로 나눈다: 메=돌, 찰=돌+줄눈, 콘크리트=사선 해칭,
  돌망태=2열 격자, 통나무=원, 바자=말뚝+엮음. 배관용·독립용·추가용이
  공용 `appendWallHatch` 하나를 쓴다(배관 오버레이의 중복 코드 제거).
- 추가(다단) 기슭막이를 고르면 유입구·유출구 아래에 전용 칸이 서고
  형태·높이·구간값·옵션 행이 그 칸으로 옮겨 간다. 선택이 풀리면 사라진다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 18:12:28 +09:00
eomsangdon 8e0eec7fc4 style(B06): 옮겨 온 옵션 토글의 켜짐·꺼짐을 구분한다
슬롯 공통 버튼 규칙(배경 투명·테두리 없음)이 .is-on 규칙을 눌러 연동·경사 토글이
두 상태 모두 같아 보였다(2026-08-29 사용자). 켜짐은 조정창과 같은 붉은 채움,
꺼짐은 흐린 글자 + 옅은 바탕, 잠김(경사 해제 중 연동)은 흐리게.
2026-08-29 17:11:53 +09:00
eomsangdon beb6e15f27 auto: 2026-08-29 17:09 (EOMSANGDON-HOME) 2026-08-29 17:09:22 +09:00
eomsangdon b3e6f01eb4 fix(B06): 폼 높이·형태가 실제로 벽을 제어하게 한다
원인 추적 결과 두 겹이었다.
① 배관 벽 높이는 spec.revet_height_m을 쓰지 않는다 — revetWallSpec이 관경 기준
   하한과 조정값(adjust.h)만 본다. 폼 값을 스펙에만 넣어 그림이 안 바뀌었다.
   이제 폼의 높이·형태를 조정창과 같은 채널(revetOffset.update)로 보낸다.
② 형태마다 높이 한계가 있다(돌쌓기(메) 2.0m). 한계를 넘겨 입력하면 그림은 그대로인데
   폼 숫자만 커져 '제어가 안 된다'로 보였다. 기하가 적용한 값을 폼에 되돌리고
   한계를 토스트로 알린다.

폼 기본 높이도 스펙이 아니라 지금 그려진 순수 높이(조정창 표시값)를 쓴다.
2026-08-29 17:09:20 +09:00
eomsangdonandClaude Fable 5 c24e556146 fix(B07): 핀치 확대가 너무 느려 지수를 2배로
PINCH_ZOOM_EXPONENT 0.0015 -> 0.003. 핀치 5회(deltaY 10)에 228%에서 264%로
움직인다. 마우스 휠 한 칸은 종전대로 10%(228%->255%).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 17:04:57 +09:00
eomsangdonandClaude Fable 5 26a2f39dd6 feat(B07): 트랙패드 두 손가락 팬 + 확대를 델타 비례로
확대가 이벤트 1회당 10% 고정이라 트랙패드처럼 잔 델타를 초당 수십 번 보내는
입력에서 튀었고, 두 손가락 이동은 팬이 아니라 확대로 먹혔다.

- zoomScreen을 부호 기반에서 델타 비례 지수식 exp(-delta*지수)로 변경.
  마우스 휠 한 칸(deltaY 100)은 종전과 같은 10%, 트랙패드 잔 델타는 그만큼만
- 트랙패드 두 손가락 이동은 panScreen으로 — 마우스 휠은 한 칸이 100/120px로
  딱 떨어지고 가로 델타가 없다는 성질로 기기를 가른다
- 핀치(ctrl+휠)는 기기 무관 확대, 전용 지수로 천천히
- deltaMode(줄·쪽 단위) 픽셀 환산 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 17:00:27 +09:00
eomsangdon 510731dd17 fix(B06): 폼의 높이·길이·전/후가 횡단도를 따라오게 하고 기본값을 조정창과 맞춘다
2026-08-29 사용자 지적 2건:
① 폼에서 높이·길이·기준측점 전/후를 고쳐도 도면이 그대로였다 — 조정창 조작값
   (revet_adjust.h·m)이 폼 값보다 우선이라 그림이 옛 값을 유지했다. 폼이 높이·
   형태를 정하면 그 벽의 조정값을 비워 폼 값이 이기게 했다.
② 폼 기본값은 예전 조정창이 보여주던 값이 기준이다 — 관 옵션이 비어 있으면
   횡단 스펙(culvert 스펙: 형태·높이·길이·전/후·집수정 구간값·관종·관경)에서
   채워 폼과 조정창이 같은 원천을 보게 했다. 저장된 옵션이 있으면 그쪽이 이긴다.
2026-08-29 16:56:37 +09:00
eomsangdonandClaude Fable 5 b16053e9e4 fix(B07): 트랙패드 핀치가 브라우저까지 확대하던 것을 막는다
핀치는 ctrl+wheel 이벤트인데 CAD 휠 처리가 preventDefault를 하지 않아 브라우저
기본 확대가 그대로 실행됐다. 캔버스 밖(리본·패널)에는 휠 핸들러조차 없었다.

- 캔버스 휠 리스너를 passive:false로 등록하고 handleMouseWheel에서 preventDefault
- document에 ctrl+wheel만 막는 리스너 — 리본·패널 위 핀치도 브라우저 확대 금지,
  ctrl 없는 휠은 남겨 패널 스크롤 유지

확대 감각(세기)·방향·로그는 건드리지 않았다 — 별도 제안으로 PLAN.md 보류 항목.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:54:23 +09:00
eomsangdon 6027e76eaf auto: 2026-08-29 16:53 (EOMSANGDON-HOME) 2026-08-29 16:53:18 +09:00
eomsangdon 45c6f9aa07 feat(B06): 기준 측점 이동을 B06 구조물 배치에서도 한다
2026-08-29 사용자: 구조물 배치 컨테이너를 B06으로 가져온 이유가 이것이다 —
폼의 기준 측점 숫자를 바꾸면 관이 옮겨져야 한다.

- 관 저장기에 이동 예약(queueMove)을 더했다. 세션 키 b06:culvertmove에 담고,
  [저장]·[확정]의 flush가 옵션 병합과 함께 pipe_points에 반영한다. 세부 배수유역
  재분할은 서버가 관 목록을 다시 받아 처리한다.
- 폼에서 측점을 옮기면 목록·폼 캐시가 즉시 새 자리를 따르고, 옵션은 옮기기 전
  자리로 예약한다(저장 시점 관 목록이 그 자리 기준).
- 이동 안내는 차단 문구에서 '저장 뒤 다시 계산' 알림으로 바꿨다.
2026-08-29 16:53:17 +09:00
eomsangdon effd5e59d3 auto: 2026-08-29 16:49 (EOMSANGDON-HOME) 2026-08-29 16:49:38 +09:00
eomsangdon ce0bc7d234 fix(B06): 값만 고쳐도 뜨던 '기준 측점 이동' 안내를 없앤다
원인: 이동 판정 기준이 0.005m였다. 폼의 측점 표기는 0.1m로 반올림되므로(관이
275.71m면 폼은 275.7m) 높이만 고쳐도 0.01m 차이가 나 이동으로 잡혔다.

- 판정 기준을 관 매칭과 같은 0.51m로 맞춘다.
- 실제로 옮긴 경우에도 함께 온 제원은 반영한다 — 위치만 못 옮길 뿐 B05·B06이
  같은 데이터를 쓰는 한 화면이다.
2026-08-29 16:49:37 +09:00
eomsangdon 7fa005dce1 auto: 2026-08-29 16:45 (EOMSANGDON-HOME) 2026-08-29 16:45:54 +09:00
eomsangdon 936def3755 fix(B06): 폼에서 바꾼 관 제원이 횡단도에 바로 반영되게 한다
원인: 좌측 폼의 실시간 반영이 세션 예약(culvertopt)과 목록 캐시까지만 갱신하고,
횡단 캐시(section.culvert 스펙)를 건드리지 않아 카드가 옛 값으로 남았다.

- 폼 옵션 키를 culvert 스펙 자리로 옮기는 applyPipeOptionsToCache 추가
  (관종·관경, 유입·유출 기슭막이 형태·높이·길이·전/후, 집수정 구간값, 구조).
- 연장이 덮는 범위의 카드만 다시 그린다 — 조정창 조작과 같은 흐름.
- 화면 캐시만 고친다. 영구저장은 [저장]·[확정] 그대로.
2026-08-29 16:45:52 +09:00