Commit Graph
18 Commits
Author SHA1 Message Date
eomsangdonandClaude Fable 5 2abca64deb feat(B06): 횡단 카드 확대 대상을 플롯 도형으로 한정 + 표시 반폭 기준값 정정
2026-08-08 사용자 지시 2건.

1) 확대·축소가 축까지 키우던 문제
   attachZoomPan이 SVG viewBox를 조작해 축선·격자·눈금 숫자·축 이름까지 함께
   확대됐다. 확대할수록 도면이 아니라 글자가 커지는 셈이라 도면을 못 읽는다.
   viewBox 조작을 걷어내고 도형 레이어(plotLayer)의 transform
   (translate + scale)만 바꾸도록 교체했다. 배율 1~8배는 그대로 두고, 확대분이
   플롯 영역을 항상 덮도록 이동량을 clamp한다(원배율에서는 이동량 0).
   팬은 도형을 직접 미는 방식이라 부호가 반대가 됐다 — 커서를 따라간다.

   플롯 clip 그룹은 design 유무와 무관하게 항상 만들고 그 안쪽에 plotLayer를
   둔다. clip을 transform 붙은 요소에 직접 걸면 자르는 창까지 같이 확대돼
   도형이 플롯 밖으로 새어 나간다.

   움직이는 것: 지반선·면적 밴드·포장·설계선·암 경계·중심 십자선.
   고정: 축선·격자·눈금 숫자·축 이름.

2) 사이드 패널 "횡단 반폭" 기준값
   진입 시 확정 이력(data.options.cross_half_width_m)이 없으면 보유 샘플의
   최대 offset을 계산해 입력칸을 덮었다. 그래서 옛 기본값(15m)으로 생성된
   노선이 15.0으로 떠 기준값 구실을 못 했다. 계산 폴백을 제거해, 확정 이력이
   있을 때만 그 값을 쓰고 없으면 백엔드 기본값
   (config_system.SECTION_CROSS_HALF_WIDTH_M = 20m)을 그대로 둔다.
   보유 샘플 폭을 넘는 값은 [전체 측점 반영]이 재생성을 태운다(기존 분기 유지).

검증: npm run typecheck 통과, prettier 무변경. docs/raw/PLAN.md에 체크리스트 기록.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 08:26:00 +09:00
eomsangdonandClaude Fable 5 8b359cd49c fix(B06): 계획선 플롯 이탈 clip 처리·전체 반영 시 개별 반폭 초기화
- 횡단 카드 설계선/면적 밴드/포장층/암 경계선을 플롯 영역 clipPath 그룹에
  그려 표시 반폭 밖으로 뚫고 나가지 않게 함
- [전체 측점 반영]이 개별 반폭(세션·저장 display_half_width_m)을 전역값으로
  초기화 — 저장 잔재로 0측점이 전역 반폭을 무시하던 문제 해결
- 오버레이 함수 시그니처 SVGSVGElement→SVGElement

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 20:01:36 +09:00
eomsangdonandClaude Fable 5 d93bd6e28d feat(B06): 횡단 반폭 개편·개별 반폭·재계산 통합 + 측구 방향 확정 동기화
2026-08-06 사용자 지시 일괄 구현:

반폭 체계:
- 초기 샘플 반폭 config 기본 20m(SECTION_CROSS_HALF_WIDTH_M 15→20) —
  표시 반폭이 이 안이면 재계산 없이 표시만 자름(기존 crossPlotMetrics)
- 재계산 버튼 삭제, [전체 측점 반영]이 반폭 적용 담당: 축소=표시만(즉시),
  확대(보유 샘플 폭 초과)=regenerate 후 상세 재로드
- regenerate에 grade_options 재구성 추가 — 계획선(profile_alignment)까지
  함께 재계산·저장. 예전 재계산 버튼이 계획 횡단도선·유토곡선·테이블을
  지우던 근본 원인 해결(B04 파일입력 파이프라인과 같은 엔진 경로 재활용)
- 높이 배율 옵션 폐지(항상 1), 반폭 입력은 표준 횡단면 설정의
  [전체 측점 반영] 위로 이동(Standard_Panel extraControl)

