Commit Graph
500 Commits
Author SHA1 Message Date
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
eomsangdonandClaude Opus 5 1774d61101 feat(B06): 집수정 관 끝선·두께 0.2·구조물 형식 드롭다운
2026-08-22 사용자 요청 3건:
- 관 끝선 = I형 벽의 안쪽(물받는 쪽) 변 복사(기슭막이와 동일 방식).
  관 시작점(하단): ㄴ·ㄷ형은 측벽 안쪽 변×바닥 윗면 교차점, I형은
  내공 1.0m 유지.
- 집수정 부재(벽·바닥판) 두께 0.2m(BASIN_MEMBER_THICKNESS_M).
- 유입 구조물 형식 드롭다운: 자동(규칙)/기슭막이+배관/집수정 I·ㄴ·ㄷ형.
  집수정 클릭 선택 가능, 선택 시 조정창에 드롭다운(집수정은 ◀▶ 숨김).
  세션 보관(inletstruct)·revet 선택 시 양측성토 로직 복귀·manual 사유.
- 집수정 구성을 _Cross_Culvert_Basin.ts로 분리(700줄 제한 — Geom 690줄).
  I형 바닥판 제거(벽뿐 — 정의 정합).
- 검증: 13+15.7 모듈(auto/revet/I/L/U 전부 기대 형상·관유입 자리 일치)
  + UI 실조작(집수정 클릭→드롭다운 revet/U/auto 전환, 부재 수 2→0→3→2,
  세션 왕복) + 스크린샷 대조.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 11:04:40 +09:00
eomsangdonandClaude Opus 5 934419bbaa feat(B06): 집수정 조건 재정의 — 성토사면 3m 기준·통째 노견 일치
2026-08-22 사용자 재정의 5개 조건 반영:
- 판정: 유입측 성토사면 길이 ≤ 3m(BASIN_MAX_FILL_SLOPE_M)면 집수정
  기본(절토측은 사면 없음으로 자동 포함). 종전 절토/30% 막힘 판정 대체.
  기슭막이 유지 선택은 향후 추가(reason: cut | short).
- ㄴ(L)형: 내부 높이 1.2 등 사이즈 유지한 채 **통째로 노견 끝점에
  일치** — 바닥(=관 유입 invert)이 따라 올라 관 물매 재계산. 유출단은
  원지반 위 원칙 유지. ㄷ형 동일(L+측벽), 기본값 L형.
- I형: 원지반 배관 유지, 벽 상단만 노견 연결(기존 분기 유지).
- 검증: 13+15.7 reason=short, 벽상단=노견 (dx=0, dz=0), 내부높이
  1.200, 관 유입 (-3.000, 539.241=노견-1.2)·유출 원지반, 물매 재계산.
  4+4.3 유입 사면>3m — 집수정 없음·벽 2개 유지.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 10:46:58 +09:00
eomsangdonandClaude Opus 5 0ebfa6c2aa fix(B06): 집수정 노견 확장은 I형만 — ㄴ·ㄷ형은 내부 높이 1.2m 고정
- 벽 높이 형태 분기(2026-08-22 사용자 정정):
  · I형(공유벽뿐): 노견 끝 접점까지 성장(직전 커밋 규칙 유지)
  · ㄴ(L)·ㄷ형(바닥판이 원지반 대체): 성장 없음, 내부 높이(바닥 윗면~
    벽 상단) = BASIN_INNER_HEIGHT_M 1.2m (⚠ 임시값, 근거 확정 시 교체)
- 검증: 13+15.7(ㄴ형) 내부높이 1.200, 벽 상단 도로측 x=노견 x(dx=0),
  관 유입단 원지반 유지, 화면 대조 완료.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 10:33:32 +09:00
eomsangdonandClaude Opus 5 3b272307ed feat(B06): 집수정 I형 벽 높이를 노견 접점까지 성장 — 배관은 원지반 유지
- 집수정은 물을 모으는 구조물(2026-08-22 사용자 확정): ㄴ·ㄷ형 바닥판은
  원지반을 대체하며 형태별 별도 구성. 배관(invert)은 원지반 자리 유지.
