diff --git a/README.md b/README.md index ab063e3f5..99b88a590 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,7 @@ pub extern "C" fn model(args: &HashMap) -> fj::Shape { let outer_edge = fj::Circle { radius: outer }; let inner_edge = fj::Circle { radius: inner }; - let footprint = fj::Difference { - a: outer_edge.into(), - b: inner_edge.into(), - }; + let footprint = fj::Difference2d::from_objects(outer_edge.into(), inner_edge.into()); let spacer = fj::Sweep { shape: footprint.into(), diff --git a/fj/src/shape_2d.rs b/fj/src/shape_2d.rs index 1e1dab5ba..64777fd9e 100644 --- a/fj/src/shape_2d.rs +++ b/fj/src/shape_2d.rs @@ -41,15 +41,29 @@ impl From for Shape2d { #[repr(C)] pub struct Difference2d { /// The original shape - pub a: Shape2d, + a: Shape2d, /// The shape being subtracted - pub b: Shape2d, + b: Shape2d, +} + +impl Difference2d { + pub fn from_objects(a: Shape2d, b: Shape2d) -> Self { + Self { a, b } + } + + pub fn a(&self) -> &Shape2d { + &self.a + } + + pub fn b(&self) -> &Shape2d { + &self.b + } } impl From for Shape { fn from(shape: Difference2d) -> Self { - Self::Shape2d(Shape2d::Difference(Box::new(shape))) + Self::Shape2d(shape.into()) } } diff --git a/models/spacer/src/lib.rs b/models/spacer/src/lib.rs index 3a84e8e98..6e83ca0e4 100644 --- a/models/spacer/src/lib.rs +++ b/models/spacer/src/lib.rs @@ -21,10 +21,7 @@ pub extern "C" fn model(args: &HashMap) -> fj::Shape { let outer_edge = fj::Circle { radius: outer }; let inner_edge = fj::Circle { radius: inner }; - let footprint = fj::Difference2d { - a: outer_edge.into(), - b: inner_edge.into(), - }; + let footprint = fj::Difference2d::from_objects(outer_edge.into(), inner_edge.into()); let spacer = fj::Sweep { shape: footprint.into(), diff --git a/models/star/src/lib.rs b/models/star/src/lib.rs index 8bfb958ad..c8eeaa9f2 100644 --- a/models/star/src/lib.rs +++ b/models/star/src/lib.rs @@ -53,10 +53,7 @@ pub extern "C" fn model(args: &HashMap) -> fj::Shape { let outer = fj::Sketch::from_points(outer); let inner = fj::Sketch::from_points(inner); - let footprint = fj::Difference2d { - a: outer.into(), - b: inner.into(), - }; + let footprint = fj::Difference2d::from_objects(outer.into(), inner.into()); let star = fj::Sweep { shape: footprint.into(), diff --git a/src/kernel/shapes/difference_2d.rs b/src/kernel/shapes/difference_2d.rs index 556a91a95..81233fc0c 100644 --- a/src/kernel/shapes/difference_2d.rs +++ b/src/kernel/shapes/difference_2d.rs @@ -22,7 +22,7 @@ impl ToShape for fj::Difference2d { let mut shape = Shape::new(); - let [mut a, mut b] = [&self.a, &self.b] + let [mut a, mut b] = [&self.a(), &self.b()] .map(|shape| shape.to_shape(tolerance, debug_info)); for shape in [&mut a, &mut b] { @@ -105,6 +105,6 @@ impl ToShape for fj::Difference2d { // This is a conservative estimate of the bounding box: It's never going // to be bigger than the bounding box of the original shape that another // is being subtracted from. - self.a.bounding_volume() + self.a().bounding_volume() } }