mirror of
https://github.com/hannobraun/Fornjot
synced 2025-01-17 13:46:10 +00:00
Merge pull request #1206 from hannobraun/duplication
Fix more object duplication issues in `PartialEdge`
This commit is contained in:
commit
62178f4b0c
@ -5,7 +5,7 @@ use crate::{
|
|||||||
Curve, GlobalCurve, GlobalEdge, GlobalVertex, HalfEdge, Objects,
|
Curve, GlobalCurve, GlobalEdge, GlobalVertex, HalfEdge, Objects,
|
||||||
Surface, SurfaceVertex, Vertex,
|
Surface, SurfaceVertex, Vertex,
|
||||||
},
|
},
|
||||||
partial::{HasPartial, MaybePartial, PartialCurve},
|
partial::{HasPartial, MaybePartial},
|
||||||
storage::{Handle, HandleWrapper},
|
storage::{Handle, HandleWrapper},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -30,6 +30,17 @@ pub struct PartialHalfEdge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PartialHalfEdge {
|
impl PartialHalfEdge {
|
||||||
|
/// Extract the global curve from either the curve or global form
|
||||||
|
///
|
||||||
|
/// If a global curve is available through both, the curve is preferred.
|
||||||
|
pub fn extract_global_curve(&self) -> Option<Handle<GlobalCurve>> {
|
||||||
|
let global_curve_from_curve = || self.curve.as_ref()?.global_form();
|
||||||
|
let global_curve_from_global_form =
|
||||||
|
|| Some(self.global_form.as_ref()?.curve()?.clone());
|
||||||
|
|
||||||
|
global_curve_from_curve().or_else(global_curve_from_global_form)
|
||||||
|
}
|
||||||
|
|
||||||
/// Update the partial half-edge with the given surface
|
/// Update the partial half-edge with the given surface
|
||||||
pub fn with_surface(mut self, surface: Option<Handle<Surface>>) -> Self {
|
pub fn with_surface(mut self, surface: Option<Handle<Surface>>) -> Self {
|
||||||
if let Some(surface) = surface {
|
if let Some(surface) = surface {
|
||||||
@ -74,6 +85,7 @@ impl PartialHalfEdge {
|
|||||||
/// Update partial half-edge as a circle, from the given radius
|
/// Update partial half-edge as a circle, from the given radius
|
||||||
pub fn as_circle_from_radius(mut self, radius: impl Into<Scalar>) -> Self {
|
pub fn as_circle_from_radius(mut self, radius: impl Into<Scalar>) -> Self {
|
||||||
let curve = Handle::<Curve>::partial()
|
let curve = Handle::<Curve>::partial()
|
||||||
|
.with_global_form(self.extract_global_curve())
|
||||||
.with_surface(self.surface.clone())
|
.with_surface(self.surface.clone())
|
||||||
.as_circle_from_radius(radius);
|
.as_circle_from_radius(radius);
|
||||||
|
|
||||||
@ -104,38 +116,18 @@ impl PartialHalfEdge {
|
|||||||
points: [impl Into<Point<2>>; 2],
|
points: [impl Into<Point<2>>; 2],
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let surface = self.surface.clone();
|
let surface = self.surface.clone();
|
||||||
self.with_vertices(Some(points.map(|point| {
|
let vertices = points.map(|point| {
|
||||||
Vertex::partial().with_surface_form(Some(
|
let surface_form = SurfaceVertex::partial()
|
||||||
SurfaceVertex::partial()
|
.with_surface(surface.clone())
|
||||||
.with_surface(surface.clone())
|
.with_position(Some(point));
|
||||||
.with_position(Some(point)),
|
Vertex::partial().with_surface_form(Some(surface_form))
|
||||||
))
|
});
|
||||||
})))
|
|
||||||
.as_line_segment()
|
self.with_vertices(Some(vertices)).as_line_segment()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update partial half-edge as a line segment, reusing existing vertices
|
/// Update partial half-edge as a line segment, reusing existing vertices
|
||||||
pub fn as_line_segment(mut self) -> Self {
|
pub fn as_line_segment(mut self) -> Self {
|
||||||
fn extract_global_curve(
|
|
||||||
partial: &PartialHalfEdge,
|
|
||||||
) -> Option<HandleWrapper<GlobalCurve>> {
|
|
||||||
fn extract_global_curve_from_curve(
|
|
||||||
partial: &PartialHalfEdge,
|
|
||||||
) -> Option<Handle<GlobalCurve>> {
|
|
||||||
partial.curve.as_ref()?.global_form()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn extract_global_curve_from_global_form(
|
|
||||||
partial: &PartialHalfEdge,
|
|
||||||
) -> Option<Handle<GlobalCurve>> {
|
|
||||||
Some(partial.global_form.as_ref()?.curve()?.clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
extract_global_curve_from_curve(partial)
|
|
||||||
.or_else(|| extract_global_curve_from_global_form(partial))
|
|
||||||
.map(Into::into)
|
|
||||||
}
|
|
||||||
|
|
||||||
let [from, to] = self
|
let [from, to] = self
|
||||||
.vertices
|
.vertices
|
||||||
.clone()
|
.clone()
|
||||||
@ -159,12 +151,10 @@ impl PartialHalfEdge {
|
|||||||
.expect("Can't infer line segment without surface position")
|
.expect("Can't infer line segment without surface position")
|
||||||
});
|
});
|
||||||
|
|
||||||
let curve = PartialCurve {
|
let curve = Handle::<Curve>::partial()
|
||||||
global_form: extract_global_curve(&self),
|
.with_global_form(self.extract_global_curve())
|
||||||
..PartialCurve::default()
|
.with_surface(Some(surface))
|
||||||
}
|
.as_line_from_points(points);
|
||||||
.with_surface(Some(surface))
|
|
||||||
.as_line_from_points(points);
|
|
||||||
|
|
||||||
let vertices = [(from, 0.), (to, 1.)].map(|(vertex, position)| {
|
let vertices = [(from, 0.), (to, 1.)].map(|(vertex, position)| {
|
||||||
vertex.update_partial(|vertex| {
|
vertex.update_partial(|vertex| {
|
||||||
@ -201,10 +191,9 @@ impl PartialHalfEdge {
|
|||||||
|
|
||||||
let global_form = self
|
let global_form = self
|
||||||
.global_form
|
.global_form
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| GlobalEdge::partial().into())
|
||||||
GlobalEdge::partial()
|
.update_partial(|partial| {
|
||||||
.from_curve_and_vertices(&curve, &vertices)
|
partial.from_curve_and_vertices(&curve, &vertices)
|
||||||
.into()
|
|
||||||
})
|
})
|
||||||
.into_full(objects);
|
.into_full(objects);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user