- I형(공유벽) 높이 = max(관 아래 여유+관경+위 여유, 노견 표고 − invert)
  — 원지반이 낮아 기본 높이로 노견 끝 접점이 안 되면 배관은 그대로 두고
  벽을 노견 표고까지 키운다. 상단 도로측 꼭짓점 = 노견 끝 지점(완전 접점).
- 검증: 13+15.7 — 노견 끝(-2.000, 540.441) = 벽 상단 도로측 꼭짓점,
  오차 dx=0.000 dz=0.000. 관 유입단 (-3.000, 538.091) 원지반 유지.
  화면 스크린샷 대조 완료.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 10:29:54 +09:00
eomsangdonandClaude Opus 5 9edf11745c feat(B06): 집수정 I형 벽을 노견 끝 접점으로 이동
- I형 벽 자리 = 상단 도로측 꼭짓점이 노견 끝 지점에 닿는 자리
  (2026-08-22 사용자 확정 — 우측 집수정이면 상단 좌측점이 접점).
  벽이 도로측으로 1:0.3 기울므로 하단은 그만큼 계류측 바깥.
  종전 '관 유입단에서 내공 1.0m' 자리 폐지.
- 유입 배관 위치는 유지(노견 끝 + 1.0m) — 벽이 안으로 오면서 관 끝이
  벽을 지나 집수정 안으로 들어간다. 마감면은 벽 변 복사 대신 관 끝
  자리에서 벽과 나란한 기울기로 절단.
- L형 바닥판·ㄷ형 반전벽 구조는 유지(명칭 재조정은 추후).
- 검증: 13+15.7 SVG 실좌표 — 벽 상단이 설계선 노견 꺾임점 접점,
  관 끝이 벽 바깥면 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 10:19:18 +09:00
eomsangdonandClaude Opus 5 f78096ad17 feat(B06): 안쪽 당김 한계를 노견까지 확장 — 높이 증가·바닥 띄움 사다리 상시화
- 안쪽 당김 클램프를 1:1.2 성립 자리에서 노견(도로 밑 침범 금지)으로
  완화(2026-08-22 사용자 재확정 — 13+15.7 확인 요청). 1:1.2 자리
  안쪽은 ① 벽 높이 증가 ② 형태별 한계(찰3.0/메2.0) 도달 시 바닥
  띄움(원지반 이격, 하부 지지 구조물 별도)으로 물매·노견을 지킨다.
- 안쪽 한계 토스트 문구를 노견 기준으로 교체.
- 검증: 13+15.7 실조작 — 안쪽 4→8m 연속 이동, 관 14→9m, H=2.0
  한계 유지, 바닥 이격 0.18→0.61m 툴팁 표시.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 10:05:19 +09:00
eomsangdonandClaude Opus 5 0117048c22 fix(B06): 기슭막이 높이 표기·한계를 계산용 높이로 통일
- H 표기 = 관 invert~상단(근입 제외)로 복귀 — 기초는 시공 시 묻히는
  부분이라 높이·한계 검사(찰 3.0/메 2.0) 모두 이 기준(2026-08-22
  사용자 확정). 수평 기초 하단선은 유지.
- 검증: 4+4.3 H=1.5(메 한계 2.0)·13+15.7 H=1.3 툴팁 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 09:55:10 +09:00
eomsangdonandClaude Opus 5 93d2838f4c feat(B06): 기슭막이 하단을 수평 기초로 — 높이는 상~하단 전체로 표기
- 하단선 = 수평(기초공사 기준 — 2026-08-22 사용자 확정). 깊이는 벽
  발자국 안 원지반(또는 관 invert) 최저점 − 0.5m. 종전 지반 추종
  경사 하단 폐지.
- 전면 1:0.3 경사선을 하단까지 연장 — 바닥이 깊어진 만큼 발끝이
  바깥으로. 발끝 지반이 더 낮으면 한 번 더 내림(2-pass).
- WallLayout.height = 상단~하단 전체 높이(근입 포함)로 변경 — 툴팁
  H 표기 기준. 설계 파라미터(폭·기움)는 invert 기준 높이 유지.
- 검증: 4+4.3(H 2.0/2.1)·13+15.7(H 1.9) 하단 수평·관 감싸기 SVG
  실좌표 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 09:46:20 +09:00
