- `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>
214 lines
18 KiB
Markdown
214 lines
18 KiB
Markdown
# 2026-09-04 완료 항목 이관
|
||
|
||
> 개발 담당 AI(Claude)가 구현·자체검증을 마친 항목이며, 위키 관리자의 2차 교차검증은 아직임(검증 대기).
|
||
> `docs/raw/PLAN.md` 「진행 중」에서 하위 체크가 전부 완료된 항목만 잘라 옮김 — 미결 항목은 계획서에 그대로 둠.
|
||
|
||
### B03 파일 입력 — 업로드 자료 그래픽 미리보기 (2026-09-04 완료, 검증 대기)
|
||
|
||
사용자 지시 — 「계획노선 자료·지형 자료 컨테이너의 파일이 올라가면 해당 파일 요소에
|
||
**그래픽으로 결과**를 보여 줄 수 있는지 검토. 단, 시간이 너무 오래 걸리면 안 됨」.
|
||
|
||
착수 전 검토 항목이며, 아래는 현행 코드를 읽고 낸 실행 가능 판단임.
|
||
|
||
- **재료는 이미 있음** — 업로드 분석기가 자료마다 `bounds` 를 냄
|
||
(`B03_FileInput_Engine_Analyze.py:158` LAS / `:270` TIF / `:380` 노선 CSV,
|
||
`B03_FileInput_Engine_Shapefile.py:241` SHP). `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). 지형 자료는 회색 사각형,
|
||
계획노선은 그 위에 겹쳐 그린 선. **한 좌표계로 모아 그려** 「노선이 지형 범위 안에
|
||
들어오나」가 눈으로 잡히게 함 — 지금 초기 계산 실패의 주된 원인이 범위 불일치임
|
||
(「초기 계산 실패 처리 후속」 항목과 같은 증상). 카드마다 따로 그리면 이 이점이 사라지므로
|
||
**카드에는 자기 도형, 범위 대조는 카드 겹침 표시(안 들어오면 경고색)** 로 처리.
|
||
좌표계가 서로 다르면 대조는 생략하고 자기 도형만 그림 (재투영은 프론트에서 안 함).
|
||
|
||
- [x] 위 방침으로 진행할지 사용자 확인 — **2026-09-04 확정: LAS·TIF 는 bbox 사각형만**, 실제 래스터·점구름 렌더 안 함.
|
||
- [x] `analyze_shapefile_metadata` 에 `preview_path`(솎은 좌표열) 추가.
|
||
- [x] 카드 SVG 미리보기 렌더 — 실제 자리는 카드 템플릿(`B03_FileInput_UI_Support.ts`)과
|
||
`renderSlot`(`B03_FileInput_UI_Page.ts`)이며, 그리는 로직은 신규 `B03_FileInput_UI_Preview.ts`.
|
||
값이 없으면 미표시. 서버 정본(`upload-overview` 응답)에 `metadata` 를 실어 재접속에도 뜬다.
|
||
- [x] 자체검증 — 공용 브라우저 실측: 업로드 후 카드에 도형이 뜨는지, 노선 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.py` 2건 통과(상한 200점·시작/끝점 보존,
|
||
다중 파트·빈 입력). `tsc --noEmit` 통과.
|
||
- 검증용 프로젝트 `미리보기검증 2026-09-04`(`6c00ba53`)를 새로 만들어 노선 5종을
|
||
실제 업로드해 확인함(기존 프로젝트 자료는 건드리지 않음).
|
||
|
||
### 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`).
|
||
|
||
- [x] **끌어 옮기기** — 헤더 줄을 pointerdown 으로 잡아 끎. 헤더에는 이미 제목 클릭 =
|
||
접기/펴기 토글이 붙어 있으므로(`overlay.ts:167`) **이동 threshold 4px** 를 두고,
|
||
넘으면 드래그로 보고 뒤따르는 click 을 삼킴 — 안 그러면 옮길 때마다 패널이 접힘.
|
||
- [x] **이동 범위 = 페이지 상세 영역** — 패널 offsetParent(오버레이 루트가 덮는 본문)
|
||
안으로 clamp. 화면 밖으로 나가 못 잡는 상태를 원천 차단. `right` 고정 대신
|
||
`left`·`top` 인라인으로 전환(전환 시점에 현재 실측 좌표를 그대로 넣어 튐 방지).
|
||
- [x] **열리는 방향 자동 전환** — 패널 본문은 헤더 아래로 펼쳐짐. 아래쪽 남은 높이가
|
||
본문 높이보다 작으면 `is-flip-up` 을 걸어 **헤더 위로** 펼침
|
||
(CSS `flex-direction: column-reverse` + 바닥 기준 정렬). 폭도 같은 규칙으로 좌우 전환.
|
||
판정은 ① 끌기를 놓을 때 ② 펼칠 때 두 시점 — 창 크기 변경까지 쫓지는 않음(과설계).
|
||
- [x] **자리는 세션에만** — `sessionStorage`(기존 `frd_workflow_progress_overlay_open` 과
|
||
같은 방식·같은 파일). 5장 데이터 3층에서 화면 조작값은 캐시 몫이고, 공용 리사이저도
|
||
같은 규칙임(`ui_template_resizer.ts` 머리주석).
|
||
- [x] 자체검증 — 공용 브라우저에서 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` 통과.
|
||
|
||
> **공유 파일 주의** — `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`.
|
||
아래는 **모자란 세 가지**.
|
||
|
||
- [x] **연속 이동** — 키를 누르고 있으면 이어서 움직임. 좌우(측점 0.1m)와 상하(계획고) 모두.
|
||
`B05_Profile_UI_Profile_Edit.ts` 의 `HOLD_DELAY_MS`(500ms)·`HOLD_INTERVAL_MS`(100ms) 를
|
||
export 해 그대로 씀. OS 키 반복(`event.repeat`)은 무시.
|
||
- [x] **연속 중 이력은 한 덩어리** — 이력에 `pause()`·`resume()` 를 더해 첫 한 번부터
|
||
키를 뗄 때까지를 한 덩어리로 기록. 구조물 이동은 서버 재계산·유령 변화점 정리가
|
||
뒤따라오므로 키를 뗀 뒤 `HOLD_SETTLE_MS`(700ms) 를 기다렸다 기록.
|
||
- [x] **[쉬프트] 도구가 켜진 상태의 상하** — `ProfileTools.nudge(delta)` 로 도구 ▲▼ 와
|
||
같은 경로(`onShift`)를 열어 방향키가 씀. 도구가 꺼져 있으면 지금처럼 측점 계획고.
|
||
- [x] 동작 정리(확정 사항) — 구조물(비정규) 측점: 상하 = 계획고 ▲/▼ 와 같음, 좌우 = 0.1m
|
||
이동(연속). 일반 측점: 상하만, 좌우 무동작.
|
||
- [x] 작업 중 드러난 **선행 결함 3건**(모두 이 항목 안에서 고침)
|
||
- 방향키가 **아무 반응이 없었음** — 듣는 자리가 패널 루트라 그래프를 눌러도 포커스가
|
||
`body` 에 남음(측점을 고르면 그래프를 다시 그려 포커스가 풀림). 창(`window`)에서 듣고
|
||
패널이 화면에 없으면 무시하도록 바꿈.
|
||
- 좌우가 **한 칸만** 움직이고 멈춤 — 관 측점 id 가 누가거리로 만들어져(`pipe-85.59`)
|
||
한 번 옮기면 선택이 풀림. 누르고 있는 동안은 처음 잡은 측점·자체 누가거리 카운터를 씀.
|
||
- 되돌리기가 **한 칸 덜** 돌아옴 — 이력의 "처음 본 관 목록"이 조작 뒤 값으로 잡혔음.
|
||
`pause()` 에서도 관 목록을 세션에 흘려 조작 **전** 값이 기준이 되게 함.
|
||
|
||
- [x] 자체검증 — 공용 브라우저(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+Z` **1회**로 원위치(계획고 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 사용자 확정.
|
||
|
||
- [x] **줌 버튼** — 조작구는 `B05_Profile_UI_Profile_Zoom.ts` 신규 모듈(배율 상태 + 버튼 묶음).
|
||
자리는 절·성토 요약줄 **오른쪽 끝**(= 그래프 우측 상단) — 요약줄 렌더러에 `trailing` 자리를
|
||
더해 붙임. 버튼 7개 `+` `−` `⇕+` `⇕−` `▲` `▼` `⤢`, 설명은 툴팁(`button.title`),
|
||
클릭은 `event.stopPropagation()` 로 측점 선택에 번지지 않게 막음.
|
||
양식(22×22px·테두리·hover)은 횡단도 줌 버튼세트와 같은 값으로 B05 CSS 에 적음
|
||
(`.b05-profile__zoom*` — B06 컨트롤 CSS 는 B05 페이지가 안 읽음).
|
||
- [x] **X 줌은 폭 배수** — `computeProfileLayout(..., zoomX)` 에 배수를 넘겨 측점 간격
|
||
기본값(`STATION_SPACING_PX × 1.5`)과 폭맞춤 폭에 함께 곱함. transform 이 아니라 캔버스
|
||
폭이 커지므로 그래프·테이블·편집 버튼층·구조물 레인이 같은 비율로 늘어남. 한 칸 1.25배,
|
||
상한 8배.
|
||
- [x] **Y = 표시 표고창(제안 A)** — 렌더러(`createLongitudinalProfile`)가 이미 받던
|
||
`verticalExaggeration` 을 배율로 쓰고, 창 중심 이동용 인자 `elevationOffsetRatio`(창 높이
|
||
대비 비율) 를 새로 받음. 창 높이 = 전범위×1.2 ÷ 배율, `▲`·`▼` 가 창 높이의 10%씩 이동.
|
||
세로 스크롤이 생기지 않아 X축·측점 라벨·편집 버튼이 바닥에 그대로 남음.
|
||
- [x] **창 밖은 클립** — 지반선·계획선·절성토 음영을 플롯 사각형 `clipPath` 안의 두 그룹으로
|
||
옮김. 안 자르면 배율을 올렸을 때 선이 축 라벨·측점 라벨 띠 위로 흘러나옴.
|
||
- [x] 배율 상태는 페이지(패널 클로저)가 보유 — 편집·되돌리기로 다시 그려도 유지.
|
||
|
||
- [x] 자체검증 — 공용 브라우저(5174) 실측(`tmp/browser/cmd/952~956`):
|
||
① 정렬 — 배율 1 / 1.95 / 3.8 에서 캔버스 폭 4600 → 8887 → 17260px, 100m 측점
|
||
**세로선·테이블 셀·편집 버튼**의 화면 x 가 852 / 1284 / 2129px 로 **셋 다 일치**(±1px)
|
||
② Y 배율 — 창 825~880m(전범위) → `⇕+`×2 로 835~870m(55m ÷ 1.5625 = 35m, 눈금 라벨이
|
||
창 범위와 일치), `▲`·`▼` 가 창을 위·아래로 옮김(840~875 / 830~865)
|
||
③ `⤢` 로 폭·배율·창 중심 모두 초기 상태 복귀(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행) 두 가지.
|
||
|
||
- [x] **구조물(비정규) 측점은 값 열을 늘 펼치지 않음** — 기능 자체는 이미 있었으나
|
||
**동작하지 않았음**: 구조물 목록의 누가거리(`85.59`)와 계획선 측점의 누가거리(`85.595`)가
|
||
소수 셋째 자리에서 어긋나 문자열 키(`toFixed(3)`)로는 같은 측점임을 못 알아봤음.
|
||
누가거리 **허용 오차 0.1m** 비교(`isNearChainage`)로 바꿈. 배관 측점의 곡선 L·R 상시 표기
|
||
예외(2026-08-04)는 그대로.
|
||
- [x] **직선화 직후 곡선 L·R 행 비우기** — 편집 델타의 반경 키는 이미 지워지고 있었으나,
|
||
표는 자동 계산된 곡선을 그대로 그려 **R 이 수억 m** 로 찍혔음(대수차가 0 이라 `R = L ÷ |대수차|`
|
||
가 발산). 대수차 `1e-4 %` 미만이면 직선으로 보고 곡선 L·R 을 빈 칸으로 둠(표·값 열 오버레이 공통).
|
||
- [x] **「각도 행」 = 구배 3행**(2026-09-04 사용자 확정) — 구배 L·H·S 는 값 열을 접는 규칙에서
|
||
빠져 **늘 보임**. 구조물로 좁게 갈라진 구간만 값을 감추던 옛 규칙(2026-08-03)을 걷어냄
|
||
(구조물 구간 색·하이라이트·툴팁은 유지). 실측: 80~85.59m·85.59~100m 블록이 고르지 않아도
|
||
`5.59 / -2.23 / -39.88`, `14.41 / 0.50 / 3.48` 표기, 빈 블록 0개.
|
||
|
||
- [x] 자체검증 — 공용 브라우저(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
|