Another project
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}