eomsangdonandClaude Opus 5 a24cfe1378 feat(B06): 기슭막이 이동 한계 도달 시 토스트 안내
- 조정창 ◀/▶ 요청이 한계에 잘려 벽이 안 움직일 때 이유를 토스트로
  알린다(2026-08-22 사용자 요청, 13+15.7 참조).
  · 안쪽 한계: 성토 물매 1:1.2가 깨지는 자리(배관 최소 길이)
  · 바깥 한계: 조정 범위 초과
- 그 벽이 선택된 조작 중에만 띄운다 — 리로드로 복원된 세션 값에는 침묵.
- 검증: 공용 브라우저 실조작 — 13+15.7 안쪽 시도 토스트 표시,
  바깥 정상 이동 시 무음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 09:35:52 +09:00
eomsangdonandClaude Opus 5 d51a07258e fix(B06): 관 축을 최종 벽 자리로 재유도 — 벽 바닥 아래 삐짐 해소
- 관 하단선은 관 시작점과 유출 벽 하단선 중점(invert)을 잇는 직선으로
  고정 — 정수 맞춤이 벽을 옮길 때마다 축·법선 재유도(deriveAxis).
  종전엔 옛 축을 그대로 늘려 가파른 지반(13+15.7)에서 관이 벽 바닥
  아래로 삐져나갔다.
- 관 시작 기준도 유입 노견점이 아니라 실제 관 시작점(집수정 내공 벽)
  으로 통일.
- 끝단면 교점을 마감면 선분 안으로 클램프(clampToFace) — 연장선
  교차로 벽 밖에 꼭짓점이 생기는 것 차단.
- 검증: 13+15.7 SVG 실좌표(관 꼭짓점 385→371, 벽 하단 379 위),
  4+4.3 회귀, dz 스윕 24건 이탈 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 09:14:22 +09:00
eomsangdonandClaude Opus 5 030b81b744 feat(B06): 기슭막이 자동 자리 노견 최소화·수동 이동 독립화
- 자동 자리 = 물매 1:1.2가 딱 성립하는 가장 안쪽(노견 최소) 지점.
  관 m단위 올림 잔여만 유출 벽 바깥 이동으로 흡수(minShoulderWallOffset).
  사면 끝 밖 자리는 급물매 교정일 때만 인정 — 얕은 성토 폭주 방지.
- 손으로 민 벽은 관 정수 맞춤이 절대 옮기지 않음 — 한쪽 이동 시
  반대쪽 벽 동시 이동(관 +2m) 소멸. 표기 길이만 올림(m).
- 안쪽 당김 한계 = 1:1.2 성립 자리(우선순위: 배관 연장 > 높이 증가 >
  바닥 띄움). 1:1.2 자리가 없는 지형 폴백에서만 높이 증가·바닥 띄움
  (solveWallVertical, 한계 찰3.0/메2.0).
- 기슭막이는 관을 감싼다: 하단은 항상 관 invert 아래 0.5m 확보,
  뜬 바닥도 동일(뜬 공간은 별도 지지 구조물 — 추가 예정).
- 검증: 4+4.3 관 13m→9m·노폭연장 1.52→0.08, 13+15.7 UI 조작
  (◀▶↺·클램프·단독이동) 및 dz 스윕 24건 물매 이탈 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 09:07:35 +09:00
eomsangdon a5800e5a34 auto: 2026-08-21 19:34 (EOMSANGDON-HOME) 2026-08-21 19:34:27 +09:00
eomsangdonandClaude Opus 5 67ec86b05f feat(B06): 성토 물매 1:1.2 고정 — 벽이 나간 만큼 노폭 연장
물매를 1:1.2~2.0 범위에서 역산하던 방식을 걷어내고 **수평 1.2 : 수직 1 고정**으로
바꿨다(2026-08-21 사용자 확정). 벽이 1:1.2 사면이 닿는 자리보다 밖에 있으면 물매를
완만하게 바꾸는 대신 **노폭을 그만큼 늘린다** — 기슭막이를 바깥으로 1m 밀면 노폭이
약 1m 늘어난다.

