Add involute to Path info
This commit is contained in:
		@ -1135,6 +1135,19 @@ pub enum Path {
 | 
			
		||||
        /// True if the arc is counterclockwise.
 | 
			
		||||
        ccw: bool,
 | 
			
		||||
    },
 | 
			
		||||
    /// An involute of a circle of start_radius ending at end_radius
 | 
			
		||||
    CircularInvolute {
 | 
			
		||||
        #[serde(flatten)]
 | 
			
		||||
        base: BasePath,
 | 
			
		||||
        /// The radius of the base circle of the involute
 | 
			
		||||
        start_radius: f64,
 | 
			
		||||
        /// The radius that the involute ends at
 | 
			
		||||
        end_radius: f64,
 | 
			
		||||
        /// Angle about which the whole involute is rotated
 | 
			
		||||
        angle: f64,
 | 
			
		||||
        /// If true, the path segment starts at the end radius and goes towards the start radius
 | 
			
		||||
        reverse: bool,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// What kind of path is this?
 | 
			
		||||
@ -1149,6 +1162,7 @@ enum PathType {
 | 
			
		||||
    Horizontal,
 | 
			
		||||
    AngledLineTo,
 | 
			
		||||
    Arc,
 | 
			
		||||
    CircularInvolute,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<&Path> for PathType {
 | 
			
		||||
@ -1164,6 +1178,7 @@ impl From<&Path> for PathType {
 | 
			
		||||
            Path::Base { .. } => Self::Base,
 | 
			
		||||
            Path::Arc { .. } => Self::Arc,
 | 
			
		||||
            Path::ArcThreePoint { .. } => Self::Arc,
 | 
			
		||||
            Path::CircularInvolute { .. } => Self::CircularInvolute,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1181,6 +1196,7 @@ impl Path {
 | 
			
		||||
            Path::CircleThreePoint { base, .. } => base.geo_meta.id,
 | 
			
		||||
            Path::Arc { base, .. } => base.geo_meta.id,
 | 
			
		||||
            Path::ArcThreePoint { base, .. } => base.geo_meta.id,
 | 
			
		||||
            Path::CircularInvolute { base, .. } => base.geo_meta.id,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1196,6 +1212,7 @@ impl Path {
 | 
			
		||||
            Path::CircleThreePoint { base, .. } => base.tag.clone(),
 | 
			
		||||
            Path::Arc { base, .. } => base.tag.clone(),
 | 
			
		||||
            Path::ArcThreePoint { base, .. } => base.tag.clone(),
 | 
			
		||||
            Path::CircularInvolute { base, .. } => base.tag.clone(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1211,6 +1228,7 @@ impl Path {
 | 
			
		||||
            Path::CircleThreePoint { base, .. } => base,
 | 
			
		||||
            Path::Arc { base, .. } => base,
 | 
			
		||||
            Path::ArcThreePoint { base, .. } => base,
 | 
			
		||||
            Path::CircularInvolute { base, .. } => base,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1272,6 +1290,15 @@ impl Path {
 | 
			
		||||
                // TODO: Call engine utils to figure this out.
 | 
			
		||||
                linear_distance(&self.get_base().from, &self.get_base().to)
 | 
			
		||||
            }
 | 
			
		||||
            Self::CircularInvolute {
 | 
			
		||||
                base: _,
 | 
			
		||||
                start_radius,
 | 
			
		||||
                end_radius,
 | 
			
		||||
                ..
 | 
			
		||||
            } => {
 | 
			
		||||
                let angle = (end_radius * end_radius - start_radius * start_radius).sqrt() / start_radius;
 | 
			
		||||
                0.5 * start_radius * angle * angle
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        TyF64::new(n, self.get_base().units.into())
 | 
			
		||||
    }
 | 
			
		||||
@ -1288,6 +1315,7 @@ impl Path {
 | 
			
		||||
            Path::CircleThreePoint { base, .. } => Some(base),
 | 
			
		||||
            Path::Arc { base, .. } => Some(base),
 | 
			
		||||
            Path::ArcThreePoint { base, .. } => Some(base),
 | 
			
		||||
            Path::CircularInvolute { base, .. } => Some(base),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1323,7 +1351,11 @@ impl Path {
 | 
			
		||||
                    radius: circle.radius,
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            Path::ToPoint { .. } | Path::Horizontal { .. } | Path::AngledLineTo { .. } | Path::Base { .. } => {
 | 
			
		||||
            Path::CircularInvolute { .. }
 | 
			
		||||
            | Path::ToPoint { .. }
 | 
			
		||||
            | Path::Horizontal { .. }
 | 
			
		||||
            | Path::AngledLineTo { .. }
 | 
			
		||||
            | Path::Base { .. } => {
 | 
			
		||||
                let base = self.get_base();
 | 
			
		||||
                GetTangentialInfoFromPathsResult::PreviousPoint(base.from)
 | 
			
		||||
            }
 | 
			
		||||
@ -1350,6 +1382,7 @@ pub enum ExtrudeSurface {
 | 
			
		||||
    /// An extrude plane.
 | 
			
		||||
    ExtrudePlane(ExtrudePlane),
 | 
			
		||||
    ExtrudeArc(ExtrudeArc),
 | 
			
		||||
    ExtrudeInvolute(ExtrudeInvolute),
 | 
			
		||||
    Chamfer(ChamferSurface),
 | 
			
		||||
    Fillet(FilletSurface),
 | 
			
		||||
}
 | 
			
		||||
@ -1410,11 +1443,26 @@ pub struct ExtrudeArc {
 | 
			
		||||
    pub geo_meta: GeoMeta,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// An extruded involute.
 | 
			
		||||
#[derive(Debug, Clone, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "camelCase")]
 | 
			
		||||
pub struct ExtrudeInvolute {
 | 
			
		||||
    /// The face id for the extrude surface.
 | 
			
		||||
    pub face_id: uuid::Uuid,
 | 
			
		||||
    /// The tag.
 | 
			
		||||
    pub tag: Option<Node<TagDeclarator>>,
 | 
			
		||||
    /// Metadata.
 | 
			
		||||
    #[serde(flatten)]
 | 
			
		||||
    pub geo_meta: GeoMeta,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ExtrudeSurface {
 | 
			
		||||
    pub fn get_id(&self) -> uuid::Uuid {
 | 
			
		||||
        match self {
 | 
			
		||||
            ExtrudeSurface::ExtrudePlane(ep) => ep.geo_meta.id,
 | 
			
		||||
            ExtrudeSurface::ExtrudeArc(ea) => ea.geo_meta.id,
 | 
			
		||||
            ExtrudeSurface::ExtrudeInvolute(ea) => ea.geo_meta.id,
 | 
			
		||||
            ExtrudeSurface::Fillet(f) => f.geo_meta.id,
 | 
			
		||||
            ExtrudeSurface::Chamfer(c) => c.geo_meta.id,
 | 
			
		||||
        }
 | 
			
		||||
@ -1424,6 +1472,7 @@ impl ExtrudeSurface {
 | 
			
		||||
        match self {
 | 
			
		||||
            ExtrudeSurface::ExtrudePlane(ep) => ep.tag.clone(),
 | 
			
		||||
            ExtrudeSurface::ExtrudeArc(ea) => ea.tag.clone(),
 | 
			
		||||
            ExtrudeSurface::ExtrudeInvolute(ea) => ea.tag.clone(),
 | 
			
		||||
            ExtrudeSurface::Fillet(f) => f.tag.clone(),
 | 
			
		||||
            ExtrudeSurface::Chamfer(c) => c.tag.clone(),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -805,6 +805,17 @@ impl Args {
 | 
			
		||||
                    None
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            ExtrudeSurface::ExtrudeInvolute(extrude_involute) => {
 | 
			
		||||
                if let Some(involute_tag) = &extrude_involute.tag {
 | 
			
		||||
                    if involute_tag.name == tag.value {
 | 
			
		||||
                        Some(Ok(extrude_involute.face_id))
 | 
			
		||||
                    } else {
 | 
			
		||||
                        None
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    None
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            ExtrudeSurface::Chamfer(chamfer) => {
 | 
			
		||||
                if let Some(chamfer_tag) = &chamfer.tag {
 | 
			
		||||
                    if chamfer_tag.name == tag.value {
 | 
			
		||||
 | 
			
		||||
@ -399,6 +399,17 @@ pub(crate) async fn do_post_extrude<'a>(
 | 
			
		||||
                        });
 | 
			
		||||
                        Some(extrude_surface)
 | 
			
		||||
                    }
 | 
			
		||||
                    Path::CircularInvolute { .. } => {
 | 
			
		||||
                        let extrude_surface = ExtrudeSurface::ExtrudeInvolute(crate::execution::ExtrudeInvolute {
 | 
			
		||||
                            face_id: *actual_face_id,
 | 
			
		||||
                            tag: path.get_base().tag.clone(),
 | 
			
		||||
                            geo_meta: GeoMeta {
 | 
			
		||||
                                id: path.get_base().geo_meta.id,
 | 
			
		||||
                                metadata: path.get_base().geo_meta.metadata,
 | 
			
		||||
                            },
 | 
			
		||||
                        });
 | 
			
		||||
                        Some(extrude_surface)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else if no_engine_commands {
 | 
			
		||||
                // Only pre-populate the extrude surface if we are in mock mode.
 | 
			
		||||
 | 
			
		||||
@ -198,7 +198,7 @@ async fn inner_involute_circular(
 | 
			
		||||
    end.x += from.x;
 | 
			
		||||
    end.y += from.y;
 | 
			
		||||
 | 
			
		||||
    let current_path = Path::ToPoint {
 | 
			
		||||
    let current_path = Path::CircularInvolute {
 | 
			
		||||
        base: BasePath {
 | 
			
		||||
            from: from.ignore_units(),
 | 
			
		||||
            to: [end.x, end.y],
 | 
			
		||||
@ -209,6 +209,10 @@ async fn inner_involute_circular(
 | 
			
		||||
                metadata: args.source_range.into(),
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
        start_radius,
 | 
			
		||||
        end_radius,
 | 
			
		||||
        angle: angle.to_degrees(),
 | 
			
		||||
        reverse: reverse.unwrap_or_default(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut new_sketch = sketch.clone();
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user