Skip to content

Commit

Permalink
Merge pull request #1683 from hannobraun/unify
Browse files Browse the repository at this point in the history
Unify `Cycle` and `PartialCycle`
  • Loading branch information
hannobraun authored Mar 15, 2023
2 parents c110b71 + f98f6e4 commit 8bd16f2
Show file tree
Hide file tree
Showing 12 changed files with 38 additions and 144 deletions.
8 changes: 4 additions & 4 deletions crates/fj-kernel/src/algorithms/intersect/curve_face.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ mod tests {
builder::{CycleBuilder, FaceBuilder},
geometry::curve::Curve,
insert::Insert,
objects::Cycle,
partial::{PartialFace, PartialObject},
services::Services,
};
Expand Down Expand Up @@ -193,13 +194,12 @@ mod tests {
face.exterior = exterior.insert(&mut services.objects);
}
{
let mut interior = face.add_interior(&mut services.objects);
let (updated, _) =
interior.read().clone().update_as_polygon_from_points(
let (interior, _) = Cycle::new([])
.update_as_polygon_from_points(
interior_points,
&mut services.objects,
);
*interior.write() = updated;
face.add_interior(interior, &mut services.objects);
}

face.build(&mut services.objects)
Expand Down
13 changes: 5 additions & 8 deletions crates/fj-kernel/src/algorithms/sweep/face.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ use crate::{
builder::{CycleBuilder, FaceBuilder},
geometry::curve::GlobalPath,
insert::Insert,
objects::{Face, Objects, Shell},
partial::{
Partial, PartialCycle, PartialFace, PartialObject, PartialShell,
},
objects::{Cycle, Face, Objects, Shell},
partial::{Partial, PartialFace, PartialObject, PartialShell},
services::Service,
storage::Handle,
};
Expand Down Expand Up @@ -87,13 +85,12 @@ impl Sweep for Handle<Face> {
}

let (top_cycle, _) =
PartialCycle::new(objects).connect_to_edges(top_edges, objects);
Cycle::new([]).connect_to_edges(top_edges, objects);

if i == 0 {
top_face.exterior = top_cycle.build(objects).insert(objects);
top_face.exterior = top_cycle.insert(objects);
} else {
let mut interior = top_face.add_interior(objects);
*interior.write() = top_cycle;
top_face.add_interior(top_cycle, objects);
};
}

Expand Down
14 changes: 6 additions & 8 deletions crates/fj-kernel/src/algorithms/triangulate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ mod tests {
algorithms::approx::{Approx, Tolerance},
builder::{CycleBuilder, FaceBuilder},
insert::Insert,
objects::Face,
objects::{Cycle, Face},
partial::{PartialFace, PartialObject},
services::Services,
storage::Handle,
Expand Down Expand Up @@ -152,13 +152,11 @@ mod tests {
face.exterior = exterior.insert(&mut services.objects);
}
{
let mut interior = face.add_interior(&mut services.objects);
let (updated, _) =
interior.read().clone().update_as_polygon_from_points(
[e, f, g, h],
&mut services.objects,
);
*interior.write() = updated;
let (interior, _) = Cycle::new([]).update_as_polygon_from_points(
[e, f, g, h],
&mut services.objects,
);
face.add_interior(interior, &mut services.objects);
}
let face = face
.build(&mut services.objects)
Expand Down
62 changes: 1 addition & 61 deletions crates/fj-kernel/src/builder/cycle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@ use crate::{
geometry::curve::Curve,
insert::Insert,
objects::{Cycle, HalfEdge, Objects},
partial::PartialCycle,
services::Service,
storage::Handle,
};

use super::{HalfEdgeBuilder, ObjectArgument};

/// Builder API for [`PartialCycle`]
/// Builder API for [`Cycle`]
pub trait CycleBuilder: Sized {
/// Add a new half-edge to the cycle
///
Expand Down Expand Up @@ -112,62 +111,3 @@ impl CycleBuilder for Cycle {
(self, edges)
}
}

impl CycleBuilder for PartialCycle {
fn add_half_edge(
mut self,
half_edge: HalfEdge,
objects: &mut Service<Objects>,
) -> (Self, Handle<HalfEdge>) {
let half_edge = half_edge.insert(objects);
self.half_edges.push(half_edge.clone());
(self, half_edge)
}

fn update_as_polygon_from_points<O, P>(
mut self,
points: O,
objects: &mut Service<Objects>,
) -> (Self, O::SameSize<Handle<HalfEdge>>)
where
O: ObjectArgument<P>,
P: Clone + Into<Point<2>>,
{
let half_edges = points.map_with_next(|start, end| {
let half_edge = HalfEdgeBuilder::line_segment([start, end], None)
.build(objects);

let (cycle, half_edge) =
self.clone().add_half_edge(half_edge, objects);
self = cycle;

half_edge
});

(self, half_edges)
}

fn connect_to_edges<O>(
mut self,
edges: O,
objects: &mut Service<Objects>,
) -> (Self, O::SameSize<Handle<HalfEdge>>)
where
O: ObjectArgument<(Handle<HalfEdge>, Curve, [Point<1>; 2])>,
{
let edges =
edges.map_with_prev(|(_, curve, boundary), (prev, _, _)| {
let half_edge = HalfEdgeBuilder::new(curve, boundary)
.with_start_vertex(prev.start_vertex().clone())
.build(objects);

let (cycle, half_edge) =
self.clone().add_half_edge(half_edge, objects);
self = cycle;

half_edge
});

(self, edges)
}
}
12 changes: 8 additions & 4 deletions crates/fj-kernel/src/builder/face.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
use crate::{
insert::Insert,
objects::{Cycle, Objects},
partial::{Partial, PartialFace},
partial::PartialFace,
services::Service,
storage::Handle,
};

/// Builder API for [`PartialFace`]
pub trait FaceBuilder {
/// Add an interior cycle
fn add_interior(
&mut self,
cycle: Cycle,
objects: &mut Service<Objects>,
) -> Partial<Cycle>;
) -> Handle<Cycle>;
}

