- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록) - `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록 — 창끼리 공유하되 저장소에는 안 올리는 장부 - 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠) - graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
9.9 KiB
9.9 KiB
PLAN: B05 종단면도 테이블·그래프 정렬 개편 및 비정규 측점 구현 완료
✅ 완료 (2026-07-24 세션) — B05 종단면도 테이블·그래프 정렬 개편
측점 간격을 브라우저 폭과 무관한 고정값으로 바꾸고, 0측점을 이름표 열 밖으로 밀어 그래프·테이블 시작점을 맞췄다. (검증 전 · 검증보고서 작성 대상)
- ① 스크롤 시 좌측 여백 누출 차단:
.b05-route-profile__body의padding-left를 0으로 낮춰(우측 15px만 유지) sticky 이름표 열이 못 덮던 좌측 틈을 없앴다. 이제 가로 스크롤에도 셀 값이 이름표 왼쪽으로 새지 않는다. →B05_wf2_Route/B05_wf2_Route_UI_Style.css - ② 그래프 시작점 우측 이동(0측점 정렬): 데이터 매핑에 좌측 반 칸 오프셋
(
PROFILE_ORIGIN_OFFSET_PX = STATION_SPACING_PX / 2)을 주어, 0측점 셀 전체가 이름표 (labelWidth =LONG_PAD.left) 오른쪽으로 나오게 했다. 그래프도 새originOffsetPx파라미터로 같은 오프셋을 받아 X축을 맞춘다. →B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Longitudinal.ts(파라미터 추가, 기본 0 → B06 무영향),B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts - ③ 측점 간격 기본값(기준×1.5) + 폭맞춤 병행:
computeProfileLayout()로 노선을STATION_SPACING_PX × 1.5(≈85px) 간격의 최소 폭으로 펼치되, 브라우저가 더 넓으면 그만큼 폭맞춤으로 늘린다(좁으면 스크롤). 매핑은x = LONG_PAD.left + halfCell + c·pxPerMeter,pxPerMeter = (width − 프레임여백) / (maxChainage + 측점간격)으로 좌우 반 칸 여백과 셀 폭(interval·pxPerMeter − gap)이 실제 간격에 항상 맞물린다. 셀 폭·오프셋은 폭맞춤 시 함께 늘어난다. →B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts(fixedProfileWidth→computeProfileLayout,PROFILE_SPACING_MULTIPLIER = 1.5;stationCellWidth/tableMinimumWidth제거)- ※ 최초 계획(측점 간격 완전 고정·무스트레치)에서 사용자 요청으로 "1.5배 최소 + 폭맞춤"으로 변경.
- ⑤ 그래프 X축 측점 이름 복원: 축 제목 삭제 시 함께 사라졌던 측점 이름(세로선 항목)을
다시 표시. 축 제목(
b06-chart__axis-label)만 숨기고 측점 라벨(b06-chart__station-label)은transform: translateY(-9px)로 살짝 올려 하단 편집 버튼(is-down) 밴드와 분리했다. →B05_wf2_Route/B05_wf2_Route_UI_Style.css - ⑥ 사이드바 "계획선 설계" 슬림화: 자동 산출이 이미 처리하는 두 필드를 사이드바에서 제거.
- 주 진행방향 제거: 서버
main_direction="auto"가 지반 형상에서 역기울기 방향을 자동 판정하고, 노선 진행은 항상 좌→우이므로 수동 select는 불필요. (백엔드 기본값auto유지) - 균형 구역 길이 제거: 절성토 균형 분할용 solver 파라미터인데, 이제 그래프+버튼 수동 편집으로 제어하므로 노출 가치 낮음. (백엔드 기본값 = criteria 기본/전체 1구역 유지)
- 지형 구분은 법정 기준값 산정에 필요하므로 유지. 요청 payload에서 두 키가 빠져 Pydantic 기본값 적용.
→
B05_wf2_Route/B05_wf2_Route_UI_Panel.ts(폼/refs/getValues/restore·RoutePanelValues필드 제거),B05_wf2_Route/B05_wf2_Route_UI_Page.ts(restore 매핑·요청 payload 제거)
- 주 진행방향 제거: 서버
- ⑦ 테이블 종점 열 우측 이동: 종점(마지막 측점)이 off-grid라 앞 측점과 겹칠 때, 측점 값·곡선
셀만 오른쪽으로 밀어 값이 읽히게 함(캔버스 오른쪽 여백 안에서 클램프). 종점이라 수직선에서
벗어나도 인지에 무리 없음. 구배 블록·그래프 세로선은 그대로 둔다.
→
B05_wf2_Route/B05_wf2_Route_UI_Profile_Table.ts(stationCellCenters, 셀 중심 배열을 값·곡선 행 공용) - ⑧ 하단 패널 스크롤바 전역 통일: 하단 종단면도 패널만 12px 두꺼운 막대로 덮어쓰던 것을 제거,
좌측 사이드바와 같은 전역 pill 스크롤바(테마
*::-webkit-scrollbar, 8px)를 상속. →B05_wf2_Route/B05_wf2_Route_UI_Style.css - ⑨ 비정규 측점 사이드바 컨테이너(초안 UI): 좌측 사이드바에 "비정규 측점 (구조물)" 섹션 추가.
지금은 자유 텍스트 textarea만 받는다(측점 X+XX 위치 + 구조물, 한 줄에 하나). 재탐색 트리거에서
제외해 텍스트 수정이 "재탐색 필요"를 띄우지 않는다. 값은
panel.irregularStationsText()로 노출하되 백엔드로 보내지 않음(형식·옵션 미확정). 추후 구조물 선택+값 입력 및 백엔드 연동으로 발전. →B05_wf2_Route/B05_wf2_Route_UI_Panel.ts,B05_wf2_Route/B05_wf2_Route_UI_Style.css- 미결(다음 단계): 텍스트 파싱 규칙, 지속성(reload 보존/DB 저장), 요청 payload·스키마·엔진 연동, 구조물 형식 select 정의. Backlog "비기준 측점 처리"와 ④ 렌더(주석형)로 이어짐.
- ⑩ 그래프:테이블 세로 비율 4:6 + 테이블 글자 여백 축소:
CHART_HEIGHT_RATIO0.3→0.4(그래프 40 : 테이블 60), 테이블 폰트 비율FONT_PER_ROW_HEIGHT0.52→0.64·CELL_PADDING_PX4→2로 상하좌우 여백 축소. →B05_wf2_Route_UI_Profile_Panel.ts,B05_wf2_Route_UI_Profile_Table.ts - ⑪ 그래프 편집 버튼 상시 표시·밝은 색: 상/하·시프트 상/하 버튼을 hover 노출→상시 표시(opacity 0.9),
글자색을 밝게(측점=
--color-text, 구간=밝은 자수정). 크기(18×15)는 유지. →B05_wf2_Route/B05_wf2_Route_UI_Style.css
🚧 비정규 측점(구조물 측점) — Phase 1~4 구현 완료(백엔드 E2E 테스트 대기)
결정(2026-07-24): 착수 범위 = Phase 1~3 프론트 먼저, 입력 형식 = 측점번호+잔여거리 2칸 분리.
- Phase 1 — 사이드바 구조화 입력: 신규 모듈
B05_wf2_Route_UI_IrregularStations.ts. 측점번호+잔여거리(→chainage = 측점×간격 + 잔여) + 구조물(자유 텍스트) + [추가]. 목록 표시, 항목 선택 시 폼 로드 → [수정]/[삭제]/[리셋]. 클라이언트 store, 백엔드 미전송. 패널이 재탐색 트리거에서 제외. →_UI_IrregularStations.ts(신규),_UI_Panel.ts(textarea→모듈 교체,onIrregularChange/Select콜백,panel.irregularStations노출),_UI_Style.css - Phase 2 — 그래프·3D 프리뷰:
SectionStation.kind에"irregular"추가. Page가 규칙 측점 좌표 사이 chainage 선형보간으로 3D 마커 위치 근사(interpolateIrregularStations) →renderStationLines에 병합. 그래프는longitudinal.stations에 주입해 파선 세로선+라벨(측점 이름은 chainage로 자동 산출). 그래프·3D에서 비정규 측점을 고르면 사이드바 폼에 로드(syncIrregularSelection↔selectByChainage). →B06_..._Api_Fetch.ts(kind union),_UI_Page.ts,_UI_Profile_Panel.ts(setIrregularStations+그래프 병합),B06_..._UI_Longitudinal.ts(기존 렌더 재사용),_UI_Style.css(--irregular파선) - Phase 3 — 테이블 주석형(④ 반영): 규칙 격자·외곽선은 그대로 두고, 비정규 측점을 파선 세로선 +
라벨(측점)+구조물 태그로 주석층으로 얹음. 가까운 라벨은 상·하 2슬롯 스태거로 겹침 회피.
→
_UI_Profile_Table.ts(buildIrregularAnnotations,irregularStations옵션),_UI_Style.css - Phase 4 — 경로 확정 시 횡단 생성(파일 기반, 비치명적): 결정(2026-07-24) = 프리뷰 작성은 그대로,
[경로 확정] 시 비정규 측점의 횡단까지 생성해 다음 페이지(B06)로 잇는다.
- 엔진:
SectionGenerationOptions.extra_stations추가 →generate_sections가 비정규 chainage를 격자 측점 배열에 병합해 동일 방식으로 횡단 샘플링(kind="irregular",structure부착). 신규generate_irregular_sections()는 비정규 측점만 골라cross_*.json을 쓰고 측점 dict를 반환. - 통합점(안전 설계): B06 상세는 종단 파일의 stations를 읽고 그에 맞는
cross_*.json만 glob으로 노출한다 → DB 미기입, 파일 병합만으로 표시된다. 계획선·규칙 측점·표고 샘플·편집은 손대지 않아 확정 시 프로파일 편집이 유실되지 않는다. 파일 기반이라 재확정해도 중복 없음(기존 비정규 교체). - 확정 흐름: 프론트가 확정 시 지표 샘플러 입력(filter/method/smooth/model)+비정규 목록을 전송
(
RouteConfirmRequest). 라우터는_append_irregular_cross_sections를 비치명적으로 호출 — 실패해도 경로 확정(다음 단계 진행)은 그대로. 프로파일 편집 저장(profilePanel.save) 뒤에 실행. - →
_Engine_Sections_Core.py(extra_stations),_Engine_Sections.py(generate_irregular_sections),_Schema.py(RouteConfirmRequest/IrregularStationInput),_Router.py(confirm 본문+비치명 호출+헬퍼),_Api_Fetch.ts(confirm 본문),_UI_Page.ts(confirm 시 전송) - ⚠ 검증 필요(미실행): DB·지표 데이터·파이프라인을 이 환경에서 돌릴 수 없어 정적 검사만 통과 (py_compile·tsc). 실제 프로젝트로 확정→B06에서 비정규 횡단 노출 여부 엔드투엔드 테스트 필요.
- 남은 한계: (a) 재탐색(solve) 시 종횡단이 전량 재생성되어 비정규 측점이 사라짐 — 저장된
extra_stations(옵션 단일 소스)로 자동 재포함하는 연결은 후속. (b) reload 시 사이드바 목록 복원 미구현 (측점은 저장돼도 폼 목록은 클라이언트 상태). (c) B07 CAD·B08 수량용 DBcross_sections행은 미기입 (B06 표시는 파일 기반이라 정상). (d) 구조물은 자유 텍스트(형식 select 미정).
- 엔진: