diff --git a/crates/fj-kernel/src/algorithms/approx/faces.rs b/crates/fj-kernel/src/algorithms/approx/faces.rs index c296dd123c..64f72a961f 100644 --- a/crates/fj-kernel/src/algorithms/approx/faces.rs +++ b/crates/fj-kernel/src/algorithms/approx/faces.rs @@ -85,7 +85,7 @@ mod tests { use crate::{ local::Local, - objects::{Face, Surface}, + objects::{Cycle, Face, Surface}, }; use super::{CycleApprox, FaceApprox, Tolerance}; @@ -106,10 +106,16 @@ mod tests { let g = Point::from([2., 2.]); let h = Point::from([1., 2.]); - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([a, b, c, d]) - .with_interior_polygon([e, f, g, h]) - .build(); + let surface = Surface::xy_plane(); + let face = Face::new(surface) + .with_exteriors([Cycle::polygon_from_points( + &surface, + [a, b, c, d], + )]) + .with_interiors([Cycle::polygon_from_points( + &surface, + [e, f, g, h], + )]); let a = Local::new(a, a.to_xyz()); let b = Local::new(b, b.to_xyz()); diff --git a/crates/fj-kernel/src/algorithms/intersection/curve_face.rs b/crates/fj-kernel/src/algorithms/intersection/curve_face.rs index cf81fa7a27..50475209c2 100644 --- a/crates/fj-kernel/src/algorithms/intersection/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersection/curve_face.rs @@ -184,7 +184,7 @@ pub type CurveFaceIntersection = [Scalar; 2]; mod tests { use fj_math::{Line, Point, Vector}; - use crate::objects::{Curve, Face, Surface}; + use crate::objects::{Curve, Cycle, Face, Surface}; use super::CurveFaceIntersectionList; @@ -210,10 +210,10 @@ mod tests { [-1., 1.], ]; - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon(exterior) - .with_interior_polygon(interior) - .build(); + let surface = Surface::xy_plane(); + let face = Face::new(surface) + .with_exteriors([Cycle::polygon_from_points(&surface, exterior)]) + .with_interiors([Cycle::polygon_from_points(&surface, interior)]); let expected = CurveFaceIntersectionList::from_intervals([[1., 2.], [4., 5.]]); diff --git a/crates/fj-kernel/src/algorithms/reverse.rs b/crates/fj-kernel/src/algorithms/reverse.rs index c0a442f8ce..ba391344c4 100644 --- a/crates/fj-kernel/src/algorithms/reverse.rs +++ b/crates/fj-kernel/src/algorithms/reverse.rs @@ -64,19 +64,25 @@ fn reverse_local_coordinates_in_cycle<'r>( mod tests { use pretty_assertions::assert_eq; - use crate::objects::{Face, Surface}; + use crate::objects::{Cycle, Face, Surface}; #[test] fn reverse_face() { - let original = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([[0., 0.], [1., 0.], [0., 1.]]) - .build(); + let surface = Surface::xy_plane(); + let original = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [[0., 0.], [1., 0.], [0., 1.]], + )]); let reversed = super::reverse_face(&original); - let expected = Face::builder(Surface::xy_plane().reverse()) - .with_exterior_polygon([[0., 0.], [1., 0.], [0., -1.]]) - .build(); + let surface = Surface::xy_plane().reverse(); + let expected = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [[0., 0.], [1., 0.], [0., -1.]], + )]); assert_eq!(expected, reversed); } diff --git a/crates/fj-kernel/src/algorithms/sweep.rs b/crates/fj-kernel/src/algorithms/sweep.rs index eceaf68b57..dc5bf85260 100644 --- a/crates/fj-kernel/src/algorithms/sweep.rs +++ b/crates/fj-kernel/src/algorithms/sweep.rs @@ -205,7 +205,7 @@ mod tests { use crate::{ algorithms::Tolerance, iter::ObjectIters, - objects::{Face, Sketch, Surface}, + objects::{Cycle, Face, Sketch, Surface}, }; #[test] @@ -294,9 +294,12 @@ mod tests { ) -> anyhow::Result<()> { let tolerance = Tolerance::from_scalar(Scalar::ONE)?; - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([[0., 0.], [1., 0.], [0., 1.]]) - .build(); + let surface = Surface::xy_plane(); + let face = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [[0., 0.], [1., 0.], [0., 1.]], + )]); let sketch = Sketch::from_faces([face]); let solid = @@ -310,9 +313,10 @@ mod tests { let faces = expected_surfaces.into_iter().map(|surface| { let surface = Surface::plane_from_points(surface); - Face::builder(surface) - .with_exterior_polygon(expected_vertices.clone()) - .build() + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + expected_vertices.clone(), + )]) }); for face in faces { diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index f0e9e8fbf1..7cc73fde10 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -67,7 +67,7 @@ mod tests { use crate::{ algorithms::Tolerance, - objects::{Face, Surface}, + objects::{Cycle, Face, Surface}, }; #[test] @@ -77,9 +77,12 @@ mod tests { let c = [2., 2.]; let d = [0., 1.]; - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([a, b, c, d]) - .build(); + let surface = Surface::xy_plane(); + let face = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [a, b, c, d], + )]); let a = Point::from(a).to_xyz(); let b = Point::from(b).to_xyz(); @@ -108,10 +111,16 @@ mod tests { let g = [3., 3.]; let h = [1., 2.]; - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([a, b, c, d]) - .with_interior_polygon([e, f, g, h]) - .build(); + let surface = Surface::xy_plane(); + let face = Face::new(surface) + .with_exteriors([Cycle::polygon_from_points( + &surface, + [a, b, c, d], + )]) + .with_interiors([Cycle::polygon_from_points( + &surface, + [e, f, g, h], + )]); let triangles = triangulate(face)?; @@ -158,9 +167,12 @@ mod tests { let d = Point::from([0.1, 0.1]); let e = Point::from([0., 0.8]); - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([a, b, c, d, e]) - .build(); + let surface = Surface::xy_plane(); + let face = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [a, b, c, d, e], + )]); let triangles = triangulate(face)?; diff --git a/crates/fj-kernel/src/builder.rs b/crates/fj-kernel/src/builder.rs deleted file mode 100644 index 68e6fe6db0..0000000000 --- a/crates/fj-kernel/src/builder.rs +++ /dev/null @@ -1,83 +0,0 @@ -//! Convenient API to build objects - -use fj_interop::mesh::Color; -use fj_math::Point; - -use crate::objects::{Cycle, Face, Surface}; - -/// API for building a [`Face`] -#[must_use] -pub struct FaceBuilder { - surface: Surface, - exterior: Option>>, - interiors: Vec>>, - color: Option, -} - -impl FaceBuilder { - /// Construct a new instance of `FaceBuilder` - pub fn new(surface: Surface) -> Self { - Self { - surface, - exterior: None, - interiors: Vec::new(), - color: None, - } - } - - /// Make the exterior or the face a polygon - pub fn with_exterior_polygon( - self, - points: impl IntoIterator>>, - ) -> Self { - let points = points.into_iter().map(Into::into).collect(); - - Self { - exterior: Some(points), - ..self - } - } - - /// Add an interior polygon to the face - pub fn with_interior_polygon( - self, - points: impl IntoIterator>>, - ) -> Self { - let points = points.into_iter().map(Into::into).collect(); - - let mut interiors = self.interiors; - interiors.push(points); - - Self { interiors, ..self } - } - - /// Define the color of the face - pub fn with_color(mut self, color: Color) -> Self { - self.color = Some(color); - self - } - - /// Build the face - pub fn build(self) -> Face { - let surface = self.surface; - - let mut exteriors = Vec::new(); - if let Some(points) = self.exterior { - let cycle = Cycle::polygon_from_points(&self.surface, points); - exteriors.push(cycle); - } - - let mut interiors = Vec::new(); - for points in self.interiors { - let cycle = Cycle::polygon_from_points(&self.surface, points); - interiors.push(cycle); - } - - let color = self.color.unwrap_or_default(); - - Face::new(surface) - .with_exteriors(exteriors) - .with_interiors(interiors) - .with_color(color) - } -} diff --git a/crates/fj-kernel/src/iter.rs b/crates/fj-kernel/src/iter.rs index 1974665210..4ae9aae239 100644 --- a/crates/fj-kernel/src/iter.rs +++ b/crates/fj-kernel/src/iter.rs @@ -355,9 +355,12 @@ mod tests { #[test] fn face() { - let object = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([[0., 0.], [1., 0.], [0., 1.]]) - .build(); + let surface = Surface::xy_plane(); + let object = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [[0., 0.], [1., 0.], [0., 1.]], + )]); assert_eq!(3, object.curve_iter().count()); assert_eq!(1, object.cycle_iter().count()); @@ -387,9 +390,12 @@ mod tests { #[test] fn sketch() { - let face = Face::builder(Surface::xy_plane()) - .with_exterior_polygon([[0., 0.], [1., 0.], [0., 1.]]) - .build(); + let surface = Surface::xy_plane(); + let face = + Face::new(surface).with_exteriors([Cycle::polygon_from_points( + &surface, + [[0., 0.], [1., 0.], [0., 1.]], + )]); let object = Sketch::from_faces([face]); assert_eq!(3, object.curve_iter().count()); diff --git a/crates/fj-kernel/src/lib.rs b/crates/fj-kernel/src/lib.rs index fed8991f1b..d8171eecc4 100644 --- a/crates/fj-kernel/src/lib.rs +++ b/crates/fj-kernel/src/lib.rs @@ -88,7 +88,6 @@ #![warn(missing_docs)] pub mod algorithms; -pub mod builder; pub mod iter; pub mod local; pub mod objects; diff --git a/crates/fj-kernel/src/objects/face.rs b/crates/fj-kernel/src/objects/face.rs index 06a7a6f822..32c834a4c7 100644 --- a/crates/fj-kernel/src/objects/face.rs +++ b/crates/fj-kernel/src/objects/face.rs @@ -1,8 +1,6 @@ use fj_interop::mesh::Color; use fj_math::Triangle; -use crate::builder::FaceBuilder; - use super::{Cycle, Surface}; /// A face of a shape @@ -34,11 +32,6 @@ impl Face { } } - /// Build a face using the [`FaceBuilder`] API - pub fn builder(surface: Surface) -> FaceBuilder { - FaceBuilder::new(surface) - } - /// Access this face's surface pub fn surface(&self) -> &Surface { &self.brep().surface diff --git a/crates/fj-kernel/src/objects/solid.rs b/crates/fj-kernel/src/objects/solid.rs index 74982135ee..0ae94bf0cd 100644 --- a/crates/fj-kernel/src/objects/solid.rs +++ b/crates/fj-kernel/src/objects/solid.rs @@ -2,7 +2,7 @@ use std::collections::BTreeSet; use fj_math::Scalar; -use crate::algorithms::TransformObject; +use crate::{algorithms::TransformObject, objects::Cycle}; use super::{Face, Surface}; @@ -49,7 +49,8 @@ impl Solid { ]; let faces = planes.map(|plane| { - Face::builder(plane).with_exterior_polygon(points).build() + Face::new(plane) + .with_exteriors([Cycle::polygon_from_points(&plane, points)]) }); Solid::from_faces(faces) diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index a1649d683b..0d0afc8017 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -36,10 +36,11 @@ impl Shape for fj::Sketch { let points = poly_chain.to_points().into_iter().map(Point::from); - Face::builder(surface) - .with_exterior_polygon(points) + Face::new(surface) + .with_exteriors([Cycle::polygon_from_points( + &surface, points, + )]) .with_color(Color(self.color())) - .build() } };