Commit Graph
519 Commits
Author SHA1 Message Date
eomsangdonandClaude Opus 5 eb41202bf4 fix(B06): 교차점 자동 줌아웃이 5m 사면 규칙에 잘리던 문제
자동 줌아웃 판정이 배수관용 slopeToeOffset(성토사면 5m에서 컷오프)을 써서, 사면이
5m를 넘는 측점은 필요 폭을 과소 산정했고 교차점이 화면 밖에 남았다(2026-08-23
사용자 보고).

- _UI_Cross_Fit 재작성: 설계선(design_line)과 지반선의 **실제 교차점**을 0.1m
  간격으로 훑어 찾는다(노면·노견·측구 구간은 건너뜀). 설계선이 만나기 전에 끝나면
  끝단 기울기 차로 외삽하고 1m 올림.
- 카드 자동 줌아웃(effectiveHalfWidth)이 이 값을 쓴다. 보유 샘플 밖으로는 넓히지
  않는다(지반이 없어 빈 화면이 될 뿐).
- [적용]은 전 측점 중 필요한 최대 폭까지 함께 넓힌다 — 20m를 넘으면 그 값으로
  재생성해 각 카드가 자동 줌아웃할 지반을 확보한다.

자체검증: node tmp/tests/test_toe_extrapolate.mjs (사면 18m 교차점을 5m 컷오프
없이 탐색, 설계선이 15m에서 끊겨도 외삽으로 같은 자리), tsc --noEmit 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:54:38 +09:00
eomsangdonandClaude Opus 5 91f843b5bb fix(B06): 표고(Y) 눈금 최소 단위 1m
확대하면 0.5m·0.2m 눈금까지 내려가 도면에서 읽을 일 없는 값이 표기됐다
(2026-08-23 사용자 지시). 횡단·종단 모두 표고 눈금 간격을 1m로 하한을 둔다
— 라벨은 항상 정수. 편거리(X) 눈금은 종전대로.

자체검증: node tmp/tests/test_cross_y_ticks.mjs (모든 눈금 정수·간격 1m 이상),
test_cross_axes_zoom.mjs 재실행, tsc --noEmit 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:50:19 +09:00
eomsangdonandClaude Opus 5 8f9e628b0b fix(B06): 횡단 보기 설정 한 줄 정렬
ui-field가 세로 배치(라벨·입력·오류 슬롯)라 [적용]이 오류 슬롯 높이만큼 내려가
수평이 안 맞았다. 이 줄에서만 필드를 가로로 눕히고(라벨-입력-버튼) 오류 슬롯을
접어 한 줄에 정렬한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:48:56 +09:00
eomsangdonandClaude Opus 5 dff1e3aff9 feat(B06): 횡단 보기 반폭을 별도 컨테이너로 분리 + 사이드 양식 B05 정렬
- 「횡단 보기 설정」 컨테이너 신설: 반폭 입력 + [적용] 버튼 한 줄. 표준 횡단면
  설정의 [전체 측점 반영]에 물려 있던 반폭 적용을 떼어냈다 — 보유 샘플(20m) 안이면
  전 측점 설계 재계산 없이 즉시 반영된다.
- 표준 횡단면 설정 컨테이너는 기본 접힘.
- 사이드 컨테이너 양식(여백·글자 크기·색)을 B05 .b05-route__panel-section 값으로
  맞춤. 접힘 토글·외곽선은 이미 공용(ui-collapsible / ui-sidebar-section)이었다.
  표준단면 「변수 위치 안내」 모식도 스타일은 현행 유지.
- 표준패널의 미사용 extraControl 인자 제거.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:47:36 +09:00
eomsangdonandClaude Opus 5 bab1f6b2c2 fix(B06): 재생성이 구조물(비정규) 측점을 지우던 문제
_regeneration_options가 extra_stations를 넘기지 않아, 반폭 재생성 한 번에
구조물 측점 횡단도가 통째로 사라졌다(2026-08-23 사용자 보고). 옵션 스냅샷
(data.options.extra_stations)에서 목록을 읽어 재생성 옵션에 실어 준다.

자체검증: ./venv/Scripts/python.exe -m pytest tmp/tests/test_regeneration_extra_stations.py -q (2 passed)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:43:32 +09:00
eomsangdonandClaude Opus 5 5ac61cb4cc fix(B06): ⤢(오토핏) 기본값을 전역 횡단 반폭 보기값으로
⤢가 항상 교차점 맞춤 폭으로 가서 전역 보기값보다 좁아지기도 했다. 이제 초기화는
전역 보기값이 기본이고, 그 폭에서 절·성토선과 원지반 교차점이 안 보이는 측점만
교차점이 보이는 폭(그 측점의 기본값)으로 되돌린다(2026-08-23 사용자 지시).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:34:50 +09:00
eomsangdonandClaude Opus 5 b344ffe60e fix(B06): 원배율에서도 캐시 범위 팬 허용 + 면적표 좌측 상단 이동
- 팬 한계를 배율과 무관하게 그려진 범위(캐시 보유분)까지 연다. 확대해야만 움직여
  "팬이 안 된다"고 보고됐다(2026-08-23). 캐시가 표시 폭과 같으면 종전처럼 이동 0.
- 절·성토 면적표를 그래프 가운데 상단 → **좌측 상단**(축선 안쪽 58px)으로. 세로
  자리는 그대로.

화면 검증(공용 브라우저): 원배율 가운데 드래그로 translate 0→100.3px, X 눈금
-10~10 → -5~15로 캐시 구간 노출. 면적표 좌측 오프셋 58px·상단 8px 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:32:06 +09:00
eomsangdonandClaude Opus 5 082e679672 fix(B06): + 버튼이 배율 확대를 못 하던 문제
원배율에서 +를 표시 반폭 좁히기로 돌려놨더니 배율이 1에서 올라가지 않았고,
가운데 버튼 팬은 배율>1에서만 열리므로 팬도 함께 막혔다(2026-08-23 사용자 보고).
+는 언제나 배율 확대, −만 원배율에서 표시 반폭 +1m로 되돌린다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:26:24 +09:00
eomsangdonandClaude Opus 5 ea29cc2e59 feat(B06): 확대 상태 팬으로 캐시 보유 범위까지 열람
- 도형(지반선·면적 밴드·설계선·암 경계선)을 표시 반폭으로 자르지 않고 **캐시 보유
  전 구간**으로 그린다. 표시 반폭 밖은 기존 clip이 가리므로 원배율 화면은 그대로다.
- 팬 한계(clampPan)를 그려진 범위까지 확장 — 배율 1에서는 종전대로 이동 0으로 묶고,
  확대 상태에서만 캐시 끝까지 가운데 버튼 드래그로 끌어다 볼 수 있다.
- 축 눈금은 팬 상태를 역산해 다시 그리므로(_UI_Cross_Axes) X·Y 값이 따라 움직인다.

