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.
This commit is contained in:
Hanno Braun 2022-03-08 15:16:39 +01:00
parent 10f8bb9eed
commit 8a578e3782
5 changed files with 35 additions and 45 deletions

View File

@ -150,10 +150,7 @@ mod tests {
kernel::{ kernel::{
geometry::Surface, geometry::Surface,
shape::Shape, shape::Shape,
topology::{ topology::{edges::Cycle, faces::Face},
edges::{Cycle, Edge},
faces::Face,
},
}, },
math::{Point, Scalar, Segment}, math::{Point, Scalar, Segment},
}; };
@ -214,11 +211,9 @@ mod tests {
let v2 = shape.vertices().add(b); let v2 = shape.vertices().add(b);
let v3 = shape.vertices().add(c); let v3 = shape.vertices().add(c);
let ab = shape let ab = shape.edges().add_line_segment([v1.clone(), v2.clone()]);
.edges() let bc = shape.edges().add_line_segment([v2, v3.clone()]);
.add(Edge::line_segment([v1.clone(), v2.clone()])); let ca = shape.edges().add_line_segment([v3, v1]);
let bc = shape.edges().add(Edge::line_segment([v2, v3.clone()]));
let ca = shape.edges().add(Edge::line_segment([v3, v1]));
let cycle = Cycle { let cycle = Cycle {
edges: vec![ab, bc, ca], edges: vec![ab, bc, ca],
@ -255,12 +250,10 @@ mod tests {
let v3 = shape.vertices().add(c); let v3 = shape.vertices().add(c);
let v4 = shape.vertices().add(d); let v4 = shape.vertices().add(d);
let ab = shape let ab = shape.edges().add_line_segment([v1.clone(), v2.clone()]);
.edges() let bc = shape.edges().add_line_segment([v2, v3.clone()]);
.add(Edge::line_segment([v1.clone(), v2.clone()])); let cd = shape.edges().add_line_segment([v3, v4.clone()]);
let bc = shape.edges().add(Edge::line_segment([v2, v3.clone()])); let da = shape.edges().add_line_segment([v4, v1]);
let cd = shape.edges().add(Edge::line_segment([v3, v4.clone()]));
let da = shape.edges().add(Edge::line_segment([v4, v1]));
let abcd = shape.cycles().add(Cycle { let abcd = shape.cycles().add(Cycle {
edges: vec![ab, bc, cd, da], edges: vec![ab, bc, cd, da],

View File

@ -71,10 +71,7 @@ mod tests {
kernel::{ kernel::{
geometry::{surfaces::Swept, Surface}, geometry::{surfaces::Swept, Surface},
shape::{handle::Handle, Shape}, shape::{handle::Handle, Shape},
topology::{ topology::{edges::Cycle, faces::Face},
edges::{Cycle, Edge},
faces::Face,
},
}, },
math::{Point, Scalar, Vector}, math::{Point, Scalar, Vector},
}; };
@ -115,15 +112,9 @@ mod tests {
let b = shape.vertices().add(b.into()); let b = shape.vertices().add(b.into());
let c = shape.vertices().add(c.into()); let c = shape.vertices().add(c.into());
let ab = shape let ab = shape.edges().add_line_segment([a.clone(), b.clone()]);
.edges() let bc = shape.edges().add_line_segment([b.clone(), c.clone()]);
.add(Edge::line_segment([a.clone(), b.clone()])); let ca = shape.edges().add_line_segment([c.clone(), a.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 cycles = shape.cycles().add(Cycle { let cycles = shape.cycles().add(Cycle {
edges: vec![ab, bc, ca], edges: vec![ab, bc, ca],

View File

@ -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}; use super::handle::{Handle, Storage};
@ -23,4 +26,20 @@ impl Edges {
pub fn add(&mut self, edge: Edge) -> Handle<Edge> { pub fn add(&mut self, edge: Edge) -> Handle<Edge> {
Storage::new(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<Vertex>; 2],
) -> Handle<Edge> {
self.add(Edge {
curve: Curve::Line(Line::from_points(
vertices.clone().map(|vertex| vertex.point()),
)),
vertices: Some(vertices),
})
}
} }

View File

@ -3,10 +3,7 @@ use crate::{
kernel::{ kernel::{
geometry::Surface, geometry::Surface,
shape::Shape, shape::Shape,
topology::{ topology::{edges::Cycle, faces::Face},
edges::{Cycle, Edge},
faces::Face,
},
}, },
math::{Aabb, Point, Scalar}, math::{Aabb, Point, Scalar},
}; };
@ -40,7 +37,7 @@ impl ToShape for fj::Sketch {
let a = window[0].clone(); let a = window[0].clone();
let b = window[1].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); edges.push(edge);
} }

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
kernel::{ kernel::{
geometry::{Circle, Curve, Line}, geometry::{Circle, Curve},
shape::handle::Handle, shape::handle::Handle,
}, },
math::{Point, Scalar, Vector}, math::{Point, Scalar, Vector},
@ -46,16 +46,6 @@ pub struct Edge {
} }
impl Edge { impl Edge {
/// Create a line segment
pub fn line_segment(vertices: [Handle<Vertex>; 2]) -> Self {
Edge {
curve: Curve::Line(Line::from_points(
vertices.clone().map(|vertex| vertex.point()),
)),
vertices: Some(vertices),
}
}
/// Create a circle /// Create a circle
pub fn circle(radius: Scalar) -> Self { pub fn circle(radius: Scalar) -> Self {
Edge { Edge {