impl FaceBuilder for PartialFace {
fn add_interior(
&mut self,
cycle: Cycle,
objects: &mut Service<Objects>,
) -> Partial<Cycle> {
let cycle = Partial::new(objects);
) -> Handle<Cycle> {
let cycle = cycle.insert(objects);
self.interiors.push(cycle.clone());
cycle
}
Expand Down
4 changes: 2 additions & 2 deletions crates/fj-kernel/src/partial/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ mod wrapper;

pub use self::{
objects::{
cycle::PartialCycle, face::PartialFace, shell::PartialShell,
sketch::PartialSketch, solid::PartialSolid,
face::PartialFace, shell::PartialShell, sketch::PartialSketch,
solid::PartialSolid,
},
traits::{HasPartial, PartialObject},
wrapper::{FullToPartialCache, Partial},
Expand Down
33 changes: 0 additions & 33 deletions crates/fj-kernel/src/partial/objects/cycle.rs

This file was deleted.

18 changes: 6 additions & 12 deletions crates/fj-kernel/src/partial/objects/face.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use fj_interop::mesh::Color;
use crate::{
insert::Insert,
objects::{Cycle, Face, Objects, Surface},
partial::{FullToPartialCache, Partial, PartialObject},
partial::{FullToPartialCache, PartialObject},
services::Service,
storage::Handle,
};
Expand All @@ -20,7 +20,7 @@ pub struct PartialFace {
/// The cycles that bound the face on the inside
///
/// Each of these cycles defines a hole in the face.
pub interiors: Vec<Partial<Cycle>>,
pub interiors: Vec<Handle<Cycle>>,

/// The color of the face
pub color: Option<Color>,
Expand All @@ -38,25 +38,19 @@ impl PartialObject for PartialFace {
}
}

fn from_full(face: &Self::Full, cache: &mut FullToPartialCache) -> Self {
fn from_full(face: &Self::Full, _: &mut FullToPartialCache) -> Self {
Self {
surface: Some(face.surface().clone()),
exterior: face.exterior().clone(),
interiors: face
.interiors()
.map(|cycle| Partial::from_full(cycle.clone(), cache))
.collect(),
interiors: face.interiors().cloned().collect(),
color: Some(face.color()),
}
}

fn build(self, objects: &mut Service<Objects>) -> Self::Full {
fn build(self, _: &mut Service<Objects>) -> Self::Full {
let surface = self.surface.expect("Need `Surface` to build `Face`");

let interiors =
self.interiors.into_iter().map(|cycle| cycle.build(objects));
let color = self.color.unwrap_or_default();

Face::new(surface, self.exterior, interiors, color)
Face::new(surface, self.exterior, self.interiors, color)
}
}
1 change: 0 additions & 1 deletion crates/fj-kernel/src/partial/objects/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
pub mod cycle;
pub mod face;
pub mod shell;
pub mod sketch;
Expand Down
1 change: 0 additions & 1 deletion crates/fj-kernel/src/partial/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ macro_rules! impl_trait {
}

impl_trait!(
Cycle, PartialCycle;
Face, PartialFace;
Shell, PartialShell;
Sketch, PartialSketch;
Expand Down
9 changes: 4 additions & 5 deletions crates/fj-kernel/src/validate/face.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ mod tests {
algorithms::reverse::Reverse,
builder::{CycleBuilder, FaceBuilder},
insert::Insert,
objects::Face,
objects::{Cycle, Face},
partial::{PartialFace, PartialObject},
services::Services,
validate::{FaceValidationError, Validate, ValidationError},
Expand All @@ -97,13 +97,12 @@ mod tests {
face.exterior = exterior.insert(&mut services.objects);
}
{
let mut interior = face.add_interior(&mut services.objects);
let (updated, _) =
interior.read().clone().update_as_polygon_from_points(
let (interior, _) = Cycle::new([])
.update_as_polygon_from_points(
[[1., 1.], [1., 2.], [2., 1.]],
&mut services.objects,
);
*interior.write() = updated;
face.add_interior(interior, &mut services.objects);
}
face.build(&mut services.objects)
};
Expand Down
7 changes: 2 additions & 5 deletions crates/fj-operations/src/difference_2d.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ impl Shape for fj::Difference2d {

exteriors.push(face.exterior().clone());
for cycle in face.interiors() {
interiors
.push(Partial::from(cycle.clone().reverse(objects)));
interiors.push(cycle.clone().reverse(objects));
}
}

Expand All @@ -59,9 +58,7 @@ impl Shape for fj::Difference2d {
"Trying to subtract faces with different surfaces.",
);

interiors.push(Partial::from(
face.exterior().clone().reverse(objects),
));
interiors.push(face.exterior().clone().reverse(objects));
}

// Faces only support one exterior, while the code here comes from
Expand Down

0 comments on commit 8bd16f2

Please sign in to comment.