diff --git a/crates/fj-core/src/geometry/geometry.rs b/crates/fj-core/src/geometry/geometry.rs index 2475d6211..6b76d3661 100644 --- a/crates/fj-core/src/geometry/geometry.rs +++ b/crates/fj-core/src/geometry/geometry.rs @@ -62,6 +62,14 @@ impl Geometry { self_ } + pub(crate) fn define_curve_inner( + &mut self, + curve: Handle, + geometry: CurveGeom, + ) { + self.curve.insert(curve, geometry); + } + pub(crate) fn define_half_edge_inner( &mut self, half_edge: Handle, diff --git a/crates/fj-core/src/layers/geometry.rs b/crates/fj-core/src/layers/geometry.rs index b23aa5cd2..b621acfff 100644 --- a/crates/fj-core/src/layers/geometry.rs +++ b/crates/fj-core/src/layers/geometry.rs @@ -1,14 +1,20 @@ //! Layer infrastructure for [`Geometry`] use crate::{ - geometry::{Geometry, HalfEdgeGeom, SurfaceGeom}, + geometry::{CurveGeom, Geometry, HalfEdgeGeom, SurfaceGeom}, storage::Handle, - topology::{HalfEdge, Surface}, + topology::{Curve, HalfEdge, Surface}, }; use super::{Command, Event, Layer}; impl Layer { + /// Define the geometry of the provided curve + pub fn define_curve(&mut self, curve: Handle, geometry: CurveGeom) { + let mut events = Vec::new(); + self.process(DefineCurve { curve, geometry }, &mut events); + } + /// Define the geometry of the provided half-edge pub fn define_half_edge( &mut self, @@ -41,6 +47,31 @@ impl Layer { } } +/// Define the geometry of a curve +pub struct DefineCurve { + curve: Handle, + geometry: CurveGeom, +} + +impl Command for DefineCurve { + type Result = (); + type Event = Self; + + fn decide( + self, + _: &Geometry, + events: &mut Vec, + ) -> Self::Result { + events.push(self); + } +} + +impl Event for DefineCurve { + fn evolve(&self, state: &mut Geometry) { + state.define_curve_inner(self.curve.clone(), self.geometry.clone()); + } +} + /// Define the geometry of a half-edge pub struct DefineHalfEdge { half_edge: Handle,