개별 반폭(카드):
- 카드 하단 ◀/▶/↺(±1m·전역 복귀), 암 경계 그룹 우측 정렬. 숫자 표시 없음
- 개별값 > 전역값 우선(StationWidthControl). 세션 보관, 확정·임시저장 시
  cross_patches(design.display_half_width_m)로 영구 저장 → 재접근 복원
- 프리뷰·단건 설계 재계산이 이 필드를 이월해 지우지 않게 보강
- 방위각 표기 삭제

측구 방향 확정 동기화(13측점 보고):
- B05 경로확정 uphill 병합 시 저장 횡단 설계도 새 방향으로 재계산·저장
  (sync_uphill_overrides_into_designs) — 정본만 갱신하면 B06 표시와
  역반영(ditch_side→uphill_side)이 옛 방향으로 순환 덮어쓰던 문제 해결
- 절/성토 역할은 엔진이 지형에서 자동 판정(정상) — 사용자 지정 대상인
  측구 방향(ditch_side)이 정확히 동기화됨을 13측점 실측 확인

실측: 축소/확대/개별 조절/저장 복원/확정 동기화/B05 하단 패널 정상,
tsc·ruff·prettier 통과, 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 19:48:00 +09:00
eomsangdonandClaude Opus 5 dc19d09f0e feat(B06): 유토곡선 직선 확정 + 잔량 표기 통일 + 횡단도 줌 버튼
유토곡선을 측점 사이에서 직선으로 잇는다(C안 확정). PARABOLIC_MASS_CURVE 한 곳으로
그리기(curvePath)와 재기(crossFrom)가 함께 바뀐다 - 둘이 어긋나면 수평선 끝이
곡선에서 뜬다. 대가는 평균운반거리가 포물선 대비 약 40% 짧아지는 것이고, 이는
20m/70m 장비 경계 판정에 직접 영향을 준다.

- 사토·토취를 balloon 계열로 통일: 단차 화살표는 22px 고정으로 잘라 위치만 가리키고
  수량 라벨은 balloon과 같은 자리 찾기·지시선·드래그를 쓴다(음수 키). 도형 없이 언더바만
- 토취 색 초록 -> 주황. 초록은 "정상"으로 읽혀 흙이 모자란 경고와 안 맞았다
- balloon 내용을 도면 양식(항목별 세로 표기)으로. 165px 이상이면 6줄
  (이름·번호 / Q / L / EA / RR / BR), 사토는 L 대신 M.N=측점, 토취는 지반유형 없음
- HaulResidual에 사토 지반유형 안분 추가. 장거리 상쇄로 깎이면 안분도 같은 비율로 감소
- 횡단도 휠 줌 제거, 우측 상단 + / − / ⤢ 버튼. 팬은 가운데 버튼 유지
- 암 경계선 제어를 그래프 안에서 중심고·방위각 행 가운데로 이동
- 700줄 초과 2건 분리: _UI_MassHaul_Balloon.ts, _UI_Style_Cross_Areas.css

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 17:59:30 +09:00
eomsangdonandClaude Opus 5 2dc75f7449 fix(B06): 선택해도 카드를 다시 만들지 않게, RR 밴드 폴백 불일치 해결
- 선택 반영이 아직 카드 재생성이라 그 카드의 viewBox(휠 줌·팬)가 초기화됐다. 카드 요소에
  applySelection() 핸들을 달아 클래스와 강조 상태만 갈아 끼운다. 재생성을 없애기 위해 면적
  밴드는 선택 여부와 무관하게 항상 깔아 둔다(평소 투명이라 화면 변화는 없다).
- RR 절토를 눌러도 단면이 안 켜지던 원인은 구 데이터 폴백 불일치였다. 표는 분리 필드가 없으면
  절토 전량을 측점 지반유형으로 돌려 RR에 값을 넣는데, 밴드 쪽은 cut_rock_kind가 없으면 곧장
  null을 반환해 암반 밴드를 만들지 않았다. rockKindOf()로 표·밴드·강조 매핑의 폴백 규칙을
  하나로 통일한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 15:11:06 +09:00