자체검증: node tmp/tests/test_cross_pan_bounds.mjs (배율 1 고정, 2배에서 좌우 한계가
캐시 끝과 일치, 범위 밖 이탈 없음, content 없을 때 옛 규칙 유지),
test_cross_axes_zoom.mjs 재실행, tsc --noEmit 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:24:23 +09:00
eomsangdonandClaude Opus 5 0d80d03b96 fix(B06): 횡단 줌·팬에 X·Y 축 눈금 동기화
도형만 transform으로 확대되고 축은 고정이라 확대·이동 후 눈금값이 실제 위치와
어긋났다(2026-08-23 사용자 보고). 축·격자를 별도 레이어(_UI_Cross_Axes)로 옮기고
줌·팬 상태가 바뀔 때마다 보이는 범위를 역산해 다시 그린다.

- 눈금 개수·간격도 그때 보이는 범위로 다시 고른다(1·2·5 계열, X 목표 7·Y 목표 10,
  라벨 겹침 하한 X 48px·Y 14px). 확대할수록 촘촘·소수 단위로 자동 전환.
- X 눈금이 7등분 고정(비정수 간격)이던 것도 같은 규칙으로 정리.
- Cross_View는 축 코드가 빠져 622줄.

자체검증: node tmp/tests/test_cross_axes_zoom.mjs (원배율·4배 확대에서 눈금이
플롯 안에 있고, 같은 offset의 도형 자리와 눈금 자리가 일치), tsc --noEmit 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:20:22 +09:00
eomsangdonandClaude Opus 5 f2ad5508f5 feat(B06): 횡단 줌 조작 일원화 + 교차점 맞춤 자동 확대
- 카드 하단 ◀/▶/↺(개별 표시 반폭) 삭제. 조작구는 우측 상단 줌 버튼 하나로.
- 줌 버튼 역할 확장(원배율에서만 반폭 조작):
  − 배율>1이면 축소, 원배율이면 표시 반폭 +1m
  + 배율>1이면 확대, 원배율이면 표시 반폭 −1m(하한 2m)
  ⤢ 배율 원복 + 절·성토 교차점이 다 보이는 폭으로 맞춤
- 교차점 맞춤(_UI_Cross_Fit): 보유 샘플(계산 반폭 20m) 안에서 교차점을 찾고,
  샘플 끝까지 안 만나면 끝단 사면·지반 기울기 차로 만나는 자리를 추세 외삽해
  올림 +1m을 요청 반폭으로 쓴다(상한 60m).
- 요청 반폭 > 보유 샘플이면 그 폭으로 재생성(regenerate) 후 해당 측점만 세션
  반폭으로 넓게 표시. 계산 기본 20m·캐시는 그대로, 확정 시 기존 경로대로
  display_half_width_m에 영구 저장.
- 재생성 로직을 _UI_Page_Common.createSampleWidener로 분리(700줄 제한),
  [전체 측점 반영]도 같은 경로 사용. 연타 중복 요청 차단.

자체검증: node tmp/tests/test_toe_extrapolate.mjs (외삽 좌/우·발산 지형·+1m 올림),
tsc --noEmit 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 18:16:31 +09:00
eomsangdonandClaude Opus 5 ec514a4560 fix(B06): 횡단 Y축 눈금이 X축 아래로 삐져나오던 문제
눈금 범위를 elevationMid 중심(±displaySpan/2)으로 잡아, displayMax에 들어간
면적표 여유(AREA_OVERLAY_HEADROOM_PX/2)만큼 아래로 밀려 최하단 격자선·라벨이
X축 라벨 줄 아래에 그려졌다. 범위를 실제 표시 상·하단(displayMax 기준)에서
역산해 플롯 안에만 눈금이 오게 한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 17:53:52 +09:00
eomsangdonandClaude Opus 5 c10fb3400e fix(B06): 횡단면도 Y축 눈금도 정수·1·2·5 계열로 정의
- 5등분 고정(소수 표기) → 종단면도와 같은 niceTickStep 규칙 적용.
- niceTickStep을 _UI_Section_Common으로 옮겨 종·횡단이 공유(정의 한 곳).
- 횡단은 카드 높이가 낮아 라벨 간격 하한 14px(종단 16px)로 개수 상한 산정.
- 횡단 표고 여유는 기존 crossPlotMetrics의 8% 패딩 그대로.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 17:51:38 +09:00
eomsangdonandClaude Opus 5 2cea6203be fix(B06): 종단 Y축 눈금 정수화 + 최대·최소 표고 여유
- 0.25 비율 고정 5눈금(소수 표기) → 1·2·5×10^n 중 10칸에 가장 가까운
  간격으로 자동 선택. 눈금값이 딱 떨어져 표고를 읽을 수 있다.
- 라벨 겹침 방지로 눈금 간격 16px 하한(plotHeight/16 개수 상한).
- 자동 스케일(B05)은 표고 범위에 위아래 10%씩 여유 — 최고·최저점이
  축선에 붙지 않는다. 공통 Y스케일(B06 yScaleOptions)은 불변.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 17:49:28 +09:00
eomsangdonandClaude Fable 5 76df1e9335 fix(B05): 종단 계획고 변경을 횡단 설계에 자동 반영 - B05 진입 시에도 재계산
2026-08-23 사용자 보고: 종단 그래프의 계획고 변화가 B06 횡단도에 반영 안 됨.

원인: 횡단 설계는 계산 당시 계획고(design.design_elevation_m) 기준으로 설계선
좌표를 굳혀 둔다. 계획선이 뒤에 바뀌면(사용자 편집·확정, 배수 최소고 같은
백엔드 규칙 도입) 설계선은 옛 자리에 남는데, 화면의 계획고 십자선과 3D
예상형상은 최신 계획선을 쓴다 - 두 기준이 어긋난다. 실측으로 한 노선에서
최대 2.21m 어긋남 확인. 지금까지 이 보정은 B06 진입 때만 돌아서, B05의 횡단
기준 유토곡선과 3D는 옛 설계선을 계속 썼다.

- staleDesignChainages() 신설(B06_Section_UI_Section_Common) - 계획선 보간값과
  계산 기준의 차이로 재계산 대상을 판정하는 B05·B06 공용 규칙.
- B05 Profile_Panel: 진입 렌더에서 어긋남이 있으면 프리뷰 1회로 맞춘다.
- B06 Page: 같은 공용 규칙을 쓰도록 통일(옛 암 2단계 필드 누락 조건은 유지).

검증: tsc 통과 · pytest 191 passed(신규 stale 판정 6건) · 공용 브라우저 실측 -
계획고·지반고 배치 대조(전 측점 일치, 렌더 역산 RMS 0.004~0.03m), 측점 중심
좌표가 노선 폴리라인과 거리 0, 인위 stale 1건을 B05 진입으로 자동 복구(stale
1 to 0, 계획고 540.895 복원).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:40:48 +09:00
eomsangdonandClaude Fable 5 d8080109c1 feat(B05): 쉬프트 재정의(힌지 승격) + 최소고 판정점을 제어점으로
2026-08-23 사용자 개념 확정 반영.

