From ac90969a66b7c6a7ecd5257789470251e346cbaf Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Mon, 12 Sep 2022 16:15:35 +0200 Subject: [PATCH 1/2] Add builder API for `Vertex` --- crates/fj-kernel/src/builder/mod.rs | 2 ++ crates/fj-kernel/src/builder/vertex.rs | 37 ++++++++++++++++++++++++++ crates/fj-kernel/src/objects/vertex.rs | 7 +++++ 3 files changed, 46 insertions(+) create mode 100644 crates/fj-kernel/src/builder/vertex.rs diff --git a/crates/fj-kernel/src/builder/mod.rs b/crates/fj-kernel/src/builder/mod.rs index 9837f7fa3..5a659b739 100644 --- a/crates/fj-kernel/src/builder/mod.rs +++ b/crates/fj-kernel/src/builder/mod.rs @@ -7,6 +7,7 @@ mod face; mod shell; mod sketch; mod solid; +mod vertex; pub use self::{ curve::{CurveBuilder, GlobalCurveBuilder}, @@ -16,4 +17,5 @@ pub use self::{ shell::ShellBuilder, sketch::SketchBuilder, solid::SolidBuilder, + vertex::VertexBuilder, }; diff --git a/crates/fj-kernel/src/builder/vertex.rs b/crates/fj-kernel/src/builder/vertex.rs new file mode 100644 index 000000000..b5a323610 --- /dev/null +++ b/crates/fj-kernel/src/builder/vertex.rs @@ -0,0 +1,37 @@ +use fj_math::Point; + +use crate::objects::{Curve, GlobalVertex, SurfaceVertex, Vertex}; + +/// API for building a [`Vertex`] +pub struct VertexBuilder { + curve: Curve, +} + +impl VertexBuilder { + /// Construct a new instance of `VertexBuilder` + /// + /// Also see [`Vertex::build`]. + pub fn new(curve: Curve) -> Self { + Self { curve } + } + + /// Build a vertex from a curve position + pub fn from_point(&self, point: impl Into>) -> Vertex { + let point = point.into(); + let &surface = self.curve.surface(); + + let global_form = GlobalVertex::from_position( + self.curve + .global_form() + .kind() + .point_from_curve_coords(point), + ); + let surface_form = SurfaceVertex::new( + self.curve.kind().point_from_curve_coords(point), + surface, + global_form, + ); + + Vertex::new([0.], self.curve, surface_form, global_form) + } +} diff --git a/crates/fj-kernel/src/objects/vertex.rs b/crates/fj-kernel/src/objects/vertex.rs index 38f0254bb..911211e79 100644 --- a/crates/fj-kernel/src/objects/vertex.rs +++ b/crates/fj-kernel/src/objects/vertex.rs @@ -1,6 +1,8 @@ use fj_math::Point; use pretty_assertions::assert_eq; +use crate::builder::VertexBuilder; + use super::{Curve, Surface}; /// A vertex @@ -17,6 +19,11 @@ pub struct Vertex { } impl Vertex { + /// Build a vertex using [`VertexBuilder`] + pub fn build(curve: Curve) -> VertexBuilder { + VertexBuilder::new(curve) + } + /// Construct an instance of `Vertex` /// /// Panics, if `curve` and `surface_form` are not defined on the same From 9c2607bdb96c1fa9f2c2d04ccdae8ad05d0ebffe Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Mon, 12 Sep 2022 16:51:07 +0200 Subject: [PATCH 2/2] Improve wording in doc comments It's a *builder*, so it *builds* stuff instead of creatings it. --- crates/fj-kernel/src/builder/edge.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index 09516d8fc..7034f621f 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -18,7 +18,7 @@ impl HalfEdgeBuilder { Self { surface } } - /// Create a circle from the given radius + /// Build a circle from the given radius pub fn circle_from_radius(&self, radius: Scalar) -> HalfEdge { let curve = { let local = CurveKind::Circle(Circle::new( @@ -68,7 +68,7 @@ impl HalfEdgeBuilder { HalfEdge::from_curve_and_vertices(curve, vertices) } - /// Create a line segment from two points + /// Build a line segment from two points pub fn line_segment_from_points( &self, points: [impl Into>; 2],