- fillSlopeOf가 [원 노견 → 연장된 노견 → 벽 이음선 상단점] 폴리라인을 돌려주고,
  설계선 오버레이가 그 폴리라인을 그린다(노면 연장 구간이 수평으로 붙는다).
- 반대로 벽이 안쪽이라 물매가 1:1.2보다 급해지는 자리는 노폭으로 못 맞춘다(도로를
  좁힐 수는 없다) — 자동 자리를 1:1.2가 될 때까지 바깥으로 미는 처리를 유지한다.
- fillSlope.roadWideningM 신설, 툴팁에 "노폭 연장 x.xxm" 표시.

검증(계획고 스윕 24케이스): 물매 23건이 정확히 1:1.200(나머지 1건은 성토고 0.2m로
사면이랄 게 없는 측점). 벽 이동 시험 — 밖으로 1m씩 밀 때 노폭 연장 1.52→3.27→
4.22→5.21m, 물매는 계속 1:1.200. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 18:35:53 +09:00
eomsangdonandClaude Opus 5 6391bb4c7e fix(B06): 성토 물매 1:1.2 하한을 자동 자리에도 강제
기슭막이 기본 자리를 사면 끝으로 바꾼 뒤 물매가 규정보다 급해지는 측점이 생겼다
(13+15.7 실측 1:0.865 — 성토_비탈면.md §1의 1:1.2~2.0 위반). 1:1.2는 지켜야 하는
하한이므로, 사면 끝 자리의 물매가 그보다 급하면 **1:1.2에 닿을 때까지 바깥으로**
민다. 지반이 1:1.2보다 급해 끝내 못 맞추면 사면 끝을 그대로 쓰고 경고로 알린다.

물매 계산의 이음선 위치도 바로잡았다 — 자리 기준이 하단선 중점으로 바뀐 뒤에도
`REVET_TRAP_TOP_M`을 그대로 더해 실제보다 0.3m 바깥으로 보고 있었다.
`fillWallBaseWidth()`로 중점↔이음선 환산을 한곳에 모았다.

검증(계획고 스윕 24케이스, 새 계획노선): 물매 최소 1:1.202 — **1:1.2 미만 0건**
(종전 0.4~0.9까지 나왔다). 페이지 실데이터로도 13+15.7 1:1.206 확인.
tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 18:24:58 +09:00
eomsangdonandClaude Opus 5 6a5cd725c2 feat(B06): 집수정 깊이를 관 여유로 결정
집수정 벽 높이를 성토 경사선과의 교점으로 잡던 방식을 걷어내고, **관 아래 여유
0.5m + 관경 + 관 위 여유 0.5m**로 정한다(2026-08-21 사용자 확정). 위 여유는
기슭막이와 같은 REVET_FREEBOARD_M을 써서 좌·우 표현이 어긋나지 않는다.

BASIN_BOTTOM_CLEARANCE_M(0.5) 신설. 종전 바닥판 두께 0.45가 아래 여유 자리를
겸하고 있었다.

검증(13+15.7, D800): 집수정 깊이 1.8m = 0.5 + 0.8 + 0.5, 바닥 여유 0.5 확인.
계획고 스윕 24케이스 문제 0. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 18:14:10 +09:00
eomsangdonandClaude Opus 5 38acdd02ed feat(B06): 기슭막이 자리·하단선 규칙 재정립
2026-08-21 사용자 확정:
- 기본 자리 = **성토 사면이 원지반과 만나는 지점**(사면 끝). 사면이 5m를 넘으면
  기슭막이가 사면을 5m에서 끊는다 — 5m는 자리 한계가 아니라 "5m 이상이면 기슭막이
  의무"라는 규정(성토_비탈면.md §2)의 표현이다. 물매 1:1.2~2.0으로 자리를 풀던
  방식은 걷어냈다(자유도 축소였다).
- 벽 하단선 = **원지반을 수직 0.5m 내린 선**. 수평 바닥이라 사면에서 앞 모서리가
  뜨던 문제가 사라진다(배면·전면 모두 근입 0.500 확인).
- 자리 기준(이동 중심) = **하단선 중점**. 배면 기준이면 벽이 기울 때 체감 위치가
  어긋난다.