- 틸트는 그 지점을 라운드로 주변 직선과 잇는 조작이고, 측점·횡단배수 지점의
  수직선에는 라운드 중심점이 놓인다. 따라서 최소고 판정도 제어점 z 기준이어야
  한다(controlElevationAt) - 곡선 샘플 계획고로 재던 탓에 배수 지점 옆을
  틸팅해 라운드 형상만 바뀌어도 락이 걸렸다.
- 쉬프트 재정의(shiftMovingPoints): 구간 끝이 사용자 틸팅점이면 그 점이 직접
  움직이고, 고정점(BP·EP·횡단배수 앵커)이면 움직이지 않는다. 대신 구간 안쪽
  미틸트 측점의 외곽 2개를 힌지로 승격해 라운드를 만들고 그 사이 직선을
  평행이동한다. 힌지 둘을 못 만드는 구간(안쪽 측점 2개 미만)은 쉬프트 대상이
  아니므로 ⬆⬇ 버튼을 만들지 않는다(canShift).
- shiftSegment 되먹임 보정 - 라운드 중앙종거가 낀 자리에서도 화면 계획고가
  정확히 1스텝 움직인다.

검증: tsc 통과 · pytest 185 passed(힌지 규칙 4건 신규) · 공용 브라우저 실측 -
구간 0~84 ⬆에서 힌지(20·80)만 이동하고 BP·앵커 오프셋 미생성, 두 힌지 계획고
정확히 +0.1000m(구배 보존), 앵커 이웃 80.0m ▼ 차단 해제, 앵커 84.3m ▼ 차단 유지.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:01:45 +09:00
eomsangdonandClaude Fable 5 eb716ffbb1 fix(B05): 종단 편집 최소고 가드 개편 - 구간 쉬프트 차단 + 시설별 산식
2026-08-23 사용자 보고: 횡단배수 최소고를 어기고 구간 쉬프트가 되는 경우
있음(가드가 측점 ▼에만, 관경 고정 산식).

- 가드 개편(blocksMinCover): 편집 후보로 정렬을 계산해 시설별 최소고
  (minCoverPoints 원천 - 배수관 관경+토피, BOX암거 구체높이+토피, 세월교
  +물넘이, 물넘이포장 제외) 위반이 새로 생기거나 커지면 차단. 측점 ▲▼와
  구간 ⇧⇩ 모두 적용, 이웃 틸트가 종단곡선을 거쳐 배관 계획고를 내리는
  경로까지 커버. 이미 위반이면 악화만 차단(복구 편집 허용). 기존
  blocksPipeLowering(측점 ▼ 전용·관경 1000 고정)은 제거.
- shiftSegment 시딩 수정: 초기 오프셋을 곡선 샘플 계획고(PVI z - 중앙종거)
  대신 변화점 실제 z로 계산 - 첫 이동에서 변화점이 내려앉아 상승 후 하강
  복귀가 비대칭이던 화면 실측 버그 해소.
- MinCover 낡은 주석 정정(구현은 세월교 포함, 물넘이포장만 제외).

검증: tsc 통과 · pytest 182 passed(가드·시딩 신규 8건) · 공용 브라우저
실조작 - 배수관 앵커 구간 ⬇ 즉시 차단(+1.5), BOX암거 구간 차단(+2.5),
⬆/⬇ 대칭 복귀, 검증 상태 전부 원복.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:27:41 +09:00
eomsangdonandClaude Fable 5 8393d22c23 feat(B05): 절성토 완전 분리(행 지반 트림) · 그랩 팬 · 측점 그룹 라이브 갱신
2026-08-23 사용자 지시 3건:
- 절성토 완전 분리: 전환 구간을 상대 측점의 폭 0 축퇴점으로 모핑하던 방식
  제거. 비탈을 측구와 같은 도로부 앵커 상대 좌표로 보간하고, 행마다 두 측점
  지반선을 섞은 행 지반선과 직접 교차시켜 종결(trimSlopeToGround). 지반이
  반대편인 행은 조각 드롭 - 절토가 지반으로 내려가거나 서피스끼리 침범하던
  문제 해소. 클리핑 외곽도 행 실점유(비탈-측구-노견)로 일치.
  700줄 제한: 측점 분류·트림 유틸을 Corridor_Station.ts로 분리(Build 494줄).
- 그랩 팬: 가운데 드래그를 커서 아래 지형점이 1:1로 따라오는 팬으로 직접
  구현(B04_PreProcess_UI_Camera). OrbitControls 기본 PAN은 카메라-target
  거리 비례라 커서 피벗 회전·줌 후 극단적으로 느려졌다. B04 뷰어도 공용.
- 측점 그룹 갱신: Profile_Panel이 라이브 alignment.samples 노출, Page의
  측점 바 계획고·코리도 designSamples가 그걸 사용, 종단 편집 디바운스에서
  renderStationLines 동반 호출. BUILD_VERSION 4-5로 저장본 만료.

검증: tsc 통과 · pytest 175 passed(신규 separation 8건) · 사용자 화면 확인.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:06:03 +09:00
eomsangdonandClaude Opus 5 0e3bdb145d feat(B05): 측구·절토 종점을 계획선-지반선 교차점으로 계산
측점 사이 어딘가에서 계획선이 지면선을 통과한다 - 그 자리가 절토+측구의 종점이고
거기서부터 성토로 넘어간다(2026-08-23 사용자 확정). 임시로 쓰던 "측점 사이 중간에서
끊기"를 이 계산으로 대체한다.

- buildCrossingFinder(): 종단 계획선 샘플의 (계획고 - 지반고) 부호가 뒤집히는 구간을
  선형보간해 전환 누가거리를 낸다. 구간 안쪽 교차만 인정 - BP·EP는 정의상 지반과
  만나므로 경계의 0을 거르지 않으면 측구·절토가 0.4m 만에 끝난다(실측으로 확인)
- 측구는 그 지점까지 그리고 마감벽으로 닫는다(위치는 계속 노견을 따라간다)
- 절·성토는 전환점에서 폭 0이 되도록 보간 구간을 다시 잡는다. 구간 전체에 걸쳐
  서서히 사라지던 것을 실제 절토가 끝나고 성토가 시작되는 자리에 맞춘다
- 전환점을 못 찾으면(전 구간 절토 또는 전 구간 성토) 종전대로 중간에서 나눈다

측구 형식(일반/L형)은 3D에 이미 반영되고 있음을 확인했다 - 폭은 형식별 필드
(top_width_m / width_m)를 구분해 쓰고, 단면 형상은 엔진이 만든 design_line을
잘라오므로 사다리꼴과 L형이 그대로 올라온다.

