Merge remote-tracking branch 'origin/dev' into sub_laptop_3

This commit is contained in:
2026-10-22 13:09:49 +09:00
@@ -0,0 +1,128 @@
# 요구 320-4 · PLAN 511-B 계산 자리 B단계 — 짝 모으기 실행 계획 (분석 · 코드 고침 없음)
- 기준 = `main_laptop_1` `349c26606` · 서버 안 켬 · 시험 안 돌림 · 511-A 코드 아직 없음(sub_laptop_2 = 같은 커밋).
- 시간 = 앞 보고 H 실측 + `tmp/server.log` `[계측]` 줄 모음(노선 저장 68 회 · 추천 초기 종단 161 회 · 전처리 4 회) · 「추정」 = 안 잰 값.
- 앞 자료 = PLAN 472 · 511 · `2026-10-19_472_구조다시세움_목록.md` 4.5 · `2026-10-19_475_요구275_저장차_초기종단.md` 1장 · H(`2026-10-20_요구304_H_…`) · 309-B(`2026-10-21_요구309_B_…`).
## 0. 결론
1. B단계 26 = 단계 다섯 줄(route 2 · follow 4 · stations 4 · profile 5 · cross 10) + F9 — 이미 Node 인 P6 · F1 · F2 · C1 · C2 · C5(일부)도 같은 단계 안 짝 때문에 잠긴 것이라 단계째 엶.
2. 바꿀 서버 자리는 넷으로 모임 — `build_sections`(측점 · 지반 · 첫 계획선 · 모든 체인) · `rebuild_alignment_profile`(종단 · 경고 · 일곱 곳) · 「기본 설계 길」 + G2 · 구간 · 형상 얹기(횡단) · `_write_planned_polyline` · 좌표 맞춤(노선 · 따라감).
3. 저장 값 = DTM 지표면이면 거의 안 바뀜(같은 선 0 차 · 성토 ≤ 1e-4 ㎡ · 475 1.2 실측) — 바뀌는 곳 = 비DTM 표현의 미교차 넓힘(G2) · golden KNOWN R7 · X2 줄(값 다시 뜸 승인) · F1 맞춤 규칙(TS 를 파이썬 규칙으로 맞추면 0).
4. 차례 = 511-A(상주 Node) → B-1 바탕(단계 Node 입구 · 판 다섯 줄) → B-2 측점 · 지반 / B-3 종단 / B-4 횡단 창 셋 동시 → B-5 노선 · 따라감 → B-6 정리 · 단계마다 그 줄 바로 엶.
5. 성능 = 체인 시간 거의 그대로(노선 저장 10.9 s 중 파이썬 셈 몫 ≈ 3.5 s ↔ Node 부름 4~6 번 · 상주면 더 빠름 · 전처리는 배수 96~98 %) · 막을 곳 = 되풀이 안 Node 부름(추천 엔진 · B07 · G2 걸음) · GET 상세 읽기마다 새 Node 프로세스.
## 1. 서버 길 묶음(표에서 줄임말)
- **측점 생성 길** = `build_sections`(`B05_Profile_Engine_Sections.py:398` → `generate_sections` `_Sections_Core.py:419` + `_append_design_profiles` `:284`) ← `run_section_generation`(`:447`) ← B03 체인(`B03_FileInput_Service_Chain.py:130 · 587`) · 노선 저장(`B05_Profile_Route_Save.py:543` = 노선 바뀐 [저장] · [확인] · 추천 [적용]) · B05 solve(`B05_Profile_Router.py:292`) · B06 /regenerate(`B06_Section_Router.py:431`) · 넓힘(`B06_Section_Router_Widen.py:125`) + 구조물 측점(`Engine_Sections.py:584` ← B05 확정 `B05_Profile_Router_Confirm.py:560` · [측점 만들기] `B06_Section_Router_Stations.py:262 · 525`) + 추천 초기 종단(`B05_Profile_Engine_InitialProfile.py:135`).
- **종단 다시 셈 길** = `rebuild_alignment_profile`(`B05_Profile_Engine_Grade_Profile.py:537`) ← PUT profile-alignment(`B05_Profile_Router.py:445`) · 페이지 설정(`B05_Profile_PageSettings.py:104`) · B05 확정(`B05_Profile_Router_Confirm.py:362`) · [저장] 경고(`B06_Section_Server_Calc_Prebuild.py:242`) · preview(`B06_Section_Router.py:538` · 옛 자료 폴백) · 추천 초기 종단(`InitialProfile.py:151`).
- **기본 설계 길** = 파이썬 `compute_cross_design` 이 남은 B05 · B06 자리 — `compute_default_designs`(`B06_Section_Router_Design.py:538` ← B03 체인 `Service_Chain.py:625` · 노선 저장 이월 `Route_Save.py:359` · B06 확정 `B06_Section_Router_Confirm.py:328 · 423` · [측점 만들기] `Router_Stations.py:541`) · `attach_default_designs`(GET 상세 `B06_Section_Router.py:355`) · `recompute_designs_for_alignment`(preview `:541`) · B05 확정 상단측 역반영(`B05_Profile_Router_Confirm.py:172`) · G2 안(`B06_Section_Engine_SampleExtend.py:169`).
- **472 밖 소비자(파이썬 짝 남김 · 거울 유지)** = 추천 엔진 되풀이(R1 `RouteInitial_Pool.py:156 · 161` · `_Station.py:565 · 605` · `_Radius.py:75 · 159` · `_Merge.py:294` · `RouteInitial.py:358` / C1 `RouteInitial_Profile.py:187` · CrossEarth) · B04 실시간 배수(`Watershed_Live.py:49`) · B07(`Router_Support.py:392` C1 · `Engine_Cad_Development.py:129` F5 · `IpTable.py:19` Sections_Core 조각) · B08(`Router_Summary.py:585` F5).
## 2. 26 계산 표
| # | 파이썬 짝(파일:줄) | TS | 서버 부르는 곳 | Node | 거울 · 값 차 | 옮기면 저장 값 | 단계 |
|---|---|---|---|---|---|---|---|
| R1 | `common_util_route_polyline.py:579` build_planned_polyline | `logic/B05_Profile_UI_RouteEdit_Curve.ts` buildEditedPolyline | 노선 저장 `B05_Profile_Router_Replan.py:246` · 초기 종단 `InitialProfile.py:85` · 추천 · B04(1장) | 아님 | `test_route_polyline_browser_mirror` < 1e-9 · 선 4자리 짝(475-1) | 안 바뀜(같은 선 0 차) | B-5 · 추천 · B04 짝 남음 |
| R3 | `B05_Profile_Route_NodeEdits.py:21` node_edits | `logic/B05_Profile_UI_RouteEdit_Edits.ts` applyCurveLimits | `Router_Replan.py:264`(곡선표 edits 칸) 하나 | 아님 | `test_430_route_edit_rules` | 안 바뀜 | B-5 · 소비자 0 → 걷음 |
| R5 | `_Sections_Core.py:419` generate_sections(_interpolate_xy · _tangent_at) | `logic/B05_Profile_UI_RouteEdit_Frame.ts` stationFrameAt | 측점 생성 길 | 아님 | `test_b05_routeedit_frame_mirror` · `test_224_2` | 0 차(파이썬이 6자리 반올림으로 적으면) | B-2 |
| R6 | 같은 generate_sections(측점 · 곡선 측점 · 확폭) | `logic/B05_Profile_Sections_Stations.ts` buildStations | 측점 생성 길 | 아님 | `test_344_3_pipeline_stations_mirror` · `test_407` · golden KNOWN R7(성토 1.1e-4 ㎡ · 누가 0.011 ㎥ · 노선 저장 다시 뜸) | 0 차(475 1.2) · KNOWN R7 걷힘 | B-2 |
| R7 | `common_util_station_key.py:32` station_key | `common_util_station_key.ts` stationKey | `B05_Profile_Route_Save_Parts.py:142` station_keys ← `_carry_cross`(`Route_Save.py:307`) 하나 | 아님(R9 은 Node) | `test_344_3_station_key_mirror` | 안 바뀜(열쇠 글 같음) | B-2 · 소비자 0 → 걷음 |
| G2 | `B06_Section_Engine_SampleExtend.py:62` extend_unclosed(`:113` 묶음) | `logic/B05_Profile_Sections_Ground.ts` extendUnclosed | [저장] 재계산 `Server_Calc_Prebuild.py:227` 하나 · 안에서 파이썬 C1 걸음마다 | 아님 | `test_344_1_sections_ground_mirror` · 브라우저는 DTM 격자 없으면 안 넓힘(`B06_Section_Cross_Stage.ts:140`) | DTM 0 차 · **비DTM = 갈림**(결정 1) | B-4 |
| G4 | generate_sections uphill_side(`_Sections_Core.py:536-541`) | `logic/B05_Profile_Pipeline_Detail.ts:67` uphillSide | 측점 생성 길(종단 stations) · 기본 단면 모양 `Router_Design.py:320` | 아님 | `test_346_2_pipeline_cross_page` · X1 확인(472-7) | 안 바뀜 | B-2 값 · cross 줄로 엶 |
| P1 | `Grade_Profile.py:210` design_ground_following_profile base_pvi 몫 · 2~4 순위 폴백(scipy `Grade_Solver.py:11`) | `logic/B05_Profile_Grade_Ground.ts` groundFollowingBasePvi(1순위만 · 못 서면 null) | 측점 생성 길 `_append_design_profiles` | 아님 | `test_344_2_route_pairs` · `test_432_1` | 1순위 0 차(475) · 폴백 파이썬 남김(결정 4) | B-3 |
| P2 | `Grade_Profile.py:537` rebuild_alignment_profile → `Grade_Alignment.py:408` evaluate | `logic/B05_Profile_UI_Profile_Alignment.ts`(700 줄) buildAlignment | 종단 다시 셈 길 | 아님 | 426 · 432_1 · 213_1 · 438_1(1e-6) | 계획고 6자리 끝자리(→ 면적 1e-4 ㎡ · Prebuild `:236` 머리) — 파이썬이 같은 반올림으로 적으면 0 | B-3 |
| P3 | `Grade_CurveLaw.py:25` flat_bends | `logic/B05_Profile_Profile_CurveLaw.ts` flatBends | P1 · P2 안(`Grade_Profile.py:203 · 420 · 518`) | 아님 | `test_432_1_curve_law` | 안 바뀜 | B-3 |
| P4 | `Grade_Alignment.py:40` is_straight_bend | `logic/B05_Profile_Profile_Straight.ts` | P2 안(`Grade_Alignment.py:340`) | 아님 | 426 · `test_271_straighten_pick` | 안 바뀜 | B-3 |
| P5 | `Grade_Carry.py:149` carry_edits | `logic/B05_Profile_Grade_Carry.ts` carryEdits | `_carry_profile`(`Route_Save.py:281`) 하나 | 아님 | `test_400_profile_carry` · `349_0v` | 안 바뀜(D2 흠 = 저장 본문 몫 · H 4.4) | B-3 · 소비자 0 → 걷음 |
| P6 | 겉 `B05_Profile_Router_Confirm.py:216` _seat_born_nodes | `logic/B05_Profile_Grade_Seat.ts` | B05 확정 · `_carry_profile` | **Node**(472-4 ①) | 427_1 · 459 · 472_4_follow_node | — | follow 줄 엶만 |
| P8 | `B05_Profile_Engine_Grade.py:193` resolve_grade_options(표 FOREST_ROAD_PROFILE_CRITERIA) + 경고 = evaluate 안 | buildAlignment `:430` verticalCurveShortfalls · 표 `B05_Profile_UI_Panel_Fields.ts:57`(화면 파일) | 종단 다시 셈 길 · `Router.py:118` · `PageSettings.py:68` · `B06_Section_Router_Regenerate_Options.py:44` | 아님 | `test_442_2_grade_limit_mirror` · golden W0 | 경고 글 꼴 같음(W1 풀림) · 표 두 벌(X5) → 한 벌 | B-3 |
| C1 | `B06_Section_Engine_Design.py:195` compute_cross_design | `common_util_cross_design.ts` computeCrossDesign | [저장] · [확정] = Node · 기본 설계 길은 파이썬 | 일부(472-4 ②) | `test_b06_cross_design_mirror` · `178_2` · 알려진 차 = 동점 1e-4 m 13 점(승인) | 기본 설계 측점 점 높이 1e-4 m(이미 허용) · 면적 0 차 | B-4 · B07 · 추천 짝 남음 |
| C2 | `B06_Section_Engine_Areas.py:51` _split_cut_areas(C1 안) | `common_util_cross_design_areas.ts` splitCutAreas | 파이썬 C1 안 | 일부 | C1 거울 | 0 차 | B-4 |
| C3 | `Router_Design.py:166 · 270` 포장 · 세월교 보정 · 구간 `B06_Section_Router_Design_Ranges.py:34 · 60 · 73` · `Engine_Tilt.py:71` | `logic/B06_Section_Cross_Enforce.ts` facilityRanges | [저장] 재계산 `Prebuild.py:208-229` · `Router_Design.py:233-234` | 다시 세운 설계만 Node | `test_349_0n_cross_enforce_mirror` | 안 바뀜 | B-4 |
| C5 | `common_util_cross_berm.py:66` cut_profile_points(C1 안 · `Design_Geometry.py:260`) | `common_util_cross_berm.ts` cutProfilePoints | 파이썬 C1 안 | 일부 | `test_178_2_berm_fill_mirror` | 0 차 | B-4 |
| C6 | `Engine_Tilt.py:100` attach_underdrain_specs(`:95` attach_underdrains = 운영 부름 0 · 시험만) | `common_util_structure_underdrain.ts` | F4 안(`Engine_Attach.py:132`) | 아님 | `test_472_4_underdrain_mirror` · 알려진 차 = 옛 underdrain 칸(TS 걷음) | GET 상세 옛 칸 하나(읽기 값) | B-4 |
| F1 | 겉 `common_util_route_follow.py:124` · 좌표 맞춤 `:87` fill_structure_coordinates = 파이썬 | `common_util_route_follow.ts` followStructures · placeOnLine `:113` | 구조물 PUT `B05_Profile_Structures_Router.py:136 · 241 · 455` | 따라감 Node · 맞춤 파이썬 | 410 · 344_2 · 493_3 | 맞춤 규칙 다름(파이썬 = 자리 셋 같으면 옛 좌표 · 4자리 · TS = 반올림 없음) → TS 를 파이썬 규칙으로 맞추면 0 | B-5 |
| F2 | 겉 `B05_Profile_Plus_Stations.py:74` | `common_util_route_follow.ts` followPlusRows | `Route_Save.py:418` | **Node**(472-4 ①) | 459 · 368_2 | — | follow 줄 엶만 |
| F3 | `common_util_structure_station.py:121` plan_stations | `common_util_structure_station.ts` planStations | 측점 생성 길(`Engine_Sections.py:278`) · `Route_Save_Parts.py:124 · 130` · `Structures_Router.py:334` · `Engine_Attach.py:63`(B07 은 같은 이름 다른 함수 `Support_Basin.py:280`) | 아님 | `test_322_3_plan_mirror` · `234_1` | 안 바뀜 | B-2 · 남은 부름 B-4 · B-5 · 상수 · snap 은 배수가 씀(남김) |
| F4 | `B06_Section_Engine_Attach.py:109` attach_shapes · `:139` attach_saved_shapes | `common_util_structure_attach.ts` attachShapes | GET 상세 `B06_Section_Router.py:263 · 471` ← [저장] 재계산이 그 상세를 Node 에 넘김 | 아님 | `test_323_4_attach_mirror` | 안 바뀜(읽기 때 얹음) | B-4 · GET 은 상주 Node 뒤 |
| F5 | `B06_Section_Engine_Culvert.py:76` pipe_wall_height_m · `_Culvert_Sets.py` load_culvert_sets | `common_util_culvert_sets.ts`(668) | F4 안 · C3 구간 · B04 `Basins.py:33` · B07 · B08 | 아님 | `test_b06_culvert_sets_mirror` · `pipe_wall_height_mirror` | 안 바뀜 | B-4 · B04 · B07 · B08 짝 남음 |
| F6 | `Engine_Structures_Wall.py:82` wall_specs_from · 포장 짝 | `common_util_structure_walls.ts` · `_pavement.ts` | F4 안(`Engine_Attach.py:127`) · B07 `Development.py:24 · 37` | 아님 | walls · pavement mirror | 안 바뀜 | B-4 · B07 짝 남음 |
| F9 | `B04_PreProcess_Router_Basins.py:268` ford_height_m · B08 ford_depth | `design_structure_ford_calc.ts` fordHeightM(화면 파일 `B05_Profile_UI_Drainage_Facility_Fields` 끌림) | B04 자동 배치 새 세월교 빈 높이(`Basins.py:262`) · B08 수리표 | 아님 | `test_65_ford_defaults` · `73_11` | 높이 = 저장 입력 · 서버 다시 안 셈 | 재분류(결정 3) |
- 472-4 「남김」 줄 까닭 → 자리 — F1 좌표 맞춤(규칙 다름 → B-5 에서 TS 를 파이썬 규칙으로) · R7 서버 열쇠(주인 F3 · 부르는 곳 `_carry_cross` → B-2 가 측점 출력 열쇠를 씀) · 「R7 알려진 차」(노선 저장 표본 다시 뜸 → B-2 뒤 걷힘).
- 472 덧 121.6 ㎥(초안 −18,216.5 ↔ [저장] −18,094.9) = 계산 짝 밖(세션 초안 넘김 두 길 · 475 2장 추정) — B단계로 안 풀림 · 따로 둠.
## 3. 묶음 단위 · 고르는 단위
- 한 단계 = 한 함수가 여러 id 를 한 번에 셈(cross = C1 C2 C3 C5 C6 G2 G4 F4 · F5 F6 은 얹기 · 보정 안) → id 하나만 서버로 못 뺌 · **고르는 단위 = 단계**.
- 제안 판(잠금 `stages` 23 + `structure_pair` 3 → 아래로 · `common_util_calc_sites.py:21-58`):
| 줄 | id | 서버 정본 자리(B 뒤) | 열 때 |
|---|---|---|---|
| route | R1 R3 | Node `route.polyline`(`_write_planned_polyline` 갈음) | B-5 |
| follow | P5 P6 F1 F2 | Node(이미 P6 F1 F2 · P5 B-3 · 좌표 맞춤 B-5) | B-5 |
| stations | R5 R6 R7 F3 | Node 측점(측점 생성 길) | B-2 |
| ground | G1 | 있음(서버 = 파이썬 표본 · DTM 이면 B-2 뒤 Node 격자도 됨) | 지금 |
| profile | P1 P2 P3 P4 P8 | Node 종단(planline + profile — 서버 정본이 한 함수라 같이) | B-3 |
| cross | G2 G4 C1 C2 C3 C5 C6 F4 F5 F6 | Node 횡단 · 형상 얹기 | B-4 |
| (F9) | F9 | 폼 기본값 도구 · B04 · B08 파이썬 | 재분류 |
- 서버 단계 요청 = 묶음 입력(`input.*` · 세션에서 모은 `input.cross` 는 브라우저가 모아 보냄 — `design_pipeline_cross.ts` 가 세션을 읽음) · 서버가 정본 맥락(저장 노선 · 관 · 구조물 · 종류 표 · 저장 PVI · 격자 경로)을 붙임 · **앞 단계는 서버 Node 가 다시 셈(5 ms 안팎)** — 지반 표본(0.5~1.5 MB)을 올려 보내지 않음 · 이어진 서버 단계는 한 요청.
- 단계마다 local · remote 한 겹(선례 ground `B05_Profile_Pipeline_RouteGround.ts:100` remote · 판 `calcOnServer` `design_calc_sites.ts:59`).
## 4. 단계 표(창 · 파일 · 완료 기준)
| 단계 | 창 | 대상 | 파일(그 창 주인) | 할 일 | 완료 기준 | 여는 줄 |
|---|---|---|---|---|---|---|
| B-0 | sub2(511-A) | 바탕 | `common_util_node_bundle.py` · `common_util_calc_runner.py` · 계산 창구 | 상주 Node · `run_calc` 가 상주로 · 묶음 다시 짓기는 켤 때만 | 511-A 확인(거울 · 왕복 시간 표) | quantity · carry · fixed_browser |
| B-1 | 창 1 | 단계 Node 입구 | 새 `design_calc_node_stages.ts` · `design_calc_node.ts` · `design_pipeline_page.ts`(693 · 빼기만) · `common_util_calc_sites.py` · `B01_Dashboard_UI_CalcSites.ts` | 472-1 헬퍼 배선(`helper_472_1_browser.mjs`)을 정식 입구로 · 페이지 닫힘 중 순수 몫(follow `placed` · cross `crossWithContext` · `shapeStatus`)을 logic 으로 · Node 가 DTM `.bin` 읽음(경로 · 수정시각 기억 · 시트 격자 17 MB) · 판 다섯 줄(잠금) · 단계 local · remote 한 겹 | golden 고정 자료 Node 단계 출력 = 브라우저 길 0 차 · 472-3 등록부 · 309-2 판 시험 · typecheck | — |
| B-2 | 창 A | R5 R6 R7 F3 G4 | `B05_Profile_Engine_Sections.py`(644) · `_Sections_Core.py`(640) · `Route_Save_Parts.py` · `InitialProfile.py` · TS stations · Frame · key · structure_station · Pipeline_Detail | `generate_sections` 몫 → Node 측점(열쇠 · 상단측) · 지반 = DTM Node 격자 / 비DTM 파이썬 표본 뒤 Node · 파이썬은 정본 꼴 · 6자리 반올림 · 머리(cad_exchange · source)만 적음 · 이월 열쇠 = Node 출력 · 추천 지문(`SOURCE_GLOBS`)에 묶음 지문 | 거울 344_3 · 224_2 · 407 · 322_3 · 346_2 · 344_1 · golden server_route = browser(R7 · X2 줄 걷힘 → 값 다시 뜸) · 검증 프로젝트 노선 저장 전후 측점 · 누가토량 같음 · 「종횡단 한 번」 중앙 ≤ 1.6 s | stations |
| B-3 | 창 B | P1 P2 P3 P4 P5 P8 | `Grade_Profile.py` · `B05_Profile_Router.py` · `PageSettings.py` · `Route_Save.py`(`_carry_profile`) · Prebuild `refresh_alignment` · TS `UI_Profile_Alignment.ts`(700 → 먼저 나눔) · `UI_Panel_Fields.ts` 표 → logic | `rebuild_alignment_profile` 본체 → Node(계획선 · 경고 · 법칙 · 직선) · 1순위 base PVI → Node(null → 파이썬 2~4 순위) · `carry_edits` → Node(seat 와 한 부름) · 기준표 한 벌(X5) · `_append_design_profiles` 는 B-2 합친 뒤 | 거울 426 · 432_1 · 213_1 · 438_1 · 400 · 349_0v · 442_2 · 427_1 · golden 0 차(W0 글 꼴) · 종단 정본 해시 같음 · 「계획고 옮김」 중앙 ≤ 0.7 s | profile |
| B-4 | 창 C | G2 C1 C2 C3 C5 C6 F4 F5 F6 | `B06_Section_Router_Design.py`(620) · `_Ranges.py` · `_Engine_Design_Node.py` · `_SampleExtend.py` · `_Engine_Attach.py` · `_Engine_Tilt.py` · `_Server_Calc_Prebuild.py` · `B06_Section_Router.py`(GET) | 기본 설계 길 → Node `cross.design` 묶음 · G2 = 한 Node 부름 안 +5 m 되풀이(격자) · 구간 → facilityRanges · 얹기 → Node(재계산 = server-calc 부름 안 · GET = 상주 Node 뒤) | 거울 b06_cross_design(동점 13 점 그대로) · 178_2 · 349_0n · 472_4_underdrain · 323_4 · culvert · walls · golden server_save = browser · [저장] 재계산 중앙 ≤ 1.6 s · [확정] ≤ 4.0 s · GET 상세 + 0.05 s 안 | cross |
| B-5 | 창 A(B-2 뒤) | R1 R3 F1 맞춤 · F3 남음 | `Router_Replan.py`(688 → 먼저 나눔) · `Structures_Router.py` · `common_util_route_follow.py · .ts` · `Route_Save_Parts.py` | `_write_planned_polyline` → Node(선 · 곡선 · 편집표) · placeOnLine 을 파이썬 규칙으로 맞춘 뒤 좌표 맞춤 → Node · plan_stations 남은 부름 → Node 출력 | 거울 route_polyline · 430 · 410 · 493_3 · 344_2 · 곡선표 · 구조물 좌표 해시 같음 · 노선 저장 체인 총 중앙 ≤ 10.9 s | route · follow |
| B-6 | 아무 창 | 정리 | 등록부 둘 · `common_util_calc_runner.py` · golden | runner `node:` · `until` 지움 · NODE_IDS · KNOWN 빈 목록 · 소비자 0 짝 걷음(R3 · R7 · P5 · G2 · C3 구간 · C6 · F1 맞춤) · 남는 짝 머리에 「소비자 · 까닭」 | 고친 대상 시험 · 472-3 · 309-2 | — |
- 겹침 — `B05_Profile_Router_Confirm.py`(B-2 `:560` · B-3 `:362` · B-4 `:172` 줄 다름 · 먼저 끝낸 창이 합침) · `Engine_Sections.py`(B-2 주인 · B-3 은 B-2 합친 뒤) · `Engine_Attach.py:63` F3 = B-4 몫.
- 700 줄 — `UI_Profile_Alignment.ts` 700 · `Router_Replan.py` 688 · `design_pipeline_page.ts` 693 · `B07_..._Router_Support.py` 693(안 만짐) → 그 단계 첫 커밋에서 나눔.
- 단계 문(472-1 그대로) — 기준값 두 길 · 고친 대상 시험 · 끌린 묶음 다시 지음(design-calc · server-calc · corridor) · 화면 = 검증 프로젝트 [저장] 전후 행 · 파일 해시.
## 5. 성능 — 파이썬 대신 Node
- 바탕 값(H 2.2) — Node 새 프로세스 기동 52 ms · 묶음 읽기까지 0.09~0.14 s · 상세 1.45 MB 넘김 포함 0.22~0.27 s · 같은 셈 TS = 측점 · 지반 · 첫 계획선 4.5~5 ms ↔ 파이썬 0.51~0.60 s(파일 쓰기 포함) · 횡단 57 측점 TS 18 ms ↔ 파이썬 0.10~0.17 s.
- 상주 Node(511-A 가정) — 부름당 = JSON 넘김(1.45 MB ≈ 파이썬 dumps 36 ms + Node 파싱 15 ms) + 셈 → 0.05~0.08 s · 작은 자료 0.01 s(추정).
| 체인 | 지금(로그 중앙) | B 가 바꾸는 파이썬 몫 | 새 프로세스 Node | 상주 Node |
|---|---|---|---|---|
| 노선 저장(노선 바뀐 [저장] · [확인] · 추천 [적용]) | 10.9 s(68 회 · H 아홉 로그 10.5 · 「종횡단 한 번」 1.6 · 「계획고 옮김」 0.7 · 「횡단 이월」 1.2) | ≈ 3.5 s(셈 + 파일 · DB) | 부름 4~6 × 0.2~0.3 s 더함 · 파이썬 셈 0.5~0.8 s 덞 → +0.3~0.7 s(추정) | −0.4~0.7 s(추정) |
| B03 전처리(배수 · 관 · 측점) | 93~121 s(배수 96~98 % · 측점 재생성 1.6~3.2 s) | 측점 재생성 몫 | ±0.3 s(0.3 %) | 거의 0 |
| 추천 초기 종단 미리 셈 | 4.6 s(161 회 · 0.8~58 s) | build_sections 0.5~0.6 s | −0.2~+0.1 s | −0.4 s |
| [저장] 서버 재계산 | 1.6 s(H · 661 회) | 경고 0.04 · 보정 · 넓힘 0.2 · 상세 얹기 0.2 | 기존 Node 부름에 얹으면 ±0 · 따로면 +0.2 s | −0.1~0.2 s |
| GET 상세(F4 · C6 · 기본 설계) | 0.2 s(H 「상세 + DB」) | 얹기 · 기본 설계 | **읽기마다 +0.2~0.3 s** | +0.01~0.05 s |
- 막을 곳:
1. 되풀이 안 부름 — 추천 엔진(R1 일곱 자리 · 균형 종단 · 단면 곡선 C1 측점 × Δ) · B07 측점마다 C1 → 파이썬 짝 남김(Node 로 바꾸면 수백~수천 × 0.2 s).
2. G2 걸음 — +5 m 마다 설계 · 표본 → 한 Node 부름 안(Node 가 격자 읽음) · 파이썬 ↔ Node 핑퐁 금지.
3. GET 상세 — 상주 Node 전엔 F4 · C6 · attach_default_designs 파이썬 둠.
4. 묶음 낡음 — 다시 짓기 0.4~0.5 s + npm 0.74 s 가 체인 중간에 안 일게(서버 켤 때 · 싱크 뒤 미리 지음 · 낡음 검사 35~41 ms).
5. 큰 자료 — 측점 250(5 km)이면 상세 6 MB(추정) → 넘김 0.3~0.5 s · 격자는 경로만 넘기고 Node 가 읽음 · 결과는 파이썬이 파일에 적을 칸만.
6. 추천 저장본 지문 — `InitialProfile.py:32` SOURCE_GLOBS 가 파이썬 파일만 봄 → TS 묶음 지문 더함(안 하면 TS 고쳐도 옛 저장본).
- 조작 중 「서버」 고름 = 왕복(5장 「네트워크 왕복 금지」의 시험용 예외 · 309-B 결정 6) · 끌기 0.1 s 는 상주 Node 로도 회선(23 ms~80 ms) 몫이 남음.
## 6. C단계 메모
| id | 브라우저에서 못 도는 까닭 · 옮김 크기 |
|---|---|
| E2 유토 배분 | TS 는 이미 한 벌(`common_util_mass_haul_balance.ts` 842 + `_settle.ts` · Node `haul.plan`) · 막힌 까닭 = `import type` 로 묶음에서 뺌(값어치 A · 09-06 사용자 확정 · `B05_Profile_Api_HaulPlan.ts:3-8`) · 옮김 = 842 → 700 아래 나눔 + 판 both 때만 dynamic import + 배분 맥락(B08 채집석 · 구조물 잔토 · 장비 한계 = 지금 서버 `haul_inputs_for` DB 조회)을 페이지로 + 거울 · 새 150 줄 안팎 · 보안 결정 먼저 |
| D1 배수유역 | 래스터 흐름 · 유역 다각형(numpy 격자 · polygonize · `common_util_drainage_detail.py` 655 + B04 Watershed_*) · 유역 산정 54~100 s · DEM 수십 MB |
| D2 관 자리 제안 | D1 흐름 누적 · 세류선 래스터(`find_inflow_hotspots`) 위에서만 셈 — D1 없이 못 돎 |
| N1 노선 추천 | 파이썬 10 파일 3,891 줄 · scipy · 지형 · 세류 래스터 탐색 · 셈 6 s 중앙(최대 87 s) · 안에서 R1 · C1 짝 되풀이 · 값어치 A |
| G3 넓힘 | 셈이 아니라 저장 밖 DB 쓰기(`B06_Section_Router_Widen.py` · N10) + 모든 지표면 표현 파이썬 표본 — 미리 보일 값 없음 |
## 사용자 결정 필요
1. 비DTM 지표면(tin · nurbs · implicit · meshfree · 기본은 dtm `config_system_terrain.py:165`) — (가) 그 프로젝트는 파이썬 길 남김 · 단계 줄 잠금 까닭 「DTM 아닌 지표면」 ★ (나) 격자로 구워 브라우저 · Node 한 벌(미교차 넓힘 · 표본 값 바뀜).
2. golden 값 파일 다시 뜸(B-2 끝 · KNOWN R7 · X2 걷힘 · `helper_472_1_dump.py` 승인 때만).
3. F9 — 재분류(폼 기본값 도구 · B04 · B08 파이썬 · 고를 것 없음) ★ / 서버 Node 로 열기(값어치 작음).
4. P1 폴백 2~4 순위(scipy) 파이썬 남김 ★ / TS 로 옮김(큼).
5. preview 창구(`/cross-design/preview` · 옛 자료 폴백) — B-3 · B-4 때 걷음 ★ / Node 로 바꿔 둠.