Fix API for defining curve geometry

The previous version would not allow defining local curve geometry for
multiple surfaces.
This commit is contained in:
Hanno Braun 2024-04-29 13:49:05 +02:00
parent 635fc51645
commit 128a15df53
4 changed files with 39 additions and 17 deletions

View File

@ -7,7 +7,7 @@ use crate::{
topology::{Curve, HalfEdge, Surface, Topology},
};
use super::{CurveGeom, GlobalPath, HalfEdgeGeom, SurfaceGeom};
use super::{CurveGeom, GlobalPath, HalfEdgeGeom, LocalCurveGeom, SurfaceGeom};
/// Geometric data that is associated with topological objects
pub struct Geometry {
@ -65,9 +65,14 @@ impl Geometry {
pub(crate) fn define_curve_inner(
&mut self,
curve: Handle<Curve>,
geometry: CurveGeom,
surface: Handle<Surface>,
geometry: LocalCurveGeom,
) {
self.curve.insert(curve, geometry);
self.curve
.entry(curve)
.or_default()
.definitions
.insert(surface, geometry);
}
pub(crate) fn define_half_edge_inner(

View File

@ -1,7 +1,7 @@
//! Layer infrastructure for [`Geometry`]
use crate::{
geometry::{CurveGeom, Geometry, HalfEdgeGeom, SurfaceGeom},
geometry::{Geometry, HalfEdgeGeom, LocalCurveGeom, SurfaceGeom},
storage::Handle,
topology::{Curve, HalfEdge, Surface},
};
@ -10,9 +10,21 @@ use super::{Command, Event, Layer};
impl Layer<Geometry> {
/// Define the geometry of the provided curve
pub fn define_curve(&mut self, curve: Handle<Curve>, geometry: CurveGeom) {
pub fn define_curve(
&mut self,
curve: Handle<Curve>,
surface: Handle<Surface>,
geometry: LocalCurveGeom,
) {
let mut events = Vec::new();
self.process(DefineCurve { curve, geometry }, &mut events);
self.process(
DefineCurve {
curve,
surface,
geometry,
},
&mut events,
);
}
/// Define the geometry of the provided half-edge
@ -50,7 +62,8 @@ impl Layer<Geometry> {
/// Define the geometry of a curve
pub struct DefineCurve {
curve: Handle<Curve>,
geometry: CurveGeom,
surface: Handle<Surface>,
geometry: LocalCurveGeom,
}
impl Command<Geometry> for DefineCurve {
@ -68,7 +81,11 @@ impl Command<Geometry> for DefineCurve {
impl Event<Geometry> for DefineCurve {
fn evolve(&self, state: &mut Geometry) {
state.define_curve_inner(self.curve.clone(), self.geometry.clone());
state.define_curve_inner(
self.curve.clone(),
self.surface.clone(),
self.geometry.clone(),
);
}
}

View File

@ -2,7 +2,7 @@ use fj_interop::ext::ArrayExt;
use fj_math::{Arc, Point, Scalar};
use crate::{
geometry::{CurveGeom, HalfEdgeGeom, SurfacePath},
geometry::{HalfEdgeGeom, LocalCurveGeom, SurfacePath},
operations::{geometry::UpdateHalfEdgeGeometry, insert::Insert},
storage::Handle,
topology::{Curve, HalfEdge, Surface, Vertex},
@ -65,7 +65,8 @@ pub trait BuildHalfEdge {
core.layers.geometry.define_curve(
half_edge.curve().clone(),
CurveGeom::from_path_and_surface(path, surface),
surface,
LocalCurveGeom { path },
);
core.layers.geometry.define_half_edge(
half_edge.clone(),
@ -93,7 +94,8 @@ pub trait BuildHalfEdge {
core.layers.geometry.define_curve(
half_edge.curve().clone(),
CurveGeom::from_path_and_surface(path, surface),
surface,
LocalCurveGeom { path },
);
core.layers.geometry.define_half_edge(
half_edge.clone(),
@ -123,7 +125,8 @@ pub trait BuildHalfEdge {
core.layers.geometry.define_curve(
half_edge.curve().clone(),
CurveGeom::from_path_and_surface(path, surface),
surface,
LocalCurveGeom { path },
);
core.layers.geometry.define_half_edge(
half_edge.clone(),

View File

@ -1,5 +1,5 @@
use crate::{
geometry::{CurveGeom, Geometry, SurfacePath},
geometry::{Geometry, LocalCurveGeom, SurfacePath},
layers::Layer,
storage::Handle,
topology::{Curve, Surface},
@ -23,10 +23,7 @@ impl UpdateCurveGeometry for Handle<Curve> {
surface: Handle<Surface>,
geometry: &mut Layer<Geometry>,
) -> Self {
geometry.define_curve(
self.clone(),
CurveGeom::from_path_and_surface(path, surface),
);
geometry.define_curve(self.clone(), surface, LocalCurveGeom { path });
self
}