BUILD_VERSION 4로 올려 옛 저장본을 만료시킨다.

검증: 실측 측구·절토 유효구간 0.00~2.80m(계산 교차점 2.83m, 0.2m 세분 격자),
이전 0.00~10.00m. pytest 167 passed(전환점 경계·측구 형식 5건 신규), tsc 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 15:38:34 +09:00
eomsangdonandClaude Opus 5 8f6cf5bba6 fix(B05): 도로부(차도·노견·측구) 위치를 한 몸으로 제어 + 빌드 판번호로 캐시 만료
측구가 노견에서 떨어지던 문제
- 측구는 있는 측점과 없는 측점이 갈려 절대 좌표로 따로 보간되고 있었다. 도로 끝은
  다음 측점을 향해 내려가는데 측구만 제자리에 남아, 측점에서 멀어질수록 벌어졌다
  (실측 ch2.0 0.18m / ch5.0 0.46m / ch9.8 0.90m - 측구 폭 0.69m보다 큰 틈)
- 측구 조각을 road edge 기준 상대 좌표로 들고 있다가 프레임의 도로 끝에 얹는다.
  "측점 사이 중간에서 끊기" 규칙은 표시 구간만 자르고 위치는 항상 노견을 따라간다
- 비탈 안쪽 끝도 그 프레임의 도로부 바깥 끝(측구 끝 또는 노견 끝)에 스냅.
  종단 보정분을 얹어 노면과 높이를 맞춘다
- 실측: 차도-노견, 노견-측구, 측구-절토 경계가 전부 0.0000 m.
  측구 단면(폭 0.690 / 깊이 0.300)은 구간 전체에서 유지

저장본 캐시 만료
- 해시가 종횡단 입력만 요약해, 빌드 코드를 고쳐도 입력이 같으면 옛 저장본을 그대로
  다시 썼다(사용자 보고: 수정이 반영 안 되다 갑자기 반영됨). BUILD_VERSION을 해시에
  섞어 기하를 바꾸는 수정마다 저장본이 만료되게 한다

검증: pytest 162 passed, tsc 통과, 화면 실측

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 15:21:12 +09:00
eomsangdonandClaude Opus 5 1f631bc3d4 fix(B05): 코리도 평면 궤적 스플라인화 + 좌표 정밀도 + 편집 되돌리기 곡선반경 보존
평면 궤적 (사용자 제안 채택)
- 노선 정점을 직선으로 잇던 것을 centripetal Catmull-Rom으로 교체.
  실측 노선은 정점 135개·평균 간격 2.61m·꺾임각 최대 42.4°라, 0.1m로 잘게
  쪼개도 정점 이음매의 각짐은 그대로였다
- 스플라인 도입으로 세분은 0.2m로 되돌림 — 데이터·연산 절반

좌표 정밀도 (지그재그의 진짜 원인)
- 코리도 좌표는 EPSG 절대값(183,494 / 489,290)이라 Float32에 담으면 해상도가
  0.14m까지 떨어져, 0.2m 세분 점들이 양자화 계단을 타며 최대 35°짜리 각도
  노이즈가 생겼다. positions를 Float64로 올린다(화면에 올릴 때 원점을 빼며
  Float32로 줄이므로 렌더 비용은 그대로)
- 실측: 중심선 꺾임 평균 4.271° → 0.704°, 5° 초과 838개 → 25개

편집 되돌리기
- resetAll이 자동 계획선이 역산해 저장한 curve_radii까지 비워, 프론트가 기본
  R로 다시 그리며 화면 계획고가 정본과 어긋났다(세월교 지점 0.22m 낮음 →
  최소고 경고 오탐). 사용자 편집 측점만 지우고 곡선반경은 저장분으로 되돌린다

검증: pytest 14/14(스플라인 제어점 통과·오버슈트 없음 3건 신규), tsc 통과,
화면 실측 — 경고 소거, 줌인 시 곡선 매끄러움 확인

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 14:40:56 +09:00
eomsangdonandClaude Opus 5 59ca25b182 fix(B05): 종단 세분 하한이 0.1m 지정을 0.5m로 깎던 문제
steps 계산의 Math.max(0.5, step)가 사용자가 지정한 0.1m 세분을 통째로
무시하고 있었다. 저장본이 702행(=350m/0.5m)으로 남아 있어 확인했다.
하한을 0으로 나누는 것만 막는 값(0.01)으로 낮춘다.

검증: 저장본 3,503행 · 평균 간격 0.100m 확인, 줌인 시 곡선 구간이
매끄럽게 이어짐. 편집 시 최대 프레임 갭 348ms(200ms 초과 1회)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 14:28:45 +09:00
eomsangdonandClaude Opus 5 ea55ad1c73 fix(B05): 세월교 요구 여유 = 배수관 산식 + 물넘이 몫, 물넘이포장은 여유 없음
세월교는 배관을 여러 개 묶어 다리 형태로 만든 것이라 배수관과 같은 산식을 쓰되,
그 위에 물넘이가 얹히므로 0.5m를 더 얹는다(2026-08-23 사용자 확정).
물넘이포장은 도로 위에 그대로 만드는 시설이라 들어 올릴 이유가 없다.

- 세월교 Ø1000 → 1.0 + 0.5(토피) + 0.5(물넘이) = 2.0
- 물넘이포장 → 0.0
- 앞서 쓰던 월류 높이(ford_height_m) 기준은 폐기

검증: 계획선 재생성 실측 — 세월교 지점 계획고-지반고 2.00 일치
(배수관 1.50/1.30, BOX 2.50도 유지). pytest 6/6, tsc 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 14:19:57 +09:00
eomsangdonandClaude Opus 5 e1d0d6dda3 feat(B05): 계획 종단선이 횡단배수 최소고를 자동 확보
계획선의 변화점(PVI)은 배수유역이 확정한 배관 배치 측점이다. 그 자리 계획고를
지반고와 같게 두면 관·구체가 들어갈 자리가 없어, 시설 제원만큼 들어 올린다.

- common_util_drainage_pipes: facility_clearance_m()/pipe_anchor_clearances() 신설
  (정본 산식) — 배수관 관경+토피 0.5, BOX암거 구체높이+토피 0.5,
  물넘이·세월교는 좌측 패널이 설계유량으로 산출한 월류 높이(ford_height_m)
- Engine_Sections: 관 지점에서 시설 여유를 함께 읽어(_load_pipe_anchors) 전달
- Engine_Grade_Profile: 앵커 목표 표고 = 지반고 + 시설 여유
- Profile_MinCover(화면 경고): 세월교·물넘이를 월류 높이 기준으로 추가.
  백엔드가 정본이고 이쪽은 편집 중 즉시 경고용 사본 — 값 일치는 테스트로 잠금

