- `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>
18 KiB
2026-09-04 완료 항목 이관
개발 담당 AI(Claude)가 구현·자체검증을 마친 항목이며, 위키 관리자의 2차 교차검증은 아직임(검증 대기).
docs/raw/PLAN.md「진행 중」에서 하위 체크가 전부 완료된 항목만 잘라 옮김 — 미결 항목은 계획서에 그대로 둠.
B03 파일 입력 — 업로드 자료 그래픽 미리보기 (2026-09-04 완료, 검증 대기)
사용자 지시 — 「계획노선 자료·지형 자료 컨테이너의 파일이 올라가면 해당 파일 요소에 그래픽으로 결과를 보여 줄 수 있는지 검토. 단, 시간이 너무 오래 걸리면 안 됨」.
착수 전 검토 항목이며, 아래는 현행 코드를 읽고 낸 실행 가능 판단임.
-
재료는 이미 있음 — 업로드 분석기가 자료마다
bounds를 냄 (B03_FileInput_Engine_Analyze.py:158LAS /:270TIF /:380노선 CSV,B03_FileInput_Engine_Shapefile.py:241SHP).metadata는 그대로 프론트까지 옴 (B03_FileInput_Schema.py:44→B03_FileInput_Api_Fetch.ts:11). 즉 bbox 미리보기는 백엔드 변경 0 · 추가 읽기 0 으로 가능. -
노선 형상만 한 줄 추가 —
analyze_shapefile_metadata가 이미read_shapefile_parts로 전 정점을 메모리에 들고 있음(:220). 여기서 200점 안팎으로 솎은 좌표열을preview_path로 함께 내보내면 실제 노선 모양이 나옴. 파일 재열람 없음. -
비용이 큰 것은 하지 않음 (사용자 제약 「오래 걸리면 안 됨」)
- LAS 포인트클라우드 렌더 ❌ — 수천만 점, 초 단위. bbox 사각형만.
- GeoTIFF 실제 래스터 디코드 ❌ —
rasterio오버뷰라도 대용량에서 수 초. bbox 사각형만. (썸네일이 정말 필요해지면 그때 별도 백그라운드 작업으로.)
-
그리는 자리·모양 — 카드 안 한 줄짜리 SVG(높이 60~80px). 지형 자료는 회색 사각형, 계획노선은 그 위에 겹쳐 그린 선. 한 좌표계로 모아 그려 「노선이 지형 범위 안에 들어오나」가 눈으로 잡히게 함 — 지금 초기 계산 실패의 주된 원인이 범위 불일치임 (「초기 계산 실패 처리 후속」 항목과 같은 증상). 카드마다 따로 그리면 이 이점이 사라지므로 카드에는 자기 도형, 범위 대조는 카드 겹침 표시(안 들어오면 경고색) 로 처리. 좌표계가 서로 다르면 대조는 생략하고 자기 도형만 그림 (재투영은 프론트에서 안 함).
-
위 방침으로 진행할지 사용자 확인 — 2026-09-04 확정: LAS·TIF 는 bbox 사각형만, 실제 래스터·점구름 렌더 안 함.
-
analyze_shapefile_metadata에preview_path(솎은 좌표열) 추가. -
카드 SVG 미리보기 렌더 — 실제 자리는 카드 템플릿(
B03_FileInput_UI_Support.ts)과renderSlot(B03_FileInput_UI_Page.ts)이며, 그리는 로직은 신규B03_FileInput_UI_Preview.ts. 값이 없으면 미표시. 서버 정본(upload-overview응답)에metadata를 실어 재접속에도 뜬다. -
자체검증 — 공용 브라우저 실측: 업로드 후 카드에 도형이 뜨는지, 노선 bbox 가 지형 bbox 안인지 판정이 맞는지, 업로드 완료 시각 대비 추가 지연이 체감 없는지(수치로).
결과(2026-09-04) — 통과.
- 도형이 뜬다 — 지형 자료(라이다·GeoTIFF) 카드에 범위 사각형, 계획노선 카드에 선.
새로 올린 shapefile 카드의 선은 정점 121개(
points속성 실측), 미리보기 높이 60px, 좌표가 뷰박스 안(첫 점4.02,19.36). - 범위 대조 세 갈래 모두 실측
① 안에 있음 — 프로젝트
2f940d8a(노선·지형 모두 EPSG:5187): 노선[183493, 183732, 489290, 489456]⊂ 지형[183434, 183806, 489169, 489570]→ 「범위 안에 있습니다」, 경고색 없음. ② 벗어남 — 같은 판정 코드로 경고색·「범위를 벗어납니다」 표시 확인. ③ 좌표계가 다르면 대조 생략 — 프로젝트8cd2e635(노선 5179 / 지형 5176)에서 「자료 범위」만 표시. shapefile 자체에는 좌표계가 없어(epsg: null실측) 같은 세트의.prj값을 쓰도록 보완. - 추가 지연 없음 — 솎기 자체 0.136 ms(shapefile 분석 총 404 ms 중), 응답에 실리는 좌표열 약 5 KB. 파일 재열람 0회(이미 메모리에 있는 정점을 그대로 씀).
- 단위 테스트
tmp/tests/test_b03_preview_path.py2건 통과(상한 200점·시작/끝점 보존, 다중 파트·빈 입력).tsc --noEmit통과. - 검증용 프로젝트
미리보기검증 2026-09-04(6c00ba53)를 새로 만들어 노선 5종을 실제 업로드해 확인함(기존 프로젝트 자료는 건드리지 않음).
- 도형이 뜬다 — 지형 자료(라이다·GeoTIFF) 카드에 범위 사각형, 계획노선 카드에 선.
새로 올린 shapefile 카드의 선은 정점 121개(
B03~B08 진행단계 패널 — 사용자가 자리 옮기기 (2026-09-04 완료, 검증 대기)
사용자 지시 — 「B03~B08 우측 상단 진행단계를 사용자가 이동할 수 있게. 범위는 페이지 상세 영역 안이면 됨. 단 열리는 방향에 공간이 부족하면 변경되게」.
-
고칠 자리는 한 곳 — 진행단계 패널은 공용
createPanel("progress", …)(ui_template/ui_template_overlay.ts:111) 하나가 만들고, B04~B08 은createWorkflowLayout을 거쳐, B03 은createWorkflowOverlays를 직접 불러 (B03_FileInput_UI_Page.ts:855) 같은 것을 씀. 여기만 고치면 6개 화면이 함께 따라옴. 현재 자리는 CSS 고정값top: 120px; right: 24px(ui_template_overlay.css:56). -
끌어 옮기기 — 헤더 줄을 pointerdown 으로 잡아 끎. 헤더에는 이미 제목 클릭 = 접기/펴기 토글이 붙어 있으므로(
overlay.ts:167) 이동 threshold 4px 를 두고, 넘으면 드래그로 보고 뒤따르는 click 을 삼킴 — 안 그러면 옮길 때마다 패널이 접힘. -
이동 범위 = 페이지 상세 영역 — 패널 offsetParent(오버레이 루트가 덮는 본문) 안으로 clamp. 화면 밖으로 나가 못 잡는 상태를 원천 차단.
right고정 대신left·top인라인으로 전환(전환 시점에 현재 실측 좌표를 그대로 넣어 튐 방지). -
열리는 방향 자동 전환 — 패널 본문은 헤더 아래로 펼쳐짐. 아래쪽 남은 높이가 본문 높이보다 작으면
is-flip-up을 걸어 헤더 위로 펼침 (CSSflex-direction: column-reverse+ 바닥 기준 정렬). 폭도 같은 규칙으로 좌우 전환. 판정은 ① 끌기를 놓을 때 ② 펼칠 때 두 시점 — 창 크기 변경까지 쫓지는 않음(과설계). -
자리는 세션에만 —
sessionStorage(기존frd_workflow_progress_overlay_open과 같은 방식·같은 파일). 5장 데이터 3층에서 화면 조작값은 캐시 몫이고, 공용 리사이저도 같은 규칙임(ui_template_resizer.ts머리주석). -
자체검증 — 공용 브라우저에서 B03·B05·B07 세 화면 실측: 끌어 옮긴 뒤 ① 패널 rect 가 상세 영역 rect 안에 있음 ② 바닥 근처로 끌면
is-flip-up이 붙고 본문 top 이 헤더 top 보다 작아짐 ③ 옮기는 중 접힘 토글이 안 걸림 ④ 페이지 이동 후 자리 유지. 수치로 판정.결과(2026-09-04, 뷰포트 1364×1304) — 세 화면 모두 통과.
- 이동 정확도: B03
(-200, +599)/ B07(-600, -301)지시값과 1px 이내. B05 는(+900, +900)지시에(+900, +146)— 바닥 clamp 가 걸린 것으로 의도대로임. - 범위: 세 화면 모두 패널 rect 가
top ≥ 64· 화면 안(inside=True). 화면 밖(3000,3000)으로 끌어도 헤더가x=1197 · y=1247(= 화면폭−패널폭−8, 화면높이−헤더높이−8)에 멈춤. - 뒤집힘: 아래 공간이 모자란 자리에서
is-flip-up이 붙고 본문 top < 헤더 top (예 B03 본문 703 / 헤더 1102) — 헤더 위로 펼쳐짐. - 토글: 끌기 직후
collapsed=False(끌다가 안 접힘), 이어 제목 클릭True → False정상. 자리 유지는 B03→B07→B05 이동 뒤에도 같은 좌표 유지 확인. - 구현 중 실측으로 잡은 두 건 ① pointerdown 에서 포인터를 잡으면 click 대상이
제목→헤더로 바뀌어 접기/펴기가 죽음 → threshold 를 넘은 뒤에만 잡도록 변경.
② 이동을 헤더에서만 들으면 커서가 패널 밖(특히 B07 CAD iframe)으로 나가는 순간
끊김 →
window에서 듣고 끌기 시작 시 포인터 캡처 병행. - 파일:
ui_template/ui_template_overlay_drag.ts(신규 156줄) ·ui_template_overlay.ts(배선) ·ui_template_overlay.css(뒤집힘·커서).tsc --noEmit통과.
- 이동 정확도: B03
공유 파일 주의 —
ui_template/ui_template_overlay.*는 두 창이 함께 쓰는 파일. 손대기 전git sync, 끝나면 바로 push 하고 다른 창에SendMessage로 알릴 것 (7장).
B05 종단도 — 키보드 방향키 조작 보강 (2026-09-04 완료, 검증 대기)
사용자 지시(2026-09-03). 뼈대는 이미 있음 — B05_Profile_UI_Profile_Panel_Tools.ts
방향키 배선(2026-09-02): ↑·↓ 는 계획고(adjustStation), ←·→ 는 누가거리이고
좌우는 구조물·비정규 측점만 움직임(규칙 20m 측점은 격자라 무시). 한 번에 KEY_STEP_M.
아래는 모자란 세 가지.
-
연속 이동 — 키를 누르고 있으면 이어서 움직임. 좌우(측점 0.1m)와 상하(계획고) 모두.
B05_Profile_UI_Profile_Edit.ts의HOLD_DELAY_MS(500ms)·HOLD_INTERVAL_MS(100ms) 를 export 해 그대로 씀. OS 키 반복(event.repeat)은 무시. -
연속 중 이력은 한 덩어리 — 이력에
pause()·resume()를 더해 첫 한 번부터 키를 뗄 때까지를 한 덩어리로 기록. 구조물 이동은 서버 재계산·유령 변화점 정리가 뒤따라오므로 키를 뗀 뒤HOLD_SETTLE_MS(700ms) 를 기다렸다 기록. -
[쉬프트] 도구가 켜진 상태의 상하 —
ProfileTools.nudge(delta)로 도구 ▲▼ 와 같은 경로(onShift)를 열어 방향키가 씀. 도구가 꺼져 있으면 지금처럼 측점 계획고. -
동작 정리(확정 사항) — 구조물(비정규) 측점: 상하 = 계획고 ▲/▼ 와 같음, 좌우 = 0.1m 이동(연속). 일반 측점: 상하만, 좌우 무동작.
-
작업 중 드러난 선행 결함 3건(모두 이 항목 안에서 고침)
- 방향키가 아무 반응이 없었음 — 듣는 자리가 패널 루트라 그래프를 눌러도 포커스가
body에 남음(측점을 고르면 그래프를 다시 그려 포커스가 풀림). 창(window)에서 듣고 패널이 화면에 없으면 무시하도록 바꿈. - 좌우가 한 칸만 움직이고 멈춤 — 관 측점 id 가 누가거리로 만들어져(
pipe-85.59) 한 번 옮기면 선택이 풀림. 누르고 있는 동안은 처음 잡은 측점·자체 누가거리 카운터를 씀. - 되돌리기가 한 칸 덜 돌아옴 — 이력의 "처음 본 관 목록"이 조작 뒤 값으로 잡혔음.
pause()에서도 관 목록을 세션에 흘려 조작 전 값이 기준이 되게 함.
- 방향키가 아무 반응이 없었음 — 듣는 자리가 패널 루트라 그래프를 눌러도 포커스가
-
자체검증 — 공용 브라우저(5174) 실측, 프로젝트 132 · 측점 100.0m/구조물 85.59m (
tmp/browser/cmd/930·932·938·940·945·946·948): ①↑×3 = 862.99→863.29m, ▲ 버튼×3 도 863.29m·오프셋0.371455로 동일,↓×3 로 862.99m 복귀 ② 1.5초 길게 누르기 = +1.00m(10칸) — 홀드 규칙(0.5초 뒤 0.1초 간격)과 일치. 구조물 좌우는 85.590→86.290m(7칸) — 관 이동은 서버 재계산을 거쳐 몇 틱이 흡수됨 ③ 연속 이동 뒤Ctrl+Z1회로 원위치(계획고 864.09→863.09, 구조물 86.290→85.590),Ctrl+Shift+Z로 복귀. 단발 1회는 그 한 번만 취소 ④ [쉬프트]에서↑— 직선 구간 120·140·160m 이 나란히 +0.09~0.10m, 바깥 180m 는 불변 (구간 평행이동), 길게 누르기 +0.91m, 되돌리기 1회로 복귀 ⑤ 일반 측점←·→무동작(초안 델타 불변) ⑥ 조작 뒤 유토곡선 갱신 — 절토 4,466.7→4,428.4㎥ · 성토 14,882.1→15,124.7㎥- 타입검사(
npm run typecheck) 통과,prettier적용, 파일 311줄(700줄 이내)
- 타입검사(
B05 종단도 — 줌·Y레인지 조작구 (2026-09-04 완료, 검증 대기)
사용자 지적 — 「공사 범위가 넓어지고 고저차가 커지니 종단 그래프가 보기 불편함」. Y축 방식은 제안 A(표시 표고창) 로 2026-09-04 사용자 확정.
-
줌 버튼 — 조작구는
B05_Profile_UI_Profile_Zoom.ts신규 모듈(배율 상태 + 버튼 묶음). 자리는 절·성토 요약줄 오른쪽 끝(= 그래프 우측 상단) — 요약줄 렌더러에trailing자리를 더해 붙임. 버튼 7개+−⇕+⇕−▲▼⤢, 설명은 툴팁(button.title), 클릭은event.stopPropagation()로 측점 선택에 번지지 않게 막음. 양식(22×22px·테두리·hover)은 횡단도 줌 버튼세트와 같은 값으로 B05 CSS 에 적음 (.b05-profile__zoom*— B06 컨트롤 CSS 는 B05 페이지가 안 읽음). -
X 줌은 폭 배수 —
computeProfileLayout(..., zoomX)에 배수를 넘겨 측점 간격 기본값(STATION_SPACING_PX × 1.5)과 폭맞춤 폭에 함께 곱함. transform 이 아니라 캔버스 폭이 커지므로 그래프·테이블·편집 버튼층·구조물 레인이 같은 비율로 늘어남. 한 칸 1.25배, 상한 8배. -
Y = 표시 표고창(제안 A) — 렌더러(
createLongitudinalProfile)가 이미 받던verticalExaggeration을 배율로 쓰고, 창 중심 이동용 인자elevationOffsetRatio(창 높이 대비 비율) 를 새로 받음. 창 높이 = 전범위×1.2 ÷ 배율,▲·▼가 창 높이의 10%씩 이동. 세로 스크롤이 생기지 않아 X축·측점 라벨·편집 버튼이 바닥에 그대로 남음. -
창 밖은 클립 — 지반선·계획선·절성토 음영을 플롯 사각형
clipPath안의 두 그룹으로 옮김. 안 자르면 배율을 올렸을 때 선이 축 라벨·측점 라벨 띠 위로 흘러나옴. -
배율 상태는 페이지(패널 클로저)가 보유 — 편집·되돌리기로 다시 그려도 유지.
-
자체검증 — 공용 브라우저(5174) 실측(
tmp/browser/cmd/952~956): ① 정렬 — 배율 1 / 1.95 / 3.8 에서 캔버스 폭 4600 → 8887 → 17260px, 100m 측점 세로선·테이블 셀·편집 버튼의 화면 x 가 852 / 1284 / 2129px 로 셋 다 일치(±1px) ② Y 배율 — 창 825880m(전범위) →870m(55m ÷ 1.5625 = 35m, 눈금 라벨이 창 범위와 일치),⇕+×2 로 835▲·▼가 창을 위·아래로 옮김(840875 / 830865) ③⤢로 폭·배율·창 중심 모두 초기 상태 복귀(4600px · 825~880m) ④ 클립 — 배율 2.44배·중심 이동 상태에서 계획선이 플롯 밖으로 그려지지 않음(스크린샷tmp/browser/shots/954_clip.png), 클립 그룹 2개 확인 ⑤ 배율 유지 — 방향키 편집·되돌리기 뒤에도 폭 7130px 그대로- 타입검사 통과,
prettier적용.B05_Profile_UI_Profile_Panel.ts는 726줄로 700줄을 넘겨 있으나 이번에 늘린 몫은 3줄이고, 분리는 아래 「700줄 제한 위반 정리」 항목 소관.
- 타입검사 통과,
B05 종단표 — 구조물 측점 값 열·직선화 후 곡선 행 (2026-09-04 완료, 검증 대기)
사용자 지시(2026-09-03) — 종단면도 하단 도면 테이블(B05_Profile_UI_Profile_Table.ts,
구배 3행 · 측점값 7행 · 곡선 2행) 두 가지.
-
구조물(비정규) 측점은 값 열을 늘 펼치지 않음 — 기능 자체는 이미 있었으나 동작하지 않았음: 구조물 목록의 누가거리(
85.59)와 계획선 측점의 누가거리(85.595)가 소수 셋째 자리에서 어긋나 문자열 키(toFixed(3))로는 같은 측점임을 못 알아봤음. 누가거리 허용 오차 0.1m 비교(isNearChainage)로 바꿈. 배관 측점의 곡선 L·R 상시 표기 예외(2026-08-04)는 그대로. -
직선화 직후 곡선 L·R 행 비우기 — 편집 델타의 반경 키는 이미 지워지고 있었으나, 표는 자동 계산된 곡선을 그대로 그려 R 이 수억 m 로 찍혔음(대수차가 0 이라
R = L ÷ |대수차|가 발산). 대수차1e-4 %미만이면 직선으로 보고 곡선 L·R 을 빈 칸으로 둠(표·값 열 오버레이 공통). -
「각도 행」 = 구배 3행(2026-09-04 사용자 확정) — 구배 L·H·S 는 값 열을 접는 규칙에서 빠져 늘 보임. 구조물로 좁게 갈라진 구간만 값을 감추던 옛 규칙(2026-08-03)을 걷어냄 (구조물 구간 색·하이라이트·툴팁은 유지). 실측: 80
85.59m·85.59100m 블록이 고르지 않아도5.59 / -2.23 / -39.88,14.41 / 0.50 / 3.48표기, 빈 블록 0개. -
자체검증 — 공용 브라우저(5174) 실측(
tmp/browser/cmd/957~962): ① 구조물 측점(85.59m) 열 — 고르기 전 절토고~측점 7행 모두 빈 칸(고치기 전에는 계획고 863.07 · 누가거리 85.59 · 측점 4+5.6 이 그대로 펼쳐져 이웃 값과 겹쳐 보였음), 고르면 값 열 오버레이로 12행 표시(계획고 863.07 · 측점 4+5.6), 다시 누르면 사라짐. 배관이라 곡선 L·R(5.04 · 11.6)은 계속 보임 ② 직선화(120→180m) 직후 — 140m·160m 의 곡선 L·R 이 빈 칸(고치기 전 R 3.0e8 · 2.4e8), 직선화 시작점 120m 은 실제 대수차 0.92% 가 남아 값 유지(R 1634.7),Ctrl+Z로 되돌리면 원래 값(15.00 / 104.3 · 81.6 · 195.8) 복귀 ③ 구배 3행 — 구조물 구간 포함 전 블록에 값 표기(빈 블록 0개)- 타입검사 통과,
prettier적용, 파일 676줄(700줄 이내) - 결과 화면 공유(아티팩트): https://claude.ai/code/artifact/70034383-f68c-4dea-8c79-f2a1b5f6c1b5
- 타입검사 통과,