Another project
0

Configure Feed

Select the types of activity you want to include in your feed.

at main 2.5 kB View raw
1use bone_kernel::{BrepError, BrepSolid, ExtrudeFeature}; 2use bone_solver::SolverError; 3use bone_types::{FeatureId, GeometryGeneration, RebuildError}; 4 5use crate::Sketch; 6use crate::profile::build_profile; 7 8#[derive(Clone, Debug, PartialEq)] 9pub enum EvaluatedSketch { 10 Solved(Sketch), 11 Failed(SolverError), 12 PlaneUnresolved(RebuildError), 13} 14 15#[must_use] 16pub fn evaluate_sketch(input: &Sketch) -> EvaluatedSketch { 17 match input.solve() { 18 Ok(solved) => EvaluatedSketch::Solved(solved), 19 Err(error) => EvaluatedSketch::Failed(error), 20 } 21} 22 23#[derive(Clone, Debug, thiserror::Error)] 24pub enum ExtrudeError { 25 #[error(transparent)] 26 UnsolvedSketch(SolverError), 27 #[error(transparent)] 28 Kernel(BrepError), 29 #[error("{0}")] 30 PlaneUnresolved(RebuildError), 31} 32 33#[derive(Clone)] 34pub struct EvaluatedExtrude { 35 result: Result<BrepSolid, ExtrudeError>, 36 generation: Option<GeometryGeneration>, 37} 38 39impl EvaluatedExtrude { 40 pub fn result(&self) -> &Result<BrepSolid, ExtrudeError> { 41 &self.result 42 } 43 44 #[must_use] 45 pub fn solid(&self) -> Option<&BrepSolid> { 46 self.result.as_ref().ok() 47 } 48 49 #[must_use] 50 pub fn generation(&self) -> Option<GeometryGeneration> { 51 self.generation 52 } 53} 54 55impl core::fmt::Debug for EvaluatedExtrude { 56 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 57 let mut state = f.debug_struct("EvaluatedExtrude"); 58 state.field("generation", &self.generation); 59 match &self.result { 60 Ok(solid) => state.field("faces", &solid.iter_faces().count()), 61 Err(error) => state.field("error", error), 62 }; 63 state.finish() 64 } 65} 66 67#[must_use] 68pub fn evaluate_extrude( 69 extrude: FeatureId, 70 sketch: &EvaluatedSketch, 71 feature: &ExtrudeFeature, 72) -> EvaluatedExtrude { 73 let result = match sketch { 74 EvaluatedSketch::Solved(solved) => build_profile(solved) 75 .and_then(|profile| bone_kernel::evaluate_extrude(extrude, &profile, feature)) 76 .map_err(ExtrudeError::Kernel), 77 EvaluatedSketch::Failed(error) => Err(ExtrudeError::UnsolvedSketch(error.clone())), 78 EvaluatedSketch::PlaneUnresolved(error) => Err(ExtrudeError::PlaneUnresolved(*error)), 79 }; 80 let generation = result 81 .as_ref() 82 .ok() 83 .map(|solid| GeometryGeneration::from_solid_key(solid.content_key())); 84 EvaluatedExtrude { result, generation } 85}