검증: 재생성한 계획선의 배관 측점 실측 — Ø1000 +1.50 / 세월교 +0.30 /
BOX +2.50 / Ø800 +1.30 (전부 요구 여유와 일치), 화면 경고 소거 확인.
pytest 10/10, tsc·ruff 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 14:12:38 +09:00
eomsangdonandClaude Opus 5 af9d2b5530 feat(B05): 측구 끊김 마감·0.1m 종단 세분·지형 near/far 분할·횡단배수 최소고 경고
측구 표현
- 한쪽 측점에만 있으면 측점 사이 중간에서 끊고, 끊긴 자리를 도로 가장자리
  높이까지 벽으로 막는다(공중에서 끊겨 보이던 문제)

품질·성능
- 종단 세분 2m → 0.1m (사용자 지정). 프레임 갭 실측 145ms로 사용 가능
- Corridor_Split(신규): 노선 밴드(코리도 AABB + 80m)로 지형을 1회만 갈라
  편집마다 near만 재트림, far는 재사용. 정점 버퍼 공유라 분할 비용은 인덱스
  복사뿐이며, 코리도가 밴드를 벗어날 때만 다시 가른다

횡단배수 최소 계획고
- Profile_MinCover(신규): 배수관 Ø1000 → 지반고 +1.5m, BOX 2.0×2.0 → +2.5m
  (관경·구체높이 + 토피 0.5m, B06 MIN_PIPE_COVER_M과 동일 값)
- 계획선이 밑돌면 종단 표시줄 경고 + 측점별 부족량 툴팁. 세월교·물넘이는 제외
- 자동 계획선 생성 시 제약 반영은 후속(선형 재구성 규칙 협의 필요)

검증: tsc·pytest 9/9, 화면 실측(경고 문구·측구 마감·클리핑 삼각형 수)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 13:58:00 +09:00
eomsangdonandClaude Opus 5 fdfc0fb893 fix(B05): 코리도 클리핑 크래시·지형 렌더 복구 + 측구 구간 분할 + 종단 스무딩
클리핑 정상화 (절토가 원지반에 묻혀 안 보이던 원인)
- 정점 버퍼를 count 길이로 잘라 복사 — 'offset is out of bounds'로 클리핑
  전체가 죽어 원지반이 하나도 안 잘리고 있었다(삼각형 485,358 → 477,239 확인)
- 정점색을 원본 배열 타입·normalized 그대로 복사(GLB는 정규화 Uint8 RGBA)
- 원본에 법선이 없으면 클리핑본도 만들지 않는다 — 직접 계산하면 감기 방향이
  원본과 달라 지형이 새까맣게 렌더됐다

표현 규칙
- 측구가 한쪽 측점에만 있으면 측점 사이 중간에서 끊는다(사용자 확정).
  폭 0 축퇴로 잇던 방식을 걷어내 없는 자리의 서피스·윤곽선 제거
- 리본을 조각이 존재하는 연속 구간별로 분리 생성
- 종단 세분 2m → 1m, 측점 사이 표고를 종단 계획선(종단곡선 포함) 기준으로
  보정 — 도로·측구는 전량, 비탈은 지반 접점까지 감쇠
- 측점 가로선을 예상형상 표시 중에는 계획고 위로 올림
- 지형 기본 표시를 흑백으로

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 13:42:16 +09:00
eomsangdonandClaude Opus 5 7fdbb343ab feat(B05): 코리도 편집 즉시 반영 + 프리즈 제거 + 구분 품질 4종
편집 반영
- Profile_Panel 프리뷰를 full_designs로 올려 설계선까지 갱신, 갱신 후
  onCrossDesignsUpdated 콜백 → Page가 코리도 재빌드(500ms 디바운스)
- 종단 계획고를 올리면 3D 예상형상이 그 자리에서 따라 바뀐다

프리즈 제거 (프레임 갭 실측 3603ms → 100ms, 100ms 초과 0회)
- Corridor_Terrain(신규): 지형 XZ 균일격자 높이 색인. 심 보정 raycast가
  BVH 없이 전 삼각형을 훑어 3.6초 단일 블록을 만들던 것을 버킷 조회로 대체.
  지형 로드당 1회만 구축
- Corridor_Clip: 스트립 셀·경계선분 균일격자 색인, 핫루프를 정점 복사에서
  인덱스 재구성으로 전환(원본 버퍼 재사용, 잘린 조각만 덧붙임)

구분 품질 (사용자 확정 4종)
- 색 재설계: 지형 고도색(주황~녹)과 겹치던 적갈/초록을 자주(절토)·청록(성토)
  으로, 도로계는 무채색, 측구 하늘색
- 종류 경계 윤곽선, 절·성토 빗금(해칭) 텍스처 방향 구분(절 우상향/성 좌상향)
- 시·종점 마구리 봉인 — 설계선↔지반선 절단면 스트립(저장 왕복 포함)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 13:11:49 +09:00
eomsangdonandClaude Opus 5 3b997963e3 feat(B05): 3D 예상형상 — 계획노선 코리도 서피스·원지반 경계 재절단·영구저장
- Corridor_Build: design_line을 차도/노견/측구/절토/성토 5종으로 분류,
  catch point(설계선-지반 교차)로 점유 폭 산출, 노선 폴리라인 2m 세분
  중간 프레임 보간 (계산식 재구현 없이 백엔드 design_line 소비만)
- Corridor_Mesh: 종류별 색 리본 BufferGeometry 조합(멀티 스윕)
- Corridor_Clip: catch line 스트립으로 지형 삼각형 경계 재절단(셀 단위
  판정·정점색 보간), 원본 보존 — [예상형상] 토글 OFF 시 원지반 완전체 복원
- Viewer: 원본/클리핑 지형 두 벌 스왑, 비탈 최외곽 z 지형 투영(심 보정),
  클립 rAF 비동기, 흑백·dispose 연동
- Panel: [예상형상] 토글 (기본 ON)
- Corridor 엔트리: 설계 입력 FNV-1a 해시 버전, base64 Float32 JSON 직렬화,
  최초 빌드 즉시 저장 + 임시저장·페이지 이동 시 dirty 저장, SPA 메모리 캐시
- Router_Corridor(신규)+main 등록: GET/PUT corridor 파일 보관
  (B05_Profile/corridor/, atomic, 64MB 상한)
- 검증: tsc·ruff·pytest 5/5, 공용 브라우저 실조작(토글·B06 변경 왕복·
  저장 왕복 네트워크 실측), 저장본 리본 수치 대조

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 12:28:37 +09:00
eomsangdonandClaude Opus 5 30031c33c0 feat(B06): I형 집수정 이동 한계 = 배관 길이가 바뀌기 직전까지
I형은 관을 감싸는 구조라 집수정을 옮기면 관 시작점이 따라가 관 길이(m 규격)가
바뀐다. 길이가 달라지는 지점 **직전**이 최대 이동이다(2026-08-22 사용자 확정).

