diff --git a/crates/fj-core/src/operations/transform/curve.rs b/crates/fj-core/src/operations/transform/curve.rs index fa6a686b6..7b99253b1 100644 --- a/crates/fj-core/src/operations/transform/curve.rs +++ b/crates/fj-core/src/operations/transform/curve.rs @@ -10,12 +10,14 @@ use crate::{ use super::{TransformCache, TransformObject}; impl TransformObject for Handle { + type Transformed = Self; + fn transform_with_cache( &self, _: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { cache .entry(self) .or_insert_with(|| { diff --git a/crates/fj-core/src/operations/transform/cycle.rs b/crates/fj-core/src/operations/transform/cycle.rs index f767cc347..071f155ed 100644 --- a/crates/fj-core/src/operations/transform/cycle.rs +++ b/crates/fj-core/src/operations/transform/cycle.rs @@ -5,12 +5,14 @@ use crate::{topology::Cycle, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Cycle { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let half_edges = self.half_edges().iter().map(|half_edge| { half_edge .clone() diff --git a/crates/fj-core/src/operations/transform/edge.rs b/crates/fj-core/src/operations/transform/edge.rs index ba3fa4370..cd175c0df 100644 --- a/crates/fj-core/src/operations/transform/edge.rs +++ b/crates/fj-core/src/operations/transform/edge.rs @@ -7,12 +7,14 @@ use crate::{ use super::{TransformCache, TransformObject}; impl TransformObject for Handle { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let curve = self .curve() .clone() diff --git a/crates/fj-core/src/operations/transform/face.rs b/crates/fj-core/src/operations/transform/face.rs index ae8911dcb..a632027c1 100644 --- a/crates/fj-core/src/operations/transform/face.rs +++ b/crates/fj-core/src/operations/transform/face.rs @@ -5,12 +5,14 @@ use crate::{topology::Face, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Face { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let surface = self .surface() .clone() diff --git a/crates/fj-core/src/operations/transform/mod.rs b/crates/fj-core/src/operations/transform/mod.rs index 9916b7442..0597c05fc 100644 --- a/crates/fj-core/src/operations/transform/mod.rs +++ b/crates/fj-core/src/operations/transform/mod.rs @@ -34,8 +34,15 @@ use super::derive::DeriveFrom; /// More convenience methods can be added as required. The only reason this /// hasn't been done so far, is that no one has put in the work yet. pub trait TransformObject: Sized { + /// The result of the transformation + type Transformed; + /// Transform the object - fn transform(&self, transform: &Transform, core: &mut Core) -> Self { + fn transform( + &self, + transform: &Transform, + core: &mut Core, + ) -> Self::Transformed { let mut cache = TransformCache::default(); self.transform_with_cache(transform, core, &mut cache) } @@ -46,12 +53,16 @@ pub trait TransformObject: Sized { transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self; + ) -> Self::Transformed; /// Translate the object /// /// Convenience wrapper around [`TransformObject::transform`]. - fn translate(&self, offset: impl Into>, core: &mut Core) -> Self { + fn translate( + &self, + offset: impl Into>, + core: &mut Core, + ) -> Self::Transformed { self.transform(&Transform::translation(offset), core) } @@ -62,22 +73,27 @@ pub trait TransformObject: Sized { &self, axis_angle: impl Into>, core: &mut Core, - ) -> Self { + ) -> Self::Transformed { self.transform(&Transform::rotation(axis_angle), core) } } impl TransformObject for Handle where - T: Clone + Insert> + TransformObject + 'static, + T: Clone + + Insert> + + TransformObject + + 'static, Handle: Into>, { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { if let Some(object) = cache.get(self) { return object.clone(); } diff --git a/crates/fj-core/src/operations/transform/region.rs b/crates/fj-core/src/operations/transform/region.rs index 5896da254..f4e4e7612 100644 --- a/crates/fj-core/src/operations/transform/region.rs +++ b/crates/fj-core/src/operations/transform/region.rs @@ -3,12 +3,14 @@ use crate::{topology::Region, Core}; use super::TransformObject; impl TransformObject for Region { + type Transformed = Self; + fn transform_with_cache( &self, transform: &fj_math::Transform, core: &mut Core, cache: &mut super::TransformCache, - ) -> Self { + ) -> Self::Transformed { let exterior = self .exterior() .clone() diff --git a/crates/fj-core/src/operations/transform/shell.rs b/crates/fj-core/src/operations/transform/shell.rs index 09c1fe6ba..b8e78287d 100644 --- a/crates/fj-core/src/operations/transform/shell.rs +++ b/crates/fj-core/src/operations/transform/shell.rs @@ -5,12 +5,14 @@ use crate::{topology::Shell, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Shell { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let faces = self .faces() .iter() diff --git a/crates/fj-core/src/operations/transform/solid.rs b/crates/fj-core/src/operations/transform/solid.rs index 6b8a1cdca..346e143a9 100644 --- a/crates/fj-core/src/operations/transform/solid.rs +++ b/crates/fj-core/src/operations/transform/solid.rs @@ -5,12 +5,14 @@ use crate::{topology::Solid, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Solid { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let shells = self.shells().iter().cloned().map(|shell| { shell.transform_with_cache(transform, core, cache) diff --git a/crates/fj-core/src/operations/transform/surface.rs b/crates/fj-core/src/operations/transform/surface.rs index 0a61532e5..60b83ac08 100644 --- a/crates/fj-core/src/operations/transform/surface.rs +++ b/crates/fj-core/src/operations/transform/surface.rs @@ -7,12 +7,14 @@ use crate::{ use super::{TransformCache, TransformObject}; impl TransformObject for Handle { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { cache .entry(self) .or_insert_with(|| { diff --git a/crates/fj-core/src/operations/transform/vertex.rs b/crates/fj-core/src/operations/transform/vertex.rs index 9e0f761bb..d3e762e6b 100644 --- a/crates/fj-core/src/operations/transform/vertex.rs +++ b/crates/fj-core/src/operations/transform/vertex.rs @@ -5,12 +5,14 @@ use crate::{topology::Vertex, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Vertex { + type Transformed = Self; + fn transform_with_cache( &self, _: &Transform, _: &mut Core, _: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { // There's nothing to actually transform here, as `Vertex` holds no // data. We still need this implementation though, as a new `Vertex` // object must be created to represent the new and transformed vertex.