chore(계획): 요구 432 분석 B — MC 측점 되돌아감 원인 · PLAN 576(판정 폭 ±0.5 m · 막음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# 분석 432-B — MC 측점 · 일반측점 위에 두면 스냅 따라감 (요구 432)
|
||||
|
||||
조사만 · 코드 읽기 판정 · 서버 · 브라우저 · 실행 재현 없음. 기준 = `main_laptop_1` dd197a975.
|
||||
|
||||
## 1. MC 측점이 생기는 자리
|
||||
|
||||
| 자리 | 파일:줄 | 하는 일 |
|
||||
|---|---|---|
|
||||
| 곡선 측점 규칙(파이썬) | `B05_Profile/B05_Profile_Engine_Sections_Core.py:301-319` `curve_stations` · 부름 `:396-400` `_station_layout` | MC 를 정수 m 로 반올림(`floor(MC+0.5)`) → 그 값에 측점(일반 · 관 · 구조물 · 추가)이 0.005 m 안에 없으면 곡선 측점 하나 더함 |
|
||||
| 같은 규칙(TS 짝) | `B05_Profile/logic/B05_Profile_UI_RouteEdit_Frame.ts:159-182` `mcScale` · `curveStations` | 위와 같음 · 거울 `test_224_2_station_snap` · `test_280_4_stations` |
|
||||
| 측점 목록(계산 묶음) | `B05_Profile/logic/B05_Profile_Sections_Stations.ts:300-311` · `:333-335` | 일반측점 20 m 그대로(280-4) + 곡선 측점 · 종류 `curve` · 열쇠 `curve:<누가거리>` |
|
||||
| 평면 눈금 「(MC)」 | `B05_Profile/B05_Profile_UI_RouteEdit_SnapStep.ts:99-107` `ticks` | 일반측점 격자만 놓고 같은 `curveStations` |
|
||||
| 이름 「… (MC)」 | `B05_Profile/logic/B05_Profile_Sections_Generate.ts:64` | 종류 curve 면 「(MC)」(507-3 강조) |
|
||||
| 열쇠 | `common_util/common_util_station_key.py:53-54` · `:66-90` `curve_moves` ↔ `.ts:80` | `curve:<0.01 m>` · MC 가 움직이면 10 m 안 새 곡선 열쇠로 넘김(432-3) |
|
||||
| 저장 열쇠 | `B05_Profile/B05_Profile_Route_Save_Parts.py:174-175` · `:226` | 곡선 측점 = `curve:` · 횡단 넘김 = `curve_moves` |
|
||||
|
||||
MC 가 일반측점에서 떨어지는 까닭 = 스냅 맞춤이 그 곡선을 못 놓음:
|
||||
|
||||
| 자리 | 파일:줄 | 하는 일 |
|
||||
|---|---|---|
|
||||
| 맞춤(브라우저만 · 파이썬 짝 없음) | `B05_Profile/logic/B05_Profile_RouteEdit_StationFit.ts:189-278` `fitCurveStations` | 고친 자리 앞 곡선부터 끝까지 · 곡선마다 그 교점 하나를 **들어오는 직선 따라** ±간격 밂(1 차원 · `solve` `:145-183`) |
|
||||
| 버리는 검사 | 같은 파일 `:226-241` `attempt` | 하한 새로 깸(`shortfallCrossed`) · 앞 곡선 MC 0.01 m 넘게 흔듦 → 버림 · `solve` 못 풂(기울기 < 0.2 · 밀 거리 끝) → 버림 |
|
||||
| 못 놓으면 | 같은 파일 `:262-274` | 그 교점 그대로 → 앞쪽 길이가 바뀐 만큼 MC 가 밀림 → 곡선 측점 생김 |
|
||||
| 「R 공간 부족」 | `B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts:301-310` | 접선 자리 = 앞뒤 직선 짧은 쪽 절반 · 넘으면 R 눌림 → 교점을 밀면 이웃 곡선 R 이 같이 바뀌어 위 검사에 걸림 |
|
||||
| 「서로 다른 측점」 | 같은 StationFit `:211-216` | 앞 곡선 측점 뒤 측점만 후보(383) |
|
||||
| 부르는 곳 | `B05_Profile/B05_Profile_UI_RouteEdit.ts:430-450` `applyEdit`(놓음 · R 입력 · 교점 넣기/지우기 · 스냅 켬) · `:546-551` 끄는 중 `fitDrag` · `:393` · `:552` 측점 밖 개수 | |
|
||||
| 끌기 · 방향키 막힘(441) | `B05_Profile/B05_Profile_UI_RouteEdit_Pointer.ts:270` · `:395-396` · `:430-438` · `..._Keys.ts:81-89` | **누를 때 측점 밖 곡선 수**보다 늘면 그 걸음 되돌림 — 개수만 견줌 |
|
||||
| 서버 | StationFit 머리 `:16` · `A00_Common/design/logic/design_calc_registry.ts:97-110` | 서버는 저장 교점 그대로 선을 짬 · 맞춤 셈 없음. 다만 서버 Node 시험 길 `design_calc_node_trial.ts:13` · `:45` 가 `fitAfter` 를 끌어감(`build:design-calc` 묶음) |
|
||||
| 추천 엔진(따로) | `B05_Profile/B05_Profile_Engine_RouteInitial_Station.py:70` `MC_TOL_M = 0.05` | 추천 · 서버 초기 노선 맞춤 — 이번 일과 별개 |
|
||||
|
||||
옛 계획 근거:
|
||||
- 224-2 스냅 = 호 안 일반측점을 MC 로 옮김(`docs/raw/plans/2026-10-16_plan_306-349.md:201-206`) → 483(280-4)에서 옮김 지움 · 일반측점 20 m 그대로 + MC 측점 더함 · 「유지」= 저장 칸 없음 · 노선 모양으로 기억(`2026-10-24_plan_335-518.md:1141-1148` · 분석 `docs/raw/조사/2026-10-19_요구280_D_스냅_특별측점.md`).
|
||||
- 366-3 · 390-5 · 441 맞춤 · 끌기 막힘(`2026-10-24_plan_335-518.md:32-38` · `:295-296` · `:765-767`) · 407 MC 곡선 측점(`:445-455`) · 432-3 열쇠 넘김(`:684-685`) · 507-3 MC 강조(`:1386-1388`).
|
||||
- 213-2 ② = [저장] 때 측점 · 관 · 구조물 자리에 없는 계획고 편집 키를 버림(`2026-10-10_plan_200-219.md:102`) → MC 가 움직이면 그 자리 계획고 편집이 새 MC 로 안 옮겨짐(`docs/raw/요구_1025/_분석_407_계획고_덮어쓰기.md:54`).
|
||||
- 272-2 「스냅은 의도 · 무시」(`2026-10-27_plan_점검387.md:92`) — 스냅이 낳은 측점 차이는 흠으로 안 봄.
|
||||
|
||||
## 2. 끌어 옮길 때 저장되는 것 · 다시 생기는 까닭
|
||||
|
||||
끄는 것:
|
||||
- MC 점 자체 손잡이 없음 — 끄는 것 = 교점 · BC/EC 손잡이(`Pointer.ts:127-143` `handleAt` 시작 · 끝만 · `:403-446` 교점). 「MC 를 일반측점으로」 = 교점을 손으로 2 차원으로 옮겨 MC 를 맞춤.
|
||||
|
||||
저장되는 것:
|
||||
- 교점 좌표 · 곡선표 `edits`(켬 · R · 고정 · 길이) · `station_snap` · `station_snap_step` 만(`B05_Profile_Route_Polyline_Write.py:134-175`).
|
||||
- MC 측점 = 저장 칸 없음 · 측점 목록에서 매번 파생(종단 `stations` 의 kind `curve` 로 결과에만).
|
||||
- 사용자 측점(추가 측점 `plus_stations.json`) · 측점 이동 기록 = MC 와 무관 · 「이 곡선을 사용자가 측점에 둠」 기록 없음.
|
||||
- B06 횡단 편집 = 열쇠 `curve:<누가거리>` · MC 가 움직이면 10 m 안 새 곡선 열쇠로(`curve_moves`) · MC 가 일반측점에 흡수되면 넘길 열쇠 없음 → 버림(「노선 밖 고침」 수) · 종단 계획고 편집 = 213-2 로 버림.
|
||||
|
||||
다시 생기는 까닭(셋이 겹침):
|
||||
1. **판정 폭 두 벌** — 「(MC)」 글이 사라지는 폭 = 일반측점 ±0.5 m(정수 m 반올림 · `curveStations`) · 맞춤의 「위」 = ±0.05 m(`StationFit.ts:29-33` `mcTolM` · `offStationMcs :75-93` · `onAt :223-224` · `keptForms :106-121`). 손으로 끌어 글이 사라져도(예 380.3) 맞춤은 여전히 「측점 밖」(상태줄 「측점 밖 곡선 1개」).
|
||||
2. **끌기 · 방향키 막힘이 그 곡선을 이미 「밖」으로 셈** — 다음 끌기를 누를 때 개수(`dragOff`)에 그 곡선이 들어 있어 그 곡선이 다시 밀려나도 개수가 안 늘어 안 막음 → 0.5 m 넘게 밀리면 「(MC)」 다시 나옴.
|
||||
3. **맞춤에 기억 없음 · 방법이 한 갈래** — 걸음마다 지금 모양만 보고 그 곡선 교점 하나를 들어오는 직선 따라 다시 밂 · 처음 MC 측점을 낳은 같은 검사(하한 · 앞 곡선 흔듦)에 또 걸려 교점 그대로 → 앞쪽 길이 변화만큼 MC 밀림. 손으로는 2 차원으로 옮겨 맞췄어도 다음 걸음 맞춤은 1 차원 밂만. `keptForms` 유지는 N+0 · N+10 꼴만 지킴 — 측점 No. 간격에선 보통 맞춤과 같은 격자라 효과 없음.
|
||||
- 일반측점으로 「바꾸는」 길 자체가 없음 — MC 측점은 상태가 아니고 곡선 모양에서 매번 셈.
|
||||
|
||||
## 3. 「일반측점 위」 판정
|
||||
|
||||
- 권함 = 측점 목록과 같은 식 — `floor(MC + 0.5)` 이 일반측점(측점 간격 배수)이면 「위」(= 「(MC)」 글이 사라지는 바로 그 폭 · 약 ±0.5 m · 정수 m 측점 규칙). 10 m 간격의 N+10 = 지금처럼 「위」(특별측점 · 280-4).
|
||||
- 관 · 구조물 · 추가 측점 위 MC 도 곡선 측점은 안 생김(`curveStations` 가 모두 봄) — 요구는 「일반측점」만이라 그대로 둠.
|
||||
- 맞춤 정밀도(0.05 m)는 그대로 — 폭 안이면 먼저 정확히 맞춰 보고, 못 맞춰도 「위」로 둠.
|
||||
|
||||
## 4. 고칠 갈래
|
||||
|
||||
| 갈래 | 고침 | 파일 | 값 영향 | 위험 |
|
||||
|---|---|---|---|---|
|
||||
| **1 권함 · 가장 작음** | 「위」 폭을 측점 목록과 같게(3장) — `offStationMcs` · `onAt` · `keptForms` 세 곳 한 상수 · 폭 안 곡선은 정확히 맞춤 먼저(`attempt`) · 못 맞추면 그 측점을 `lastStation` 으로 「위」 | `logic/B05_Profile_RouteEdit_StationFit.ts` 하나(+ 상태줄 글은 그대로 따라옴 · `CurveBar.ts:168` · `KeyNudge`) | 측점 목록 규칙(파이썬 · TS 짝) 그대로 → 같은 노선이면 측점 · 횡단 · 토량 같음. 바뀌는 것 = 사용자가 측점에 둔 곡선을 다음 끌기 · 방향키가 폭 밖으로 밀면 그 걸음 막음(441 글 「곡선 가운데를 측점에 못 맞춰 더 못 옮깁니다」) · 상태줄 측점 밖 개수 줄어듦 · MC 측점이 덜 생김 → 버리는 MC 횡단 · 계획고 편집 줄어듦. 폭 안 MC 는 일반측점 횡단이 대표(최대 0.5 m 어긋남 · 지금도 같음) | 막힘 = 개수 견줌(한 곡선 밖 · 다른 곡선 위면 안 막음 · 드묾) · `applyEdit` 길(R · 곡선 길이 입력 · 교점 넣기/지우기 · 스냅 켬 · 간격 바꿈)은 막힘 없음 → 1b 로 `applyEdit` 에도 `floorStop` 옆 「측점 밖 늘면 되돌림」 한 줄(`UI_RouteEdit.ts:433-434` · 691 줄 → 700 안) |
|
||||
| 2 맞춤 힘 키움 | 교점 하나 밂이 버려지면 앞 곡선과 둘을 번갈아 맞춤(2~3 회 · 둘 다 위 · 하한 안 깸일 때만) · R 이 뒤 직선에 눌린 곡선은 뒤 교점(k+1)을 밂 | 같은 StationFit 하나 | 교점이 더 움직임 → 노선 모양 바뀜 → 그 뒤 측점 자리 · 지반 · 횡단 · 토량 바뀜([저장] 때 서버가 교점으로 다시 셈 · 짝 그대로) · 막힘 줄고 「스냅 따라감」에 더 가까움 | 어느 검사가 버리는지 먼저 재현 필요(확인 못 함) · 390-5 끌기 훑기 「측점 밖 0」 · 454 방향키 · 383 서로 다른 측점 · 366-3 「IP 밂 ≤ 8.8 m」 다시 잼 |
|
||||
| 3 곡선마다 「사용자 고정」 칸 | 곡선표 `edits` 에 칸 · 맞춤이 고정 곡선은 꼭 지킴 · 못 지키면 모든 편집 막음 | 곡선표 쓰기 · Schema · 되돌리기 사진 · 초안 · 저장 · 열 곳 넘게 | 저장 값 새 칸 | 280-4 「저장 칸 없음」 결정을 뒤집음 · 권하지 않음 |
|
||||
|
||||
공통:
|
||||
- 파이썬 짝 없음(StationFit 머리 · 등록부 `pair: null`) → 거울 시험 없음 · 서버 Node `build:design-calc` 다시 지음(시험 길 `fitAfter`).
|
||||
- 시험 — 고침 대상: `test_280_4_fit` · `test_366_3_station_fit` · `test_390_5_snap_step_ops` · `test_408_radius_downstream` · `test_454_arrow_station_step` · `test_383_2_route_keys` · `test_430_route_edit_rules`(1b 면) · 새 시험(폭 안 MC = 위 · 상태줄 0 · 앞 교점 끌어 폭 밖으로 밀면 그 걸음 막힘 · 맞출 수 있으면 정확히 0.05 m 안 · 스냅 끔 = 지금 그대로). 측점 목록 짝 시험(`test_224_2` · `test_280_4_stations` · `test_344_3_*`)은 안 바뀜 확인만.
|
||||
|
||||
## 5. 사용자 물음
|
||||
|
||||
- 「일반측점 위」 허용 차 — ±0.5 m(지금 「(MC)」 글이 사라지는 폭 · 권함) 인지 ±0.05 m(지금 맞춤 판정 · 손으로 맞추기 어려움) 인지.
|
||||
- 일반측점에 둔 곡선이 그 뒤 노선을 옮길 때 못 따라가면 — 그 걸음 막음(권함 · 지금 끌기 규칙) · MC 측점 다시 생김(지금) · 교점을 더 밀어 따라가게(갈래 2) 중 무엇인지.
|
||||
- 막는 범위 — 끌기 · 방향키만(지금 막힘 자리) 인지 R · 곡선 길이 입력 · 교점 넣기/지우기까지(1b) 인지.
|
||||
- 스냅 꺼짐 — 맞춤 없음 → 자유 이동 · MC 측점 생김 그대로(권함) 인지.
|
||||
|
||||
## 6. 확인 못 함
|
||||
|
||||
- 사용자 사례에서 맞춤을 버린 검사(하한 새로 깸 · 앞 곡선 MC 흔듦 · 못 풂 · 서로 다른 측점) — 실행 재현 안 함.
|
||||
- 사용자가 끈 것이 교점인지 BC/EC 손잡이인지 · 그때 스냅 켬 · 간격(측점 No. · 10 m) — 요구 글에 없음.
|
||||
- 검증_랩탑메인(storage `1/3/81339cc8…` · 이름이 B07 표지에 있는 폴더) 저장 노선 = 스냅 켬 · 측점 No. · 곡선 16 개 MC 모두 일반측점 0.05 m 안(가장 먼 곳 80.047 · 1000.045) · 저장 종단 곡선 측점 0 → 사용자가 본 MC 는 저장 안 한 편집 중 것 · 재현 자료 없음.
|
||||
- 갈래 1 뒤 막힘이 실제로 얼마나 잦은지(빽빽한 곡선 — 이 노선 곡선 사이 직선 13~14 m 곳 셋).
|
||||
Reference in New Issue
Block a user