feat(b06): 소단 = 성토 사면 노면 끝 아래 depth_m 에 수평 한 단 · 아래로 성토 이음 · 절토 소단 끔 · 높이 칸 숨김 · 깊이 칸(기본 1.0 · 0 미만 = 0) · 파이썬 · TS 거울 시험(178-2)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3mdb91125mPoC6tpsQx4P
This commit is contained in:
2026-10-10 11:56:48 +09:00
co-authored by Claude Opus 5.5
parent 24aba4008d
commit 922a2876eb
16 changed files with 321 additions and 54 deletions
@@ -217,11 +217,8 @@ class _SectionGeometry:
self.cut_ratio,
self.soil_cut_ratio,
boundary,
self.berm,
# 소단이 있으면 경계를 오갈 때마다 꺾는다 — 소단은 평탄한데 경계선은 지반을
# 따라 올라가서 되돌아 들어가는 일이 흔하다. 한 번만 꺾으면 그 구간을 암인데
# 토사 경사로 그려 절토가 조용히 커진다(2026-09-07).
multi_knee=self.berm is not None,
# 절토 소단 끔(178-2 · 소단 = 성토 사면 한 단) — 경계는 한 번만 꺾음(종전 규칙).
None,
)
self._cut_points_cache[side] = points
return points
@@ -235,7 +232,11 @@ class _SectionGeometry:
if side in self._fill_points_cache:
return self._fill_points_cache[side]
start_dist, start_z = self._slope_start(side)
points = fill_profile_points(start_dist, start_z, self.fill_ratio, self.berm)
# 소단 깊이 기준 = 그쪽 노면 끝(길어깨 끝) 표고 — 측구가 그쪽이어도 같음(178-2).
edge_z = (
self.road_z(self.left_extent) if side == "left" else self.road_z(-self.right_extent)
)
points = fill_profile_points(start_dist, start_z, self.fill_ratio, self.berm, top_z=edge_z)
self._fill_points_cache[side] = points
return points
@@ -428,8 +429,8 @@ class _SectionGeometry:
"""적분·설계선에 반드시 포함할 설계 꼭짓점 오프셋 목록(2단계 무릎·소단 포함)."""
points = [0.0, self.left_extent, -self.right_extent]
points.extend(offset for offset, _z in self.ditch_points)
# 절토 사면 꼭짓점(무릎·소단 모서리) — 빠뜨리면 계단이 설계선에 안 실린다.
if self.two_stage or self.berm is not None:
# 절토 사면 꼭짓점(무릎) — 빠뜨리면 꺾임이 설계선에 안 실린다.
if self.two_stage:
for side in ("left", "right"):
role = self.left_role if side == "left" else self.right_role
if role != "cut":