feat(B06): 세월교 노면을 월류 높이만큼 내려 앉힌다
횡단도에 그려지던 노면은 사실 월류부 가장 아래를 자른 자리다 — 구체 위 노면은 월류 높이만큼 낮게 앉아야 한다(2026-08-30 사용자 확정). 계획고를 통째로 내려 잡아 측벽·바닥판·십자선·절성토 면적이 한 번에 따라오게 했다. 전폭 평행 하강이라 횡단경사·측구·사면 규칙은 그대로다. 백엔드 - `_ford_set`이 `ford_height_m`을 `overflow_depth_m`으로 스펙에 싣는다. - `compute_cross_design(surface_drop_m=)` — 계획고를 그만큼 내려 계산하고, 내린 양을 `surface_drop_m`으로 echo한다(프론트가 점선을 되그리는 데 쓴다). - `ford_surface_drops()`·`ford_drop_at()` — 관 지점 정본에서 측점별 하강량을 읽는다 (포장 구간과 같은 방식). 설계 계산 경로 전부(기본값·재계산·프리뷰·종횡단 확정)에 물렸다. - `enforce_ford_surface_drops()` — 저장분이 옛 계획고면 상세 조회에서 다시 계산한다. 월류 높이를 지우면 같은 경로로 원래 계획고로 되돌아온다. 프론트 - 십자선을 하강량만큼 내려 찍는다(`cardDesignElevation`). 종단 계획고를 그대로 쓰던 자리다. - `appendFordSurfaceDropPlan()` — "월류가 없었다면" 노면을 점선으로 남긴다. 물넘이포장의 「기존 계획고 점선」과 같은 표기라 한 규칙으로 읽힌다. - 측벽·바닥판은 내려간 설계선(`design_line`)에 그대로 붙으므로 따로 손대지 않았다. 자체검증(공용 브라우저 5174 + 워크트리 백엔드 8001, 측점 7+9.7, 월류 높이 0.39m): - `tmp/tests/test_ford_surface_drop.py` 2건 통과 — 계획고·좌우 노견이 정확히 0.39m 내려가고, 절토는 늘고 성토는 줄며, 하강이 없으면 `surface_drop_m` 키 자체가 없다. - 화면 실측: y축 눈금 1m = 24.375px에서 십자선이 점선보다 9.50px 아래 (= 0.390m, 오차 0.001m). 수정 전에는 두 선이 같은 자리였다. - 세월교 측벽 자동 높이 1.70m → 1.50m. 이론값 1.31m이나 하한(관경 1.0 + 최소 토피 0.5 = 1.5m)에 걸린 값이다 — 기존 규칙 그대로다. - 성토 면적 18.46 → 13.85 ㎡. 이웃 일반 측점에는 점선이 그려지지 않는다. - 검증에 쓴 `pipe_points.json` 임시 옵션은 백업본으로 되돌렸다(정본 무변경). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -445,6 +445,7 @@ def compute_cross_design(
|
||||
rock_boundary_offset_m: float | None = None,
|
||||
two_stage_slope: bool = True,
|
||||
ditch_enabled: bool | None = None,
|
||||
surface_drop_m: float = 0.0,
|
||||
) -> dict[str, Any]:
|
||||
"""측점 하나의 표준횡단 설계선과 절·성토 단면적을 계산한다.
|
||||
|
||||
@@ -455,6 +456,9 @@ def compute_cross_design(
|
||||
standard: B06 설정 패널 편집값(STANDARD_CROSS_SECTION 형태). 요청값 → config 순.
|
||||
rock_boundary_offset_m: 암반 경계선 오프셋(지반선 기준, 음수=하향). 암 지반 2단계 절토용.
|
||||
two_stage_slope: 암 지반에서 암반 경계 기준 2단계 경사 적용 여부(기본 True, 토글로 해제).
|
||||
surface_drop_m: 노면을 통째로 내리는 양(m) — 세월교 월류 높이. 구체 위 노면은 월류
|
||||
높이만큼 낮게 앉으므로 계획고를 그만큼 내려 잡는다. 단면 전체가 평행 이동하므로
|
||||
횡단경사·측구·사면 규칙은 그대로고 절·성토 면적만 따라 바뀐다(2026-08-30 사용자).
|
||||
"""
|
||||
if ground_type not in SECTION_GROUND_TYPE_PRESET:
|
||||
raise ValueError(f"지원하지 않는 지반유형입니다: {ground_type}")
|
||||
@@ -464,6 +468,8 @@ def compute_cross_design(
|
||||
raise ValueError(f"지원하지 않는 측구 형식입니다: {ditch_type}")
|
||||
if design_elevation_m is None:
|
||||
raise ValueError("계획고(design_elevation_m)가 없어 횡단 설계를 계산할 수 없습니다.")
|
||||
drop = max(float(surface_drop_m), 0.0)
|
||||
design_elevation_m = float(design_elevation_m) - drop
|
||||
|
||||
preset_key = SECTION_GROUND_TYPE_PRESET[ground_type]
|
||||
if ditch_type == "l_type" and preset_key != "rock":
|
||||
@@ -630,6 +636,9 @@ def compute_cross_design(
|
||||
"ditch_area_m2": round(ditch_area, 4),
|
||||
"design_line": design_line,
|
||||
}
|
||||
if drop > 0:
|
||||
# 내려 앉힌 양 — 프론트가 "월류가 없었다면" 노면을 점선으로 되그리는 데 쓴다.
|
||||
result["surface_drop_m"] = round(drop, 4)
|
||||
if paved:
|
||||
result["pavement_thickness_m"] = round(paved_group["pavement_thickness_m"], 4)
|
||||
# 암 지반은 경계선 오프셋을 echo해 프론트가 세션값 없이도 오버레이·재계산에 쓰게 한다.
|
||||
|
||||
Reference in New Issue
Block a user