rust changes to make three point confrom to same as others since we're not ready with name params yet
This commit is contained in:
		@ -394,6 +394,18 @@ impl Args {
 | 
			
		||||
    > {
 | 
			
		||||
        FromArgs::from_args(self, 0)
 | 
			
		||||
    }
 | 
			
		||||
    pub(crate) fn get_circle_three_point_args(
 | 
			
		||||
        &self,
 | 
			
		||||
    ) -> Result<
 | 
			
		||||
        (
 | 
			
		||||
            crate::std::shapes::CircleThreePointData,
 | 
			
		||||
            crate::std::shapes::SketchOrSurface,
 | 
			
		||||
            Option<TagNode>,
 | 
			
		||||
        ),
 | 
			
		||||
        KclError,
 | 
			
		||||
    > {
 | 
			
		||||
        FromArgs::from_args(self, 0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(crate) fn get_sketches(&self) -> Result<(SketchSet, Sketch), KclError> {
 | 
			
		||||
        FromArgs::from_args(self, 0)
 | 
			
		||||
@ -1230,6 +1242,16 @@ impl<'a> FromKclValue<'a> for super::shapes::CircleData {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a> FromKclValue<'a> for super::shapes::CircleThreePointData {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
 | 
			
		||||
        let obj = arg.as_object()?;
 | 
			
		||||
        let_field_of!(obj, p1);
 | 
			
		||||
        let_field_of!(obj, p2);
 | 
			
		||||
        let_field_of!(obj, p3);
 | 
			
		||||
        Some(Self { p1, p2, p3 })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a> FromKclValue<'a> for super::sketch::TangentialArcData {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
 | 
			
		||||
        let obj = arg.as_object()?;
 | 
			
		||||
 | 
			
		||||
@ -139,7 +139,7 @@ async fn inner_helix(data: HelixData, exec_state: &mut ExecState, args: Args) ->
 | 
			
		||||
            args.batch_modeling_cmd(
 | 
			
		||||
                exec_state.next_uuid(),
 | 
			
		||||
                ModelingCmd::from(mcmd::EntityMakeHelixFromParams {
 | 
			
		||||
                    radius: data.radius,
 | 
			
		||||
                    radius: LengthUnit(data.radius),
 | 
			
		||||
                    is_clockwise: !data.ccw,
 | 
			
		||||
                    length: LengthUnit(length),
 | 
			
		||||
                    revolutions: data.revolutions,
 | 
			
		||||
@ -156,7 +156,7 @@ async fn inner_helix(data: HelixData, exec_state: &mut ExecState, args: Args) ->
 | 
			
		||||
            args.batch_modeling_cmd(
 | 
			
		||||
                exec_state.next_uuid(),
 | 
			
		||||
                ModelingCmd::from(mcmd::EntityMakeHelixFromEdge {
 | 
			
		||||
                    radius: data.radius,
 | 
			
		||||
                    radius: LengthUnit(data.radius),
 | 
			
		||||
                    is_clockwise: !data.ccw,
 | 
			
		||||
                    length: data.length.map(LengthUnit),
 | 
			
		||||
                    revolutions: data.revolutions,
 | 
			
		||||
 | 
			
		||||
@ -55,6 +55,20 @@ pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// three point sketch circle
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "camelCase")]
 | 
			
		||||
// TODO: make sure the docs on the args below are correct.
 | 
			
		||||
pub struct CircleThreePointData {
 | 
			
		||||
    /// first point
 | 
			
		||||
    pub p1: [f64; 2],
 | 
			
		||||
    /// second point
 | 
			
		||||
    pub p2: [f64; 2],
 | 
			
		||||
    /// third point
 | 
			
		||||
    pub p3: [f64; 2],
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Construct a 2-dimensional circle, of the specified radius, centered at
 | 
			
		||||
/// the provided (x, y) origin point.
 | 
			
		||||
///
 | 
			
		||||
@ -150,13 +164,11 @@ async fn inner_circle(
 | 
			
		||||
 | 
			
		||||
/// Sketch a 3-point circle.
 | 
			
		||||
pub async fn circle_three_point(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
 | 
			
		||||
    let p1 = args.get_kw_arg("p1")?;
 | 
			
		||||
    let p2 = args.get_kw_arg("p2")?;
 | 
			
		||||
    let p3 = args.get_kw_arg("p3")?;
 | 
			
		||||
    let sketch_surface_or_group = args.get_unlabeled_kw_arg("sketch_surface_or_group")?;
 | 
			
		||||
    let (data, sketch_surface_or_group, tag): (CircleThreePointData, SketchOrSurface, Option<TagNode>) =
 | 
			
		||||
        args.get_circle_three_point_args()?;
 | 
			
		||||
    let tag = args.get_kw_arg_opt("tag");
 | 
			
		||||
 | 
			
		||||
    let sketch = inner_circle_three_point(p1, p2, p3, sketch_surface_or_group, tag, exec_state, args).await?;
 | 
			
		||||
    let sketch = inner_circle_three_point(data, sketch_surface_or_group, tag, exec_state, args).await?;
 | 
			
		||||
    Ok(KclValue::Sketch {
 | 
			
		||||
        value: Box::new(sketch),
 | 
			
		||||
    })
 | 
			
		||||
@ -172,12 +184,10 @@ pub async fn circle_three_point(exec_state: &mut ExecState, args: Args) -> Resul
 | 
			
		||||
/// ```
 | 
			
		||||
#[stdlib {
 | 
			
		||||
    name = "circleThreePoint",
 | 
			
		||||
    keywords = true,
 | 
			
		||||
    keywords = false,
 | 
			
		||||
    unlabeled_first = true,
 | 
			
		||||
    arg_docs = {
 | 
			
		||||
        p1 = "1st point to derive the circle.",
 | 
			
		||||
        p2 = "2nd point to derive the circle.",
 | 
			
		||||
        p3 = "3rd point to derive the circle.",
 | 
			
		||||
        data = "Data containing the three points to derive the circle.",
 | 
			
		||||
        sketch_surface_or_group = "Plane or surface to sketch on.",
 | 
			
		||||
        tag = "Identifier for the circle to reference elsewhere.",
 | 
			
		||||
    }
 | 
			
		||||
@ -186,17 +196,15 @@ pub async fn circle_three_point(exec_state: &mut ExecState, args: Args) -> Resul
 | 
			
		||||
/// Similar to inner_circle, but needs to retain 3-point information in the
 | 
			
		||||
/// path so it can be used for other features, otherwise it's lost.
 | 
			
		||||
async fn inner_circle_three_point(
 | 
			
		||||
    p1: [f64; 2],
 | 
			
		||||
    p2: [f64; 2],
 | 
			
		||||
    p3: [f64; 2],
 | 
			
		||||
    data: CircleThreePointData,
 | 
			
		||||
    sketch_surface_or_group: SketchOrSurface,
 | 
			
		||||
    tag: Option<TagNode>,
 | 
			
		||||
    exec_state: &mut ExecState,
 | 
			
		||||
    args: Args,
 | 
			
		||||
) -> Result<Sketch, KclError> {
 | 
			
		||||
    let center = calculate_circle_center(p1, p2, p3);
 | 
			
		||||
    let center = calculate_circle_center(data.p1, data.p2, data.p3);
 | 
			
		||||
    // It can be the distance to any of the 3 points - they all lay on the circumference.
 | 
			
		||||
    let radius = distance(center.into(), p2.into());
 | 
			
		||||
    let radius = distance(center.into(), data.p2.into());
 | 
			
		||||
 | 
			
		||||
    let sketch_surface = match sketch_surface_or_group {
 | 
			
		||||
        SketchOrSurface::SketchSurface(surface) => surface,
 | 
			
		||||
@ -242,9 +250,9 @@ async fn inner_circle_three_point(
 | 
			
		||||
                metadata: args.source_range.into(),
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
        p1,
 | 
			
		||||
        p2,
 | 
			
		||||
        p3,
 | 
			
		||||
        p1: data.p1,
 | 
			
		||||
        p2: data.p2,
 | 
			
		||||
        p3: data.p3,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut new_sketch = sketch.clone();
 | 
			
		||||
@ -260,7 +268,6 @@ async fn inner_circle_three_point(
 | 
			
		||||
    Ok(new_sketch)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Type of the polygon
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Default)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user