cimery Sprint 1 — Rust 워크스페이스 + 전 계층 파이프라인
8개 크레이트 구현, cargo test 32개 전부 통과: - core: Mm/M 단위 newtype, UnitExt 리터럴, FeatureError - ir: GirderIR + 전 단면 파라미터(PSC-I/U/SteelBox/PlateI) serde JSON - dsl: Girder builder + 검증 (경간 범위·count·spacing) - kernel: GeomKernel trait + StubKernel (box mesh, AABB) - incremental: dirty-tracking IncrementalDb (salsa 업그레이드 경로 주석) - evaluator: 상태 없는 IR→kernel 브리지 - usd: USDA 1.0 텍스트 익스포트 (CimeryBridgeAPI·GirderAPI schema) - viewer: wgpu 22 + winit 0.30 컬러 삼각형 (Sprint 1 proof-of-concept) Sprint 2 다음 단계: - opencascade-rs로 StubKernel 교체 (실제 PSC-I sweep) - viewer에서 Girder Mesh 렌더 + 카메라 orbit Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
12
cimery/crates/evaluator/Cargo.toml
Normal file
12
cimery/crates/evaluator/Cargo.toml
Normal file
@@ -0,0 +1,12 @@
|
||||
[package]
|
||||
name = "cimery-evaluator"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
|
||||
[dependencies]
|
||||
cimery-ir = { workspace = true }
|
||||
cimery-kernel = { workspace = true }
|
||||
cimery-incremental = { workspace = true }
|
||||
|
||||
[dev-dependencies]
|
||||
cimery-core = { workspace = true }
|
||||
81
cimery/crates/evaluator/src/lib.rs
Normal file
81
cimery/crates/evaluator/src/lib.rs
Normal file
@@ -0,0 +1,81 @@
|
||||
//! cimery-evaluator — IR → geometry kernel bridge.
|
||||
//!
|
||||
//! Stateless wrapper that calls a `GeomKernel` on demand.
|
||||
//! For cached/incremental evaluation use [`cimery_incremental::IncrementalDb`].
|
||||
|
||||
use cimery_ir::GirderIR;
|
||||
use cimery_kernel::{GeomKernel, KernelError, Mesh};
|
||||
|
||||
// ─── Evaluator ────────────────────────────────────────────────────────────────
|
||||
|
||||
/// Stateless bridge between IR and geometry kernel.
|
||||
///
|
||||
/// Use [`IncrementalDb`](cimery_incremental::IncrementalDb) for cached evaluation.
|
||||
/// Use `Evaluator` when you need a one-shot compute without caching.
|
||||
pub struct Evaluator<K: GeomKernel> {
|
||||
pub kernel: K,
|
||||
}
|
||||
|
||||
impl<K: GeomKernel> Evaluator<K> {
|
||||
pub fn new(kernel: K) -> Self { Self { kernel } }
|
||||
|
||||
/// Compute the mesh for a Girder IR. No caching.
|
||||
pub fn eval_girder(&self, ir: &GirderIR) -> Result<Mesh, KernelError> {
|
||||
self.kernel.girder_mesh(ir)
|
||||
}
|
||||
// Future Sprint 2: eval_pier, eval_bearing, eval_deck, etc.
|
||||
}
|
||||
|
||||
// ─── Tests ────────────────────────────────────────────────────────────────────
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use cimery_core::{MaterialGrade, SectionType};
|
||||
use cimery_ir::{FeatureId, GirderIR, PscISectionParams, SectionParams};
|
||||
use cimery_kernel::StubKernel;
|
||||
|
||||
fn test_ir() -> GirderIR {
|
||||
GirderIR {
|
||||
id: FeatureId::new(),
|
||||
station_start: 0.0,
|
||||
station_end: 40.0,
|
||||
offset_from_alignment: 0.0,
|
||||
section_type: SectionType::PscI,
|
||||
section: SectionParams::PscI(PscISectionParams::kds_standard()),
|
||||
count: 1,
|
||||
spacing: 0.0,
|
||||
material: MaterialGrade::C50,
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_with_stub_kernel() {
|
||||
let eval = Evaluator::new(StubKernel);
|
||||
let mesh = eval.eval_girder(&test_ir()).unwrap();
|
||||
assert!(mesh.triangle_count() > 0);
|
||||
assert!(mesh.vertex_count() > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_matches_direct_kernel_call() {
|
||||
let ir = test_ir();
|
||||
let eval = Evaluator::new(StubKernel);
|
||||
|
||||
let via_eval = eval.eval_girder(&ir).unwrap();
|
||||
let via_direct = StubKernel.girder_mesh(&ir).unwrap();
|
||||
|
||||
assert_eq!(via_eval.triangle_count(), via_direct.triangle_count());
|
||||
assert_eq!(via_eval.vertex_count(), via_direct.vertex_count());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn aabb_z_extent_equals_span() {
|
||||
let ir = test_ir();
|
||||
let eval = Evaluator::new(StubKernel);
|
||||
let mesh = eval.eval_girder(&ir).unwrap();
|
||||
let (mn, mx) = mesh.aabb();
|
||||
let z_extent = mx[2] - mn[2];
|
||||
assert!((z_extent - ir.span_mm() as f32).abs() < 0.1);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user