eomsangdonandClaude Opus 5 cbb40dd7cf fix(B06): 그래프 몫을 실측으로 채우고 가운데 버튼 드래그를 팬으로 분리
- 유토곡선 아래 빈 공간: chartHeights()가 패널높이 − PANEL_CHROME_PX 어림값을 썼는데, 어림값이
  실제 chrome보다 크면 그 차이가 그대로 빈 공간이 됐다. chartWrap.clientHeight를 직접 재서
  몫으로 쓴다. chartWrap 높이는 내용이 아니라 패널에서 정해지므로 되먹임 없이 수렴하며, 화면에
  붙기 전이라 잴 수 없는 첫 렌더만 어림값으로 출발한 뒤 다음 프레임에 한 번 보정한다.
  컨테이너 최소 크기는 건드리지 않았다.
- 팬을 가운데 버튼 전용으로 바꾸고(좌클릭은 선택) 상단 그래프에도 가운데 버튼 팬을 달았다.
  가운데 버튼을 누를 때 브라우저 자동 스크롤이 같이 뜨던 문제는 mousedown/auxclick에서 막는다
  (자동 스크롤은 mousedown 기본동작이라 pointerdown에서는 막히지 않는다).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 14:52:13 +09:00
eomsangdonandClaude Opus 5 df83ac6699 fix(B06): 비선택 카드 값 클릭 즉시 반영, 빈 공간 선택 해제, 접기 손잡이 하단 이동
- 면적표 값·머리글을 가운데 맞춤으로 바꾼다.
- 값 칸을 모든 카드에서 버튼으로 만든다. 선택되지 않은 카드에서 눌리면 부모에 측점과 키를
  함께 올려, 카드 선택과 면적 강조가 한 번에 반영된다. 강조 상태는 부모가 들고 있다가 카드를
  다시 그릴 때 되살리고, 측점이 바뀌면 따라가지 않는다.
- 카드 그리드 빈 자리를 누르면 선택을 해제한다.
- 접어도 빈 배경이 남던 문제: 인라인 min-height가 .is-collapsed { height: auto }를 이겨
  360px 상자가 그대로 남았다. CSS 변수로 넘기고 :not(.is-collapsed)에만 건다.
- 접기 손잡이를 헤더 캐럿에서 패널 하단 가운데 삼각형 손잡이로 옮긴다. 좌측 사이드 패널과
  같은 공용 컴포넌트를 90° 돌린 모양이며, 위로 접히는 패널이라 collapseToward 옵션에
  "up"/"down"을 추가했다(기존 좌우 호출부는 그대로). 리사이저는 손잡이 위로 14px 올렸다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 14:32:23 +09:00
eomsangdonandClaude Opus 5 2bd1c874ca fix(B06): 횡단 면적을 EA/RR/BR 표로 바꾸고 강조 클릭 버블링 차단, 0선 눈금 표기
- 면적 하이라이트가 먹지 않던 원인: 값 칸·밴드 클릭이 카드까지 버블링돼 측점 선택이 다시
  걸리고, draw()가 카드를 새로 만들면서 방금 켠 강조가 즉시 지워졌다. stopPropagation 추가.
- 면적 표기를 칩 나열에서 절토/성토 2행 × EA·RR·BR·계 4열 표로 바꾼다. 이름은 도면 표기를
  그대로 쓰고, 0값이어도 항목을 유지해 카드끼리 비교가 되게 한다. 성토는 완성 단면이라
  지반유형으로 갈리지 않으므로 계 한 칸만 쓴다.
- 암반 밴드는 하나뿐이라 그 측점의 암종에 해당하는 칸만 강조 버튼이 된다.
- 유토곡선 0선에 Y축 눈금값 0을 적어 무슨 선인지 읽히게 한다(선 자체는 원래 상시 표시).
- 오버레이가 1줄에서 3행 표가 되어 상단 여유를 28 → 58px로 키웠다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 13:57:45 +09:00
eomsangdonandClaude Opus 5 bf7d780f9a fix(B06): 구간 물량 말풍선화, 패널 제목·캐럿 정리, 곡선 2종 축소
- 횡단 카드 측점 종류 표기에서 "일반 측점" 제거(BP/EP만 남김).
- 구간 물량을 패널 아래 칩 줄에서 유토곡선 위 둥근 사각 말풍선으로 옮긴다. 말풍선이 놓일
  가로 구간의 곡선 세로 범위를 실측해 위/아래 빈 곳 중 들어가는 쪽에 놓고, 좌우 후보를
  모두 재서 여유가 큰 조합을 고른다. HTML 오버레이 대신 SVG 안에 그려 X축 정렬을 지킨다.
