feat(344-2): 첫 계획선 · 관 자리 투영 · 구조물 좌표 따라감 · 계획고 옮김 짝

- 첫 계획선(계획고 = 지반고) base_pvi TS 짝 = B05_Profile/logic/B05_Profile_Grade_Ground.ts(1순위만 · 못 서는 땅은 null = 서버로 다시 셈)
- 관 자리 투영 TS 짝 · 구조물 따라감 py · ts 짝 = common_util_route_follow(정수 m · 구간 끝 밂 · 0 ~ 연장 자름 · 20 m 넘으면 멀어짐 표시 · 상수 STRUCTURE_ROUTE_DRIFT_MAX_M)
- 구조물 x · y 저장(저장 때 노선 위 자리 · 자리가 그대로면 옛 좌표 지킴 · 옛 자료는 읽을 때 채움) · 노선 [확인] 때 구조물 정본이 좌표를 따라감
- 노선 바뀜 때 계획고 옮김 = 바뀐 구간만 새 지반 첫 계획선 · 앞 그대로 · 뒤 길이 차만큼 밂(B05_Profile_Engine_Grade_Carry.py ↔ logic/B05_Profile_Grade_Carry.ts)
- 거울 시험 test_344_2_route_pairs(+ helper cjs) · buildCurves · evaluateAt 내보냄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
This commit is contained in:
2026-10-16 11:19:54 +09:00
co-authored by Claude Opus 5.5
parent 73a251db26
commit bb63b30aae
14 changed files with 1137 additions and 3 deletions
@@ -281,13 +281,13 @@ function resolvePvi(
return [...nodes.values()].sort((a, b) => a.chainage_m - b.chainage_m);
}
interface WorkingCurve extends AlignmentCurve {
export interface WorkingCurve extends AlignmentCurve {
grade_in: number;
grade_out: number;
}
/** 각 변화점에 대칭 종단곡선을 삽입한다 (좌우 직선이 남도록 반쪽 길이를 제한). */
function buildCurves(
export function buildCurves(
pvi: AlignmentNode[],
policy: AlignmentPolicy,
curveRadii: Record<string, number>,
@@ -352,7 +352,7 @@ function buildCurves(
}
/** 직선 + 종단곡선으로 구성된 계획선을 임의 chainage에서 평가한다. */
function evaluateAt(
export function evaluateAt(
pviS: number[],
pviZ: number[],
curves: WorkingCurve[],