From 0a275853437b6b1d173ffaad88e65cc7a6dce7aa Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 21 Sep 2022 15:47:07 +0200 Subject: [PATCH 1/5] Add `GlobalEdgeBuilder` --- crates/fj-kernel/src/builder/edge.rs | 5 +++++ crates/fj-kernel/src/builder/mod.rs | 2 +- crates/fj-kernel/src/objects/edge.rs | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index f8611d45dc..affa5875cb 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -124,3 +124,8 @@ impl<'a> HalfEdgeBuilder<'a> { HalfEdge::from_curve_and_vertices(curve, vertices) } } + +/// API for building a [`GlobalEdge`] +/// +/// Also see [`GlobalEdge::builder`]. +pub struct GlobalEdgeBuilder; diff --git a/crates/fj-kernel/src/builder/mod.rs b/crates/fj-kernel/src/builder/mod.rs index 0c73ef261c..4f8aaccefd 100644 --- a/crates/fj-kernel/src/builder/mod.rs +++ b/crates/fj-kernel/src/builder/mod.rs @@ -12,7 +12,7 @@ mod vertex; pub use self::{ curve::{CurveBuilder, GlobalCurveBuilder}, cycle::CycleBuilder, - edge::HalfEdgeBuilder, + edge::{GlobalEdgeBuilder, HalfEdgeBuilder}, face::FaceBuilder, shell::ShellBuilder, sketch::SketchBuilder, diff --git a/crates/fj-kernel/src/objects/edge.rs b/crates/fj-kernel/src/objects/edge.rs index d4239c14a3..0f6867d83d 100644 --- a/crates/fj-kernel/src/objects/edge.rs +++ b/crates/fj-kernel/src/objects/edge.rs @@ -1,7 +1,7 @@ use std::fmt; use crate::{ - builder::HalfEdgeBuilder, + builder::{GlobalEdgeBuilder, HalfEdgeBuilder}, stores::{Handle, Stores}, }; @@ -134,6 +134,11 @@ pub struct GlobalEdge { } impl GlobalEdge { + /// Build a `GlobalEdge` using [`GlobalEdgeBuilder`] + pub fn builder() -> GlobalEdgeBuilder { + GlobalEdgeBuilder + } + /// Create a new instance pub fn new( curve: Handle, From f3c749770f26d1f60f50835908440184977475f7 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 21 Sep 2022 15:49:53 +0200 Subject: [PATCH 2/5] Add `GlobalEdgeBuilder` method --- crates/fj-kernel/src/builder/edge.rs | 18 ++++++++++++++++-- crates/fj-kernel/src/objects/edge.rs | 6 ++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index affa5875cb..a64fe39bb2 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -2,8 +2,8 @@ use fj_math::{Line, Point, Scalar}; use crate::{ objects::{ - Curve, GlobalCurve, GlobalVertex, HalfEdge, Surface, SurfaceVertex, - Vertex, + Curve, GlobalCurve, GlobalEdge, GlobalVertex, HalfEdge, Surface, + SurfaceVertex, Vertex, }, path::{GlobalPath, SurfacePath}, stores::Stores, @@ -129,3 +129,17 @@ impl<'a> HalfEdgeBuilder<'a> { /// /// Also see [`GlobalEdge::builder`]. pub struct GlobalEdgeBuilder; + +impl GlobalEdgeBuilder { + /// Build a [`GlobalEdge`] from the provided curve and vertices + pub fn build_from_curve_and_vertices( + self, + curve: &Curve, + vertices: &[Vertex; 2], + ) -> GlobalEdge { + GlobalEdge::new( + curve.global_form().clone(), + vertices.clone().map(|vertex| *vertex.global_form()), + ) + } +} diff --git a/crates/fj-kernel/src/objects/edge.rs b/crates/fj-kernel/src/objects/edge.rs index 0f6867d83d..63337133e9 100644 --- a/crates/fj-kernel/src/objects/edge.rs +++ b/crates/fj-kernel/src/objects/edge.rs @@ -85,10 +85,8 @@ impl HalfEdge { curve: Curve, vertices: [Vertex; 2], ) -> Self { - let global = GlobalEdge::new( - curve.global_form().clone(), - vertices.clone().map(|vertex| *vertex.global_form()), - ); + let global = GlobalEdge::builder() + .build_from_curve_and_vertices(&curve, &vertices); Self::new(curve, vertices, global) } From 069a4f613926dba9e5dc2f1f2eb00a376a265a1a Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 21 Sep 2022 15:56:09 +0200 Subject: [PATCH 3/5] Implement `Reverse` for `GlobalEdge` --- .../fj-kernel/src/algorithms/reverse/edge.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/reverse/edge.rs b/crates/fj-kernel/src/algorithms/reverse/edge.rs index f61044b01d..adf0b4237c 100644 --- a/crates/fj-kernel/src/algorithms/reverse/edge.rs +++ b/crates/fj-kernel/src/algorithms/reverse/edge.rs @@ -1,4 +1,4 @@ -use crate::objects::HalfEdge; +use crate::objects::{GlobalEdge, HalfEdge}; use super::Reverse; @@ -9,6 +9,21 @@ impl Reverse for HalfEdge { [b, a] }; - HalfEdge::from_curve_and_vertices(self.curve().clone(), vertices) + HalfEdge::new( + self.curve().clone(), + vertices, + self.global_form().clone().reverse(), + ) + } +} + +impl Reverse for GlobalEdge { + fn reverse(self) -> Self { + let vertices = { + let &[a, b] = self.vertices(); + [b, a] + }; + + GlobalEdge::new(self.curve().clone(), vertices) } } From 6c991c838319d45700cbe3737a7a7297293543bb Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 21 Sep 2022 15:58:45 +0200 Subject: [PATCH 4/5] Implement `TransformObject` for `GlobalEdge` --- crates/fj-kernel/src/algorithms/transform.rs | 25 +++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/transform.rs b/crates/fj-kernel/src/algorithms/transform.rs index 0427c7f168..8166f8ea7e 100644 --- a/crates/fj-kernel/src/algorithms/transform.rs +++ b/crates/fj-kernel/src/algorithms/transform.rs @@ -4,8 +4,8 @@ use fj_math::{Transform, Vector}; use crate::{ objects::{ - Curve, Cycle, Face, Faces, GlobalCurve, GlobalVertex, HalfEdge, Shell, - Sketch, Solid, Surface, SurfaceVertex, Vertex, + Curve, Cycle, Face, Faces, GlobalCurve, GlobalEdge, GlobalVertex, + HalfEdge, Shell, Sketch, Solid, Surface, SurfaceVertex, Vertex, }, path::GlobalPath, stores::{Handle, Stores}, @@ -122,6 +122,23 @@ impl TransformObject for GlobalCurve { } } +impl TransformObject for GlobalEdge { + type Transformed = Self; + + fn transform( + self, + transform: &Transform, + stores: &Stores, + ) -> Self::Transformed { + let curve = self.curve().clone().transform(transform, stores); + let vertices = self + .vertices() + .map(|vertex| vertex.transform(transform, stores)); + + Self::new(curve, vertices) + } +} + impl TransformObject for GlobalPath { type Transformed = Self; @@ -153,8 +170,10 @@ impl TransformObject for HalfEdge { .vertices() .clone() .map(|vertex| vertex.transform(transform, stores)); + let global_form = + self.global_form().clone().transform(transform, stores); - Self::from_curve_and_vertices(curve, vertices) + Self::new(curve, vertices, global_form) } } From adf10177587f1c6fdd7fb1b9d18750f628bc532a Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 21 Sep 2022 16:00:03 +0200 Subject: [PATCH 5/5] Remove `HalfEdge::from_curve_and_vertices` This constructor is a bit problematic, for multiple reasons: - It fulfills a role that is better fitted for the builder API. - It takes away control over the `GlobalVertex` construction from the caller. That second point is a problem, due to the work that needs to happen to address #1079. This commit doesn't solve that, but the builder API provides a better framework to do so than this constructor did. --- .../fj-kernel/src/algorithms/validate/mod.rs | 8 +++++--- crates/fj-kernel/src/builder/edge.rs | 10 ++++++++-- crates/fj-kernel/src/objects/edge.rs | 18 ------------------ 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/validate/mod.rs b/crates/fj-kernel/src/algorithms/validate/mod.rs index ed4ec18809..20f880c8f6 100644 --- a/crates/fj-kernel/src/algorithms/validate/mod.rs +++ b/crates/fj-kernel/src/algorithms/validate/mod.rs @@ -161,8 +161,8 @@ mod tests { use crate::{ algorithms::validate::{Validate, ValidationConfig, ValidationError}, objects::{ - Curve, GlobalCurve, GlobalVertex, HalfEdge, Surface, SurfaceVertex, - Vertex, + Curve, GlobalCurve, GlobalEdge, GlobalVertex, HalfEdge, Surface, + SurfaceVertex, Vertex, }, path::{GlobalPath, SurfacePath}, stores::Stores, @@ -236,7 +236,9 @@ mod tests { ); let vertices = [a, b]; - let half_edge = HalfEdge::from_curve_and_vertices(curve, vertices); + let global_edge = GlobalEdge::builder() + .build_from_curve_and_vertices(&curve, &vertices); + let half_edge = HalfEdge::new(curve, vertices, global_edge); let result = half_edge.clone().validate_with_config(&ValidationConfig { diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index a64fe39bb2..c2c6899f40 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -57,7 +57,10 @@ impl<'a> HalfEdgeBuilder<'a> { ) }; - HalfEdge::from_curve_and_vertices(curve, vertices) + let global_form = GlobalEdge::builder() + .build_from_curve_and_vertices(&curve, &vertices); + + HalfEdge::new(curve, vertices, global_form) } /// Build a line segment from two points @@ -121,7 +124,10 @@ impl<'a> HalfEdgeBuilder<'a> { ] }; - HalfEdge::from_curve_and_vertices(curve, vertices) + let global_form = GlobalEdge::builder() + .build_from_curve_and_vertices(&curve, &vertices); + + HalfEdge::new(curve, vertices, global_form) } } diff --git a/crates/fj-kernel/src/objects/edge.rs b/crates/fj-kernel/src/objects/edge.rs index 63337133e9..ee955d7878 100644 --- a/crates/fj-kernel/src/objects/edge.rs +++ b/crates/fj-kernel/src/objects/edge.rs @@ -23,10 +23,6 @@ impl HalfEdge { /// Create a new instance of `HalfEdge` /// - /// If you only have a curve and the edge vertices, please check out - /// [`HalfEdge::from_curve_and_vertices`], which is a convenience wrapper - /// around this method, which creates an instance of [`GlobalEdge`]. - /// /// # Panics /// /// Panics, if the provided `vertices` are not defined on the same curve as @@ -76,20 +72,6 @@ impl HalfEdge { } } - /// Create a new instance of `HalfEdge` from a curve and vertices - /// - /// The [`GlobalEdge`] instance is created from the provided curve and - /// vertices. Please refer to [`HalfEdge::new`], if you already have a - /// [`GlobalEdge`] instance that you can provide. - pub fn from_curve_and_vertices( - curve: Curve, - vertices: [Vertex; 2], - ) -> Self { - let global = GlobalEdge::builder() - .build_from_curve_and_vertices(&curve, &vertices); - Self::new(curve, vertices, global) - } - /// Access the curve that defines the half-edge's geometry /// /// The edge can be a segment of the curve that is bounded by two vertices,