- 관 유출단 invert = 그 자리 원지반 → 관 하단 경사가 지반과 만난다.
- structureRequired = 사면길이 5m 이상(의무 발생), 종전의 "받을 수 없는 자리" 판정 대체.

그리기도 기운 하단선에 맞췄다 — 이음선 바닥·돌 해칭이 하단선 위에서 잡힌다.

검증: 두 측점 이동 10케이스 근입 배면·전면 모두 0.500, 하단선 중점이 원지반과 일치
(관 수평 클램프 2건 제외), 계획고 스윕 24케이스 문제 0. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 17:56:35 +09:00
eomsangdonandClaude Opus 5 564b289ee6 fix(B06): 이동량이 한계에 걸려도 숫자만 커지던 문제·안쪽 이동 최소 물매
- 조정창 숫자가 실제와 갈렸다. 안쪽으로 계속 누르니 "안쪽 10.0m"까지 올라가는데
  벽은 노견 한계에서 멈춰 있었다. 기하가 **실제 적용한 이동량**(revetShift)을 돌려
  주고, 카드가 그 값을 제어기에 되담는다 — 이제 한계에 닿으면 숫자도 멈춘다.
- 안쪽으로 당기면 사면이 짧아져 물매가 급해진다. **1:1.2(가장 급한 한계)**를 넘지
  않는 자리까지만 들어가게 막았다(2026-08-21 사용자 지시). 바깥으로 밀 때는 완만해
  지므로 막지 않고 범위 밖이면 경고로만 알린다.

검증: 4+4.3은 자동 자리가 이미 1:1.21이라 안쪽 이동 0(차단), 13+15.7은 −1m까지
허용(1:1.61)하고 그 이상 차단. 조정창 숫자도 같은 자리에서 멈춘다. 두께 16케이스
0.450 고정, 계획고 스윕 24케이스 문제 0. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 17:24:35 +09:00
eomsangdonandClaude Opus 5 ce03edc180 fix(B06): 벽 폭 흡수 폴백 제거 — 좌우 단면이 서로 달라지던 문제
유입 벽을 조정창으로 밀면 유출 벽이 자동으로 관 길이를 맞추다가 **폭 흡수 폴백**에
걸려 0.45→0.85m로 부풀었다(4+4.3 화면 확인: 좌 0.45 / 우 0.85). 조정한 벽만 폭을
지키게 했던 앞 조치로는 반대편 벽이 보호되지 않았다.

폭 흡수를 아예 없앤다 — 벽 두께는 항상 0.45 고정이고, 자리를 더 못 옮기면 거기서
멈춘다. 남는 몫은 관이 벽을 조금 벗어나는 것으로 두는 게 기존 확정 규칙이다.

검증: 두 측점 이동 16케이스 전부 두께 0.450 고정(두께 이상 0건), 계획고 스윕
24케이스 문제 0. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 17:15:26 +09:00
eomsangdonandClaude Opus 5 bcdfde2a05 fix(B06): 유출 기슭막이가 지반에서 뜨던 문제
벽 밑을 관 축(유입 → 자연 사면 끝 직선) 위에 얹고 있었다. 성토측 지반이 관 물매보다
가파른 구간에서는 축이 지반 위로 떠올라 벽이 공중에 떴다 — 13+15.7 유출 벽은 자동
자리에서도 전면 0.14m, 바깥으로 2m 밀면 배면까지 0.16m 떴다.

관 끝은 원지반 위에 놓는다는 원칙대로 벽 밑을 **그 자리 원지반**(역경사는 유입 invert로
클램프)으로 바꿨다. 관 물매는 그 자리에 맞춰 다시 잡힌다. 유입 벽은 원래 지반을 따르고
있어 멀쩡했다 — 좌우가 달라 보인 이유가 이것이다.

표기 길이도 목표값이 아니라 **실제 그려진 관**의 올림값으로 바꿨다(자리 제약에 걸려
못 늘린 경우 도면보다 길게 적혔다).

검증: 이동 ±3m 전 구간 배면 근입 +0.500 고정(종전 −0.16~+0.59), 계획고 스윕
24케이스 문제 0. tsc 통과, pytest 148 pass.

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