- clampBasinMove(Basin): 요청값에서 0.1씩(상하 먼저, 다음 좌우) 되돌려 기준
  길이와 같아지는 자리를 찾는다. ㄴ·ㄷ형은 대상 아님(관이 바닥에서 출발)
- 적용값을 layout.basinAdjust로 돌려주고, Wire가 세션값을 실제 적용값으로
  되돌린 뒤 토스트로 이유를 알린다(눌러도 안 움직이는데 숫자만 커지는 것 방지)
- 700줄 유지: pipeAxisSolver(Solve)로 관 축·끝단 계산 이전, Geom 673줄

검증: 4+4.3 I형 좌우 2m 요청 → 0.7m 적용·관 길이 8m 유지, 13+15.7은 0.4m
적용·14m 유지. 상하 요청도 같은 한계. ㄴ형은 클램프 없이 2m 그대로 적용.
화면에서 ◀ 12회 연속 → 0.7m에서 멈추고 관 L=8.0m 불변, 토스트 안내.
tsc·prettier 통과 · pytest 148 passed, 7 skipped · 700줄 초과 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 19:10:28 +09:00
eomsangdonandClaude Opus 5 917cdce5df feat(B06): 집수정 9키 조작 · 좌우 화면 기준 통일 · 계류측 성토부 체계 도입
① 집수정 조작을 9키(3×3)로 — 십자 축은 이동(◀▶ 좌우 / ▲▼ 사면 대각),
   네 모서리는 크기(⇕ 내부 높이 · ⇔ 내부 폭), 가운데는 초기화. 기슭막이
   십자와 같은 축 규칙·버튼 크기라 행열이 맞는다. I형은 내공 개념이 없어
   네 모서리만 숨긴다.
② 좌우 반전 해소 — 집수정 lateralM이 계류측(outward) 기준값에 그대로 묶여
   유입이 우측인 측점에서 ◀가 화면 오른쪽으로 갔다. 버튼을 **화면 기준**으로
   받아 카드가 부호를 환산한다. 노견 안쪽(음수)은 0에서 멈추고 토스트로 알린다.
③ 집수정 계류측에 **유출측과 같은 성토부 체계** 적용(ㄴ·ㄷ형) — 구조물 계류측
   끝이 원지반 위로 나오면 1:1.2 성토부선을 긋고, 5m를 넘으면 다단 기슭막이를
   둘 수 있다(키 , 단 수 행 별도). 원지반 안이면 종전 절토선,
   I형은 관 하단 3도 되메움선이 맡는다. 좌우 이동 시 마감선을 억제하던 임시
   조건은 제거했다(급경사 선의 근본 원인은 이미 설계선 트림에서 해결).
- 700줄 유지: attachBasin(Basin)·buildExtrasAt(Extra) 추출 + 주석 정리

검증: 4+4.3 ㄴ형 좌우 2m — 성토부선 2.41m가 원지반에 0.001m 오차로 접함
(종전 마감선 없음) · ◀ 클릭 시 4+4.3(유입 좌)·13+15.7(유입 우) 모두 화면
왼쪽으로 이동 · 9키 3×3 좌표 정렬 확인 · tsc·ruff·prettier 통과 ·
pytest 148 passed, 7 skipped · B06_Section 700줄 초과 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 18:59:09 +09:00
eomsangdonandClaude Opus 5 2a247184fd feat(B06): 집수정 좌우·상하 이동 및 내공 조정 + 설계선 스냅 급경사 제거
- 집수정 조정값(BasinAdjust: 내공 폭·높이, 좌우 lateralM, 상하 slopeM) 신설.
  측점별 세션 보관 + 백엔드 design.basin_adjust 저장 경로(Schema·Router) 연동
- 조정창에 집수정 조정 항목 추가, I형 관 시작점을 벽 안쪽 변과 원지반의
  교차점으로 산출(이분법), 집수정 성토(되메움)선 5° → 성토 비탈 1:1.2로 통일
- 설계선 트림 수정: 배수관 레이아웃이 사면 폴리라인을 준 쪽은 그 시작점(노견)에서
  설계선을 끊는다 — 종전에는 트림 경계에서 끝점 표고를 벽 상단으로 강제 스냅해
  집수정을 좌우로 옮기면 마지막 구간이 수직으로 튀는 선이 남았다(사용자 지적)
- basinApproachPoints의 길이 0 중복 꼭짓점 제거

검증: 4+4.3(집수정 I형 좌우 2.9m 이동)·13+15.7·5+0.0·2+0.0에서 급경사
세그먼트 0건 · tsc --noEmit 통과 · ruff check 통과 · prettier 적용 ·
pytest tmp/tests/ 148 passed, 7 skipped · B06_Section 700줄 초과 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 17:50:45 +09:00
eomsangdonandClaude Opus 5 e54da341ea refactor(B06): 700줄 초과 파일 분리 — Router·Cross_View·Section_View·Style
- B06_Section_Router.py(824) → Router_Design.py(139) 분리
- Cross_View → Cross_View_Metrics.ts(75) 분리
- Cross_Design → Cross_Design_Surface.ts(54) 분리
- Section_View → Section_View_Panel.ts(53) 분리
- Page → Page_Common.ts(15) 분리
- Style_Cross.css → Style_Cross_Controls.css(174) 분리
- B06_Section/ 전체 700줄 초과 0건

검증: tsc --noEmit 통과 · ruff check 통과(import 정렬·포맷 적용) ·
prettier 적용 · pytest tmp/tests/ 148 passed, 7 skipped.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 17:04:08 +09:00
eomsangdonandClaude Opus 5 be7503d741 chore(knowledge): 중첩 Obsidian 볼트 잔재 제거 + .obsidian gitignore
- resources/knowledge/knowledge/ 아래 남아 있던 .obsidian 설정과 기본 노트 삭제
- .gitignore에 **/.obsidian/ 추가 — 볼트 설정은 추적하지 않는다
- 03_미결_및_확인사항.md BOM 제거

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 16:26:25 +09:00
eomsangdonandClaude Opus 5 7cbfa475a6 fix(B06): 유입 하강을 유출 수용 가능 여부로 제한 + 계산은 전체 샘플 사용
- 유입이 유출보다 높아야 하므로 유입을 내리면 유출도 따라 내려간다. 유출이
  원지반에 묻히고 3도 절토선이 지반과 다시 못 만나는 높이면 **유입도 그만큼
  못 내려간다**(placeInletWall의 outletGuard, 아래 방향만 되돌림)
- 횡단 카드의 배수관 기하 계산 입력을 표시 반폭으로 자른 샘플 → **전체 샘플**로
  변경(2026-08-22 사용자 확정: 표시 반폭은 보기용, 계산은 계산용 전 구간)
