From 8a578e37821c6ac455aa160814c089b4a8518bdd Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 8 Mar 2022 15:16:39 +0100 Subject: [PATCH] Replace `Edge::line_segment` with `Edges` method I'm aware that I did the opposite not that long ago, but that was then. Now, I'm facing the need of having to track curves in the `Shape` API, and then the constructors will no longer work on `Edge`, at least without passing a `&mut Shape` into them. --- src/kernel/algorithms/approximation.rs | 23 ++++++++--------------- src/kernel/algorithms/sweep.rs | 17 ++++------------- src/kernel/shape/edges.rs | 21 ++++++++++++++++++++- src/kernel/shapes/sketch.rs | 7 ++----- src/kernel/topology/edges.rs | 12 +----------- 5 files changed, 35 insertions(+), 45 deletions(-) diff --git a/src/kernel/algorithms/approximation.rs b/src/kernel/algorithms/approximation.rs index f070f63f9..f7accdc1c 100644 --- a/src/kernel/algorithms/approximation.rs +++ b/src/kernel/algorithms/approximation.rs @@ -150,10 +150,7 @@ mod tests { kernel::{ geometry::Surface, shape::Shape, - topology::{ - edges::{Cycle, Edge}, - faces::Face, - }, + topology::{edges::Cycle, faces::Face}, }, math::{Point, Scalar, Segment}, }; @@ -214,11 +211,9 @@ mod tests { let v2 = shape.vertices().add(b); let v3 = shape.vertices().add(c); - let ab = shape - .edges() - .add(Edge::line_segment([v1.clone(), v2.clone()])); - let bc = shape.edges().add(Edge::line_segment([v2, v3.clone()])); - let ca = shape.edges().add(Edge::line_segment([v3, v1])); + let ab = shape.edges().add_line_segment([v1.clone(), v2.clone()]); + let bc = shape.edges().add_line_segment([v2, v3.clone()]); + let ca = shape.edges().add_line_segment([v3, v1]); let cycle = Cycle { edges: vec![ab, bc, ca], @@ -255,12 +250,10 @@ mod tests { let v3 = shape.vertices().add(c); let v4 = shape.vertices().add(d); - let ab = shape - .edges() - .add(Edge::line_segment([v1.clone(), v2.clone()])); - let bc = shape.edges().add(Edge::line_segment([v2, v3.clone()])); - let cd = shape.edges().add(Edge::line_segment([v3, v4.clone()])); - let da = shape.edges().add(Edge::line_segment([v4, v1])); + let ab = shape.edges().add_line_segment([v1.clone(), v2.clone()]); + let bc = shape.edges().add_line_segment([v2, v3.clone()]); + let cd = shape.edges().add_line_segment([v3, v4.clone()]); + let da = shape.edges().add_line_segment([v4, v1]); let abcd = shape.cycles().add(Cycle { edges: vec![ab, bc, cd, da], diff --git a/src/kernel/algorithms/sweep.rs b/src/kernel/algorithms/sweep.rs index 7908311d4..be4e8932a 100644 --- a/src/kernel/algorithms/sweep.rs +++ b/src/kernel/algorithms/sweep.rs @@ -71,10 +71,7 @@ mod tests { kernel::{ geometry::{surfaces::Swept, Surface}, shape::{handle::Handle, Shape}, - topology::{ - edges::{Cycle, Edge}, - faces::Face, - }, + topology::{edges::Cycle, faces::Face}, }, math::{Point, Scalar, Vector}, }; @@ -115,15 +112,9 @@ mod tests { let b = shape.vertices().add(b.into()); let c = shape.vertices().add(c.into()); - let ab = shape - .edges() - .add(Edge::line_segment([a.clone(), b.clone()])); - let bc = shape - .edges() - .add(Edge::line_segment([b.clone(), c.clone()])); - let ca = shape - .edges() - .add(Edge::line_segment([c.clone(), a.clone()])); + let ab = shape.edges().add_line_segment([a.clone(), b.clone()]); + let bc = shape.edges().add_line_segment([b.clone(), c.clone()]); + let ca = shape.edges().add_line_segment([c.clone(), a.clone()]); let cycles = shape.cycles().add(Cycle { edges: vec![ab, bc, ca], diff --git a/src/kernel/shape/edges.rs b/src/kernel/shape/edges.rs index 625ebfff9..f50ea30b1 100644 --- a/src/kernel/shape/edges.rs +++ b/src/kernel/shape/edges.rs @@ -1,4 +1,7 @@ -use crate::kernel::topology::edges::Edge; +use crate::kernel::{ + geometry::{Curve, Line}, + topology::{edges::Edge, vertices::Vertex}, +}; use super::handle::{Handle, Storage}; @@ -23,4 +26,20 @@ impl Edges { pub fn add(&mut self, edge: Edge) -> Handle { Storage::new(edge).handle() } + + /// Add a line segment to the shape + /// + /// Calls [`Edges::add`] internally, and is subject to the same + /// restrictions. + pub fn add_line_segment( + &mut self, + vertices: [Handle; 2], + ) -> Handle { + self.add(Edge { + curve: Curve::Line(Line::from_points( + vertices.clone().map(|vertex| vertex.point()), + )), + vertices: Some(vertices), + }) + } } diff --git a/src/kernel/shapes/sketch.rs b/src/kernel/shapes/sketch.rs index a6f2c42c5..d69b4ddc2 100644 --- a/src/kernel/shapes/sketch.rs +++ b/src/kernel/shapes/sketch.rs @@ -3,10 +3,7 @@ use crate::{ kernel::{ geometry::Surface, shape::Shape, - topology::{ - edges::{Cycle, Edge}, - faces::Face, - }, + topology::{edges::Cycle, faces::Face}, }, math::{Aabb, Point, Scalar}, }; @@ -40,7 +37,7 @@ impl ToShape for fj::Sketch { let a = window[0].clone(); let b = window[1].clone(); - let edge = shape.edges().add(Edge::line_segment([a, b])); + let edge = shape.edges().add_line_segment([a, b]); edges.push(edge); } diff --git a/src/kernel/topology/edges.rs b/src/kernel/topology/edges.rs index e07a04288..6c1a87486 100644 --- a/src/kernel/topology/edges.rs +++ b/src/kernel/topology/edges.rs @@ -1,6 +1,6 @@ use crate::{ kernel::{ - geometry::{Circle, Curve, Line}, + geometry::{Circle, Curve}, shape::handle::Handle, }, math::{Point, Scalar, Vector}, @@ -46,16 +46,6 @@ pub struct Edge { } impl Edge { - /// Create a line segment - pub fn line_segment(vertices: [Handle; 2]) -> Self { - Edge { - curve: Curve::Line(Line::from_points( - vertices.clone().map(|vertex| vertex.point()), - )), - vertices: Some(vertices), - } - } - /// Create a circle pub fn circle(radius: Scalar) -> Self { Edge {