Sprint 3 — Must Feature 5종 추가 (상부→하부 순서)

상부 구조물:
- DeckSlabIR + DeckSlabBuilder + 기하학 (직사각형 슬래브 스위프)

연결부:
- BearingIR + BearingBuilder (카탈로그 기반, KDS 기본값 포함)

하부 구조물:
- PierIR + PierBuilder + 기하학 (다주 지원, 코핑 포함)
- AbutmentIR + AbutmentBuilder + 기하학 (흉벽 + 기초 + 날개벽)

core에 BearingType·PierType·ColumnShape·AbutmentType 열거형 추가
kernel: sweep.rs 공유 모듈 (sweep_profile_flat·box·prism·merge)
psc_i.rs → sweep.rs 의존으로 리팩터
GeomKernel trait에 4개 메서드 추가 (상부→하부 문서화 주석)

cargo test 57개 전부 통과

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-14 19:27:57 +09:00
parent 40857f39c5
commit bdacea5253
16 changed files with 1113 additions and 85 deletions

View File

@@ -138,6 +138,112 @@ pub struct SteelPlateIParams {
pub web_thickness: f64,
}
// ─── Deck Slab IR ─────────────────────────────────────────────────────────────
/// Fully-resolved Deck Slab (바닥판) specification.
/// Structural dimensions in mm, alignment in m.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeckSlabIR {
pub id: FeatureId,
pub station_start: f64, // m
pub station_end: f64, // m
/// Width left of alignment centreline [mm].
pub width_left: f64,
/// Width right of alignment centreline [mm].
pub width_right: f64,
/// Slab thickness [mm].
pub thickness: f64,
/// Haunch depth over girder top flange [mm].
pub haunch_depth: f64,
/// Cross-slope [%]. Positive = right side lower.
pub cross_slope: f64,
pub material: cimery_core::MaterialGrade,
}
impl DeckSlabIR {
pub fn span_m(&self) -> f64 { self.station_end - self.station_start }
pub fn span_mm(&self) -> f64 { self.span_m() * 1_000.0 }
pub fn total_width(&self) -> f64 { self.width_left + self.width_right }
}
// ─── Bearing IR ───────────────────────────────────────────────────────────────
/// Fully-resolved Bearing (받침) specification.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BearingIR {
pub id: FeatureId,
pub station: f64, // m — position along alignment
pub bearing_type: cimery_core::BearingType,
/// Dimension along span direction [mm].
pub plan_length: f64,
/// Dimension transverse to span [mm].
pub plan_width: f64,
pub total_height: f64, // mm
pub capacity_vertical: f64, // kN
}
// ─── Cap Beam IR ──────────────────────────────────────────────────────────────
/// Pier cap beam (교각 코핑).
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CapBeamIR {
pub length: f64, // mm — total along transverse
pub width: f64, // mm — along span
pub depth: f64, // mm — vertical
pub cantilever_left: f64, // mm — overhang beyond outermost column
pub cantilever_right: f64,
}
// ─── Pier IR ──────────────────────────────────────────────────────────────────
/// Fully-resolved Pier (교각) specification.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PierIR {
pub id: FeatureId,
pub station: f64, // m
pub skew_angle: f64, // degrees — deviation from normal
pub pier_type: cimery_core::PierType,
pub column_shape: cimery_core::ColumnShape,
pub column_count: u32,
pub column_spacing: f64, // mm — centre-to-centre
/// Diameter (circular) or width (rectangular) [mm].
pub column_diameter: f64,
/// Depth for rectangular section [mm]; ignored for circular.
pub column_depth: f64,
pub column_height: f64, // mm — footing top to cap beam soffit
pub cap_beam: CapBeamIR,
pub material: cimery_core::MaterialGrade,
}
// ─── Wing Wall IR ─────────────────────────────────────────────────────────────
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WingWallIR {
pub length: f64, // mm — along wing wall axis
pub height: f64, // mm — at connection with breast wall
pub thickness: f64, // mm
}
// ─── Abutment IR ──────────────────────────────────────────────────────────────
/// Fully-resolved Abutment (교대) specification.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AbutmentIR {
pub id: FeatureId,
pub station: f64, // m
pub skew_angle: f64, // degrees
pub abutment_type: cimery_core::AbutmentType,
pub breast_wall_height: f64, // mm
pub breast_wall_thickness: f64, // mm
pub breast_wall_width: f64, // mm — transverse
pub footing_length: f64, // mm — along span
pub footing_width: f64, // mm — transverse
pub footing_thickness: f64, // mm
pub wing_wall_left: WingWallIR,
pub wing_wall_right: WingWallIR,
pub material: cimery_core::MaterialGrade,
}
// ─── Tests ────────────────────────────────────────────────────────────────────
#[cfg(test)]