change circle args

This commit is contained in:
Kurt Hutten Irev-Dev
2024-09-04 18:55:05 +10:00
parent 706af591c5
commit 72e522dd51
2 changed files with 32 additions and 17 deletions

View File

@ -14,6 +14,8 @@ use crate::{
std::{shapes::SketchSurfaceOrGroup, sketch::FaceTag, FnAsArg}, std::{shapes::SketchSurfaceOrGroup, sketch::FaceTag, FnAsArg},
}; };
use super::shapes::Circle;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Args { pub struct Args {
pub args: Vec<KclValue>, pub args: Vec<KclValue>,
@ -261,8 +263,7 @@ impl Args {
&self, &self,
) -> Result< ) -> Result<
( (
[f64; 2], crate::std::shapes::CircleData,
f64,
crate::std::shapes::SketchSurfaceOrGroup, crate::std::shapes::SketchSurfaceOrGroup,
Option<TagDeclarator>, Option<TagDeclarator>,
), ),
@ -605,6 +606,7 @@ fn from_user_val<T: DeserializeOwned>(arg: &KclValue) -> Option<T> {
impl_from_arg_via_json!(super::sketch::AngledLineData); impl_from_arg_via_json!(super::sketch::AngledLineData);
impl_from_arg_via_json!(super::sketch::AngledLineToData); impl_from_arg_via_json!(super::sketch::AngledLineToData);
impl_from_arg_via_json!(super::sketch::AngledLineThatIntersectsData); impl_from_arg_via_json!(super::sketch::AngledLineThatIntersectsData);
impl_from_arg_via_json!(super::shapes::CircleData);
impl_from_arg_via_json!(super::sketch::ArcData); impl_from_arg_via_json!(super::sketch::ArcData);
impl_from_arg_via_json!(super::sketch::TangentialArcData); impl_from_arg_via_json!(super::sketch::TangentialArcData);
impl_from_arg_via_json!(super::sketch::BezierData); impl_from_arg_via_json!(super::sketch::BezierData);

View File

@ -24,12 +24,24 @@ pub enum SketchSurfaceOrGroup {
SketchGroup(Box<SketchGroup>), SketchGroup(Box<SketchGroup>),
} }
/// Data for drawing an angled line that intersects with a given line.
#[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 CircleData {
/// The center of the circle.
pub center: [f64; 2],
/// The circle radius
pub radius: f64,
}
/// Sketch a circle. /// Sketch a circle.
pub async fn circle(args: Args) -> Result<KclValue, KclError> { pub async fn circle(args: Args) -> Result<KclValue, KclError> {
let (center, radius, sketch_surface_or_group, tag): ([f64; 2], f64, SketchSurfaceOrGroup, Option<TagDeclarator>) = let (data, sketch_surface_or_group, tag): (CircleData, SketchSurfaceOrGroup, Option<TagDeclarator>) =
args.get_circle_args()?; args.get_circle_args()?;
let sketch_group = inner_circle(center, radius, sketch_surface_or_group, tag, args).await?; let sketch_group = inner_circle(data, sketch_surface_or_group, tag, args).await?;
Ok(KclValue::new_user_val(sketch_group.meta.clone(), sketch_group)) Ok(KclValue::new_user_val(sketch_group.meta.clone(), sketch_group))
} }
@ -58,8 +70,7 @@ pub async fn circle(args: Args) -> Result<KclValue, KclError> {
name = "circle", name = "circle",
}] }]
async fn inner_circle( async fn inner_circle(
center: [f64; 2], data: CircleData,
radius: f64,
sketch_surface_or_group: SketchSurfaceOrGroup, sketch_surface_or_group: SketchSurfaceOrGroup,
tag: Option<TagDeclarator>, tag: Option<TagDeclarator>,
args: Args, args: Args,
@ -68,15 +79,18 @@ async fn inner_circle(
SketchSurfaceOrGroup::SketchSurface(surface) => surface, SketchSurfaceOrGroup::SketchSurface(surface) => surface,
SketchSurfaceOrGroup::SketchGroup(group) => group.on, SketchSurfaceOrGroup::SketchGroup(group) => group.on,
}; };
let sketch_group = let sketch_group = crate::std::sketch::inner_start_profile_at(
crate::std::sketch::inner_start_profile_at([center[0] + radius, center[1]], sketch_surface, None, args.clone()) [data.center[0] + data.radius, data.center[1]],
sketch_surface,
None,
args.clone(),
)
.await?; .await?;
let from: Point2d = sketch_group.current_pen_position()?; let from: Point2d = sketch_group.current_pen_position()?;
let angle_start = Angle::from_degrees(0.0); let angle_start = Angle::from_degrees(0.0);
let angle_end = Angle::from_degrees(360.0); let angle_end = Angle::from_degrees(360.0);
let (center, end) = arc_center_and_end(from, angle_start, angle_end, radius);
if angle_start == angle_end { if angle_start == angle_end {
return Err(KclError::Type(KclErrorDetails { return Err(KclError::Type(KclErrorDetails {
@ -94,8 +108,8 @@ async fn inner_circle(
segment: kittycad::types::PathSegment::Arc { segment: kittycad::types::PathSegment::Arc {
start: angle_start, start: angle_start,
end: angle_end, end: angle_end,
center: center.into(), center: data.center.into(),
radius, radius: data.radius,
relative: false, relative: false,
}, },
}, },
@ -104,17 +118,16 @@ async fn inner_circle(
let current_path = Path::Circle { let current_path = Path::Circle {
base: BasePath { base: BasePath {
from: center.into(), from: data.center.into(),
// to: end.into(), to: data.center.into(),
to: center.into(),
tag: tag.clone(), tag: tag.clone(),
geo_meta: GeoMeta { geo_meta: GeoMeta {
id, id,
metadata: args.source_range.into(), metadata: args.source_range.into(),
}, },
}, },
radius, radius: data.radius,
center: center.into(), center: data.center.into(),
ccw: angle_start.degrees() < angle_end.degrees(), ccw: angle_start.degrees() < angle_end.degrees(),
}; };