- config 기본 L 20 · 초기값 직선 문턱 500 m ↔ TS `logic/B05_Profile_Profile_CurveLaw.ts` 상수 짝 - 초기값(1차 지반 종단 · 추천 [적용])만 정책 `no_curve_keys` 로 얼림 · 손 편집 · R 이면 기본 곡선 - 법정 종단곡선 최소 R · L 미달 = 경고 글(파이썬 · TS 같은 글) + 종단 요약줄 「종단곡선 미달」 - 노선 [저장]은 옛 정책(L · 열쇠) 이어받음 · 바뀐 자리 새 꼭짓점만 새 지반 열쇠(`carry_policy` ↔ `carryNoCurveKeys`) - 시험 test_432_1 + 헬퍼 스텁 넷 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
57 lines
2.7 KiB
Python
57 lines
2.7 KiB
Python
"""B05 종단곡선 초기값 직선 · 법정 미달 판정(432 · 요구 262).
|
|
|
|
- `initial_no_curve_keys` : 초기값(자동설계 체인 · 추천 [적용]으로 처음 만드는 종단)에서만 — 기본 L
|
|
기준 R 이 `initial_straight_radius_m`(500 m)보다 큰(대수차 L/R 안쪽) 꼭짓점 열쇠. 정책
|
|
`no_curve_keys` 로 저장돼 그 꼭짓점엔 종단곡선을 두지 않음 · 사용자가 그 꼭짓점을 고치거나 R 을
|
|
넣으면 다시 곡선(`build_curves`). 꼭짓점 높이는 그대로.
|
|
- `vertical_curve_shortfalls` : 설계속도별 종단곡선 최소 R · L 미달(지식DB 별표2 마.) — 막지 않고
|
|
경고만 · 비포장 대수차 5 % 이하(생략 가능)는 뺌 · 45 % 규칙으로 줄어든 곡선도 같은 잣대.
|
|
|
|
짝: TS `logic/B05_Profile_Profile_CurveLaw.ts` — 거울 시험 `test_432_1_curve_law.py`.
|
|
"""
|
|
|
|
from typing import Any
|
|
|
|
import numpy as np
|
|
|
|
from config.config_system import FOREST_ROAD_PROFILE_ALIGNMENT
|
|
|
|
# 초기값 직선 문턱 R(m) — TS `INITIAL_STRAIGHT_RADIUS_M` 과 같은 값.
|
|
INITIAL_STRAIGHT_RADIUS_M = float(FOREST_ROAD_PROFILE_ALIGNMENT["initial_straight_radius_m"])
|
|
|
|
|
|
def initial_no_curve_keys(
|
|
base_s: np.ndarray, base_z: np.ndarray, curve_length_m: float | None
|
|
) -> tuple[str, ...]:
|
|
"""안쪽 꼭짓점 중 기본 L 기준 R > 500 m(|대수차| < L/500) 인 것의 열쇠(소수 3자리)."""
|
|
if not curve_length_m or len(base_s) < 3:
|
|
return ()
|
|
limit = float(curve_length_m) / INITIAL_STRAIGHT_RADIUS_M
|
|
spans = base_s[1:] - base_s[:-1]
|
|
grades = (base_z[1:] - base_z[:-1]) / np.where(spans > 0, spans, 1.0)
|
|
keys = []
|
|
for index in range(1, len(base_s) - 1):
|
|
if abs(float(grades[index] - grades[index - 1])) < limit:
|
|
keys.append(f"{float(base_s[index]):.3f}")
|
|
return tuple(keys)
|
|
|
|
|
|
def vertical_curve_shortfalls(
|
|
curves: list[dict[str, Any]], min_radius_m: float, min_length_m: float
|
|
) -> list[str]:
|
|
"""법정 최소 R · L 을 못 채운 종단곡선 경고 글(누가거리 순) — 기준 0 이면 판정 안 함."""
|
|
if min_radius_m <= 0 and min_length_m <= 0:
|
|
return []
|
|
out = []
|
|
for curve in curves:
|
|
if curve.get("omitted") or curve.get("skip_allowed"):
|
|
continue
|
|
radius = float(curve.get("radius_m", curve.get("r_m", 0.0)))
|
|
length = float(curve.get("length_m", curve.get("l_m", 0.0)))
|
|
if radius < min_radius_m - 1e-6 or length < min_length_m - 1e-6:
|
|
out.append(
|
|
f"{float(curve['chainage_m']):.1f}m: 종단곡선 R {radius:.0f}m · L {length:.1f}m — "
|
|
f"법정 최소 R {min_radius_m:.0f}m · L {min_length_m:.0f}m 미달"
|
|
)
|
|
return out
|