From 0c2ce402f0b517fb72d6c81be37b1d488510fabf Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 18 Oct 2026 08:56:20 +0900 Subject: [PATCH] =?UTF-8?q?chore(=EC=A1=B0=EC=82=AC):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=20252=20=EB=B6=84=EC=84=9D=20=E2=80=94=20=EA=B3=A1=EC=84=A0=20?= =?UTF-8?q?=EC=B8=A1=EC=A0=90=20=C2=B7=20R=20=EB=92=A4=20=EC=B8=A1?= =?UTF-8?q?=EC=A0=90=20=EB=A7=9E=EC=B6=A4=20=C2=B7=20=EB=A7=88=EC=BB=A4=20?= =?UTF-8?q?=EB=A7=A8=20=EC=9C=84=20=C2=B7=20=EC=A2=8C=ED=91=9C=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=EA=B0=90=20=C2=B7=20=EC=98=AE=EA=B9=80=20=ED=9D=A0=20?= =?UTF-8?q?=EC=9B=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01C6BNBFXFndbqYxu6sZuknK --- docs/raw/조사/2026-10-18_407_요구252_분석.md | 100 +++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 docs/raw/조사/2026-10-18_407_요구252_분석.md diff --git a/docs/raw/조사/2026-10-18_407_요구252_분석.md b/docs/raw/조사/2026-10-18_407_요구252_분석.md new file mode 100644 index 000000000..d28837f5e --- /dev/null +++ b/docs/raw/조사/2026-10-18_407_요구252_분석.md @@ -0,0 +1,100 @@ +# 요구 252 분석 — 곡선 측점 · R 바꿈 뒤 측점 맞춤 · 구조물 측점 마커 + +## 1. 검증 프로젝트 id (252-1) + +- 에이전트가 프로젝트 id 를 찾는 문서 = `OWNERS.md` 표(서브 여덟 폴더 = 메인 파일 링크 · git 밖 · 데스크탑은 시놀로지) → 새 id 13 개로 바꿈(10-18). +- 옛 id 를 쓰는 곳: 지난 기록(`docs/raw/plans` · `docs/raw/조사` · `요구_10xx`) = 이력이라 그대로 · `resources/tester` 일부 시험 · 견본(옛 프로젝트 자료에 맞춘 것) = 배정 프로젝트 없음으로 건너뜀(9 skipped) — 사용자 말 「없다면 무시」에 따라 손대지 않음. + +## 2. 곡선 측점 (252-2) + +지금: +- 덧 측점(이형 측점)을 심는 것 = 관 · 구조물(횡단도 부품 `anchor` · `span3`) · 사용자 덧 측점뿐 — 곡선 점(BC · MC · EC)은 어디서도 측점이 안 됨(`common_util_structure_station.py:121-216` ↔ `.ts:237-307`). +- 곡선 관련 측점 = 요구 224-2 「호 사이 측점은 호 가운데로」 하나 — [측점 스냅] 켬일 때 호 안 일반측점 하나를 MC 로 **옮김**(`B05_Profile_Engine_Sections_Core.py:298-324` `snap_curve_stations` ↔ `logic/B05_Profile_UI_RouteEdit_Frame.ts:165-183`) · 옮긴 측점은 일반측점 이름 그대로 · 원래 자리(20 m 배수)는 사라짐 · 측점 수 그대로(`test_224_2:239-244`). +- 빈틈: + - 스냅 끔 = MC 측점 없음. + - 호가 짧아 안에 일반측점이 없으면 = MC 측점 없음. + - 스냅 간격 0.1 · 1 · 10 m 또는 맞춤 실패 = 일반측점(예 No.5 = 100 m)이 107 m 로 옮겨져 20 m 격자가 깨짐. + +정함(브레인): +- 224-2 「호 안 측점은 호 가운데로」 그대로 — 스냅 켬 · 호 안에 일반측점이 있으면 지금처럼 그 측점을 MC 로 옮김. +- 그 밖에 MC 에 측점이 없으면(스냅 끔 · 호가 짧아 안에 일반측점 없음) MC 자리에 **곡선 측점**(새 종류 `curve`) 하나를 더함 · MC 가 일반측점 값(스냅 간격 자릿수로 반올림 · 20 m 배수)과 같으면 더하지 않음. +- 곡선 측점 값 = 스냅 간격 자릿수(0.1 = 소수 한 자리 · 그 밖 · 스냅 끔 = 정수 m · 390-5 규칙). +- BC · EC 는 더하지 않음(지식DB `산림과임업기술(임도)/2. 임도/4. 노선측량.md:144` = BC · MC · EC 보조측점 · 사용자 규칙은 MC 하나 · 곡선마다 둘씩 늘면 횡단 계산이 크게 늚) — 사용자가 원하면 같은 길로 더함. +- 이름 = 「No.5+7 (MC)」 꼴 · 열쇠 = `curve:<누가거리>`(`common_util_station_key` 짝) · 종단 · 횡단(B06 카드) · 평면 눈금 모두 한 목록으로. + +바꿀 곳: +- 서버 `generate_sections`(Core.py:388-415) ↔ TS `buildStations`(`logic/B05_Profile_Sections_Stations.ts:281-311` · `gridIndices` 가 곡선 측점에 격자 번호를 주지 않게). +- 종류 · 열쇠: `StationKind`(`A00_Common/design/logic/design_pipeline_types.ts:156`) · `stationKey`(Sections_Stations.ts:72-82) · `common_util_station_key.py ↔ .ts`. +- `irregular` 로 두지 않음 — `_merge_irregular_into_longitudinal`(Router_Confirm.py:327) 이 지우고 `oneStationList` · `setGeneralStations` 가 걸러냄 · B06 `_stale_marks`(B06_Section_Router_Stations.py:153)가 낡음으로 셈. +- B06 종류 갈래: `B06_Section_Station_Keys.ts:118` · `B06_Section_Section_Drafts.ts:212` · `logic/B06_Section_Station_Swap.ts:145` · `B06_Section_UI_Longitudinal.ts:411`. +- 평면 눈금: `UI_RouteEdit_SnapStep.ts:93-100`(스냅 끔 = null) · `UI_RouteEdit_Render.ts:476-486`. +- 거울 시험: `test_344_3_pipeline_stations_mirror` · `test_344_3_station_key_mirror` · `test_224_2_station_snap`(옮김 그대로 · 더함 경우 추가) · `test_390_5_snap_step_ops`. +- 곡선 측점은 새 열쇠라 종단 · 횡단 초안 없음(자동 설계) · 노선이 바뀌면 MC 따라 새로 생김(옛 곡선 측점 초안은 400 이월 규칙 = 옆 1.0 m 안이면 이어받음). + +## 3. R 바꿈 뒤 뒤쪽 측점 맞춤 (252-3) + +답: **있음** — 반지름 · 곡선 길이 입력(`UI_RouteEdit_CurveBar.ts:66-87`) → `applyEdit`(`UI_RouteEdit.ts:435-445`) → `fitCurveStations(…, k-1)`(`StationFit.ts:142-177`) = 교점 끌기 · 방향키와 같은 함수 · 고친 곡선부터 끝 곡선까지 MC 를 다시 측점에 맞춤(뒤 교점을 들어오는 접선 따라 밂). + +빈틈: +- 조용히 빠짐 — 고정 교점(`apexLock`) · 풀이 실패(기울기 0.2 아래 · 10 걸음 안 수렴) · 곡선 한계 새로 깨짐(`shortfallCrossed`) · 앞 곡선 MC 가 tol/5 넘게 밀림 → 그 곡선은 말없이 「측점 밖」 개수로만(StationFit.ts:159-172) · 큰 R 은 접선이 직선 절반에 막혀 이 경우가 잦음. +- 상태줄에 「함께 밀린 교점」 보고 없음(방향키만 `KeyNudge.ts:63-96`). +- 입력 중 미리보기 없음(`change` 때만 · Label.ts:243). +- 시험 없음 — R 바꾼 뒤 뒤쪽 MC(`helper_398_2` 는 고친 곡선만). + +정함(브레인): +- 뒤쪽 맞춤은 지금 함수 그대로 씀(재활용) · 고칠 것 = ① R · 곡선 길이 입력 뒤 상태줄에 「실제 바뀜 · 함께 밀린 교점 N곳 · 못 맞춘 곡선 No.…」(KeyNudge 재사용) ② 못 맞춘 곡선은 252-2 곡선 측점으로 자연히 측점이 생김 ③ 시험 = R 키운 뒤 뒤쪽 곡선 MC 가 측점 위(측점 밖 개수 안 늘어남). +- 풀이 실패 줄이기(접선 절반 막힘)는 이번에 안 함 — 398-4 접선 규칙 그대로(251). + +## 4. 구조물 측점 마커 — 맨 위 · 다른 곳 누르면 고름 풀림 (252-4) + +지금(`B05_Profile_UI_RouteEdit_Render.ts:155-323` 한 캔버스 차례): +- 마커(`drawStructureMarks` :258) 위에 교점 원 · 삼각 · 곡선 손잡이 · 곡선 3점 · 마우스 올림 고리(:260-321)가 그려짐 → 마커가 가려짐. +- 누름 차례(`UI_RouteEdit_Pointer.ts:198-284`) = 교점(12 px) → 곡선 손잡이(14 px) → 마커(10 px · :242) → 측점 눈금 → 호 → 등고선 · 마우스 올림 · 커서도 교점 먼저(:361-374). +- 고름 풀기 없음 — 마커 고름 = 공용 세션 `structure-pick`(`A00_Common/design/design_selection.ts:112-190`) · 교점 · 손잡이 · 호 · 빈 곳 · 등고선을 눌러도 안 풀림 · Esc 없음. + +정함(브레인): +- 그리기 = 마커를 맨 마지막(마우스 올림 뒤 · `context.restore()` 앞) · 누름 · 마우스 올림 · 커서 = 마커 먼저(측정 · Shift 다음) · 마커를 누르면 고른 교점 풂(마커 방향키가 교점 고름 때 막힘 · Marks:358). +- 마커 아닌 곳을 누르면(교점 · 손잡이 · 호 · 눈금 · 빈 곳 · 등고선) 마커 고름 풀림 · Esc 도 풂 · 오른쪽 횡단 판은 마지막 측점 그대로(비우지 않음 · `PLAN_PICK_FROM`). +- 시험 `test_399_plan_structure_marks.py:73-86`(지금 차례를 잠근 것) 새 차례로 고쳐 씀. + +## 5. 구조물 자리 = 등고선 좌표(x · y) 지킴 (252-5) + +지금: +- 규칙 · 코드는 이미 좌표 따라감 — 초안(`A00_Common/design/design_pipeline_page.ts:312-324` → `common_util_route_follow.ts:59-192`) · 저장(`B05_Profile_Route_Save.py:383-387` → `common_util_route_follow.py:77-114` · 관 `common_util_drainage_pipes.py:271-297`). +- 그런데 사용자가 본 「번호 유지」 = 흠 둘이 만든 것: + - 마커로 옮긴 구조물은 누가거리만 바뀌고 x · y 는 옛 값(`B05_Profile_UI_Structures_Snap.ts:27-39` `movedStructure`) → 다음 교점 · R 고침 때 옛 자리로 튀어 돌아감. + - 배수 편집기(`B05_Profile_UI_Drainage_Panel.ts:150-153 · 405-408` `rememberPipes`)가 관 하나만 고쳐도 모든 관을 옛 노선 누가거리로 다시 써서 따라감 결과를 버림(PipePage:603) → 관 번호가 그대로 남음. +- 저장 x · y 채움(`B05_Profile_Structures_Router.py:356-363`)은 누가거리 · 시종점이 그대로일 때만 옛 x · y 유지 · 아니면 누가거리로 다시 셈. + +정함(브레인): +- 구조물 · 관 자리 = 처음 놓은(또는 마커로 옮긴) x · y · 노선이 바뀌면 그 x · y 를 새 노선에 투영해 누가거리를 다시 매김(정수 m 반올림 = 사용자가 말한 미세 이동) · 측점 번호는 따라 바뀜. +- 마커로 옮기면 그 자리 x · y 를 새로 적음(노선 위 점) — 사용자가 고른 새 자리가 기준. +- 배수 편집기는 따라간 누가거리를 받아 씀(옛 값으로 덮지 않음) · 관 초안에 x · y 실음. +- 사토장 · 토취장(측점 안 심는 「자리」 종류)은 지금처럼 가까운 일반측점에 붙음. +- 서버 저장도 같은 규칙(x · y 기준 · 파이썬 짝 `common_util_route_follow` · 거울 시험). + +## 6. 마커 옮기면 새 측점 · 오른쪽 횡단 빔 (252-6) + +원인(코드로 확인): +- **A 오른쪽 횡단 빔(확실)** — 구조물 · 관을 고르면 `Cross.follow` 가 `watching.structure = true` → `redraw()` 가 바로 돌아감(`B05_Profile_UI_RouteEdit_Cross.ts:272 · 343-347 · 394-395`) = 382-2 때 「구조물 고름 = 마름모만」 규칙의 남은 자리 · 399 가 마름모를 지우며 이 규칙을 남김 · 구조물 옮긴 뒤 다시 고름 없음(`B05_Profile_UI_Structures_Panel.ts:675-682`). +- **B 앞 관을 지나 옮기면 새 관(코드로 확인 · 화면 재현 필요)** — 옛 · 새 관 목록을 **정렬 차례로 짝지음**(`A00_Common/design/design_view_profile.ts:122-127` `shownPipes`) → 옮긴 관이 이웃 id 를 받고 이웃은 새 `pipe-sN`(`design_pipe_ids.ts:35-75`) → 새 알약 · 마커 · 이형 측점 · `followedMarks`(`logic/B05_Profile_Structure_Follow.ts:38-45` · ponytail 주석) · `followPipeReports`(`logic/B05_Profile_Pipeline_Follow.ts:22-24`)도 차례 짝. +- **C 노선 고친 초안에서 관 옮김** — 옮김은 따라간 누가거리로 관을 찾는데 배수 편집기는 옛 값(0.51 m 넘게 어긋나면 옮김이 말없이 안 됨 · 마커는 없는 자리 `to` 에 남음 = 새 측점처럼 보임 · Drain:572-581 · Marks:125-136) — 5장 고침으로 같이 풀림. +- **D B06 열쇠 갈래(추정 · 화면 확인)** — 서버 관 id(`p8017`)를 `pipe-` 머리로 가려 `structure:` 열쇠로 셈(`B06_Section_Station_Keys.ts:66-76` · `B06_Section_Section_Drafts.ts:184-185`) vs 파이프라인 `pipe:p8017`(`logic/B05_Profile_Sections_Stations.ts:297-307`) → 옮긴 관이 「새로 생긴 측점 · 계획고 0」(`logic/B06_Section_Station_Swap.ts:124-165`). + +정함(브레인): +- 오른쪽 판 = 구조물 · 관을 골라도 그 측점 횡단을 그림(일반측점과 같은 판 · 구조물 측점 횡단). +- 관 · 구조물 짝은 늘 id 로(정렬 차례 짝 걷음) · 옮겨도 id · 알약 · 측점 열쇠 그대로. +- B06 열쇠 갈래를 파이프라인과 같은 규칙으로(서버 관 id 도 `pipe:`). +- 끝 확인 = 사용자 길 그대로: 관 · 구조물 마커를 앞 측점 · 앞 관을 지나 옮김(노선 고친 초안 · 안 고친 상태 둘) → 측점 수 그대로 · 알약 수 그대로 · 오른쪽 횡단 그림 있음 · B06 카드 계획고 0 아님. + +## 7. 나눔 + +| 절 | 일 | 창 | 파일 경계 | +|---|---|---|---| +| 406 | 곡선 합치기(진행 중) | sub4 | 추천 엔진 | +| 407 | 곡선 측점(252-2) | sub6 | 측점 목록 짝(Core.py · Sections_Stations.ts · station_key · StationKind) · B06 종류 갈래(Station_Keys.ts:118 · Section_Drafts.ts:212 · Station_Swap.ts:145 · UI_Longitudinal.ts:411) · 평면 눈금(SnapStep · Render 눈금) | +| 408 | R 바꿈 뒤 보고 · 시험(252-3) | sub1 | CurveBar · KeyNudge · StationFit 시험 | +| 409 · 411-A | 마커 맨 위 · 고름 풀기 · 오른쪽 판(252-4 · 6A) | sub3 | Render(마커 차례) · Pointer · UI StructureMarks · Cross · Cross_Card | +| 410 · 411-B~D | 좌표 따라감 · id 짝 · B06 열쇠(252-5 · 6B~D) | sub7 | design_view_profile · design_pipe_ids · Structures_Snap · Drainage_Panel · Structure_Follow · Pipeline_Follow · route_follow 짝 · B06 Station_Keys.ts:66-76 · Section_Drafts.ts:184-185 | + +- 겹치는 파일(B06 `Station_Keys.ts` · `Section_Drafts.ts`) = 407(종류 갈래 곡선 추가) · 411-D(관 id 머리) 몫을 줄로 나눔 · 합칠 때 양쪽 살림.