Files
Aislo/docs/raw/plans/2026-09-04_plan_completed_items.md
T
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `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>
2026-09-09 18:19:07 +09:00

214 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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