- 패널 제목 문구 삭제. 헤더는 캐럿만 남긴 손잡이 행이며, 캐럿은 좌측 사이드 패널과 같은
  공용 규칙을 쓰되 방향만 상하(펼침 ▴ / 접힘 ▾)로 바꿨다.
- 측점 라벨을 종단 그래프 바닥에 붙이고 유토곡선 상하 여백을 좁혀 두 그래프가 측점 표기를
  공유하는 것처럼 보이게 한다. 좌우 여백(LONG_PAD)은 X축 정렬 때문에 그대로 둔다.
- 패널을 줄이면 그래프 폭까지 줄던 문제: SVG가 flex 기본값으로 세로로 눌리면서
  preserveAspectRatio(meet)가 가로도 같은 비율로 축소한 것. flex: none으로 막고 패널에
  최소 높이를 건다.
- 토사 단일 환산·환산 없음 곡선 삭제. 절토가 암반 경계선으로 갈려 나온 뒤로는 부피비를
  단일값이나 1로 넣은 곡선에 정보가 없다. 곡선 키 형식이 바뀌어 세션 저장 키를 v2로 올렸다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 13:50:38 +09:00
eomsangdonandClaude Opus 5 39d7c2daee feat(B06): 절토면적을 암반 경계선 기준 토사/암반으로 분리하고 유토곡선에 배선
절토부의 토사·암반 구분은 환산계수가 아니라 횡단도 기하로 갈린다. 지표면~암반 경계선이
토사, 그 아래가 암이다. 기존에는 측점당 절토 단면적이 하나뿐이라 리핑암/발파암 측점의
상단 토사층까지 암 환산계수로 곱해졌다(실데이터 기준 다짐환산 +21% 과대).

- Engine_Design: `_split_cut_areas()` 신설. `d=0`, `d=t0` 교차점을 브레이크포인트로 넣어
  정확 적분(무작위 2,000회 검산 `soil+rock==cut` 최대오차 1.4e-14).
  `cut_soil_area_m2` / `cut_rock_area_m2` / `cut_rock_kind` 3필드 추가(기존 키 불변).
- UI_Cross_Areas(신규): 면적 readout을 4칩으로 확장하고 절토(토사)/절토(암반)/성토 밴드를
  그린다. 선택된 카드에서만 붙어 다른 측점을 고르면 자동 해제된다.
- UI_MassHaul: `AreaSample`을 2분할로 교체해 부분별 환산계수를 물리고, 측점별 구간 물량
  내역(토사/암반/다짐환산/성토)을 남긴다. 구 데이터는 전량 측점 지반유형으로 폴백.
- UI_MassHaul_View: 선택 측점의 구간 물량 표기 줄과 곡선 위 강조점 추가. 측점 매칭은
  id가 아니라 누가거리로 한다(종단 기준 곡선의 점 id는 파생값이라 형태가 다름).

암반 경계선 오프셋을 바꾸면 분리 면적과 유토곡선 환산량이 함께 움직인다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 13:10:07 +09:00
eomsangdonandClaude Opus 5 0665c11c49 feat(B06): 횡단도 휠 줌 방향 반전 — 당기면 확대, 밀면 축소
B04 2D 지도·B05 배수유역도와 같은 방향으로 맞췄다. viewBox 축소가 확대이므로
factor 판정만 deltaY > 0 기준으로 바꿨고, 커서 아래 지점 고정은 그대로다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 01:14:20 +09:00
eomsangdon 497a7026c2 B06_B08_연계 수정 시작 2026-07-25 17:58:13 +09:00
eomsangdon add71aa5a3 260725_6 2026-07-25 16:04:42 +09:00
eomsangdon cb6cc3a71a 260725_2 2026-07-25 11:15:41 +09:00
eomsangdon 5d6c6aa1be 260725_1 2026-07-25 10:01:55 +09:00
eomsangdon 7b453d7a46 B06_개선 시작 2026-07-24 20:47:22 +09:00
eomsangdon 505f28a30b 260723_7 2026-07-24 17:52:01 +09:00
eomsangdon a8ac3ea66c 260722_1_B06_리팩토링 2026-07-22 20:28:33 +09:00