diff --git a/crates/fj-core/src/operations/geometry/half_edge.rs b/crates/fj-core/src/operations/geometry/half_edge.rs new file mode 100644 index 000000000..54de2f73f --- /dev/null +++ b/crates/fj-core/src/operations/geometry/half_edge.rs @@ -0,0 +1,60 @@ +use fj_math::Point; + +use crate::{ + geometry::{CurveBoundary, SurfacePath}, + objects::HalfEdge, + operations::insert::Insert, + storage::Handle, + Core, +}; + +/// Update the geometry of a [`HalfEdge`] +pub trait UpdateHalfEdgeGeometry { + /// Update the path of the edge + #[must_use] + fn update_path( + &self, + update: impl FnOnce(SurfacePath) -> SurfacePath, + core: &mut Core, + ) -> Self; + + /// Update the boundary of the edge + #[must_use] + fn update_boundary( + &self, + update: impl FnOnce(CurveBoundary>) -> CurveBoundary>, + core: &mut Core, + ) -> Self; +} + +impl UpdateHalfEdgeGeometry for Handle { + fn update_path( + &self, + update: impl FnOnce(SurfacePath) -> SurfacePath, + core: &mut Core, + ) -> Self { + let path = update(self.path()); + + HalfEdge::new( + path, + self.boundary(), + self.curve().clone(), + self.start_vertex().clone(), + ) + .insert(core) + } + + fn update_boundary( + &self, + update: impl FnOnce(CurveBoundary>) -> CurveBoundary>, + core: &mut Core, + ) -> Self { + HalfEdge::new( + self.path(), + update(self.boundary()), + self.curve().clone(), + self.start_vertex().clone(), + ) + .insert(core) + } +} diff --git a/crates/fj-core/src/operations/geometry/mod.rs b/crates/fj-core/src/operations/geometry/mod.rs new file mode 100644 index 000000000..5b34f8cd9 --- /dev/null +++ b/crates/fj-core/src/operations/geometry/mod.rs @@ -0,0 +1,5 @@ +//! Operations to update the geometry of objects + +mod half_edge; + +pub use self::half_edge::UpdateHalfEdgeGeometry; diff --git a/crates/fj-core/src/operations/mod.rs b/crates/fj-core/src/operations/mod.rs index 9645aa6ed..38b6c41a3 100644 --- a/crates/fj-core/src/operations/mod.rs +++ b/crates/fj-core/src/operations/mod.rs @@ -40,6 +40,7 @@ pub mod build; pub mod derive; +pub mod geometry; pub mod holes; pub mod insert; pub mod join; diff --git a/crates/fj-core/src/operations/update/half_edge.rs b/crates/fj-core/src/operations/update/half_edge.rs index c8992c629..f10ace4d6 100644 --- a/crates/fj-core/src/operations/update/half_edge.rs +++ b/crates/fj-core/src/operations/update/half_edge.rs @@ -1,7 +1,4 @@ -use fj_math::Point; - use crate::{ - geometry::{CurveBoundary, SurfacePath}, objects::{Curve, HalfEdge, Vertex}, operations::{derive::DeriveFrom, insert::Insert}, storage::Handle, @@ -9,22 +6,7 @@ use crate::{ }; /// Update a [`HalfEdge`] -pub trait UpdateHalfEdge: Sized { - /// Update the path of the edge - #[must_use] - fn update_path( - &self, - update: impl FnOnce(SurfacePath) -> SurfacePath, - core: &mut Core, - ) -> Handle; - - /// Update the boundary of the edge - #[must_use] - fn update_boundary( - &self, - update: impl FnOnce(CurveBoundary>) -> CurveBoundary>, - ) -> Self; - +pub trait UpdateHalfEdge { /// Update the curve of the edge #[must_use] fn update_curve( @@ -47,34 +29,6 @@ pub trait UpdateHalfEdge: Sized { } impl UpdateHalfEdge for HalfEdge { - fn update_path( - &self, - update: impl FnOnce(SurfacePath) -> SurfacePath, - core: &mut Core, - ) -> Handle { - let path = update(self.path()); - - HalfEdge::new( - path, - self.boundary(), - self.curve().clone(), - self.start_vertex().clone(), - ) - .insert(core) - } - - fn update_boundary( - &self, - update: impl FnOnce(CurveBoundary>) -> CurveBoundary>, - ) -> Self { - HalfEdge::new( - self.path(), - update(self.boundary()), - self.curve().clone(), - self.start_vertex().clone(), - ) - } - fn update_curve( &self, update: impl FnOnce(&Handle, &mut Core) -> T, diff --git a/crates/fj-core/src/validate/shell.rs b/crates/fj-core/src/validate/shell.rs index ff062f243..48bf7a8cb 100644 --- a/crates/fj-core/src/validate/shell.rs +++ b/crates/fj-core/src/validate/shell.rs @@ -403,6 +403,7 @@ mod tests { objects::{Curve, Shell}, operations::{ build::BuildShell, + geometry::UpdateHalfEdgeGeometry, update::{ UpdateCycle, UpdateFace, UpdateHalfEdge, UpdateRegion, UpdateShell, @@ -435,9 +436,10 @@ mod tests { |path| path.reverse(), core, ) - .update_boundary(|boundary| { - boundary.reverse() - })] + .update_boundary( + |boundary| boundary.reverse(), + core, + )] }, core, )