- 유입 배치 로직을 placeInletWall(Solve)로 이전

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 16:00:40 +09:00
eomsangdonandClaude Opus 5 8be67485be style(B06): Cross_View 주석 정리 — 700줄 제한 준수
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 15:44:58 +09:00
eomsangdonandClaude Opus 5 cd855e32d3 feat(B06): 관 접속 절·성토선 3도 물매 + 교차점 보간 + 절성토 교차 기준 자동 줌아웃
- 관 유도 접속선을 0도 → **3도**로: 유입측은 계류 쪽 오름(물이 관으로),
  유출측 매몰 절토선은 계류 쪽 내림(물이 밖으로). 집수정 I형 되메움선도 동일
- 모든 유도선·성토부선 끝점을 격자점이 아니라 **선형 보간 교차점**에 붙여
  선이 원지반을 미세하게 벗어나던 문제 해소(2026-08-22 사용자 지적)
- 카드 자동 줌아웃: **구조물 없는 상태**의 설계 절·성토선이 원지반과 만나는
  지점(+0.5m)이 표시 반폭 밖이면 그 카드만 반폭을 넓혀 그린다. 보유 샘플
  범위를 넘는 경우는 기존 전역 반폭 재생성 경로(applyPanelToAll)가 담당

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 15:44:10 +09:00
eomsangdonandClaude Opus 5 de78feabde feat(B06): 다단 등간격 배치 버튼 + 유입 0도 접속선 + 유출 매몰 절토선·이동 금지
① 십자 우측 하단 ≡ 버튼 — 벽 사이 사면 구간을 같게 재배치(끝 성토부는 지형
   결정값이라 제외). 다단 연쇄(아랫단 바닥 하강) 때문에 1회 분할이 아니라
   구간 오차를 d로 되먹임하는 수렴 반복(≤8회, 허용 0.05m)으로 푼다.
② 유입 기슭막이 관 시작 접속선: 관 하단점이 원지반보다 위면 0도 성토선
   (지반 교차에서 정지), 아래면 0도 1m 후 표준 절토 경사(1:n)로 지반까지.
③ 유출 마지막 구조물 시작점이 원지반에 묻히면 0도 절토선을 지반 교차까지
   연장, 교차가 없는 자리는 이동 금지(배관 벽·추가 벽 공통 클램프).
- 배관 벽 4축 배치를 placePipeWall(Solve)로 추출 — Geom 700줄 유지

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 15:29:43 +09:00
eomsangdonandClaude Opus 5 63bd922711 fix(B06): 관 끝점 기준 = 실제 바닥+0.5 · 추가 벽 매몰 이동 차단 · 기본 높이 2.0 통일
- 유출 관 하단 끝점·다음 단 성토선 시작점의 기준을 기준선(anchor)이 아니라
  **실제 바닥(전면 근입 심화 반영) +0.5m**로 통일 — 가파른 지반에서 바닥만
  깊어지고 관이 벽 위쪽에 떠 보이던 문제 해소(2026-08-22 사용자 지적)
- 추가 기슭막이 이동 한계 = 원지반 매몰 자리 금지: 이음선 상단이 지반 아래
  (통째 매몰)이거나 자기 성토선 시작점이 지반 아래 0.05m 이상이면 그 앞에서
  멈춤(상하 먼저, 다음 좌우 되돌림) — 자동 자리조차 매몰이면 그 단은 불가
- 배관 기슭막이 기본 높이 = 재질 무관 2.0m(찰·콘크리트 기본 2.5 → 2.0 정정)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 15:06:31 +09:00
eomsangdonandClaude Opus 5 5666ef0dd4 fix(B06): 이동 십자 버튼 그룹을 패널 폭 기준 수평 가운데 배치
버튼 크기(26×22)는 유지 — justify-content만 center로.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:52:41 +09:00
eomsangdonandClaude Opus 5 e6bce1ccb5 fix(B06): 조정창 정보 표시를 항목당 한 행으로 — 관 길이/좌우/상하
- 한 줄 요약(관 길이 · 바깥 · 위) 대신 3행: 관 길이 / 좌우 / 상하(사면)
- 조작 없으면 각 행에 '자동' 표기 — 행 수 고정으로 레이아웃 안정

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:49:04 +09:00
eomsangdonandClaude Opus 5 411d4351c2 fix(B06): 단 수 조작을 높이 행과 같은 형식으로 + 버튼 행열 정렬
- 추가 기슭막이(단): 직접 입력 제거 — 높이와 동일한 [- 값 +] 형식(0단 표기)
- 값 조작 버튼 26×22 고정 폭 — 높이·단 수·십자 이동의 열이 맞는다
- 값 표시 폭 3.5em 고정(높이 2.0m / 0단 동일 열)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:46:50 +09:00
eomsangdonandClaude Opus 5 c4322f620c feat(B06): 조정창 항목 2행 구조 + 이동 버튼 십자(D-pad) 배치
- 항목별 1행 = 이름 라벨, 2행 = 값 조작(구조물 형식·재질·높이·단 수·이동)
- 이동 버튼 십자 배치: ▲ 위 / ◀ ↺ ▶ 가운데 / ▼ 아래 — 중앙이 초기화
- __controls(flex)와의 우선순위 충돌은 복합 선택자로 해결

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:42:06 +09:00
eomsangdonandClaude Opus 5 97bf00a8ef fix(B06): 유출 관 끝점·전면 근입 기준 + 줌 유지·조정창 레이아웃 정리
- 유출 관 하단 끝점 = 벽 바닥 +0.5m 기준선과 전면 경사선(1:0.3)의 교차점
  (성토부선 시작점과 동일 자리) — 정수 맞춤 재배치에도 동일 적용
- 근입 0.5m는 경사선(전면) 측 깊이 기준 — 전면 발끝 지반 아래 0.5까지
  수렴 반복으로 내림(배관 벽·추가 벽 공통, 뜬 벽은 기준선 아래 0.5)
- 카드 내부 조작(조정창 등)으로 다시 그려져도 줌·팬 배율 유지
  (측점별 상태 보관, ZoomPanState)
- 조정창: 재질 행을 높이 행 위 별도 행으로(폭 축소 — 한계는 툴팁),
  추가 기슭막이(단) 행은 유출 벽에서 항상 표시(레이아웃 널뜀 방지)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:32:30 +09:00
eomsangdonandClaude Opus 5 ff3e3b734b feat(B06): 기슭막이 4축 조작 — 좌우(노견 연장)·상하(사면 대각)·높이·재질
- 좌우 ◀▶ = 노견(추가 벽은 윗단 0.5m 기준선) 수평 연장 평행이동 —
  성토선 물매 1:1.2·상단 표고 불변, 지반에 못 닿으면 바닥 뜸 허용
- 상하 ▲▼ = 성토선을 타는 대각 이동(수평 성분 1m), 위 한계 =
  최소 성토고·토피(역경사), 추가 벽은 윗단 하단 관통 금지
