Remove Surface ref from Cycle/PartialCycle

This commit is contained in:
Hanno Braun 2023-02-20 15:27:15 +01:00
parent 3c85fb911c
commit 0bec935c54
15 changed files with 35 additions and 120 deletions

View File

@ -184,10 +184,9 @@ mod tests {
let face = { let face = {
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior face.exterior
.write() .write()
.update_as_polygon_from_points(exterior); .update_as_polygon_from_points(exterior);

View File

@ -94,10 +94,9 @@ mod tests {
] ]
.map(|surface| { .map(|surface| {
let mut face = PartialFace { let mut face = PartialFace {
surface: Partial::from(surface.clone()), surface: Partial::from(surface),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface);
face.exterior.write().update_as_polygon_from_points(points); face.exterior.write().update_as_polygon_from_points(points);
face.build(&mut services.objects) face.build(&mut services.objects)
@ -126,10 +125,9 @@ mod tests {
]; ];
let [a, b] = surfaces.clone().map(|surface| { let [a, b] = surfaces.clone().map(|surface| {
let mut face = PartialFace { let mut face = PartialFace {
surface: Partial::from(surface.clone()), surface: Partial::from(surface),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface);
face.exterior.write().update_as_polygon_from_points(points); face.exterior.write().update_as_polygon_from_points(points);
face.build(&mut services.objects) face.build(&mut services.objects)

View File

@ -151,10 +151,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[1., 1.], [1., 1.],
@ -176,10 +175,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[2., 1.], [2., 1.],
@ -204,10 +202,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[4., 2.], [4., 2.],
[0., 4.], [0., 4.],
@ -232,10 +229,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[2., 1.], [2., 1.],
@ -261,10 +257,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[2., 1.], [2., 1.],
@ -290,10 +285,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[2., 1.], [2., 1.],
@ -320,10 +314,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[2., 0.], [2., 0.],
@ -357,10 +350,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[1., 0.], [1., 0.],

View File

@ -166,10 +166,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.yz_plane()); let surface = Partial::from(services.objects.surfaces.yz_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],
@ -193,10 +192,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.yz_plane()); let surface = Partial::from(services.objects.surfaces.yz_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],
@ -223,10 +221,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.yz_plane()); let surface = Partial::from(services.objects.surfaces.yz_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],
@ -250,10 +247,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.yz_plane()); let surface = Partial::from(services.objects.surfaces.yz_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],
@ -288,10 +284,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.yz_plane()); let surface = Partial::from(services.objects.surfaces.yz_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],
@ -326,10 +321,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],
@ -355,10 +349,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[-1., -1.], [-1., -1.],
[1., -1.], [1., -1.],

View File

@ -17,6 +17,6 @@ impl Reverse for Handle<Cycle> {
edges.reverse(); edges.reverse();
Cycle::new(self.surface().clone(), edges).insert(objects) Cycle::new(edges).insert(objects)
} }
} }

View File

@ -38,8 +38,7 @@ impl Sweep for (Handle<HalfEdge>, &Surface, Color) {
(edge.curve().clone(), surface) (edge.curve().clone(), surface)
.sweep_with_cache(path, cache, objects), .sweep_with_cache(path, cache, objects),
); );
face.surface = surface.clone(); face.surface = surface;
face.exterior.write().surface = surface;
} }
// Now we're ready to create the edges. // Now we're ready to create the edges.
@ -270,7 +269,6 @@ mod tests {
}; };
let mut cycle = PartialCycle { let mut cycle = PartialCycle {
surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
cycle.half_edges.extend( cycle.half_edges.extend(

View File

@ -83,8 +83,6 @@ impl Sweep for Handle<Face> {
top_edges.push(Partial::from(top_edge)); top_edges.push(Partial::from(top_edge));
} }
top_cycle.write().surface = Partial::from(top_surface.clone());
top_cycle top_cycle
.write() .write()
.connect_to_closed_edges(top_edges, &top_surface.geometry()); .connect_to_closed_edges(top_edges, &top_surface.geometry());
@ -165,8 +163,6 @@ mod tests {
let mut face = sketch.add_face(); let mut face = sketch.add_face();
face.write().surface = Partial::from(surface.clone()); face.write().surface = Partial::from(surface.clone());
face.write().exterior.write().surface =
Partial::from(surface.clone());
face.write() face.write()
.exterior .exterior
.write() .write()
@ -185,7 +181,6 @@ mod tests {
..Default::default() ..Default::default()
}; };
bottom.exterior.write().surface = Partial::from(surface.clone());
bottom bottom
.exterior .exterior
.write() .write()
@ -200,11 +195,10 @@ mod tests {
let surface = surface.clone().translate(UP, &mut services.objects); let surface = surface.clone().translate(UP, &mut services.objects);
let mut top = PartialFace { let mut top = PartialFace {
surface: Partial::from(surface.clone()), surface: Partial::from(surface),
..Default::default() ..Default::default()
}; };
top.exterior.write().surface = Partial::from(surface);
top.exterior.write().update_as_polygon_from_points(TRIANGLE); top.exterior.write().update_as_polygon_from_points(TRIANGLE);
top.build(&mut services.objects) top.build(&mut services.objects)
@ -246,8 +240,6 @@ mod tests {
let mut face = sketch.add_face(); let mut face = sketch.add_face();
face.write().surface = Partial::from(surface.clone()); face.write().surface = Partial::from(surface.clone());
face.write().exterior.write().surface =
Partial::from(surface.clone());
face.write() face.write()
.exterior .exterior
.write() .write()
@ -265,11 +257,10 @@ mod tests {
surface.clone().translate(DOWN, &mut services.objects); surface.clone().translate(DOWN, &mut services.objects);
let mut bottom = PartialFace { let mut bottom = PartialFace {
surface: Partial::from(surface.clone()), surface: Partial::from(surface),
..Default::default() ..Default::default()
}; };
bottom.exterior.write().surface = Partial::from(surface);
bottom bottom
.exterior .exterior
.write() .write()
@ -286,7 +277,6 @@ mod tests {
..Default::default() ..Default::default()
}; };
top.exterior.write().surface = Partial::from(surface.clone());
top.exterior.write().update_as_polygon_from_points(TRIANGLE); top.exterior.write().update_as_polygon_from_points(TRIANGLE);
top.build(&mut services.objects) top.build(&mut services.objects)

View File

@ -14,16 +14,12 @@ impl TransformObject for Cycle {
objects: &mut Service<Objects>, objects: &mut Service<Objects>,
cache: &mut TransformCache, cache: &mut TransformCache,
) -> Self { ) -> Self {
let surface = self
.surface()
.clone()
.transform_with_cache(transform, objects, cache);
let half_edges = self.half_edges().map(|half_edge| { let half_edges = self.half_edges().map(|half_edge| {
half_edge half_edge
.clone() .clone()
.transform_with_cache(transform, objects, cache) .transform_with_cache(transform, objects, cache)
}); });
Self::new(surface, half_edges) Self::new(half_edges)
} }
} }

View File

@ -99,10 +99,9 @@ mod tests {
let surface = Partial::from(services.objects.surfaces.xy_plane()); let surface = Partial::from(services.objects.surfaces.xy_plane());
let mut face = PartialFace { let mut face = PartialFace {
surface: surface.clone(), surface,
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = surface;
face.exterior face.exterior
.write() .write()
.update_as_polygon_from_points([a, b, c, d]); .update_as_polygon_from_points([a, b, c, d]);
@ -144,7 +143,6 @@ mod tests {
surface: Partial::from(surface.clone()), surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface.clone());
face.exterior face.exterior
.write() .write()
.update_as_polygon_from_points([a, b, c, d]); .update_as_polygon_from_points([a, b, c, d]);
@ -211,7 +209,6 @@ mod tests {
surface: Partial::from(surface.clone()), surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface.clone());
face.exterior face.exterior
.write() .write()
.update_as_polygon_from_points([a, b, c, d, e]); .update_as_polygon_from_points([a, b, c, d, e]);

View File

@ -34,7 +34,6 @@ pub trait FaceBuilder {
impl FaceBuilder for PartialFace { impl FaceBuilder for PartialFace {
fn add_interior(&mut self) -> Partial<Cycle> { fn add_interior(&mut self) -> Partial<Cycle> {
let cycle = Partial::from_partial(PartialCycle { let cycle = Partial::from_partial(PartialCycle {
surface: self.exterior.read().surface.clone(),
..Default::default() ..Default::default()
}); });
self.interiors.push(cycle.clone()); self.interiors.push(cycle.clone());

View File

@ -3,16 +3,11 @@ use std::slice;
use fj_interop::ext::SliceExt; use fj_interop::ext::SliceExt;
use fj_math::{Scalar, Winding}; use fj_math::{Scalar, Winding};
use crate::{ use crate::{geometry::path::SurfacePath, objects::HalfEdge, storage::Handle};
geometry::path::SurfacePath,
objects::{HalfEdge, Surface},
storage::Handle,
};
/// A cycle of connected half-edges /// A cycle of connected half-edges
#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] #[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct Cycle { pub struct Cycle {
surface: Handle<Surface>,
half_edges: Vec<Handle<HalfEdge>>, half_edges: Vec<Handle<HalfEdge>>,
} }
@ -22,10 +17,7 @@ impl Cycle {
/// # Panics /// # Panics
/// ///
/// Panics, if `half_edges` does not yield at least one half-edge. /// Panics, if `half_edges` does not yield at least one half-edge.
pub fn new( pub fn new(half_edges: impl IntoIterator<Item = Handle<HalfEdge>>) -> Self {
surface: Handle<Surface>,
half_edges: impl IntoIterator<Item = Handle<HalfEdge>>,
) -> Self {
let half_edges = half_edges.into_iter().collect::<Vec<_>>(); let half_edges = half_edges.into_iter().collect::<Vec<_>>();
// This is not a validation check, and thus not part of the validation // This is not a validation check, and thus not part of the validation
@ -37,15 +29,7 @@ impl Cycle {
"Cycle must contain at least one half-edge" "Cycle must contain at least one half-edge"
); );
Self { Self { half_edges }
surface,
half_edges,
}
}
/// Access the surface that the cycle is in
pub fn surface(&self) -> &Handle<Surface> {
&self.surface
} }
/// Access the half-edges that make up the cycle /// Access the half-edges that make up the cycle

View File

@ -1,5 +1,5 @@
use crate::{ use crate::{
objects::{Cycle, HalfEdge, Objects, Surface}, objects::{Cycle, HalfEdge, Objects},
partial::{FullToPartialCache, Partial, PartialObject}, partial::{FullToPartialCache, Partial, PartialObject},
services::Service, services::Service,
}; };
@ -7,9 +7,6 @@ use crate::{
/// A partial [`Cycle`] /// A partial [`Cycle`]
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
pub struct PartialCycle { pub struct PartialCycle {
/// The surface that the cycle is defined in
pub surface: Partial<Surface>,
/// The half-edges that make up the cycle /// The half-edges that make up the cycle
pub half_edges: Vec<Partial<HalfEdge>>, pub half_edges: Vec<Partial<HalfEdge>>,
} }
@ -19,7 +16,6 @@ impl PartialObject for PartialCycle {
fn from_full(cycle: &Self::Full, cache: &mut FullToPartialCache) -> Self { fn from_full(cycle: &Self::Full, cache: &mut FullToPartialCache) -> Self {
Self { Self {
surface: Partial::from_full(cycle.surface().clone(), cache),
half_edges: cycle half_edges: cycle
.half_edges() .half_edges()
.cloned() .cloned()
@ -29,12 +25,11 @@ impl PartialObject for PartialCycle {
} }
fn build(self, objects: &mut Service<Objects>) -> Self::Full { fn build(self, objects: &mut Service<Objects>) -> Self::Full {
let surface = self.surface.build(objects);
let half_edges = self let half_edges = self
.half_edges .half_edges
.into_iter() .into_iter()
.map(|half_edge| half_edge.build(objects)); .map(|half_edge| half_edge.build(objects));
Cycle::new(surface, half_edges) Cycle::new(half_edges)
} }
} }

View File

@ -148,7 +148,6 @@ mod tests {
let surface = services.objects.surfaces.xy_plane(); let surface = services.objects.surfaces.xy_plane();
let mut cycle = PartialCycle { let mut cycle = PartialCycle {
surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
cycle.update_as_polygon_from_points([[0., 0.], [1., 0.], [0., 1.]]); cycle.update_as_polygon_from_points([[0., 0.], [1., 0.], [0., 1.]]);
@ -175,7 +174,7 @@ mod tests {
.into_iter() .into_iter()
.map(|half_edge| half_edge.build(&mut services.objects)); .map(|half_edge| half_edge.build(&mut services.objects));
Cycle::new(valid.surface().clone(), half_edges) Cycle::new(half_edges)
}; };
valid.validate_and_return_first_error()?; valid.validate_and_return_first_error()?;
@ -192,7 +191,6 @@ mod tests {
let surface = services.objects.surfaces.xy_plane(); let surface = services.objects.surfaces.xy_plane();
let mut cycle = PartialCycle { let mut cycle = PartialCycle {
surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
cycle.update_as_polygon_from_points([[0., 0.], [1., 0.], [0., 1.]]); cycle.update_as_polygon_from_points([[0., 0.], [1., 0.], [0., 1.]]);
@ -214,7 +212,7 @@ mod tests {
.into_iter() .into_iter()
.map(|half_edge| half_edge.build(&mut services.objects)); .map(|half_edge| half_edge.build(&mut services.objects));
Cycle::new(valid.surface().clone(), half_edges) Cycle::new(half_edges)
}; };
valid.validate_and_return_first_error()?; valid.validate_and_return_first_error()?;

View File

@ -13,7 +13,6 @@ impl Validate for Face {
config: &ValidationConfig, config: &ValidationConfig,
errors: &mut Vec<ValidationError>, errors: &mut Vec<ValidationError>,
) { ) {
FaceValidationError::check_surface_identity(self, errors);
FaceValidationError::check_interior_winding(self, errors); FaceValidationError::check_interior_winding(self, errors);
FaceValidationError::check_vertex_positions(self, config, errors); FaceValidationError::check_vertex_positions(self, config, errors);
} }
@ -87,23 +86,6 @@ pub enum FaceValidationError {
} }
impl FaceValidationError { impl FaceValidationError {
fn check_surface_identity(face: &Face, errors: &mut Vec<ValidationError>) {
let surface = face.surface();
for interior in face.interiors() {
if surface.id() != interior.surface().id() {
errors.push(
Box::new(Self::SurfaceMismatch {
surface: surface.clone(),
interior: interior.clone(),
face: face.clone(),
})
.into(),
);
}
}
}
fn check_interior_winding(face: &Face, errors: &mut Vec<ValidationError>) { fn check_interior_winding(face: &Face, errors: &mut Vec<ValidationError>) {
let exterior_winding = face.exterior().winding(); let exterior_winding = face.exterior().winding();
@ -182,10 +164,9 @@ mod tests {
let surface = services.objects.surfaces.xy_plane(); let surface = services.objects.surfaces.xy_plane();
let mut face = PartialFace { let mut face = PartialFace {
surface: Partial::from(surface.clone()), surface: Partial::from(surface),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface);
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[3., 0.], [3., 0.],
@ -203,7 +184,6 @@ mod tests {
let surface = services.objects.surfaces.xz_plane(); let surface = services.objects.surfaces.xz_plane();
let mut cycle = PartialCycle { let mut cycle = PartialCycle {
surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
cycle.update_as_polygon_from_points([[1., 1.], [1., 2.], [2., 1.]]); cycle.update_as_polygon_from_points([[1., 1.], [1., 2.], [2., 1.]]);
@ -235,10 +215,9 @@ mod tests {
let surface = services.objects.surfaces.xy_plane(); let surface = services.objects.surfaces.xy_plane();
let mut face = PartialFace { let mut face = PartialFace {
surface: Partial::from(surface.clone()), surface: Partial::from(surface),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface);
face.exterior.write().update_as_polygon_from_points([ face.exterior.write().update_as_polygon_from_points([
[0., 0.], [0., 0.],
[3., 0.], [3., 0.],
@ -283,7 +262,6 @@ mod tests {
surface: Partial::from(surface.clone()), surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
face.exterior.write().surface = Partial::from(surface.clone());
let mut half_edge = face.exterior.write().add_half_edge(); let mut half_edge = face.exterior.write().add_half_edge();
half_edge.write().update_as_circle_from_radius(1.); half_edge.write().update_as_circle_from_radius(1.);
@ -326,8 +304,8 @@ mod tests {
.insert(&mut services.objects) .insert(&mut services.objects)
}; };
let exterior = Cycle::new(valid.surface().clone(), [half_edge]) let exterior =
.insert(&mut services.objects); Cycle::new([half_edge]).insert(&mut services.objects);
Face::new( Face::new(
valid.surface().clone(), valid.surface().clone(),

View File

@ -37,7 +37,6 @@ impl Shape for fj::Sketch {
}; };
let exterior = { let exterior = {
let mut cycle = PartialCycle { let mut cycle = PartialCycle {
surface: surface.clone(),
..Default::default() ..Default::default()
}; };
cycle.half_edges.push(half_edge); cycle.half_edges.push(half_edge);
@ -60,7 +59,6 @@ impl Shape for fj::Sketch {
let exterior = { let exterior = {
let mut cycle = PartialCycle { let mut cycle = PartialCycle {
surface: Partial::from(surface.clone()),
..Default::default() ..Default::default()
}; };
let mut line_segments = vec![]; let mut line_segments = vec![];