diff --git a/docs/raw/plans/2026-10-17_plan_351-364.md b/docs/raw/plans/2026-10-17_plan_351-364.md new file mode 100644 index 000000000..5f8df4038 --- /dev/null +++ b/docs/raw/plans/2026-10-17_plan_351-364.md @@ -0,0 +1,149 @@ +# PLAN 351~364 이관 (요구 235~239 · 10-16 ~ 10-17) + +근거 분석 = `docs/raw/조사/2026-10-16_351_요구235_분석.md` · 브레인 검증 아티팩트 https://claude.ai/artifact/Dg1dzJPsQfVomCGMduxQPN + +## 351. 노선 추천 — 저장 빈틈 · 곡선 MC 를 일반측점에 (요구 235-1 · 235-3 · sub1 · Opus high) + +- 사용자 확정: 다섯 갈래는 시점 · 종점 · 제한값이 같으면 다시 안 셈 · 모달은 저장본만 읽음 · 곡선 MC(곡선 가운데 법선)가 일반측점(No.N+0) 위 · 곡선 수 ≤ 일반측점 수. +- 정함(브레인): 327 저장은 있음 → 빈틈만 · 「측점 스냅 풀고 점 옮기면 뒤 측점 미세 이동」 = 지금처럼 측점이 누가거리로 따라감(번호 다시 매김 아님) · MC 맞춤 = 추천 다섯 갈래 결과(전처리 초기 노선 · 손 편집 규칙은 그대로) · 근거 = docs/raw/조사/2026-10-16_351_요구235_분석.md 1장 · 3장. +- [x] 351-1 B04 재확정 체인 끝 미리 셈 예약 · 기본값 결과는 「최근 2벌」 정리에서 뺌 · 저장된 제약(initial_choice)으로도 미리 셈 · B01 노선 사용 범위를 바꾸면 expected_route 다시 쓰고 미리 셈 — 확인: 체인 뒤 첫 누름 = 저장본 시험. +- [x] 351-2 추천 결과 곡선 MC → 일반측점(시점부터 차례 · IP 를 4 m 안에서 밀고 R 맞춤 · 남는 측점 없으면 합침/끔 · 실패면 원래 선) · ALGO_VERSION 3 · 모달 미리 보기에 원호 — 확인: 모든 곡선 MC % 20 ≈ 0 · 곡선 수 ≤ 일반측점 수 시험. + — 브레인 확정: 이탈 한도 6 m(따로) · 못 놓는 곡선만 그 자리 · 맞춘 선 · 맞추기 전 선 두 벌 저장 · 모달 「측점 맞춤」 켬끔(기본 켬). + — 검증완료 — 시험 351-1·351-2·route_initial 등 통과 · typecheck 0 · 검증_sub1 예상노선 8벌 중 7벌 전부 · 곡선 99% 측점 위 · 실지형 갈래 95% · 화면 MC 오차 ≤ 9 mm · 저장본 첫 누름 0.2 s · B01 범위 900 m 바꿈 → 예상노선 다시 씀 + 미리 셈 44.9 s → 되돌림(파일 같음) · 검증 대기. + +## 352. B05 배치 — 평면 전체 · 위 메뉴 덮개 · 횡단 우측 판 · ☰ · 분석 지형 · 되돌리기 (요구 235-2 · 10 · 13 · 14 · sub5 · Sonnet high) + +- 정함(브레인): 「띠」 = 계획노선 머리 줄(.b05-routeedit__head) · 「컨테이너」 = .b05-routeedit__box → 둘 다 걷고 도구는 3D 와 같은 떠 있는 단추(☰ 비킴 그대로) · 횡단 = 지금 「지금 · 이전 횡단」 판을 우측 덮는 판(아래 종단 판이 그 위) · ☰ = 좌측 패널 제목 앞 칸(접히면 떠 있는 ☰) · 서랍 AISLO 로고 · 이름 우측 · 분석 지형 = 고른 적 없으면 데이터대로(라이다 있으면 라이다) · 사용자가 고른 값만 기억 · [저장 전으로] 지움 · 근거 2장. +- [x] 352-1 머리 줄 · 테두리 걷고 도구를 떠 있는 단추로 · [?] 도구줄 아래 · 횡단 판 우측 덮개 · 회전 단추 · 잰 값 · R 이름표 겹침 손봄 — 확인: 평면이 가운데 전체 · 종단 판이 횡단 판 위 시험 + ORCA. 검증완료: 글 시험 통과(chrome_modal · initial · 345_5 · 345_5b · 345_5c · 133_1 · 349_0h) · typecheck 통과 · ORCA 화면 검증완료(5180 · 검증_sub5 · 밝음/어두움 · 횡단 판 펼침 · 접힘 · ☰ 접힘/서랍/Esc · 곡선 삭제 라벨 · 분석 지형 고르기). +- [x] 352-2 ↶ ↷ 글 없이 기호(aria-label) · [저장 전으로] · reset 지움 — 확인: test_b05_routeedit_chrome_modal · test_346_4 고쳐 씀. 검증완료: 시험 4 파일 통과 · typecheck 통과 · 화면 확인 대기. +- [x] 352-3 분석 지형 기본값 = 데이터(sources las) · 열 때 안 씀 · 사용자가 바꿀 때만 기억 · 바꾸면 묶음에 알림 — 확인: 처음 연 프로젝트 고르기 = 실제 지형 시험. 검증완료: test_352_3 · 133_1 · 133_2 통과 · typecheck 통과 · 화면 확인 대기. +- [x] 352-4 ☰ 를 좌측 패널 제목 앞 칸으로(제목 자리 그대로 · 접힘 · 서랍 열림 때도 닫힘) · 서랍 로고 · 이름 우측 — 확인: test_device_drawer 고쳐 씀 + ORCA. 검증완료: 글 시험 통과(☰ 자리 8,8 그대로 · 패널 펼침 때만 테두리 · 바탕 없음) · 브라우저 시험(5174 서버)은 로그인 502 로 못 돎 · 화면 확인 대기. +- [x] 352-5 B05 버튼 명사형 — 곡선 삭제 · 곡선 추가(Label.ts). 검증완료: chrome_modal 통과. 남음: 추천 모달 「다시 셈」(Recommend.ts:194 · 351 몫) · 로케일 「유역 다시 나누기」 「선택한 관 삭제」(locale_b2:35·40 · 357 몫). → 로케일 둘 끝(sub5 73b337f15). + +## 353. 평면 그림 — 절/성토선 · 등고선 고정 · 3D 등고선 (요구 235-4 · 5 · 6 · sub8 · Opus high) + +- 정함(브레인): 절/성토선 = 측점 값을 그대로 지나는 단조 3차 보간 + 같은 법선 + 접힘 버림(B07 계획평면도 파이썬 짝 함께 · 거울) · 등고선 고정 = 높이값 하나 · 페이지 동안 · 호버 · 고른 가닥에 자물쇠 · 3D 등고선 = 5 m 주곡선 고정 · 1 m 옅게(평면 색 토큰) · B04 3D 도 같게 · 근거 3장. +- [x] 353-1 [발자국] → [절/성토선] · 선 매끄럽게(PCHIP · 법선 통일 · 접힘 제거 · 곡선 촘촘) TS + B07 짝 — 확인: 거울 시험 · 측점 폭 = 횡단 값 · 꺾임 각 상한 시험. + - 검증완료 — test_353_1 · 346_2 · b07_plan_kinds · 119 통과 · ORCA 검증_sub8 실데이터 도로 끝 꺾임 최대 8° · 되돌아감 0 · 곡선 안쪽 접힘은 모서리로 잘림. +- [x] 353-2 등고선 하이라이트 자물쇠(호버 · 누르면 고정 · 다시 누르면 풂 · 고정 동안 다른 지정 안 됨) — 확인: 시험 + ORCA. + - 검증완료 — test_353_2 통과 · ORCA 진짜 마우스 855 m 잠금 뒤 빈 곳 · 845 · 875 눌러도 855 · 수치지형도로 바꿔도 855 다시 짚음 · 풂 뒤 865 고름 · 밝음/어두움. +- [x] 353-3 3D 등고선 5 m · 1 m 선 종류 구별(B05 · B04) — 확인: test_176_2 · test_345_2. + - 검증완료 — test_353_3 · 176_2 · 345_2 통과 · ORCA B05 3D 5 m 진한 남보라 · 1 m 옅은 선(B04 는 같은 재질 파일 · 화면 안 엶). + +## 354. 종단 판 — 유토곡선 따로 · 종단 기준 숨김 · 스크롤 끊김 (요구 235-7 · 8 · 9 · sub2 · Opus high) + +- 정함(브레인): 유토곡선 = 배수유역도처럼 자기 판(종단 열 아래 칸 · 손잡이 · 높이 · 접기 따로 · X 동기화 · 창 분할 유지 · B05 · B06 공용) · 종단 기준 = 안 셈 · 안 그림(코드 남김 · 저장 범례는 횡단으로) · 스크롤 = 유토 다시 그림은 열림일 때 한 틀 한 번 · 동기화 메아리 막는 공용 도우미 · 근거 4장. +- [x] 354-1 유토곡선 자기 판 — 확인: 시험 고쳐 씀 + ORCA(B05 · B06). + - 검증완료: test_354_1 · 224_1b · 224_1c · 230_2 고쳐 씀 · 관련 시험 138 통과 · typecheck 빨강 0 · ORCA 5177 검증_sub2 B05 · B06 = 종단 칸 504~842 · 유토 판 842~1078 안 겹침 · 표 695~842 종단 칸 안 · 접음 = 25px 머리줄([창 분할] · 손잡이) · 다시 펼침 scrollLeft 999.9 = 999.9 · 측점선 X 같음 · 밝음/어두움 · bf3aaaa41 · f79a33ef3(머리줄 z 6 — [창 분할]이 축 띠에 가려짐 고침). +- [x] 354-2 종단 기준 숨김(저장 범례 맞춤) — 확인: 시험. + - 검증완료: test_354_2 4 통과(저장 종단 범례 → 횡단 · 그리기 기준 횡단만 · 묶음 단계 두 기준 그대로) · test_309 · single_source 통과 · typecheck 빨강 0 · f331f2094. +- [x] 354-3 스크롤 끊김(다시 그림 줄임 · 메아리 무시 · 표 켬/끔 × 분배 켬/끔) — 확인: 메아리 재현 시험 + ORCA 휠. + - 검증완료: test_354_3 재현(옛 잇기 = 휠 1,200px 중 210px 에서 멈춤 · 뒤로 튐 5 / 새 = 8 경우 튐 0 · 끝까지) · ORCA B05 4 경우 + B06 × 종단 · 유토 쪽 휠 = body.scrollLeft 뒤로 튐 0 · 유토 접음 스크롤 다시 그림 0 · 5417cde43. 휠은 ORCA 마우스 휠이 (0,0)에만 떨어져 스크롤러에 WheelEvent 를 eval 로 보냄(scroll · 메아리는 브라우저 그대로). + +## 355. 종단 ▲▼ — 이웃 R 점을 축으로 직선 돌림 (요구 235-15 · sub6 · Opus high) + +- 정함(브레인): 「R 있는 점」 = 기하 꺾임(종단곡선 있는 변화점) · 누른 점이 꺾임이면 좌우 같은 기울기 마디를 건너 다음 꺾임(없으면 시점 · 종점)을 축으로 사이 측점을 새 직선 위로 · 직선 안쪽 점이면 지금 그대로 · ▲▼ 버튼 · 표 입력 · 방향키 같은 길 · 근거 4장. +- [x] 355-1 adjustStation(Alignment.ts) 고침 — 확인: 새 helper 세 경우(처음 계획선 = 옛 값 · 직선화 뒤 꺾임 ▲ = 사이 한 직선 · 축 표고 그대로 · 직선 안쪽 = 옛 값) · 영향 시험. + - 검증완료: test_355_1 · 영향 시험 55 통과 · typecheck 0 · ORCA 5181 검증_sub6(▲ · ▼ · 방향키 · 표 입력 = 축 사이 측점 정확히 비례 · 축 키 그대로 · 빈 값 무시 · 어두움 · 횡단 오가기) · 1ac1a7d93. +- [x] 355-2 새 Pivot 파일을 가짜 모듈 목록 도우미(helper_344_2 등)가 싣게 — 확인: test_344_2 통과(지금 12 오류). + - 검증완료: 도우미 셋(344_2 · 349_0v · 234_1) 진짜 Pivot 모듈 · 시험 46 통과(메인 재확인) · 47b28e4ed. + +## 356. B06 — 맹암거 경계 · 중심점 좌우 · 키 강조 (요구 235-16 · 17 · 18 · sub7 · Opus high) + +- 정함(브레인): 양측절토 맹암거 = 낮은 쪽으로 늘인 노면선이 원지반과 만나는 점(tilt_reach)에서 끊음(흐름 방향 규칙은 지금대로) · 중심점 = 고르면 ▲▼ 계획고 · ◀▶ · 가로 끌기 = 그 측점 노선을 좌우로(가까운 노드 옮김 · 없으면 끼움 · 놓을 때 한 번 커밋 · 그 측점 높이 그대로 · 뒤 측점은 묶음이 조용히) · 카드 초점 강조 없앰(▲▼ 계획고 길은 그대로) · 근거 5장. +- [x] 356-1 맹암거 양측절토 reach 에서 끊음 — 확인: test_288 · 306 · B07 묶음 다시 지음. + - 검증완료: test_288 · 306 12 통과(양측절토 reach 수직 끊음 새 시험) · build:b07-extent 다시 지음 · test_b07_cross_overlay_extent 3 통과 · typecheck 통과. +- [x] 356-2 카드 초점(tabIndex · Enter/Space) 걷음 — 확인: 키 눌러도 다른 색 테두리 없음. + - 검증완료: test_356 · 219_1 통과 · ORCA(검증_sub7 · 5182) 카드 마우스 고름 뒤 초점 안 받음 · 빨강 고름 테두리만. +- [x] 356-3 중심점 고름 · 상하 · 좌우(노선 이동 · 놓을 때 커밋 · 높이 보정) — 확인: 시험(Δ → 노드 · 뒤 측점 다시 셈 · 되돌리기 한 걸음) + ORCA. + - 검증완료: test_356 외 고친 대상 196 통과 · typecheck · ORCA 진짜 마우스 — 중심점 고름(원 맨 위 · 조정창 ◀▶) · ▲ 계획고 +0.1 · B06 바로 열기 ◀ 0.1 m = 노드 끼움(49→50) · 끌기 우 2.0 m = 0.5 m 안 노드 옮김 · 측점 40 계획고 867.1767 → 867.1778 / 867.1784(보정 없으면 867.0997) · 끝 측점 1092.269 → 1092.268 · 되돌리기 한 번 = 한 걸음 · 고정 노드 알림 · 밝음/어두움 · 종단 보기 옮김 뒤 초안 유지 · 원상복구. +- [x] 356-4 되돌리기 · 다시하기로 노선이 바뀌는 차례는 계획고 편집 · 횡단 초안을 그 걸음 사진대로(follow · 계획고 옮김이 덮지 않게) — 확인: 중심점 좌우 + 보정 → 되돌리기 = 조작 전 계획고 시험. + - 검증완료: test_356_4 4 통과(옛 동작 대조 = 편집 사라짐 잡음) · 349-0k~0u · 346 · 355 · 356 142 통과 · typecheck · ORCA 진짜 마우스(검증_sub7) — ◀ 0.1 m(z40 867.1772 · 보정 0.0954) → 끌기 우 2 m(867.1779 · −1.427) → 되돌리기 = 867.1772 · 0.0954 그대로 · 다시하기 = 867.1779 · −1.427 · 끝까지 되돌림 = 초안 없음 · 밝음/어두움 · 원상복구. 344-2 시험 12 오류 = 355 피벗 새 파일이 헬퍼 가짜 목록에 없음(sub2 몫 · 무관). + +## 357. 설정 · 단축키 · 버튼 이름 (요구 235-11 · 12 · 27 · sub6 · Sonnet high) + +- 정함(브레인): 설정 저장 = [닫기]와 같은 크기 · 저장하면 바로 닫힘 · 단축키 글 「단추」 → 「버튼」 · 한 줄 = 「입력 = 동작」(키 칩) · 버튼 이름 = 명사형(분석 6장 표 · -기 꼴은 짧은 한자어 있을 때만 · [닫기] 그대로) · B05 · M02 버튼은 그 장 창이 · 나머지 화면 · 로케일은 sub6 · 근거 6장. +- [x] 357-1 설정 저장 버튼 크기 · 저장 뒤 닫힘 — 확인: test_app_settings 고쳐 씀. 검증완료(시험 통과 · ORCA 저장 59.5×31.7 = [닫기] 같음 · 저장 뒤 창 닫힘 · 잘못 별칭은 창 남음 · 값 되돌림). 검증 대기. +- [x] 357-2 마우스 · 단축키 탭 한 줄씩 · 버튼 — 확인: 시험 + ORCA. 검증완료(마우스 8줄 · 다른 곳 38줄 모두 높이 31 · 「단추」 0 · 밝음/어두움). 검증 대기. +- [x] 357-3 서술형 버튼 이름 명사형(A0x · B01 · B03 · B09 · B11 · M01 · ui_template · spreadsheet · cad_host · 로케일) — 확인: 바뀐 글 시험 고쳐 씀. 검증완료(물음 창 [취소] [폐기] [저장] 화면 확인 · 시험 78 통과 · typecheck). 남김: B05 · M02 · Recommend 버튼 = 각 창 · -기 꼴 중 spreadsheet 「내용/서식/화살표 지우기」 · 주소 등은 그대로. 검증 대기. + +## 358. M02 실무자료 맞춤 — 자재 · 별도계상 · 이름 닮은 후보 · 출처 · 옵션 단계 (요구 235-20 · 22 · 236 · sub3 · Opus high) + +- 사용자 확정: 데스크탑 옛 판의 유사 로직 찾기가 낫게 느껴짐 · 엑셀 단가산출의 출처 · 옵션 로직으로 단계적으로 확인해 정합성을 올림. +- 정함(브레인): 새 판(1순위 14 → 48/49)은 되돌리지 않고 합침 — 후보를 숨기지 않고 묶음으로 보임(1위 + 판정 / 출처 같음 / 이름 닮은 로직 = 옛 판 다섯 / 숫자만 닮음 = 접고 꼬리표) · 출처 → 옵션 → 이름 → 규격 · 단위 차례는 거름이 아니라 묶음 · 꼬리표 · 자재 · 별도계상 줄도 단계 대조 · 근거 = docs/raw/조사/2026-10-16_351_요구235_분석.md 7장 · 8장. +- [x] 358-1 후보 묶음(이름후보 · 뜻겹침 · 출처 같음 · 책 표시 · 찾기 칸 = 이름 낱말) — 서버 Line · Api 두 칸 · 고르기 창 — 확인: 옛 다섯 ⊂ 후보 ∪ 이름후보 · 1순위 ≥ 116 그대로 시험. + - 검증완료 — 이름후보 = 옛 판 600줄 대조 0 다름 · golden 9 통과(다섯 안 ∪ 이름후보 ≥ 다섯 안) · ORCA 구조물터파기 고르기 창 1위 / 이름 닮은 로직 5 / 숫자만 닮음 4(접힘 · 회색) · 검색 칸 「구조물터파기」 · 밝음/어두움 · 검증 대기 +- [x] 358-2 자재 · 별도계상 줄: 갈래 판정(재료비만 = 자재 · 「별도계상」 글 = 표시) · 맞춤(지역 · 관급/사급 꼬리 · 규격 숫자 · 단위) · 단가산출 줄에서도 자재 고름 · 가져올 때 별도계상 · 자재구분 · 운반비 세 칸 넣음 — 확인: 북부청 자재 30줄 맞음 2 → 늚 시험 · 자재 정답 표. + - 검증완료 — 북부청 임도 자재 · 별도계상 30줄 맞음 2 → 8(면목 · 레미콘 둘 · 와이어메쉬 · 열연강판 · 자물쇠 · 돌망태 둘) · 정답 표 5 · 로직 자재 같은 품목 = 자재표시로(400 없음) · ORCA 레미콘 고르기 창 1위 + 변형 · 큰돌 = 가까운 것 없음 + 다른 자재 검색 · 검증 대기 +- [x] 358-3 단계 대조가 안 된 것처럼 보이던 까닭 고침: 옛 꼴 장부 짝이 숫자 판정과 다르면 판정 먼저 + 「장부와 다름」 표시 · 목록 숫자 = 확인 창 숫자 한 규칙(% 줄 · 노임 줄은 셈 밖) · 판 2 캐시 없는 층 파일 미리 셈 — 확인: 시험. + - 검증완료 — 목록 수 = 확인 창 수(68호표 같음) · 실물 북부청 제안 113 → 204 / 415 · 장부와 다름 24줄 · 연결할 414 · 연결된 204(sub4 녹색용) · 목록 열 때 뒤 셈 예약 시험 · 검증 대기 + +## 359. M02 실무자료 화면 — 파일 업로드 · 바로 엑셀 보기 · 수정 · 저장 · 숫자 색 · 확인 창 표 (요구 235-19 · 21 · 23 · 24 · 25 · 26 · sub4 · Opus high) + +- 정함(브레인): [엑셀 올리기] → [파일 업로드](구조물 조합 [마스터] 단추 꼴) · 파일 줄 누름 = 바로 엑셀 보기(표가 맡던 지우기 · 검산 · 셈 중 · 고름 표시는 엑셀 보기로) · 엑셀 보기 펼침 표 · [확인 창 열기] 없앰 · 호표 줄 번호 오른쪽 [수정] = 확인 창 · [고른 N개 확인하고 만들기] → [저장] = 체크한 호표를 체크 줄로 만들기 · 숫자 = 다 연결(358-3 한 규칙)이면 녹색 · 확인 창 표 = 일위대가 상세 꼴(로직 표 + 자재 표 · 세 칸) + 품 비교 · 버튼 · 드롭다운 「넣음 · 뺌 둘」 → 「추가 · 로직없음 · 사용안함」(저장 값 그대로) · 별칭 장부는 이름 그대로 두고 단추 · 창 머리에 한 줄 풀이 · 근거 7장. +- [x] 359-1 [파일 업로드] 버튼 · 파일 줄 누름 = 엑셀 보기 · 표 몫 옮김 — 확인: 시험 + ORCA. + - 검증완료 — test_m02_hopyo_screen 18 · 단추 꼴 = [개인] 층 단추와 같음(32px · 14px · 8px 16px) · 파일 줄 = 엑셀 보기 · 머리 막대 · 고름 표시 켜짐/꺼짐 · 검증 대기 +- [x] 359-2 [수정] · [저장](체크 기준 만들기) · 펼침 표 · [확인 창 열기] 지움 · 숫자 녹색 — 확인: test_m02_hopyo_screen 고쳐 씀 + ORCA. + - 검증완료 — [수정] 68줄 같은 자리 · [저장]/[삭제] 물음 취소 = 그대로 · 녹색 = success 토큰(밝음 31,138,76 · 어두움 63,187,111) · 북부청 다 연결 0개 · 녹색 칸은 358-3 연결할 · 연결된 두 칸 오면 바꿈 · 검증 대기 +- [x] 359-3 확인 창 표 = 일위대가 상세 꼴 + 품 비교 · 드롭다운 글 · Check.ts 쪼갬 — 확인: 시험 + ORCA. + - 검증완료 — sub4 가 끝냄 · test_m02_hopyo_draft_calc(북부청 실물 줄 calc 200 · 저장 안 함) · 제1호표 로직 4 · 자재 2줄 · 금액 미리 셈 채움 · 드롭다운 저장 값 「우리에 없음」 그대로 · 캐시 되돌림 · 검증 대기 +- [x] 359-4 별칭 장부 풀이 한 줄 · M02 서술형 버튼 명사형(분석 6장 표의 M02 몫 · Choose.ts 는 sub3) — 확인: 시험. · 덧 0576420d8 M02 로케일 버튼 9개 명사형(en 포함) · ui_checks 4 · 시험 29 통과. + - 검증완료 — 장부 머리 · 좌측 title 풀이 · Hopyo 단추 명사형 · 로케일 단추 글(Layer · UI_Side · UI_Main · Practice)은 sub6 몫으로 남김 · 검증 대기 + +## 360. 요구 235 · 236 마무리 — 합치기 · 빌드 · 시험 · 보고 (브레인) + +- [x] 360-1 창마다 끝나면 메인 합침 · 고친 대상 시험 · typecheck · 서버 Node 묶음 다시 지음 · push. 검증완료: 메인 합침(351~359 · 355-2 · 356-4) · 고친 대상 시험 모두 통과(마지막 351 묶음 60) · typecheck 0 · 서버 묶음 corridor · server-calc · b07-extent 다시 지음 · push. +- [x] 360-2 장이 끝난 창 /clear · 사용자 보고(창 보고 수치 모음 · 남은 것). 검증완료: 창 여덟 /clear · 모델 모두 Opus high 로 되돌림 · ORCA 탭 0 · 사용자 보고. + +## 361. M02 실무자료 — 지역만 다른 자재 = 전국 (요구 237-1 · sub3 · Opus high) + +- 사용자 확정: 지역 자동 고름 안 함 · 기본 = 전국 · 필요하면 사용자가 바꿈 · 레미콘 = 별도계상 · 관급/사급 · 지역은 나중에 프로젝트에서. +- 정함(브레인): 줄 글에 지역이 적혀 있으면 그 지역(원문 · 자동 고름 아님) · (전국) 품목 있으면 그것 · 없으면(레미콘) 특정 지역 품목 · 단가에 안 묶고 「전국」 · 관급/사급 꼬리 · 별도계상은 지금 규칙 · 근거 = 자재 목록에 레미콘(전국) 없음(시 사급 · 시군 관급만). +- [x] 361-1 맞춤 · 꼬리표(「못 가림 — N개 중 첫째」 → 「전국」) · 고르기 창 지역 변형 고름 / 전국 되돌림 · 만들기 결과도 전국 — 확인: 북부청 레미콘 별도계상 줄 = 전국 시험 + hopyo 묶음 + ORCA. + - 검증완료 — hopyo 묶음 108 통과 · typecheck 0 · ORCA(5178 · HP-000002 제1호표) 레미콘 줄 = 「레미콘(전국)-관급」 · 코드 「전국」 · 금액 — · 고르기 강릉 MT019839(102,410) → 전국 되돌림 · 밝음/어두움 · 캐시 · 테마 되돌림 · 만들기는 임시 층 시험만(본뜬.전국자재 · 빠진 줄 까닭 · 장부 안 남김) · 검증 대기 +- [x] 361-2 「전국」 자재(사전조합 본뜬.전국자재)를 상세 화면 자재 표 아래 보기 전용 줄로 — 확인: 있는 것 · 없는 것 시험 + ORCA. + - 검증완료 — 고친 대상 시험 215 통과(national 4 · hopyo 묶음 · Labor 상세 · 사전조합 시험) · typecheck 0 · 전국 자재 표(코드 전국 · 세 칸 · 금액 — · 단추 0) · 없으면 안 그림 · 확인 창 세 칸 = 서버 `세칸`(전국-관급 = 관급) · ORCA 는 브레인 몫(V31) · 검증 대기 + +## 362. M02 상세 화면 [파일 업로드] · 옛 별칭 정리 (요구 238 · sub4 · Sonnet high) + +- 사용자 확정: 「상세도 있음」 = 상세 화면에도 같은 종류 버튼 · 옛 별칭 = 사용자 시험 흔적 · 지워도 됨. +- 정함(브레인): 같은 종류 = M02 도면 상세 머리 📂(파일 불러오기 DXF · DWG) — M02 안 파일 버튼은 이 둘뿐 · B07 도각 편집 [파일 불러오기]는 그대로. +- [x] 362-1 옛 별칭 3짝 지움(사용자 개인 장부 storage/1/3 · 사본 스크래치패드 req237) · 엄상준 개인 장부(1/10) 옛 꼴 2짝은 그대로 — 확인: 장부 줄 0. +- [x] 362-2 도면 상세 머리 📂 → [파일 업로드](실무자료 [파일 업로드]와 같은 꼴 · DXF · DWG 그대로) · 도움말 글 — 확인: 시험 + ORCA. + - 검증완료: 시험 12 + 메인 18 통과 · typecheck · ORCA 5179 도면 상세 [파일 업로드] 102×31.7 px = 실무자료 버튼 102.04×31.74 px · 누름 = 숨은 input click(불러오기 · 저장 안 함) · 밝음/어두움 · bfe0d1d95. 참고: 머리 줄 [저장] 줄바꿈은 옛 그대로. + +## 363. 요구 235~238 브레인 화면 검증 · 아티팩트 (요구 239 · 브레인) + +- 사용자 확정: 코드 끝난 뒤 브레인이 사용자처럼 브라우저로 검증 · 내일 아침 볼 아티팩트. +- 정함(브레인): 랩탑 메인 5173 · 검증_브레인232 사본 · M02 = 보기 · 확인 창까지(사용자 층 [저장] · 장부 쓰기 안 함) · 바꾼 값 되돌림 · 목록 = 스크래치패드 req239/verify239.md. +- [x] 363-1 요구 1~27 · 236 · 237 · 238 사용자 길 · 수치 · 사진 — 흠은 창에 고침 → 다시 잼. + - 검증완료: V1~V31 모두 통과(흠 10건 고친 뒤 다시 잼) · 목록 스크래치패드 req239/verify239.md · 사진 req239/shots · 사본 검증_브레인232 · 시험 사전조합 SC-000001 지움 · 현재 프로젝트 id 되돌림 · 탭 0. +- [x] 363-2 아티팩트 보고(요구별 결과 · 수치 · 사진 · 남은 것). + - 검증완료: 아티팩트 https://claude.ai/artifact/Dg1dzJPsQfVomCGMduxQPN(요구별 결과 31 · 고친 흠 10 · 화면 16 · 남은 것). + +## 364. 브레인 검증에서 찾은 흠 (요구 239) + +- 정함(브레인): 보기만 바꾸는 조작 · 뒤에서 오는 파생 값은 되돌리기 걸음 아님 · 설계 값이 바뀐 때만 걸음. +- [x] 364-1 B05 평면 [횡단] 판 열기만으로 ↶ 켜짐 → 보기 조작은 걸음 안 만듦(sub7) — 확인: 판 열기 · 회전 · 맞춤 뒤 canUndo false 시험 + ORCA. + - 검증완료 — 시험 187 통과 · typecheck · ORCA 5182 검증_sub7: 보기 손길 15 종 · 횡단 보기 · 카드 고름 = 걸음 0 · ▲ · 꺾임점 끌기 = 걸음 하나씩 · 밝음/어두움 · 검증 대기. +- [x] 364-2 설정 [다른 곳 단축키] 동작 칸 빈 줄 넷(Esc · Backspace · Esc · CAD 묶음 · Ctrl+C 묶음) → 실제 동작 · 동작마다 한 줄(sub6) — 확인: 모든 줄 「 = 」 시험. 검증완료 — 넷을 「키 = 동작」으로 나눔 · 시험 `test_app_settings.py` 3 통과 · typecheck 통과 · 화면 검증 「탭 차례」 대기. +- [x] 364-3 절/성토선 비탈 끝 아직 뾰족(30° 넘음 왼 14 · 오른 2 · 최대 139°) → 바뀜 자리 빼고 둥글게(sub8 · TS ↔ B07 짝) — 확인: 같은 자료 전후 꺾임 수치 시험. 검증완료 — 세션 자료 30° 넘음 왼 14 · 오른 3 · 최대 140.7° → 0 · 1 · 34.8°(측점 860 · 861 사이 1 m 폭 4.4 → 6.0 m · 측점 점 그대로) · 시험 `test_364_3_slope_end_round.py` 4 + 거울 · 관련 42 통과 · typecheck 통과 · 화면 검증 브레인 V4. +- [x] 364-4 노선 추천 저장본 없는 옛 프로젝트 = 모달 첫 열기 셈(토공 63 s · 갈래마다 9~10 s) → B05 열 때 뒤에서 다섯 갈래 미리 셈(sub1) — 확인: 저장본 없는 사본 → 열고 기다린 뒤 모달 0.2 s. 검증완료 — 시험 `test_364_4_precompute_on_open.py` 4 · 351-1 · 224-3 · 모달 시험 59 통과 · typecheck 통과 · 8001 검증_sub1 판 바뀐 저장본(ALGO 4) B05 열기 → 86.8 s 에 다섯 갈래 끝 → 모달 누름 0.12~0.16 s 저장본 · 다 있으면 미리 셈 1 s 안팎 · 583c200b3 · 화면 검증 브레인. + - 검증완료(sub1): B05 열기 = 다섯 갈래 미리 셈 예약 · 86.8 s 뒤 모달 0.12~0.16 s · 583c200b3 · 메인 68 통과. +- [x] 364-5 측점 맞춤 뒤 측점 밖 곡선 남음(영선 5 · 비중 3 · 토공 8 / 166) → 한 측점 다투는 가까운 두 곡선 합침/끔(sub1) — 확인: 다섯 갈래 전후 수치. 검증완료 — 덜 꺾인 쪽 끔(꺾임점째 뺌 · 안 되면 꺾임만 · 이탈 6 m · 기울기 잣대 그대로) · 브레인 판 측점 밖 16 → 3(영선 5/34 → 0/30 · 비중 3/35 → 1/33 · 토공 8/39 → 2/34 · 기울기 · 예상 0 그대로 · 다투는 쌍 0) · 넘은 곳 옛 맞춤 → 새: 영선 4 → 5 · 비중 6 → 7 · 토공 6 → 4 · 최대 기울기 20.9 → 19.3 · 27.1 그대로 · 26.4 그대로 % · 시험 `test_364_5_crowded_curves.py` 2 · 351-2 · route_initial 43 통과 · 63032d6cc. + - 검증완료(sub1): 측점 밖 곡선 16 → 3 · ALGO 4 · 63032d6cc. +- [x] 364-6 B05 누가토량 2,003.9 → B06 열면 편집 없이 2,918.8(절토 +811 ㎥) → 같은 입력 같은 값(sub7) — 확인: 사본 편집 없이 B05 = B06 시험. + - 검증완료: 메인 B05 = B06 = 2,003.9 ㎥(편집 없이 오가도 그대로) · be4383f81 · 덧 f1e15a771(암 값 보기 전용 글). + - 까닭: B06 표준 횡단 칸이 열릴 때 공통 칸을 토사 값으로 펼쳐 세션을 고침(암 측구 상폭 0.69 → 0.9 · 암 횡단경사 3 → 3~5) → 다시 셈이 암 측점 절토를 키움 · 성토 그대로. 서버 셈 = B05 셈(정본 맞음). + - 고침: 열기 · 저장값 복원 · 초기 값 · 다른 프로젝트 불러오기 = 그룹 값 그대로 · 공통 칸은 고칠 때만 펼침. + - 검증완료 — 검증_sub7 노선 304(67 측점 · 모두 리핑암) 칸 열기 전후 절토 면적 합 402.9 → 444.4 ㎡(56 측점 변함) → 고친 뒤 402.9 = 402.9(0 측점) · 시험 `test_364_6_std_panel_same_value.py` 6(옛 코드 4 실패) · 관련 25 통과 · typecheck · 화면 검증 브레인. + - [x] 덧(브레인 판정): 공통 칸 라벨 끝 보기 전용 작은 글 = 고치기 전 암 · 포장이 실제 쓰는 값(「암 0.69」 · 「암 3 %」) · 고치면 한 벌이 되어 사라짐 · 글자색 토큰 `--color-text-muted`. + - 검증완료 — config 표준: 측구 상단폭 「암 0.69」 · 횡단경사 최대 「암 3 %」 · 최소 · 절토경사 글 없음 · 고친 뒤 넷 모두 없음 · 시험 `test_364_6_std_panel_same_value.py` 8 · 관련 17 통과 · typecheck · 화면 검증 브레인. + - [x] 덧 2: 「암 0.69」 · 「암 3 %」 글이 줄을 늘려 칸이 어긋남 → 라벨과 같은 줄 끝(넘치면 라벨 말줄임) + - 검증완료 — 시험 `test_364_6b_std_note_same_line.py` · `test_364_6_std_panel_same_value.py` 8 통과 · typecheck 통과 · 화면 실측(입력 top 차 ≤ 1 px)은 브레인. +- [x] 364-7 B06 중심점 ◀ 0.1 m 에 40~140 m 계획고 다시 맞춤(최대 −1.27 · +1.73 m · 기울기 18.3 %) → 노면 그대로 옮김 = 계획고 그대로(sub2) — 확인: 사본 ◀ 0.1 m 뒤 모든 측점 계획고 ±0.001 시험. + - 까닭: 노선이 바뀌면 planline 단계가 바뀐 구간을 새 지반 첫 계획선으로 다시 맞춤(꺾임점 끌기와 같은 길 · 바뀐 구간 안 편집 · R 버림) · 옛 보정은 누른 측점 하나만 되돌림. + - 고침: 중심점 좌우 · 끌기 = 옛 · 새 꺾은선 꼭짓점 · 측점을 견줘 다른 곳만 계획고 편집으로 고정 · 옛 R 되살림(`holdGrade`) · B05 꺾임점 끌기 규칙 그대로 · 편집 측점 수는 바뀐 구간 측점만큼 늚. + - 검증완료: test_356 5 · 356-4 4 · 349-0k~0u · 364-1 49 통과(바뀐 구간 안 계획고 · R 든 흉내 = 모든 측점 ±0.001 · 최대 기울기 · R 그대로 · 되돌리기 한 걸음) · typecheck 0 · 842473bce · 덧: 중심점 ◀▶ 툴팁 「이 측점 노선을 화면 왼쪽 · 오른쪽으로 0.1 m」 · ↺ · 소단 ▲▼ 숨김 확인(13fc271eb · 고르기 시험 64 통과) · 화면 검증 브레인. +- [x] 364-8 M02 실무자료 머리 ↔ [파일 업로드] 간격 0 px → 구조물 조합과 같은 12 px(sub4) — 확인: 간격 시험. + - 검증완료: 브레인 화면 간격 12 px · 138c2e2f4. diff --git a/docs/raw/조사/2026-10-17_365_요구240_분석.md b/docs/raw/조사/2026-10-17_365_요구240_분석.md new file mode 100644 index 000000000..5b9992686 --- /dev/null +++ b/docs/raw/조사/2026-10-17_365_요구240_분석.md @@ -0,0 +1,192 @@ +# 요구 240 분석 (10-17 · PLAN 365~375 근거) + +원문 = `docs/raw/요구_1017/사용자요구_1017.md` · 조사 = Explore 여덟(읽기만) + 브레인 직접 확인(1장 묶음 주인 · swap 덮음 · 5장 판정 차례 · 4장 Pivot) · 줄 번호는 10-17 기준. + +## 1장 평면 > 종단 <> 횡단 연동 · 캐시 · 고리 (240-4 · 8) + +약칭: PP=A00_Common/design/design_pipeline_page.ts · PL=A00_Common/design/logic/design_pipeline.ts · DP=design_profile.ts · VP=design_view_profile.ts · VPS=design_view_profile_sections.ts · VC=design_view_cross.ts · SW=B06_Section_UI_Page_Station_Swap.ts · SS=B06_Section_Section_Store.ts · CR=B06_Section_Cross_Refresh.ts · DS=B06_Section_UI_Page_Design_Sync.ts · SV=B06_Section_UI_Section_View.ts · PV=B05_Profile_UI_Profile_Preview.ts · RE=B05_Profile_UI_RouteEdit.ts · RC=B05_Profile_UI_RouteEdit_Cross.ts · SH=B05_Profile_UI_RouteEdit_Shift.ts · CC=B06_Section_UI_Cross_Center.ts +### 흐름 +- 평면→종단: 사진첩 commit → bridge.edited(RouteEdit_Draft.ts:66-70,85-89 · RE:463) → PP:578 route-draft + pipe.update("route") PP:582 → 단계 route→follow→stations→ground→planline→profile(PL:33-43) → PP:450-484 → adoptPipeline DP:633-645. +- 평면→관·구조물: follow PP:326-338 → PP:422-449 → 가게 → VP:145-154 · B06 watchDrafts VC:576. +- 평면→횡단(묶음): cross 단계 PP:344-354 → shown = draftSectionDetail PP:456-468 → B06 followDraftDetail SW:46-71 → VC:223-245 → shownDetail SW:18-21(보일 때만). +- 평면→횡단(측점 갈아끼움): ground → 가게 stations PP:369-385 → VPS:178-180 · SW:33-36 → swapSectionStations SS:140-167(저장 노선 section-detail 세션까지 덮음 SS:159-160). +- 평면→B05 오른쪽 횡단 판: 끌기 놓을 때만(RouteEdit_Pointer.ts:316-321) · 서버 POST route/cross-preview RC:173-193 → Router_Terrain.py:148-228(계획고 = 지반고). +- 종단→횡단: applyEdits → rebuild DP:328-359 → ① pipelineGrade PP:593-599 ② crossPreview 16/120 ms(PV:105-139) → refreshCrossDesigns CR:218-238 → B06 refreshCards · 초안 동안 ② 꺼짐 DP:373,384. +- 횡단→종단: B06 노면·중심점 ▲▼ = 종단 방향키(Design_Pick.ts:529-530 → Profile_Panel_Tools.ts:221-231). +- 횡단 입력→묶음: DS:64-119,143-187,209-221 캐시 상세만 · 묶음 cross 입력은 상세 객체마다 한 번(PP:289-295) · update("cross") earthwork 한 곳(PP:604-608). +- 횡단→평면: 356-3 중심점 ◀▶·가로 끌기 CC:58-67,106-109 → SH:56-94 노드 옮김 → 평면→종단 길 → holdGrade → pipelineGrade SH:76-89(두 바퀴). +- 종단→평면: 없음. +### 고리 막음(있음): busy PL:177-192,336-342 · 같은 입력 안 셈 PL:344 · deps 판 PL:194-199,229-233 · 차례 번호·abort PL:255-306,319-326 · drafted WeakSet PP:231-240 · echo PP:260-262,490-500,557-561 · stationsShown PP:366-383 · quiet PP:246-249 · PV 지문 :95-104 · seq. +### 비쌈: 계획고 한 번에 횡단 두 벌(묶음 cross 45 ms + crossPreview 7.5~88 ms) · B06 보일 때 노선 한 번 = B06 다시 그림 최대 4번(SW:32 · SW:56-62 두 번 · VC:576) · 중심점 좌우 = 묶음 두 바퀴 · B05 오른쪽 판 서버 0.7 s. +### 8번 원인 +1. 묶음 주인 = B05 종단 보기(routeDraftBridge VP:532 한 곳 · PP:175-183) → B06 바로 열기·새로고침 = 묶음 없음(pipelineDetail null PP:197) → route-draft 아무도 안 셈 · B06 은 section-detail 그림(VC:521,632). +2. 초안 동안 swap 이 저장 노선 section-detail 세션을 새 측점·새 지반 + 옛 설계로 덮음(SS:159-160 · logic/B06_Section_Station_Swap.ts:164-165) → 새로고침·B06 바로 열기 = 새 측점 + 옛 종단 섞임. +3. 초안 동안 B06 횡단 고침 안 보임(카드 = shown SV:576 · 고침 = 숨은 sectionDetail DS:64-103 · 묶음 cross 입력 옛 값 PP:289-295). +4. B05 오른쪽 횡단 판 = 묶음과 따로(서버 지반 추종 · 계획고 반영 안 됨 · 끌기 놓을 때만). +### 바꿀 자리 +- 묶음을 페이지가 세움(design_shared.ts:152-186 sharedProfile 또는 design_page.ts · VP:532-551 다리·holdDraft·structureAreas 옮김). +- PP: crossNow 기억 없앰 · pipelineCross() · start 때 입력 지문 대 파생 지문 → 낡음이면 돌림 → settled 뒤 다시 견줌(상한 N). +- DS 끝에 pipelineCross() · SS 초안 동안 저장 노선 section-detail 안 덮음 · RC 묶음 상세 그 측점 그림(서버 cross-preview 지움) · SW+VC 다시 그림 한 틀 한 번 · SH holdGrade 한 바퀴. +### 물음(추천): Q1 356-3 중심점 ◀▶ 남김 · Q2 B05 오른쪽 판 = 묶음 횡단 · Q3 B06 바로 열기도 초안으로 셈 · Q4 초안 동안 B06 횡단 고침 허용 · Q5 횡단 → 절/성토선 그림 실시간 · Q6 1단계 두 벌 두고 기억만 고침 · 2단계 합침 · Q7 최대 3바퀴 · Q8 끄는 동안 선만 · 놓을 때 한 바퀴. + +## 2장 B05 평면 — 등고선 자물쇠 · 도구줄 · 이름 · R 일반측점 (240-1 · 3 · 10 · 11) + +### 1 등고선 자물쇠 = 고른 때만 +- 지금: 커서 지나기만 해도 뜸 B05_Profile_UI_RouteEdit_ContourLock.ts:118-126(pointermove) · :128 pointerup · 규칙 logic/B05_Profile_ContourLock.ts:25-31 · 숨김 0.7 s(:27 · :87-93 · :129) · 클릭 고름 _Pointer.ts:220-235 · 잠긴 동안 고름 막힘 RouteEdit.ts:525-527 = 353-2 결정. +- 고침: ContourLock.ts :118-126 · :71-72 지움(pointerup 만) · ContourLockScene(:37-43)에 picked · RouteEdit.ts:198 pickedContour 넘김 · 안 잠김 = 고른 가닥일 때 · 잠김 = 잠근 높이 누를 때만 · lockButtonState selected 인자 · 휠 때 숨김 · 시험 test_353_2_contour_lock.py:29-32 · :53-60. +- 물음(추천): 고른 동안 클릭 자리 옆 · 다음 클릭 · 휠 · 떠남 0.7 s 숨김 · 다시 고름 = 같은 높이 아무 가닥. +### 3 평면 도구줄 +- 지금 Chrome.ts:62-89: [3D] | 분석 지형(:65-71 라이다·도엽 둘 다 때) · 맞춤 · 1m 등고선 · 거리 재기 · 측점 스냅 · 절/성토선 | ↶ ↷ · [?] 따로(:90-99) · 회전 = 오른쪽 위 .b05-routeedit__spin(:100-105) · css :19-23. +- 맞춤 = RouteEdit.ts:321-327 → fitView(_View.ts:128 · 처음 열 때도 씀 :123 → 함수 남김). +- 고침: [?] | ↶ ↷ | 3D | ⟲ ⟳ 1m 등고선 절/성토선 | 측점 스냅 · 구분선 4 · [?] 단추만 도구줄(본문 제자리 · :145 hint.querySelector → overlay.querySelector) · :72-73 맞춤 · spin 칸 지움 · RouteEdit.ts:321-327 · :59 import 지움 · css :20 right → var(--spacing-12) · _Rotate.ts:63-71 data-act 그대로 · .b05-routeedit__spin CSS 남김(Recommend_Map.ts:33). +- 시험: test_345_5b_plan_visible_area.py:133-139 · test_b05_routeedit_initial.py:212-215. +- 물음(추천): 거리 재기 = 넷째 묶음 끝(ui_checks 44-1b · 48-1) · 분석 지형 = 맨 오른쪽 · 맞춤 지움(회전 0 한 번에 되돌리는 길 사라짐) · 도움말 = 평면 [?]. +### 10 종단설계 → 노선설계 · 종단 보기 → 노선 보기 +- 바꿈: ui_template_locale_b2.ts:111 B05_Route_Title · :149 Design_Btn_ToProfile · ui_template_locale_common.ts:83 WF_Step_Route(☰ 단계 · B01 진행 · B03~B09 진행) · locale_b2:803 안내 · B03_FileInput_Email.py:221,228,242 · resources/help/B05/00_설명서.md:1 · 영문 Route Design / Route view. +- 안 바꿈: 종단 그래프 이름 locale_b2:180,220,222,304,376 · locale_common:151 「B05 종단」 · B03_FileInput_Router_Helpers.py:49(시험 단언) · 「종단 설계 기준」 · 주석 · locale_a:21,61. +- 시험: test_design_view_parity.py:98 · helper_design_view_parity.cjs:128 짝. +### 11 R = 일반측점에만 · 스냅 +- 지금: IP 끌기 Pointer.ts:268-297 → markEdited(RouteEdit.ts:388-398) · MC 규칙 없음 · commit(Pointer.ts:316-321 → RouteEdit.ts:542-545) · [측점 스냅] = 반대(호 안 측점 하나를 MC 로 옮김 RouteEdit.ts:168-175 · Frame.ts:158-176 ↔ Sections_Core.py:291-313,377 · Sections_Stations.ts:285 · 깃발 Router_Replan.py:276 → Engine_Sections.py:88-90). +- 351 = 추천에만(Engine_RouteInitial_Station.py _try/_solve :186-232 · snap_curves_to_stations :465-491 · Engine_RouteInitial.py:398-417 · 모달 Recommend.ts:151-154,310-316,430 · 머리 주석 :4-5 「손 편집 · [측점 스냅]은 안 거침」). +- 고침(작은 안): 새 logic/B05_Profile_RouteEdit_StationFit.ts(고친 IP 부터 끝까지 · 고정 아닌 IP 를 들어오는 접선 따라 ±간격/2 · MC = curveSpans(buildEditedPolyline) 가운데 · 하한 깨면 버림 curveShortfalls/shortfallCrossed · 못 놓으면 그대로 + 개수) · Node 시험 · 부를 자리(스냅 켬): commit(:542-545) · applyEdit(:457 · restoreSnapshot :482-488 뺌) · 스냅 켤 때 전체 한 번(:267-271 · 되돌리기 한 걸음) · 단추 title Chrome.ts:79-81 · 상태줄 「측점 밖 곡선 N개」 Edits.ts:157-197 · 옛 측점→MC 규칙 · 저장 깃발 · 서버 그대로. +- 물음(추천): 강제 = 스냅 켬 때만 · 끄는 동안 실시간 아님 · 놓을 때 · 뒤 곡선 IP 최대 간격/2 따라 밀림 · 못 놓는 곡선 표시만 · 추천 적용 땐 안 맞춤 · B06 중심점 좌우는 맞춤 탐. +### 겹침: RouteEdit.ts 699줄(700 한도 시험 test_b05_routeedit_chrome_modal.py:107 · test_345_5b:140) — 3번 맞춤 삭제 먼저 · 1번 picked · 11번 호출부 · 모자라면 logic 으로 · Chrome.ts = 3번 · 11번. + +## 3장 종단 판 — 유토곡선 · 창 분할 · 자유지정 (240-2 · 23 · 18 · 19) + +경로: MH.ts=B05_Profile/B05_Profile_UI_Profile_MassHaul.ts · MH.css=B05_Profile/B05_Profile_UI_Style_MassHaul.css · view.ts=common_util/common_util_mass_haul_view.ts · mh.ts=common_util/common_util_mass_haul.ts · state.ts=A00_Common/b_page_state.ts · overlays.ts=A00_Common/design/design_profile_overlays.ts · popout.ts=A00_Common/design/design_profile_popout.ts · Render.ts=B05_Profile/B05_Profile_UI_Profile_Render.ts · dp.ts=A00_Common/design/design_profile.ts · free.ts=A00_Common/design/logic/design_profile_free.ts · free_view.ts=A00_Common/design/design_profile_free_view.ts · PT.ts=B05_Profile/B05_Profile_UI_Profile_Panel_Tools.ts · Tools.ts=B05_Profile/B05_Profile_UI_Profile_Tools.ts · History.ts=B05_Profile/B05_Profile_UI_Profile_History.ts · Table.css=B05_Profile/B05_Profile_UI_Style_Table.css · theme.css=ui_template/ui_template_theme.css +### 2 측점 연계 없앰 · 기본 횡단+분배 · 분배 = 도형 켬/끔 · 초기화 왼쪽 +- 측점 연계 = 분배 끈 보기(종단 같은 가로 매핑 Render.ts:434-447 · 스크롤 동기 overlays.ts:63 → MH.ts:290-294 · 스크롤마다 창 다시 그림 Render.ts:341,352,459-464 → MH.ts:359-368,316,518-524 · 측점선 눌러 고름 view.ts:552-582 · 휠 MH.ts:253). +- 분배 켬 = fitAll = haulPlan !== null(MH.ts:454-471) 전체 한 화면 · 측점선·동기 꺼짐 · 배분 오기 전엔 연계 보기(435-436). +- 기본 ["cross"](mh.ts:128 → MH.ts:82) · 키 masshaul-visible v5(state.ts:89-94) B05·B06 공유. +- 범례 [횡단 기준] [토량 분배] [도형 위치 초기화(분배 켬일 때만)](view.ts:772-790) · 도형 = 장비 balloon. +- 고침: MH.ts:454 fitAll = true · 연계 길 지움(attachScrollSync · drawWindow · fitted · keepLeft · windowState · 휠 · overlays.ts:62-63 · Render.ts:341,352,455-464 · ctx 타입 69) · MH.css:135-141 overflow-x hidden · 기본값 MH.ts:82 MASS_HAUL_BALANCE_KEY 더함 · state.ts:92 version 5→6 · view.ts:789 append → prepend · 시험 test_354_1:33 · test_354_3:67-87 · helper_354_2:26. +- 물음(추천): 도형 = 분배 그림 전부(평형선·띠·balloon) · 단추 글 「토량 분배」 그대로 · 고른 측점 점·말풍선 남김 · 공용 view 창 코드 남김(helper_230_2). +### 23 유토 [창 분할] 접어도 줄 남고 버튼 늘 보임 +- [창 분할] 머리줄 맨 앞(popout.ts:146-148) · 머리줄 접어도 남게(MH.ts:20,202 · MH.css:91-104) = 354-1 결정. +- 고침 MH.css: 91-93 height 0 · 99-104 머리줄 top:auto bottom:100%(손잡이 매달림 · 배수유역 접힘 꼴) · `.b05-profile__masshaul-overlay.is-collapsed:not(.is-popout) .b05-subpanel__popout{display:none}` · test_354_1:47-69 확인 더함 · test_224_1c:4. +### 18 자유지정 되돌리기 · 다시하기 +- 자유지정 = free.ts:205-363 단계(범위 → 시작 대기 → 점) 메모리 상태 · 끝 = dp.ts:328-345 applyEdits 큰 이력 한 걸음 · Esc = 버림(free_view.ts:169). +- 큰 이력 History.ts:202-285 세션 사진첩 100단 · 자유지정 중 Ctrl+Z = PT.ts:322 → 328-333 큰 이력 되돌림(흠) · ↶↷ 단추도 큰 이력(PT.ts:160-163 · Tools.ts:173-176) · 자유지정 안 되돌림 = Backspace 점 빼기뿐(free.ts:318-328). +- 고침: free.ts past/future · undo/redo/canUndo/canRedo · reset 비움 · Backspace = undo · PT.ts:160-163 자유지정이면 free 쪽 + freeView.redraw() · 328 분기 첫 줄 자유지정이면 free.undo/redo 후 return · 시험 helper_215_1 ⑥. +- 물음(추천): ↶↷ 단추 · Ctrl+Z 돌려 씀 · 한 걸음 = 범위·시작·점 전부 · 적용 막히면 자유지정 열린 채(applyEdits 성공 여부 돌려줌). +### 19 자유지정 녹색 +- Table.css:339-385 범위 띠 · 경계 · 점선 · 점 = --color-primary(보라 = 계획선과 같음) · .is-over = --color-danger(365-367 · 383-385). +- 고침: __line(355-359) · __dot(369-373) stroke --color-success(theme.css:38,332) · .is-over 빨강 유지 · test_215_1:136-142. +- 물음(추천): 범위 띠 · 경계 보라 유지 · 덧 = theme.css:343-376 OS 자동 어두움 블록에 success · danger 정의 없음(메울지). + +## 4장 종단 R 넣기 · 원지반 점 횡단 모달 · 추가 측점 (240-20 · 21) + +### 20 직선 중간 측점 ▲▼ → 그 자리 R · 이웃 R 과 접선 +- 계획고 길 하나 adjustStation(B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts:559-594) · 부르는 곳 ▲▼ Render.ts:391-394 · 표 입력 Render.ts:201-202 · 방향키 Panel_Tools.ts:230 · B06 중심점 ▲▼(Cross_Center.ts:6) · 끌기 없음 · 서버 짝 없음. +- 축 pivotAxes(logic/B05_Profile_UI_Profile_Pivot.ts:27-51) — :36 `if (same(index - 1, index)) return null;` 직선 안쪽 = 누른 점 하나만(355 「직선 안쪽 = 그대로」) · :30 꼭짓점 아님(index −1). +- 모든 측점 = 꼭짓점(Engine_Grade_Profile.py:213-224) · 꺾인 꼭짓점마다 곡선(buildCurves Alignment.ts:292-354 · 기본 L 15 m config_system_design.py:622 · 반쪽 상한 이웃 거리 × 0.45 :625) → P 만 올리면 P−1 · P+1 꺾여 R 생김(보고 그대로). +- 비슷: [직선화] tiltStraightRun(B05_Profile_Straighten.ts:197-247) 구간 가운데 꺾음 · R 키 박음(:244). +- 고침 Pivot.ts 한 파일: :36 지움 → P 좌우 같은 기울기 마디 건너 다음 R 점(없으면 시점·종점) 축 · 사이 점 새 직선 위 · 사이 R 키 지움(adjustStation :577-583) · P 에 기본 L 곡선 · 꼭짓점 아닌 P(약 3줄 · right = findIndex 구간 · left) · 시험 helper_355_1_pivot_tilt.cjs:135-148 ③ 바꿈 · ④ 더함 · test_355_1_pivot_tilt.py:59-60 · 머리 Pivot.ts:3-7 · Alignment.ts:557. +- 물음(추천): P 의 R = 기본 L 15 m(키 안 박음) · 흙덮기·기울기 막힘 = 지금처럼 막고 알림 · 355 「직선 안쪽 = 그대로」 뒤집음 확인. +### 21 원지반선 점 → 임시 횡단 모달 → [측점 추가] → 일반측점(점선) +- 특점 계산 없음 · 지반선 1 m 표본(config:260 → Engine_Sections_Core.py:371-373 · Longitudinal.ts:455-475) · 「특점」 = 「특정」 뜻(사용자요구_1010_2.md:318). +- 평면 우측 횡단 판 createCrossPreview(B05_Profile_UI_RouteEdit_Cross.ts:161 · createPane :88 비공개) → /route/cross-preview(Router_Terrain.py:148-228 · 계획고 = 지반 · 가까운 격자 측점). +- 임의 위치 자르기 있음: POST /section/preview-stations(B06_Section_Router_Stations.py:362-432 · 파일 안 씀 · 저장된 계획선 · 샘플링 조건 없으면 409) · 화면 previewStructureSections(B06_Section_Api_Fetch.ts:130) · 그림 buildCrossSvg · summarizeCross(RouteEdit_Cross_Draw.ts:111,39 samples·design 만). +- 비정규 측점 = 관·구조물만 심음(초안 design_store.ts:121-122 · 정본 design_save.ts:50-58) · 우클릭 mountStructureMenu(Profile_Structures.ts:76-128 · 측점선 6 px 안 삭제 :113-119 · 빈 곳 추가 :99-111) · 옛 createIrregularStationsSection 안 부름 · 선: 일반·BP --color-warning 실선(Style_Cross.css:474-487) · EP accent 4 3 · 구조물 자수정 5 3(:494-500 · B05 Style.css:155-159) · class Longitudinal.ts:427 · 끌기 구조물만 :411 · B06 목록 = cross 파일 + withDraftStations(Section_Drafts.ts:171-252) · 저장 ensure_structure_stations(Router_Stations.py:251) · 카드 이름 비면 칩 없음(Card_Chrome.ts:124-133). +- 측점 한 벌 짝: planStations/plantedChainages(common_util_structure_station.ts:185,236) ↔ plan_stations(.py:109) · resolve_extra_stations(Engine_Sections.py:269) · oneStationList(:259) ↔ _merge_irregular_into_longitudinal(Router_Confirm.py:295) · followMovedNodes(:281) ↔ _follow_moved_stations(Router_Confirm.py:204) · 거울 test_272_1 · test_322_3 · test_344_3 · planStations 부르는 곳 5(Page_Structures.ts:126 · Section_View_Profile.ts:112 · Section_Drafts.ts:191 · Sections_Stations.ts:296 · common_util_structure_attach.ts:80). +- 고침(작은 꼴): 자료 = 정수 m 목록 · 초안 plus-stations(b_page_state draft → 사진첩 History.ts:49-52) + design_store 키 · 정본 B06_Section/plus_stations.json GET/PUT(Router_Stations.py) · [저장] 차례 alignment 앞 · 심기 = planStations 끝에 붙임(owner plus-{m} · 이름 "" · 같은 m 관·구조물 이김 · 입력 setGeneralStations(:41) 같은 모듈 칸) · 서버 plan_stations(plus=()) + resolve_extra_stations 파일 읽음 · kind irregular + 이름 "" · 다시 셈 신호 watchDrafts(design_structure_status.ts:52) · Section_Drafts.ts:178-187 · 그림 irregularGraphStations(Profile_Layout.ts:54-70) plus:true(SectionStation B06_Section_Api_Types.ts:114) · Longitudinal.ts:427 --plus · :411 끌기 뺌 · css .b06-chart__station-line--plus{stroke:var(--color-warning);stroke-dasharray:5 3} · 삭제 Profile_Structures.ts:113-119 · 모달 새 파일 B05_Profile_UI_Profile_CrossModal.ts(종단 칸 안 · previewStructureSections + buildCrossSvg + attachSvgZoomPan + [측점 추가] · [삭제] · [닫기] · 열기 = 도구 꺼진 때 원지반선 근처 클릭 Render.ts:211 · elevationAtChartY). +- 물음(추천): 특점 = 아무 점 · 정수 m 스냅 · 이름 「12+7」 · 카드 이름 빈칸 · 모달 계획선 = 저장 기준(미리 뜨기) · [저장] 한 번 · 같은 m 막음 · 끌기 없음. + +## 5장 B06 횡단 형상 — 사면 이동 · 멈춤 · 벽 성토 이음 · 맹암거 (240-13 · 14 · 15 · 24) + +### 13 사면 좌우 이동 절↔성 넘어가면 기울기 없이 원지반에 붙음 +- 사면 이동 = 노견째 확장 shoulder_extend_{side}_m · 0.1 m · ◀▶/방향키 · 끌기 없음 · B06_Section_UI_Cross_Design_Pick.ts:487-490 → :321-325 shiftedExtend → :347-374 designLineMoves → B06_Section_UI_Page_Design_Sync.ts:74-79. +- 짝 common_util/common_util_cross_design_geometry.ts ↔ B06_Section/B06_Section_Engine_Design_Geometry.py · 거울 test_b06_cross_design_mirror.py. +- 원인: 쪽 역할(절/성) 판정이 노견 옮기기 전(TS :183-190 / Py :110-120) · 확장 그 뒤(TS :229-236 / Py :159-167) → 마루 넘어도 cut 그대로 → cutCrossDist(TS :369-388 / Py :363-385) 시작점에서 바로 끝 → designZ(TS :459-462 / Py :467-471) 원지반 → 직선. 성→절 fillCrossDist TS :390-411 / Py :411-437. +- 고침(짝 둘 다): 확장 블록을 tilt 블록 바로 뒤(TS :181 뒤 · Py :104 뒤)로 · 거울 사례 :216-228 이름 · 「마루 너머 = 성토 1:n」 사례 더함 · section_mode 따라 바뀜(14 키 문제). +- 물음(추천): 절→성 넘어간 쪽 측구 = 자동 판정 따라 사라짐(사용자가 켠 측구 유지). +### 14 이동 중 절도 성도 아닌 점에서 멈춤 + 교차점 다시 고름 +- 뜻 = 옮긴 노견 끝이 원지반과 딱 만나는 extend(사면 길이 0). +- 지금: 0.1 m 반올림(:324)으로 건너뜀 · 사면 0 이면 조각 없음(MIN_PIECE_M :46) · 고름 키 = 갈래+쪽+차례(pieceKeys :141-153 · crossZoneAt :76-105 section_mode) → 13 고치면 넘어가는 순간 키 cut→fill → pickedLineAt(:282-287) null → 창 닫힘 · 교차점 판정 원 없음(centerHit :449 · Cross_Center.ts:70-77). +- 고침(TS 만): designLineMoves Pick 에 samples · shift.stopAt(side, now, next) — 원지반 − 노면 평면(road_edges 두 점) 부호 바뀌면 그 extend 로 섬(보간) · step(:487-490)만 · 계산 함수 logic/B06_Section_UI_Cross_Fit.ts(지반 보간 groundInterpolator logic/B06_Section_UI_Cross_Culvert_Solve.ts) · 손잡이 = toeOffsets(Fit.ts:35-57) 자리에 쪽마다 원(attachDesignLinePick :439-457 · 키 toe:left|right · axis x · setActive :548-600) · 키 이어받기(cut/fill 못 찾으면 같은 쪽 toe:) · Node 시험. +- 물음(추천): ◀▶ 한 번에 그 점에 섬 · 손잡이 늘 보임. +### 15 벽 형상 성토 상단 연결 0.1 m · 바닥 시작 = 전면 경사 ∩ 하단 수평선 +- 공용 B06_Section_UI_Cross_Wall.ts:69-110 buildRevetWallGeometry(배면 수직 · 윗변 1.5t · 전면 1:n · 바닥 = 기준 −0.5 수평) · 부르는 곳 넷: Culvert_Geom.ts:314-402 buildWall · Culvert_Extra.ts:328 다단 · Cross_Revetment.ts:238 C군 · Cross_Body_Guard.ts:120 probe. +- 쓰는 구조물(common_util/common_util_structure_parts.json): 배관 유입·유출 흙막이(관보호공) + 다단 · BOX · 세월교 유입·유출 흙막이 · 기슭막이(꺼짐) · 옹벽(물빼기) · 흙막이(soil_guard) · 돌쌓기 찰·메 · 큰돌쌓기(뒤 셋 꺼짐) · 집수정 제외. +- 지금(t=0.45 logic/B06_Section_UI_Cross_Culvert_Const.ts:25): 상단 = topJoint = 배면 + t/2(Wall.ts:80) = 앞 모서리 0.45 m 안쪽 · 쓰는 곳 fillSlopeOf Solve.ts:150 · Extra.ts:362-365 · Revetment.ts:288-317 · Geom.ts:380-392 · 3D B05_Profile_UI_Corridor_Station_Structure.ts:312,324,330 · 0점 slopeZeroAnchor Tiers.ts:24-29 · Revetment.ts:210-211 · jointRunOf Extra.ts:212-214 · 바닥 = 바닥+0.5 ∩ 전면(Extra.ts:370-377) · 관 세트 첫 시작 = 관 하단 꼭짓점(Geom.ts:510 · Tiers.ts:31-41) · 숨은 관 유입(Geom.ts:512-516 · Body_Guard.ts:289-302) · C군 2단 tier1.bottomFront(Revetment.ts:260). +- 고침(TS 만): Wall.ts 반환 fillTop = topFront − outward·0.1(윗면 표고) · 필드 Culvert_Types.ts:124-131 · topJoint 무늬 이음선(Wall_Hatch.ts:275) 그대로 · 성토 목표 topJoint → fillTop 다섯 곳 · 0점 t/2 → 1.5t − 0.1(Tiers.ts:29 · Revetment.ts:211 · Extra.ts:213 — 안 고치면 노폭 연장 +0.35) · 바닥 Extra.ts:370-377 → wall.bottomFront · Geom.ts:510 · 512-516 도 · 다시 지음 build:server-calc · corridor · b07-extent · 시험 test_b06_wall_shape_unified · helper_79/80/186_1. +- 물음(추천): 기본 벽 자리 = 새 연결점 기준 0.35 m 도로 쪽(노폭 연장 0 유지 · 관 길이 바뀔 수 있음) · 관 유출 바닥 시작 = 벽 발끝 · 세월교·박스 수평공간 그대로. +### 24 맹암거 — 암거 경사가 노면을 기울임 +- 암거 경사(M02 기본 3 % 구조물정의.json:693-697) → common_util_structure_underdrain.ts:47 ↔ B06_Section_Engine_Tilt.py:59 · tilt 범위 Tilt.py:80-81 ↔ logic/B06_Section_Cross_Enforce.ts:66-67 · tiltPct B06_Section_Cross_Refresh.ts:438 · design_pipeline_cross.ts:69 · 노면 횡단경사 common_util_cross_design.ts:324-326 ↔ B06_Section_Engine_Design.py:258-259 · 그림 B06_Section_UI_Cross_Underdrain.ts grade = 노면 끝 두 점(:96) · 옵셋선 = 노면 − 높이 평행(:54) · 절토 교점(:62-65) · 돌 띠(:142-148). +- 원인: 암거 경사가 노면 경사로 들어가고 하단 = 노면 평행. +- 고침: 노면 = 표준(Tilt.py:81 None ↔ Enforce.ts:67 null · Refresh.ts:438 · pipeline_cross.ts:69 `?? section.underdrain?.slope_pct` 지움 · tilted · 물넘이 그대로) · 하단 = 암거 경사(underdrainOutline :87 slopePct · bottomZ(o) = 높은 쪽 노면 끝 z − H + g·Δo · sidePath · 교점 (bottomZ − edge.z)/(k − g) · 돌 띠 · 그림 전용 · 파이썬 짝 없음) · 저장분 Router_Design.py:249-250 tilt 다르면 다시 셈 · 시험 test_288:89-91,113-147 · helper_288 · test_349_0n · B07_DesignDetail_Cross_Overlay.ts:493 같은 함수 → build:b07-extent. +- 물음(추천): H = 높은 쪽(상류) 노면 끝 · 노면 기본 = 표준 경사 낮은 쪽 한 경사 · 측구 없음(288-1). + +## 6장 B06 횡단 UI — CAD 글 · 관 기울기 글 · 암 경계선 공용 칸 (240-9 · 16 · 22) + +### 9 상세 CAD 칸 +- 대상 A~G·기타 전부 · 관 지점 + structures.json · 이름 = 구조물정의 종류 이름(TS loadNoteThings B06_Section_UI_Cross_Detail_Cad.ts:235-278 ↔ Py _things B07_DesignDetail_Engine_Cad_CulvertNote.py:206-235). +- 줄: structureNoteLines :164-179 ↔ structure_note_lines :109-129 — 조합 연결 = 조합 이름 · 없으면 「{종류} 조합 미지정」(:176 / Py :127) · 연결 없는 배관 줄 없음 · 뒤에 옵션 줄(Node B07_DesignDetail_Note_Options_Node.ts). +- 측점: noteEntities :217-231 ↔ note_entities :185-203 = [측점, ...줄] · 측점 이미 한 번. +- 채움: 칸 빌 때만 (firstNoteCad :282-293 · Py :300). +- 고침: :176 · Py :127 → 종류 이름만 · 머리 주석 :10 :161 / :10 :112 · 시험 test_265_note_cad.py:127-128 · test_166_1_note_options.py:110 · Node 번들 재빌드 불필요. +- 물음: 같은 측점 같은 종류 둘 = 한 줄(추천) · 저장된 칸 그대로(추천). +### 16 관 L 뒤 기울기 +- B06_Section_UI_Cross_Culvert.ts:316 `관매설 {관종}Φ800m/m, L=8 m (7.6)` · :318 appendPipeInfoText(_Culvert_Types.ts:57-76) · 자리 = 노폭 라벨 위 13px(_Cross_View.ts:521-525). +- pipe.slopePct (_Culvert_Geom.ts:291 · 유출 벽 :483-487 · 역경사 0 :280) · 지금 툴팁 :321 만 · 저장 design.pipe_slope_pct(Structure_Layouts.ts:243 · B08). +- 세월교 = hidden_pipe(common_util_culvert_sets.ts:331) 저절로 빠짐. +- 고침: :316 끝 `, S=x.x%` · 툴팁 「매설 경사」 지움 · 서버 묶음(server-calc · corridor · b07-extent) 이 파일을 실음 → 다시 지음. +### 22 암 경계선 고름 · 키 · 끌기 · 공용 칸 +- 암 선 그림 _Cross_View.ts:533-542 → _Design_Surface.ts:6-31 점선만(판정 선 없음). +- 암 조작 = 아래 띠 왼쪽 Card_Chrome :162-184 · buildRockBoundaryControl(Cross_Design :238-314 ▲▼↺ 값) · 길게 누름 :213-235 · 저장 Page_Persist.ts:239-317 걸음 0.1 · 기본 −0.5(Schema.py:341-342). +- 선 고름 Design_Pick :389-602 · 키 기억 :280-293 · 하나만(_Cross_View.ts:311-330) · 우측 위 라벨 .b06-cross-card__line-dims(Design_Pick :459-461 · :559-563 · View :682) · 떠 있는 조정창 Design_Pick :469-527(View :684). +- 방향키 Panel_Base.ts:263-294 · 끌기 본보기 _Cross_Center.ts:91-145. +- 고침: Design_Pick 에 rock 축(▲▼↺ · ◀▶ 막음) · 판정 선 · bindCenterShift 축 인자 세로 끌기 · View :604-612 · :682-684 라벨 · 조정창 → 띠 · Card_Chrome 왼쪽 칸 = 공용 칸(고른 것 없으면 암 · 고르면 그 선) · CSS Controls.css :226-257 · Cross.css :631-635 · Areas.css :219 · 시험 test_137_design_pick.py:103-112 · test_179_1_line_dims_left.py · test_318_cross_card.py(+helper_318). +- 물음(추천): 떠 있는 선 조정창도 띠로 합침(구조물 조정창 그대로) · 토사 측점도 띠 · 안 골랐을 때 암 ▲▼ 상시 · 암 끌기 세로 · 값 한 줄 · 암 키는 암만. + +## 7장 배수 구조물 자리 (240-7) + +약칭: detail=common_util/common_util_drainage_detail.py · geom=common_util/common_util_route_geometry.py · pipes=common_util/common_util_drainage_pipes.py · snap=common_util/common_util_initial_snapshot.py · cfg=config/config_system_design.py · chain=B03_FileInput/B03_FileInput_Service_Chain.py · basins=B04_PreProcess/B04_PreProcess_Router_Basins.py · analyze=B04_PreProcess/B04_PreProcess_Engine_Watershed_Analyze.py · fetch=B04_PreProcess/B04_PreProcess_Api_Fetch.ts · save=B05_Profile/B05_Profile_Route_Save.py · parts=B05_Profile/B05_Profile_Route_Save_Parts.py · life=B05_Profile/B05_Profile_Router_Lifecycle.py · rinit=B05_Profile/B05_Profile_Router_RouteInitial.py · chrome=B05_Profile/B05_Profile_UI_Drainage_Chrome.ts · panel=B05_Profile/B05_Profile_UI_Drainage_Panel.ts(700줄) · live=B05_Profile/B05_Profile_UI_Drainage_Live.ts(269줄) · sugg=B05_Profile/B05_Profile_UI_Drainage_Suggest.ts · lsugg=B05_Profile/logic/B05_Profile_Drainage_Suggest.ts · hist=B05_Profile/B05_Profile_UI_Profile_History.ts · loc=ui_template/ui_template_locale_b2.ts +### 지금 +- 관 자리 = 서버만(TS 짝 없음): ① 세류선 교차 geom:626-660 find_stream_crossings · analyze:342-351 _base_pipes 5 m 합침(cfg:117) ② 100 m 보충 cfg:115 DRAINAGE_PIPE_MAX_SPACING_M env 기본 100 · detail:385-412 place_pipes · :415-443 _fill_gap n=ceil(L/100)−1 · :446-472 _best_position(흐름 0.7 + 계획고 오목 0.3 · 성토 ×0.5 :63-67 · source "spacing"). +- 합침 detail:181-197 build_detail — 목록 없으면 기본 + 보충(:197) · 있으면 그대로 + 후보만(:184 · :475-490). +- 노선 [저장]·추천 [적용] = save:188-219(좌표 따라감 :207 → 새 교차점 기본 관 parts:76-96 → 100 m 넘는 구간 지반 오목 보충 :211 · parts:99-147). +- 언제: 자동설계 체인 chain:305 → 분석 :97 → put_pipe_points(None) :109 → _build(None) → 등록부 기본값(basins:96-109) → pipe_points.json + 04_detailed_basins.geojson(basins:566-577) → 종단 다시 셈(chain:77-79) → 초기값 스냅샷(chain:338 · snap:38-43) · B04 재확정 chain:578(저장분 투영 pipes:300-354) · [초기화] life:232-246 · 자동 배치 길 셋 더(DELETE 배관 배치 초기화 basins:524-540 즉시 지움 · 저장분 없는 GET :498-505 · points 없는 POST :508-521). +- 배수유역 칸: [유역 재분할](panel:425 · 툴팁 loc:37 「자동 보충」 낡음) · [관 삭제] · [배관 배치 초기화](chrome:91-97 → panel:421,438 · loc:45-49) · ⚙ 수동/자동(live:197-224) · 흐림 + [업데이트] /drainage/live(live:115-173) · 제안 목록 pipe_candidates(basins:384-388) 「제안 N건」 [적용] 관경·시설·관 자리 한꺼번에(lsugg:64-83) → POST detail-basins → 세션 초안(live:94-100) → [저장] PUT · 낡으면 꺼짐(sugg:88-91) · 점선 원(panel:279). +- 흠: [적용]으로 더한 관 = 요청 목록 안이라 「새 관」 아님(basins:97-102) → 등록부 기본값 못 받음 → 관경 빈칸 → B06 세트 건너뜀(B06_Section_Engine_Culvert.py:618-619). +- 되돌리기 = 사진첩(hist:14 · 400 ms 뒤 한 장 hist:36). +- 근거: 현행 시행규칙 별표2 간격 문구 없음(「수리계산과 현지여건」 현행_20260201.xml:5828) · 100 m = 2019판 교본시점_20191202.xml:4653 「기본적으로 100미터 내외」 · 임도규정 별표7 산불진화임도 :123 · technical_info/01_임도/02_상세설계/배수시설_배치.md:55,60 「계곡 교차점 = 필수 · 간격 = 보충」(60~100 m). +### 고칠 자리(새 라우트 없음 · POST detail-basins 몸통 auto 칸) +- detail build_detail(..., auto=None): 기본 = 세류선만 · "all" = place_pipes · "add" = 목록 + 후보 · 후보 두 갈래 모두. +- basins _build: "all" = 자리 새로 · 같은 자리(0.05 m) 관 속성·id 유지 · 나머지 새 관 기본값 · _retag(:279-287) · _resolve(:446-488) · _build_cached(:169-188) · _detail_key(:135-155) 에 auto. +- 노선 저장 오목 보충 끔: save:210-211 · parts:42-45,99-147 · save:164-185 · test_346_3_route_save.py:94-116 · RouteEdit_Apply.ts:131 · Api_Replan.ts:133 concave. +- 글: analyze:345 · chain:108 · basins:5,84 · loc:37,47. +- 화면: fetch:624-632 computeDetailBasins(pid, points, auto?) · [배관 배치 초기화] 자리 = [자동 제안] · ⚙ 모달 틀 복사 두 줄(① 전체 자동 · ② 지정 포함 추가) · runner.run → rememberPipes · 배선 live · panel :419-421 지움 · :438 한 줄. +- 미리보기: ② = 점선 원 · 목록 그대로 · ① = 초안만 · 정본 [저장] · 되돌리기 한 걸음(400 ms 넘으면 덮임 확인). +- 시험: 세 모드. +### 물음(추천): 노선 저장 오목 보충 끔 · 저장된 spacing 관 · 스냅샷 그대로 · [배관 배치 초기화] 즉시 지움 없앰(⓪ 세류선만 · ① · ② 모두 초안만) · ① 같은 자리 관 속성 유지 · 목록 [적용] = 관경·시설만 · 간격 100 m 고정. + +## 8장 M02 · B08 거리이정표 · 돋보기 (240-5 · 6 · 12 · 17) + +### 5 실무자료 [저장] → 개인 전용 +- 실무자료 = 화면 층 폴더 실무자료/.json(M02_Hopyo_Store.py:1) · 올리기 = 그 층 쓰기 권한(M02_Labor_Router.py:246-260). +- 컨테이너 = 화면 층(M02_MasterTemplete_Hopyo_Side.ts:38 pageScope) · 엑셀 보기 창 열 때 target 안 넘김(:110-120) → Hopyo_Sheet.ts:145 opt.target ?? opt.scope = 화면 층 → :467 buildHopyo 그 층 · 확인 창도(Hopyo_Check.ts:222,412) · 별칭 장부도 그 층(M02_Hopyo_Build.py:318). +- 저장 권한: 화면 canEdit(UI_Side.ts:179 · UI_Main.ts:110-112 · Hopyo_Sheet.ts:168) · 서버 만들 층 쓰기(M02_Labor_Router.py:368-382 · M02_Layer_Access.py:61-80). +- [로직 추가] 실무 호표 길 = 문서 층(Hopyo_Pick.ts:55-60,90-96 · 위 층만 참조 M02_Labor_Ref.py:98-107). +- 고침: Hopyo_Side.ts:110-120 target {layer:"personal", owner:null} · canWrite:true · onDeleted 는 화면 층 쓰기 권한 있을 때만(Sheet.ts:212) · 서버 그대로(회사 없는 사용자 409 아님 — 개인). +- 가져오기: 사전조합 다른 층 직접 복사 = 서버만(M02_Labor_Router.py:103-125 본뜬{층,주인,키}) · 화면 [복사] 같은 층만(Library_List.ts:197-206) · 간접 = 구조물 카드 [가져오기](Structure.ts:305-336 · Layer.ts:135-186 「다른 사람」 탭) → Router_Items.py:354-381 → Store.py:574-576 refs.carry → 개인 사전조합 새 SC 키 복사(M02_Labor_Ref.py:329-349). +- 결함: 복사 때 본뜬을 원본 참조로 덮음(Labor_Router.py:99-100 · Labor_Ref.py:344) → 실무자료 표시(Build.py:68) · 본뜬.전국자재 보기 줄(Labor_National.ts:24-25) 사라짐. +- 물음(추천): 개인 = 로그인한 사람 · [로직 추가] 길 그대로 · 단독 복사 단추 없음(간접 길) · 복사 때 전국자재 지킴. +### 6 단가산출 지정영역 = B:F +- 근거 [엑셀 보기](Hopyo_Check.ts:383-391) → Hopyo_Sheet.ts:371 select(rowsText(..),"단가산출") · rowsText "4:9" 행 전체(:130-132 · spreadsheet_selection.ts:95-106) · 일위대가 = B{r0}:{끝열}{r1}(:104-105,252-253). +- 고침 Hopyo_Sheet.ts:131-132 `B${a}:F${b}` 한 줄 · 서버 열 정보 없음(M02_Hopyo_Grid.py:208-212 · Basis.py:87-98) → F 고정 · 시험 test_m02_hopyo_screen.py:290 · test_m02_hopyo_seam.py:56. +- 물음(추천): 시작 열 B(산출근거 B열 Basis.py:4 · 일위대가와 같음). +### 12 B08 거리이정표 +- 주소: 등록·수정 모달은 연결 무관 소재지 있음(B08_Quantity_UI_Milestone_Modal.ts:135-139,186-206 · Diagram.ts:164-170) · 막힘 ① 연결선 모달은 선 있어야(Layout.ts:302 → LegModal.ts:159-160) ② 경로 탭 지도 onClick·center 없음(UI_Milestone_Route.ts:174-177 · 안 이은 상자 자기 표지만 :136 · 좌표 없으면 지도 숨김 KakaoMap.ts:137-139) · 운반 자동 상자(주소·선·좌표 없음 B08_Quantity_Haul.py:116-127) 경로 탭에서 주소 못 넣음. +- 연결 저장: 녹색 점 끌어 놓음(Diagram.ts:254-276) → 연결 대상 · 구간 비움 → findSegmentKm(State.ts:290-330) · auto_km 캐시만(:319-322) · 서버 [저장] 때(:146-157) · 길 선 메모리만(State.ts:281-283) · 서버 Leg = road·km·auto_km(Router_Milestone.py:104-107) · [저장] 뒤 카카오 다시(:346-358). +- 다시 이음: 길찾기 실패·좌표 없음이면 옛 경로 메모리에 남음(State.ts:300-303,316) → 옛 선 보임(Route.ts:141-146 · LegModal.ts:201-204) · 안 이은 기준점에 이으면 사슬 끊김(Layout.ts:280,548-549). +- 녹색 = 연결 점 원 Diagram.ts:215-217(왼위 +10 · r 6) · CSS B08_Quantity_UI_Milestone.css:259-269(opacity .55 · 호버 1). +- 고침: Route.ts:174-177 editMap onClick moveTo · center startPoint(Place.ts:57-61 꼴) · 머리 줄 [소재지] → openPlaceModal 재사용 · path 칸(Milestone_Calc.ts:138-179 · Router_Milestone.py:116-127 Place · 점 수 상한) · State.ts:317-318 자료에 적음 · segmentPath 자료에서 · 다시 이음(Diagram.ts:273) · 수기(LegModal.ts:271) path=null · 녹색 r 6→9 · +10→+12 · opacity .85 · test_254_2_b08_milestone_diagram.py:117. +- 물음(추천): 주소 입력 자리 = 경로 탭 · 경로 좌표 저장(소수 5자리 · 점 줄임) · 캐시 + [저장] · 다시 이으면 옛 km·선 지우고 새 값·선(실패면 빈칸 + 까닭) · 안 이은 기준점 「시점 미연결」 표시. +### 17 돋보기 +- ui_template/ui_template_loupe.ts(붙임 A00_Common/main.ts:62) · 켤 때 #app DOM 복제(:245 · captureInto :347-374 · walk :376-405 getBoundingClientRect · 2D canvas drawImage :407-413) · 움직임 transform(:316-325) · #app 관찰(:304-313) · 0.5 s 스로틀 통째 다시 뜸(:281-287) · 스크롤(:288-295). +- 원인: 모달 = document.body 에 붙음(ui_template_modal.ts:57) → #app 밖 · 모달 첫 입력칸 초점(modal.ts:60) → Z 키 글 입력(loupe.ts:204-206) · 끊김 ① 호버 class·style 변화 → 속성 관찰 → 0.5 s 마다 통째 복제(스로틀) ② stage 합성층 아님(ui_template_loupe.css:28-35 · will-change 원 :20 만). +- 고침: 소스 = body(loupe.ts:245 → win.document.body) · :272 원·배율 글 doc.documentElement 에(자기 복제·관찰 안 걸림 · ponytail 비표준 — 싫으면 body + walk 에서 .ui-loupe* 숨김) · refresh 스로틀 → 디바운스 · 그래도 끊기면 stage 이동 전용(will-change) + 안쪽 확대 상자 · 시험 helper_218_1_loupe.cjs:494,550. +- 한계: WebGL canvas 빈칸(preserveDrawingBuffer 없음) · CAD iframe 빈칸 · 호버 모양 안 옮김 · 변화 = 멈춘 뒤 0.5 s. +- 물음(추천): 모달 입력칸 Z 키 안 켬(우클릭 길게 누르기) · WebGL 빈칸 받아들임.