- 높이 ±0.1m: 배관 벽 2.0~재질한계(기본 2.5, 메쌓기면 2.0로 절삭),
  일반 벽 0.5~재질한계(기본 1.5). 높이 기준 = 근입 0.5 위 기준선~상단
- 재질 선택(메쌓기 2.0/찰쌓기 3.0/콘크리트 5.0m) — 한계 초과 시
  토스트로 재질 변경 안내, 자동 높이는 기본값 고정(사용자 확정)
- 다단 단 수: 숫자 입력 + +/- 버튼 병행, 입력기 스피너 제거
- 저장 스키마: revetx 값이 {x,d,h,m} 객체로 확장(구 숫자 형식 호환)
- 인터페이스 3종을 Wire로 이전(Cross_View 700줄 제한)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:21:30 +09:00
eomsangdonandClaude Opus 5 8167dd23c3 feat(B06): 다단 기슭막이 규칙 재정립 — 정확한 1:1.2·매몰 종단·단 수 입력
- 벽 사이 성토사면 = 정확히 1:1.2 — 벽 높이를 자리에서 역산(닫힌식),
  0.1m 눈금 올림 제거(물매 정확 유지 우선)
- 아랫단 상단은 윗단 하단(수평 기초) 관통 금지 — 안쪽 이동 한계
- 다음 단 성토선 시작 = 윗단 하단 +0.5m 수평선 × 전면 경사선(1:0.3) 교차점
  (배관 벽의 관 하단 꼭짓점과 같은 자리)
- 시작점이 원지반 아래(벽 0.5m 이상 매몰)면 성토 불필요 — 다단 종료
- 추가 방식 = 유출 벽 조정창의 단 수 숫자 입력(+/- 버튼 대체),
  지형 허용 단 수 초과 시 토스트로 가능한 단 수 안내 후 되는 만큼만 반영

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 13:39:21 +09:00
eomsangdonandClaude Opus 5 9a58e3b1bd feat(B06): 유출부 보호공 삭제·성토부선 전환 + 추가 기슭막이(계단식)
- 보호공(돌붙임) 띠 삭제, 윗면 선만 성토부선(계획선)으로 유지 — 구간별
  사면길이·5m 초과 여부 툴팁 표기
- 성토부 5m 이상이면 조정창 +로 추가 기슭막이(배관 없는 동일 형상 벽)
  계단식 추가 — 자동 자리는 배관용과 같은 규칙(1:1.2 최소 자리)
- 추가 벽도 ◀/▶/↺ 이동(안쪽 한계 = 앞 구조물), 마지막 벽 - 삭제
- 개수·이동량 세션 보관(b06:extrawall / revetx extra{n} 키)
- 700줄 제한: Extra(성토부선·추가 벽)·Wire(카드 배선) 분리 신설

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 13:24:47 +09:00
eomsangdonandClaude Opus 5 97053ab0d2 feat(B06): I형 관 하단 수평 되메움선 — 지반 교점 절단 철회
- 지반 교점 절단(직전 커밋)은 사용자 확인 후 철회 — 관 끝은 벽 안쪽 변
  절단으로 복귀.
- 대신 관 유입 하단 꼭짓점이 원지반 위에 뜨면 그 표고 그대로 계류측으로
  **수평 되메움(성토)선**을 그어 원지반과 연결(applyBasinPipeFill —
  Basin 분리, Geom 700줄 유지).
- 검증: 13+15.7 I형 실화면 — 성토선 수평·관 꼭짓점 부착 0.4px, 스크린샷.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 12:42:12 +09:00
eomsangdonandClaude Opus 5 7ded6be4d1 fix(B06): I형 집수정 관 유입 끝을 원지반 교점에서 절단
- 관 계산 시작점은 지반에 맞췄지만 그림의 끝은 벽 안쪽 변에서 잘려
  꼭짓점이 지반과 어긋나 보였다(2026-08-22 사용자 — 파란 관선이
  녹색 지반선과 만나야 함).
- I형은 마감면 기준점을 관 하단선-원지반 교점으로 이동(기울기는 벽과
  나란히 유지). invert가 토피 상한에 걸려 지반보다 낮아도 그림의 관은
  지반 위에서 시작한다.
- 검증: 13+15.7 I형 실화면 SVG — 관 유입 하단 꼭짓점 vs 지반 보간
  0.1px 차(접점).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 12:33:41 +09:00
eomsangdonandClaude Opus 5 8743ccf810 feat(B06): 상황별 구조물 선택지 숨김 + 집수정 I형 원지반 근입
- 선택지 가용성(inletChoiceAvailability — Basin 분리):
  · 기슭막이+배관: 자동 자리 원지반이 토피 상한보다 높아 배관이 묻힐
    수밖에 없으면 숨김(2026-08-22 사용자 ①)
  · 집수정 ㄴ·ㄷ형: ㄴ형 가정으로 세워 봐서 원지반으로 밀고 들어가지
    않으면(절토선 없음) 숨김(사용자 ②)
  현재 선택된 값은 숨기지 않는다(빈 셀렉트 방지). 자동 자리 스캔은
  가용성 판정과 공용(중복 제거 — Geom 698줄).
- 집수정 I형 벽 하단을 원지반까지 근입(지반 아래 부재두께 0.2m) 후
  배관 배치(2026-08-22 사용자 — ㄴ·ㄷ형은 현행 유지). 벽면 기울기
  그대로 연장, 관 끝 마감면은 벽 폴리곤 실제 변 복사로 일반화.
- 검증: 13+15.7 I형 근입 0.40m·관 유입 불변(539.141), L형 회귀,
  dz 스윕(-2/-1: revet 숨김, +1: ㄴㄷ 숨김), 실화면 4+4.3 L·U 숨김
  / 13+15.7 revet 숨김(절토향 오르막 — 관 묻힘 판정) 드롭다운 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 11:45:09 +09:00
eomsangdonandClaude Opus 5 11429654c1 fix(B06): ㄷ형 막음벽 미러·절/성토선, I형 관 시작 접지, 집수정 강조
2026-08-22 사용자 3건:
- ㄷ형 막음벽 = I형 벽을 바닥부 중심 기준 수직 반전(대칭오차 0.000).
  구조물 계류측 끝이 원지반 안이면 절토선(1:n), 밖이면 성토(되메움)선
  5°(임시값)로 지반 교차점까지(fillLine 추가).
- I형 관 시작 invert = 시작점 x(내공 1.0m)의 원지반(토피 상한 이내).
  종전 노견 x 평가로 13+15.7에서 관이 지반에 1.07m 파묻히던 문제 해소
  (현재 차 -0.016 = 토피 캡). 기슭막이 유입은 접점 0.000 정상 확인.
- 집수정 선택 강조(is-active) — 기슭막이와 같은 규칙, 부재 전체.
- 검증: 13+15.7 실조작 — I형/기슭막이 화면·수치, ㄷ형 미러·성토선,
  강조 토글, 형식 전환 세션 왕복.

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