This commit is contained in:
Adam Chalmers
2025-04-02 14:07:26 -05:00
parent 7c7f4fcedd
commit 07cacf04e7
5 changed files with 1594 additions and 1402 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@ mod cache;
use kcl_lib::{ use kcl_lib::{
test_server::{execute_and_export_step, execute_and_snapshot, execute_and_snapshot_no_auth}, test_server::{execute_and_export_step, execute_and_snapshot, execute_and_snapshot_no_auth},
ExecError, UnitLength, ExecError,
}; };
/// The minimum permissible difference between asserted twenty-twenty images. /// The minimum permissible difference between asserted twenty-twenty images.
@ -26,7 +26,7 @@ pub(crate) fn assert_out(test_name: &str, result: &image::DynamicImage) -> Strin
async fn kcl_test_fillet_duplicate_tags() { async fn kcl_test_fillet_duplicate_tags() {
let code = kcl_input!("fillet_duplicate_tags"); let code = kcl_input!("fillet_duplicate_tags");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = result.expect_err("Code should have failed due to the duplicate edges being filletted"); let err = result.expect_err("Code should have failed due to the duplicate edges being filletted");
let err = err.as_kcl_error().unwrap(); let err = err.as_kcl_error().unwrap();
@ -48,7 +48,7 @@ async fn kcl_test_execute_engine_error_return() {
|> extrude(length = 4) |> extrude(length = 4)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -61,7 +61,7 @@ async fn kcl_test_execute_i_shape() {
// This is some code from lee that starts a pipe expression with a variable. // This is some code from lee that starts a pipe expression with a variable.
let code = kcl_input!("i_shape"); let code = kcl_input!("i_shape");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("i_shape", &result); assert_out("i_shape", &result);
} }
@ -70,7 +70,7 @@ async fn kcl_test_execute_i_shape() {
async fn kcl_test_execute_pipes_on_pipes() { async fn kcl_test_execute_pipes_on_pipes() {
let code = kcl_input!("pipes_on_pipes"); let code = kcl_input!("pipes_on_pipes");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("pipes_on_pipes", &result); assert_out("pipes_on_pipes", &result);
} }
@ -78,7 +78,7 @@ async fn kcl_test_execute_pipes_on_pipes() {
async fn kcl_test_execute_cylinder() { async fn kcl_test_execute_cylinder() {
let code = kcl_input!("cylinder"); let code = kcl_input!("cylinder");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cylinder", &result); assert_out("cylinder", &result);
} }
@ -86,7 +86,7 @@ async fn kcl_test_execute_cylinder() {
async fn kcl_test_execute_kittycad_svg() { async fn kcl_test_execute_kittycad_svg() {
let code = kcl_input!("kittycad_svg"); let code = kcl_input!("kittycad_svg");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("kittycad_svg", &result); assert_out("kittycad_svg", &result);
} }
@ -94,7 +94,7 @@ async fn kcl_test_execute_kittycad_svg() {
async fn kcl_test_execute_lsystem() { async fn kcl_test_execute_lsystem() {
let code = kcl_input!("lsystem"); let code = kcl_input!("lsystem");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("lsystem", &result); assert_out("lsystem", &result);
} }
@ -102,7 +102,7 @@ async fn kcl_test_execute_lsystem() {
async fn kcl_test_member_expression_sketch() { async fn kcl_test_member_expression_sketch() {
let code = kcl_input!("member_expression_sketch"); let code = kcl_input!("member_expression_sketch");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("member_expression_sketch", &result); assert_out("member_expression_sketch", &result);
} }
@ -110,7 +110,7 @@ async fn kcl_test_member_expression_sketch() {
async fn kcl_test_helix_defaults() { async fn kcl_test_helix_defaults() {
let code = kcl_input!("helix_defaults"); let code = kcl_input!("helix_defaults");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("helix_defaults", &result); assert_out("helix_defaults", &result);
} }
@ -118,7 +118,7 @@ async fn kcl_test_helix_defaults() {
async fn kcl_test_helix_defaults_negative_extrude() { async fn kcl_test_helix_defaults_negative_extrude() {
let code = kcl_input!("helix_defaults_negative_extrude"); let code = kcl_input!("helix_defaults_negative_extrude");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("helix_defaults_negative_extrude", &result); assert_out("helix_defaults_negative_extrude", &result);
} }
@ -126,7 +126,7 @@ async fn kcl_test_helix_defaults_negative_extrude() {
async fn kcl_test_helix_with_length() { async fn kcl_test_helix_with_length() {
let code = kcl_input!("helix_with_length"); let code = kcl_input!("helix_with_length");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("helix_with_length", &result); assert_out("helix_with_length", &result);
} }
@ -134,7 +134,7 @@ async fn kcl_test_helix_with_length() {
async fn kcl_test_dimensions_match() { async fn kcl_test_dimensions_match() {
let code = kcl_input!("dimensions_match"); let code = kcl_input!("dimensions_match");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("dimensions_match", &result); assert_out("dimensions_match", &result);
} }
@ -142,7 +142,7 @@ async fn kcl_test_dimensions_match() {
async fn kcl_test_close_arc() { async fn kcl_test_close_arc() {
let code = kcl_input!("close_arc"); let code = kcl_input!("close_arc");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("close_arc", &result); assert_out("close_arc", &result);
} }
@ -150,7 +150,7 @@ async fn kcl_test_close_arc() {
async fn kcl_test_negative_args() { async fn kcl_test_negative_args() {
let code = kcl_input!("negative_args"); let code = kcl_input!("negative_args");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("negative_args", &result); assert_out("negative_args", &result);
} }
@ -164,7 +164,7 @@ async fn kcl_test_basic_tangential_arc_with_point() {
|> extrude(length = 10) |> extrude(length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("tangential_arc_with_point", &result); assert_out("tangential_arc_with_point", &result);
} }
@ -178,7 +178,7 @@ async fn kcl_test_basic_tangential_arc_to() {
|> extrude(length = 10) |> extrude(length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("tangential_arc_to", &result); assert_out("tangential_arc_to", &result);
} }
@ -205,7 +205,7 @@ box(30, 43, 18, '-xy')
let thing = box(-12, -15, 10, 'yz') let thing = box(-12, -15, 10, 'yz')
box(-20, -5, 10, 'xy')"#; box(-20, -5, 10, 'xy')"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("different_planes_same_drawing", &result); assert_out("different_planes_same_drawing", &result);
} }
@ -263,7 +263,7 @@ part004 = startSketchOn('YZ')
|> close() |> close()
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("lots_of_planes", &result); assert_out("lots_of_planes", &result);
} }
@ -280,7 +280,7 @@ async fn kcl_test_holes() {
|> extrude(length = 2) |> extrude(length = 2)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("holes", &result); assert_out("holes", &result);
} }
@ -299,7 +299,7 @@ async fn optional_params() {
thing = other_circle([2, 2], 20) thing = other_circle([2, 2], 20)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("optional_params", &result); assert_out("optional_params", &result);
} }
@ -335,7 +335,7 @@ part = roundedRectangle([0, 0], 20, 20, 4)
|> extrude(length = 2) |> extrude(length = 2)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("rounded_with_holes", &result); assert_out("rounded_with_holes", &result);
} }
@ -343,7 +343,7 @@ part = roundedRectangle([0, 0], 20, 20, 4)
async fn kcl_test_top_level_expression() { async fn kcl_test_top_level_expression() {
let code = r#"startSketchOn('XY') |> circle(center = [0,0], radius= 22) |> extrude(length = 14)"#; let code = r#"startSketchOn('XY') |> circle(center = [0,0], radius= 22) |> extrude(length = 14)"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("top_level_expression", &result); assert_out("top_level_expression", &result);
} }
@ -357,7 +357,7 @@ part = startSketchOn('XY')
|> extrude(length = 1) |> extrude(length = 1)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_linear_basic_with_math", &result); assert_out("patterns_linear_basic_with_math", &result);
} }
@ -369,7 +369,7 @@ async fn kcl_test_patterns_linear_basic() {
|> extrude(length = 1) |> extrude(length = 1)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_linear_basic", &result); assert_out("patterns_linear_basic", &result);
} }
@ -385,7 +385,7 @@ async fn kcl_test_patterns_linear_basic_3d() {
|> patternLinear3d(axis = [1, 0, 1], instances = 4, distance = 6) |> patternLinear3d(axis = [1, 0, 1], instances = 4, distance = 6)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_linear_basic_3d", &result); assert_out("patterns_linear_basic_3d", &result);
} }
@ -397,7 +397,7 @@ async fn kcl_test_patterns_linear_basic_negative_distance() {
|> extrude(length = 1) |> extrude(length = 1)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_linear_basic_negative_distance", &result); assert_out("patterns_linear_basic_negative_distance", &result);
} }
@ -409,7 +409,7 @@ async fn kcl_test_patterns_linear_basic_negative_axis() {
|> extrude(length = 1) |> extrude(length = 1)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_linear_basic_negative_axis", &result); assert_out("patterns_linear_basic_negative_axis", &result);
} }
@ -430,7 +430,7 @@ rectangle = startSketchOn('XY')
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_linear_basic_holes", &result); assert_out("patterns_linear_basic_holes", &result);
} }
@ -442,7 +442,7 @@ async fn kcl_test_patterns_circular_basic_2d() {
|> extrude(length = 1) |> extrude(length = 1)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_circular_basic_2d", &result); assert_out("patterns_circular_basic_2d", &result);
} }
@ -458,7 +458,7 @@ async fn kcl_test_patterns_circular_basic_3d() {
|> patternCircular3d(axis = [0,0, 1], center = [-20, -20, -20], instances = 41, arcDegrees = 360, rotateDuplicates = false) |> patternCircular3d(axis = [0,0, 1], center = [-20, -20, -20], instances = 41, arcDegrees = 360, rotateDuplicates = false)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_circular_basic_3d", &result); assert_out("patterns_circular_basic_3d", &result);
} }
@ -474,7 +474,7 @@ async fn kcl_test_patterns_circular_3d_tilted_axis() {
|> patternCircular3d(axis = [1,1,0], center = [10, 0, 10], instances = 11, arcDegrees = 360, rotateDuplicates = true) |> patternCircular3d(axis = [1,1,0], center = [10, 0, 10], instances = 11, arcDegrees = 360, rotateDuplicates = true)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("patterns_circular_3d_tilted_axis", &result); assert_out("patterns_circular_3d_tilted_axis", &result);
} }
@ -483,7 +483,7 @@ async fn kcl_test_import_file_doesnt_exist() {
let code = r#"import 'thing.obj' let code = r#"import 'thing.obj'
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -496,7 +496,7 @@ async fn kcl_test_import_obj_with_mtl() {
let code = r#"import 'e2e/executor/inputs/cube.obj' let code = r#"import 'e2e/executor/inputs/cube.obj'
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_obj_with_mtl", &result); assert_out("import_obj_with_mtl", &result);
} }
@ -506,7 +506,7 @@ async fn kcl_test_import_obj_with_mtl_units() {
import 'e2e/executor/inputs/cube.obj' import 'e2e/executor/inputs/cube.obj'
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_obj_with_mtl_units", &result); assert_out("import_obj_with_mtl_units", &result);
} }
@ -515,7 +515,7 @@ async fn kcl_test_import_stl() {
let code = r#"import 'e2e/executor/inputs/2-5-long-m8-chc-screw.stl' as screw let code = r#"import 'e2e/executor/inputs/2-5-long-m8-chc-screw.stl' as screw
model = screw"#; model = screw"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_stl", &result); assert_out("import_stl", &result);
} }
@ -524,7 +524,7 @@ async fn kcl_test_import_gltf_with_bin() {
let code = r#"import 'e2e/executor/inputs/cube.gltf' let code = r#"import 'e2e/executor/inputs/cube.gltf'
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_gltf_with_bin", &result); assert_out("import_gltf_with_bin", &result);
} }
@ -533,7 +533,7 @@ async fn kcl_test_import_gltf_embedded() {
let code = r#"import 'e2e/executor/inputs/cube-embedded.gltf' as cube let code = r#"import 'e2e/executor/inputs/cube-embedded.gltf' as cube
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_gltf_embedded", &result); assert_out("import_gltf_embedded", &result);
} }
@ -542,7 +542,7 @@ async fn kcl_test_import_glb() {
let code = r#"import 'e2e/executor/inputs/cube.glb' let code = r#"import 'e2e/executor/inputs/cube.glb'
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_glb", &result); assert_out("import_glb", &result);
} }
@ -551,7 +551,7 @@ async fn kcl_test_import_glb_no_assign() {
let code = r#"import 'e2e/executor/inputs/cube.glb' let code = r#"import 'e2e/executor/inputs/cube.glb'
cube"#; cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("import_glb_no_assign", &result); assert_out("import_glb_no_assign", &result);
} }
@ -561,7 +561,7 @@ async fn kcl_test_import_ext_doesnt_match() {
import 'e2e/executor/inputs/cube.gltf' import 'e2e/executor/inputs/cube.gltf'
model = cube"#; model = cube"#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -572,7 +572,7 @@ model = cube"#;
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cube_mm() { async fn kcl_test_cube_mm() {
let code = r#"fn cube = (pos, scale) => { let code = r#"fn cube = (pos, scale) => {
sg = startSketchOn('XY') sg = startSketchOn(XY)
|> startProfileAt(pos, %) |> startProfileAt(pos, %)
|> line(end = [0, scale]) |> line(end = [0, scale])
|> line(end = [scale, 0]) |> line(end = [scale, 0])
@ -586,13 +586,14 @@ async fn kcl_test_cube_mm() {
myCube = cube([0,0], 10) myCube = cube([0,0], 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cube_mm", &result); assert_out("cube_mm", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cube_cm() { async fn kcl_test_cube_cm() {
let code = r#"fn cube = (pos, scale) => { let code = r#"@settings(defaultLengthUnit = cm)
fn cube = (pos, scale) => {
sg = startSketchOn('XY') sg = startSketchOn('XY')
|> startProfileAt(pos, %) |> startProfileAt(pos, %)
|> line(end = [0, scale]) |> line(end = [0, scale])
@ -607,13 +608,14 @@ async fn kcl_test_cube_cm() {
myCube = cube([0,0], 10) myCube = cube([0,0], 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Cm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cube_cm", &result); assert_out("cube_cm", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cube_m() { async fn kcl_test_cube_m() {
let code = r#"fn cube = (pos, scale) => { let code = r#"@settings(defaultLengthUnit = m)
fn cube = (pos, scale) => {
sg = startSketchOn('XY') sg = startSketchOn('XY')
|> startProfileAt(pos, %) |> startProfileAt(pos, %)
|> line(end = [0, scale]) |> line(end = [0, scale])
@ -628,13 +630,14 @@ async fn kcl_test_cube_m() {
myCube = cube([0,0], 10) myCube = cube([0,0], 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::M, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cube_m", &result); assert_out("cube_m", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cube_in() { async fn kcl_test_cube_in() {
let code = r#"fn cube = (pos, scale) => { let code = r#"@settings(defaultLengthUnit = in)
fn cube = (pos, scale) => {
sg = startSketchOn('XY') sg = startSketchOn('XY')
|> startProfileAt(pos, %) |> startProfileAt(pos, %)
|> line(end = [0, scale]) |> line(end = [0, scale])
@ -649,13 +652,14 @@ async fn kcl_test_cube_in() {
myCube = cube([0,0], 10) myCube = cube([0,0], 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::In, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cube_in", &result); assert_out("cube_in", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cube_ft() { async fn kcl_test_cube_ft() {
let code = r#"fn cube = (pos, scale) => { let code = r#"@settings(defaultLengthUnit = ft)
fn cube = (pos, scale) => {
sg = startSketchOn('XY') sg = startSketchOn('XY')
|> startProfileAt(pos, %) |> startProfileAt(pos, %)
|> line(end = [0, scale]) |> line(end = [0, scale])
@ -670,13 +674,14 @@ async fn kcl_test_cube_ft() {
myCube = cube([0,0], 10) myCube = cube([0,0], 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Ft, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cube_ft", &result); assert_out("cube_ft", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_cube_yd() { async fn kcl_test_cube_yd() {
let code = r#"fn cube = (pos, scale) => { let code = r#"@settings(defaultLengthUnit = yd)
fn cube = (pos, scale) => {
sg = startSketchOn('XY') sg = startSketchOn('XY')
|> startProfileAt(pos, %) |> startProfileAt(pos, %)
|> line(end = [0, scale]) |> line(end = [0, scale])
@ -691,7 +696,7 @@ async fn kcl_test_cube_yd() {
myCube = cube([0,0], 10) myCube = cube([0,0], 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Yd, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("cube_yd", &result); assert_out("cube_yd", &result);
} }
@ -719,7 +724,7 @@ part002 = startSketchOn(part001, part001.sketch.tags.here)
|> extrude(length = 1) |> extrude(length = 1)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = result.err().unwrap(); let err = result.err().unwrap();
let ExecError::Kcl(err) = err else { let ExecError::Kcl(err) = err else {
@ -763,7 +768,7 @@ part003 = startSketchOn(part002, "end")
|> extrude(length = 5) |> extrude(length = 5)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("sketch_on_face_of_face", &result); assert_out("sketch_on_face_of_face", &result);
} }
@ -780,7 +785,7 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() {
|> extrude(length = 2) |> extrude(length = 2)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = result.err().unwrap(); let err = result.err().unwrap();
let ExecError::Kcl(err) = err else { let ExecError::Kcl(err) = err else {
panic!("Expected KCL error, found {err}"); panic!("Expected KCL error, found {err}");
@ -811,7 +816,7 @@ part002 = startSketchOn(part001, "end")
|> extrude(length = 5) |> extrude(length = 5)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("sketch_on_face_circle", &result); assert_out("sketch_on_face_circle", &result);
} }
@ -853,7 +858,7 @@ part = rectShape([0, 0], 20, 20)
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = result.err().unwrap(); let err = result.err().unwrap();
let ExecError::Kcl(err) = err else { let ExecError::Kcl(err) = err else {
panic!("Expected KCL error, found {err}"); panic!("Expected KCL error, found {err}");
@ -880,7 +885,7 @@ async fn kcl_test_simple_revolve() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("simple_revolve", &result); assert_out("simple_revolve", &result);
} }
@ -900,7 +905,7 @@ async fn kcl_test_simple_revolve_uppercase() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("simple_revolve_uppercase", &result); assert_out("simple_revolve_uppercase", &result);
} }
@ -920,7 +925,7 @@ async fn kcl_test_simple_revolve_negative() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("simple_revolve_negative", &result); assert_out("simple_revolve_negative", &result);
} }
@ -940,7 +945,7 @@ async fn kcl_test_revolve_bad_angle_low() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert!(result assert!(result
@ -966,7 +971,7 @@ async fn kcl_test_revolve_bad_angle_high() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert!(result assert!(result
@ -992,7 +997,7 @@ async fn kcl_test_simple_revolve_custom_angle() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("simple_revolve_custom_angle", &result); assert_out("simple_revolve_custom_angle", &result);
} }
@ -1012,7 +1017,7 @@ async fn kcl_test_simple_revolve_custom_axis() {
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("simple_revolve_custom_axis", &result); assert_out("simple_revolve_custom_axis", &result);
} }
@ -1036,7 +1041,7 @@ sketch001 = startSketchOn(box, "end")
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("revolve_on_edge", &result); assert_out("revolve_on_edge", &result);
} }
@ -1060,7 +1065,7 @@ sketch001 = startSketchOn(box, revolveAxis)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
result.unwrap_err(); result.unwrap_err();
//this fails right now, but slightly differently, lets just say its enough for it to fail - mike //this fails right now, but slightly differently, lets just say its enough for it to fail - mike
@ -1088,7 +1093,7 @@ sketch001 = startSketchOn(box, "END")
}, %) }, %)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("revolve_on_face_circle_edge", &result); assert_out("revolve_on_face_circle_edge", &result);
} }
@ -1110,7 +1115,7 @@ sketch001 = startSketchOn(box, "END")
}, %) }, %)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("revolve_on_face_circle", &result); assert_out("revolve_on_face_circle", &result);
} }
@ -1136,7 +1141,7 @@ sketch001 = startSketchOn(box, "end")
}, %) }, %)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("revolve_on_face", &result); assert_out("revolve_on_face", &result);
} }
@ -1150,7 +1155,7 @@ async fn kcl_test_basic_revolve_circle() {
}, %) }, %)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("basic_revolve_circle", &result); assert_out("basic_revolve_circle", &result);
} }
@ -1177,7 +1182,7 @@ part002 = startSketchOn(part001, 'end')
|> extrude(length = 5) |> extrude(length = 5)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("simple_revolve_sketch_on_edge", &result); assert_out("simple_revolve_sketch_on_edge", &result);
} }
@ -1243,7 +1248,7 @@ plumbus1 = circle1
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("plumbus_fillets", &result); assert_out("plumbus_fillets", &result);
} }
@ -1251,7 +1256,7 @@ plumbus1 = circle1
async fn kcl_test_empty_file_is_ok() { async fn kcl_test_empty_file_is_ok() {
let code = r#""#; let code = r#""#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
result.unwrap(); result.unwrap();
} }
@ -1281,7 +1286,7 @@ async fn kcl_test_member_expression_in_params() {
capScrew([0, 0.5, 0], 50, 37.5, 50, 25) capScrew([0, 0.5, 0], 50, 37.5, 50, 25)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("member_expression_in_params", &result); assert_out("member_expression_in_params", &result);
} }
@ -1326,7 +1331,7 @@ bracket = startSketchOn('XY')
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
result.unwrap(); result.unwrap();
} }
@ -1346,7 +1351,7 @@ secondSketch = startSketchOn(part001, '')
|> extrude(length = 20) |> extrude(length = 20)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1377,7 +1382,7 @@ extrusion = startSketchOn('XY')
|> extrude(length = height) |> extrude(length = height)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1410,7 +1415,7 @@ sketch001 = [profile001, profile002]
extrude(sketch001, length = 10) extrude(sketch001, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("array_of_sketches", &result); assert_out("array_of_sketches", &result);
} }
@ -1447,7 +1452,7 @@ pattn1 = patternLinear3d(
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("pattern3d_array_of_extrudes", &result); assert_out("pattern3d_array_of_extrudes", &result);
} }
@ -1495,7 +1500,7 @@ baseExtrusion = extrude(sketch001, length = width)
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("fillets_referencing_other_fillets", &result); assert_out("fillets_referencing_other_fillets", &result);
} }
@ -1543,7 +1548,7 @@ baseExtrusion = extrude(sketch001, length = width)
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("chamfers_referencing_other_chamfers", &result); assert_out("chamfers_referencing_other_chamfers", &result);
} }
@ -1563,7 +1568,7 @@ async fn kcl_test_shell_with_tag() {
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("shell_with_tag", &result); assert_out("shell_with_tag", &result);
} }
@ -1594,7 +1599,7 @@ pattn1 = patternLinear3d(
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("linear_pattern3d_filleted_sketch", &result); assert_out("linear_pattern3d_filleted_sketch", &result);
} }
@ -1621,7 +1626,7 @@ pattn2 = patternCircular3d(part001, axis = [0,0, 1], center = [-20, -20, -20], i
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("circular_pattern3d_filleted_sketch", &result); assert_out("circular_pattern3d_filleted_sketch", &result);
} }
@ -1647,7 +1652,7 @@ part001 = cube([0,0], 20)
pattn2 = patternCircular3d(part001, axis = [0,0, 1], center = [-20, -20, -20], instances = 5, arcDegrees = 360, rotateDuplicates = false) pattn2 = patternCircular3d(part001, axis = [0,0, 1], center = [-20, -20, -20], instances = 5, arcDegrees = 360, rotateDuplicates = false)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("circular_pattern3d_chamfered_sketch", &result); assert_out("circular_pattern3d_chamfered_sketch", &result);
} }
@ -1674,7 +1679,7 @@ part001 = cube([0,0], 20)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = result.err().unwrap(); let err = result.err().unwrap();
let ExecError::Kcl(err) = err else { let ExecError::Kcl(err) = err else {
panic!("Expected KCL error, found {err}"); panic!("Expected KCL error, found {err}");
@ -1706,7 +1711,7 @@ async fn kcl_test_duplicate_tags_should_error() {
let p = triangle(200) let p = triangle(200)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = result.unwrap_err(); let err = result.unwrap_err();
let err = err.as_kcl_error().unwrap(); let err = err.as_kcl_error().unwrap();
assert_eq!(err.message(), "Cannot redefine `a`"); assert_eq!(err.message(), "Cannot redefine `a`");
@ -1715,49 +1720,49 @@ let p = triangle(200)
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_global_tags() { async fn kcl_test_global_tags() {
let code = kcl_input!("global-tags"); let code = kcl_input!("global-tags");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("global_tags", &result); assert_out("global_tags", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_extrude_inside_fn_with_tags() { async fn kcl_test_extrude_inside_fn_with_tags() {
let code = kcl_input!("extrude-inside-fn-with-tags"); let code = kcl_input!("extrude-inside-fn-with-tags");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("extrude-inside-fn-with-tags", &result); assert_out("extrude-inside-fn-with-tags", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_pattern_vase() { async fn kcl_test_pattern_vase() {
let code = kcl_input!("pattern_vase"); let code = kcl_input!("pattern_vase");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("pattern_vase", &result); assert_out("pattern_vase", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_scoped_tags() { async fn kcl_test_scoped_tags() {
let code = kcl_input!("scoped-tags"); let code = kcl_input!("scoped-tags");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("scoped_tags", &result); assert_out("scoped_tags", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_order_sketch_extrude_in_order() { async fn kcl_test_order_sketch_extrude_in_order() {
let code = kcl_input!("order-sketch-extrude-in-order"); let code = kcl_input!("order-sketch-extrude-in-order");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("order-sketch-extrude-in-order", &result); assert_out("order-sketch-extrude-in-order", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_order_sketch_extrude_out_of_order() { async fn kcl_test_order_sketch_extrude_out_of_order() {
let code = kcl_input!("order-sketch-extrude-out-of-order"); let code = kcl_input!("order-sketch-extrude-out-of-order");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("order-sketch-extrude-out-of-order", &result); assert_out("order-sketch-extrude-out-of-order", &result);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn kcl_test_extrude_custom_plane() { async fn kcl_test_extrude_custom_plane() {
let code = kcl_input!("extrude-custom-plane"); let code = kcl_input!("extrude-custom-plane");
let result = execute_and_snapshot(code, UnitLength::Mm, None).await.unwrap(); let result = execute_and_snapshot(code, None).await.unwrap();
assert_out("extrude-custom-plane", &result); assert_out("extrude-custom-plane", &result);
} }
@ -1779,7 +1784,7 @@ async fn kcl_test_arc_error_same_start_end() {
) )
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1799,7 +1804,7 @@ async fn kcl_test_angled_line_to_x_90() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1819,7 +1824,7 @@ async fn kcl_test_angled_line_to_x_270() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1839,7 +1844,7 @@ async fn kcl_test_angled_line_to_y_0() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1859,7 +1864,7 @@ async fn kcl_test_angled_line_to_y_180() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1879,7 +1884,7 @@ async fn kcl_test_angled_line_of_x_length_90() {
extrusion = extrude(sketch001, length = 10) extrusion = extrude(sketch001, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1899,7 +1904,7 @@ async fn kcl_test_angled_line_of_x_length_270() {
extrusion = extrude(sketch001, length = 10) extrusion = extrude(sketch001, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1921,7 +1926,7 @@ async fn kcl_test_angled_line_of_y_length_0() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1943,7 +1948,7 @@ async fn kcl_test_angled_line_of_y_length_180() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1965,7 +1970,7 @@ async fn kcl_test_angled_line_of_y_length_negative_180() {
example = extrude(exampleSketch, length = 10) example = extrude(exampleSketch, length = 10)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -1982,7 +1987,7 @@ async fn kcl_test_error_inside_fn_also_has_source_range_of_call_site() {
someFunction('INVALID') someFunction('INVALID')
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -2003,7 +2008,7 @@ async fn kcl_test_error_inside_fn_also_has_source_range_of_call_site_recursive()
someFunction('INVALID') someFunction('INVALID')
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( assert_eq!(
result.err().unwrap().to_string(), result.err().unwrap().to_string(),
@ -2027,7 +2032,7 @@ async fn kcl_test_error_no_auth_websocket() {
) )
"#; "#;
let result = execute_and_snapshot_no_auth(code, UnitLength::Mm, None).await; let result = execute_and_snapshot_no_auth(code, None).await;
assert!(result.is_err()); assert!(result.is_err());
assert!(result assert!(result
.err() .err()
@ -2053,9 +2058,7 @@ sketch000 = startSketchOn('XY')
|> line(end = [0, innerDiameter / 2]) |> line(end = [0, innerDiameter / 2])
"#; "#;
let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default()) let ctx = kcl_lib::ExecutorContext::new_with_default_client().await.unwrap();
.await
.unwrap();
let mut exec_state = kcl_lib::ExecState::new(&ctx); let mut exec_state = kcl_lib::ExecState::new(&ctx);
let program = kcl_lib::Program::parse_no_errs(code).unwrap(); let program = kcl_lib::Program::parse_no_errs(code).unwrap();
ctx.run(&program, &mut exec_state).await.unwrap(); ctx.run(&program, &mut exec_state).await.unwrap();
@ -2078,9 +2081,7 @@ async fn kcl_test_ensure_nothing_left_in_batch_multi_file() {
// Change the current working directory to the test directory. // Change the current working directory to the test directory.
std::env::set_current_dir(path.parent().unwrap()).unwrap(); std::env::set_current_dir(path.parent().unwrap()).unwrap();
let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default()) let ctx = kcl_lib::ExecutorContext::new_with_default_client().await.unwrap();
.await
.unwrap();
let mut exec_state = kcl_lib::ExecState::new(&ctx); let mut exec_state = kcl_lib::ExecState::new(&ctx);
let program = kcl_lib::Program::parse_no_errs(&code).unwrap(); let program = kcl_lib::Program::parse_no_errs(&code).unwrap();
ctx.run(&program, &mut exec_state).await.unwrap(); ctx.run(&program, &mut exec_state).await.unwrap();
@ -2098,7 +2099,7 @@ async fn kcl_test_better_type_names() {
|> circle(center = [-95.51, -74.7], radius = 262.23) |> circle(center = [-95.51, -74.7], radius = 262.23)
|> appearance(metalness = 0.9) |> appearance(metalness = 0.9)
"#; "#;
let result = execute_and_snapshot(code, UnitLength::Mm, None).await; let result = execute_and_snapshot(code, None).await;
let err = match result.err() { let err = match result.err() {
Some(x) => match x { Some(x) => match x {
@ -2117,7 +2118,7 @@ async fn kcl_test_exporting_step_file() {
// This tests export like how we do it in cli and kcl.py. // This tests export like how we do it in cli and kcl.py.
let code = kcl_input!("helix_defaults_negative_extrude"); let code = kcl_input!("helix_defaults_negative_extrude");
let (_, _, files) = execute_and_export_step(code, UnitLength::Mm, None).await.unwrap(); let (_, _, files) = execute_and_export_step(code, None).await.unwrap();
for file in files { for file in files {
expectorate::assert_contents( expectorate::assert_contents(
format!("e2e/executor/outputs/helix_defaults_negative_extrude_{}", file.name), format!("e2e/executor/outputs/helix_defaults_negative_extrude_{}", file.name),

View File

@ -5,11 +5,16 @@ import type { Node } from '@rust/kcl-lib/bindings/Node'
import type { TagDeclarator } from '@rust/kcl-lib/bindings/TagDeclarator' import type { TagDeclarator } from '@rust/kcl-lib/bindings/TagDeclarator'
import { import {
ARG_ANGLE,
ARG_CIRCLE_CENTER, ARG_CIRCLE_CENTER,
ARG_CIRCLE_RADIUS, ARG_CIRCLE_RADIUS,
ARG_END, ARG_END,
ARG_END_ABSOLUTE, ARG_END_ABSOLUTE,
ARG_END_ABSOLUTE_X,
ARG_END_ABSOLUTE_Y,
ARG_LENGTH, ARG_LENGTH,
ARG_LENGTH_X,
ARG_LENGTH_Y,
ARG_TAG, ARG_TAG,
DETERMINING_ARGS, DETERMINING_ARGS,
} from '@src/lang/constants' } from '@src/lang/constants'
@ -79,7 +84,13 @@ import type {
} from '@src/lang/wasm' } from '@src/lang/wasm'
import { sketchFromKclValue } from '@src/lang/wasm' import { sketchFromKclValue } from '@src/lang/wasm'
import { err } from '@src/lib/trap' import { err } from '@src/lib/trap'
import { getAngle, getLength, isArray, roundOff } from '@src/lib/utils' import {
allLabels,
getAngle,
getLength,
isArray,
roundOff,
} from '@src/lib/utils'
import type { EdgeCutInfo } from '@src/machines/modelingMachine' import type { EdgeCutInfo } from '@src/machines/modelingMachine'
const STRAIGHT_SEGMENT_ERR = new Error( const STRAIGHT_SEGMENT_ERR = new Error(

View File

@ -1,7 +1,11 @@
import { ARG_END, ARG_END_ABSOLUTE } from '@src/lang/constants' import { ARG_END, ARG_END_ABSOLUTE } from '@src/lang/constants'
import type { ToolTip } from '@src/lang/langHelpers' import type { ToolTip } from '@src/lang/langHelpers'
import { codeRefFromRange } from '@src/lang/std/artifactGraph' import { codeRefFromRange } from '@src/lang/std/artifactGraph'
import { fnNameToTooltip, getArgForEnd, isAbsoluteLine } from '@src/lang/std/sketch' import {
fnNameToTooltip,
getArgForEnd,
isAbsoluteLine,
} from '@src/lang/std/sketch'
import type { import type {
ConstraintLevel, ConstraintLevel,
ConstraintType, ConstraintType,
@ -13,7 +17,7 @@ import {
transformAstSketchLines, transformAstSketchLines,
transformSecondarySketchLinesTagFirst, transformSecondarySketchLinesTagFirst,
} from '@src/lang/std/sketchcombos' } from '@src/lang/std/sketchcombos'
import { findKwArg, topLevelRange } from '@src/lang/util' import { findAngleLengthPair, findKwArg, topLevelRange } from '@src/lang/util'
import type { Expr, Program } from '@src/lang/wasm' import type { Expr, Program } from '@src/lang/wasm'
import { assertParse, initPromise, recast } from '@src/lang/wasm' import { assertParse, initPromise, recast } from '@src/lang/wasm'
import type { Selection, Selections } from '@src/lib/selections' import type { Selection, Selections } from '@src/lib/selections'
@ -93,7 +97,7 @@ function getConstraintTypeFromSourceHelper(
) )
} }
const args = arg.elements as [Expr, Expr] const args = arg.elements as [Expr, Expr]
const fnName = expr.callee.name as ToolTip const fnName = expr.callee.name.name as ToolTip
return getConstraintType(args, fnName, false) return getConstraintType(args, fnName, false)
} }
case 'CallExpressionKw': { case 'CallExpressionKw': {
@ -104,7 +108,7 @@ function getConstraintTypeFromSourceHelper(
return new Error("couldn't find either end or endAbsolute in KW call") return new Error("couldn't find either end or endAbsolute in KW call")
} }
const isAbsolute = endAbsolute ? true : false const isAbsolute = endAbsolute ? true : false
const fnName = fnNameToTooltip(allLabels(expr), expr.callee.name) const fnName = fnNameToTooltip(allLabels(expr), expr.callee.name.name)
if (err(fnName)) { if (err(fnName)) {
return fnName return fnName
} }

View File

@ -1,16 +1,16 @@
import type { Node } from '@rust/kcl-lib/bindings/Node' import type { Node } from '@rust/kcl-lib/bindings/Node'
import { import {
ARG_ANGLE,
ARG_END, ARG_END,
ARG_END_ABSOLUTE, ARG_END_ABSOLUTE,
ARG_LENGTH,
ARG_TAG,
ARG_ANGLE,
DETERMINING_ARGS,
ARG_END_ABSOLUTE_X, ARG_END_ABSOLUTE_X,
ARG_END_ABSOLUTE_Y, ARG_END_ABSOLUTE_Y,
ARG_LENGTH,
ARG_LENGTH_X, ARG_LENGTH_X,
ARG_LENGTH_Y, ARG_LENGTH_Y,
ARG_TAG,
DETERMINING_ARGS,
} from '@src/lang/constants' } from '@src/lang/constants'
import { import {
createArrayExpression, createArrayExpression,
@ -34,6 +34,7 @@ import { getNodePathFromSourceRange } from '@src/lang/queryAstNodePathUtils'
import { import {
createFirstArg, createFirstArg,
fnNameToTooltip, fnNameToTooltip,
getAngledLine,
getArgForEnd, getArgForEnd,
getCircle, getCircle,
getConstraintInfo, getConstraintInfo,
@ -73,7 +74,13 @@ import type {
import { sketchFromKclValue } from '@src/lang/wasm' import { sketchFromKclValue } from '@src/lang/wasm'
import type { Selections } from '@src/lib/selections' import type { Selections } from '@src/lib/selections'
import { cleanErrs, err } from '@src/lib/trap' import { cleanErrs, err } from '@src/lib/trap'
import { getAngle, isArray, normaliseAngle, roundOff } from '@src/lib/utils' import {
allLabels,
getAngle,
isArray,
normaliseAngle,
roundOff,
} from '@src/lib/utils'
export type LineInputsType = export type LineInputsType =
| 'xAbsolute' | 'xAbsolute'
@ -363,17 +370,17 @@ type TransformMap = {
const xyLineSetLength = const xyLineSetLength =
(xOrY: 'xLine' | 'yLine', referenceSeg = false): CreateStdLibSketchCallExpr => (xOrY: 'xLine' | 'yLine', referenceSeg = false): CreateStdLibSketchCallExpr =>
({ referenceSegName, tag, forceValueUsedInTransform, rawArgs: args }) => { ({ referenceSegName, tag, forceValueUsedInTransform, rawArgs: args }) => {
const segRef = createSegLen(referenceSegName) const segRef = createSegLen(referenceSegName)
const lineVal = forceValueUsedInTransform const lineVal = forceValueUsedInTransform
? forceValueUsedInTransform ? forceValueUsedInTransform
: referenceSeg : referenceSeg
? segRef ? segRef
: args[0].expr : args[0].expr
const literalArg = asNum(args[0].expr.value) const literalArg = asNum(args[0].expr.value)
if (err(literalArg)) return literalArg if (err(literalArg)) return literalArg
return createCallWrapper(xOrY, lineVal, tag, literalArg) return createCallWrapper(xOrY, lineVal, tag, literalArg)
} }
type AngLenNone = 'ang' | 'len' | 'none' type AngLenNone = 'ang' | 'len' | 'none'
const basicAngledLineCreateNode = const basicAngledLineCreateNode =
@ -382,49 +389,49 @@ const basicAngledLineCreateNode =
valToForce: AngLenNone = 'none', valToForce: AngLenNone = 'none',
varValToUse: AngLenNone = 'none' varValToUse: AngLenNone = 'none'
): CreateStdLibSketchCallExpr => ): CreateStdLibSketchCallExpr =>
({ ({
referenceSegName, referenceSegName,
tag, tag,
forceValueUsedInTransform, forceValueUsedInTransform,
inputs, inputs,
rawArgs: args, rawArgs: args,
referencedSegment: path, referencedSegment: path,
}) => { }) => {
const refAng = path ? getAngle(path?.from, path?.to) : 0 const refAng = path ? getAngle(path?.from, path?.to) : 0
const argValue = asNum(args[0].expr.value) const argValue = asNum(args[0].expr.value)
if (err(argValue)) return argValue if (err(argValue)) return argValue
const nonForcedAng = const nonForcedAng =
varValToUse === 'ang' varValToUse === 'ang'
? inputs[0].expr ? inputs[0].expr
: referenceSeg === 'ang' : referenceSeg === 'ang'
? getClosesAngleDirection( ? getClosesAngleDirection(
argValue, argValue,
refAng, refAng,
createSegAngle(referenceSegName) createSegAngle(referenceSegName)
) )
: args[0].expr : args[0].expr
const nonForcedLen = const nonForcedLen =
varValToUse === 'len' varValToUse === 'len'
? inputs[1].expr ? inputs[1].expr
: referenceSeg === 'len' : referenceSeg === 'len'
? createSegLen(referenceSegName) ? createSegLen(referenceSegName)
: args[1].expr : args[1].expr
const shouldForceAng = valToForce === 'ang' && forceValueUsedInTransform const shouldForceAng = valToForce === 'ang' && forceValueUsedInTransform
const shouldForceLen = valToForce === 'len' && forceValueUsedInTransform const shouldForceLen = valToForce === 'len' && forceValueUsedInTransform
const literalArg = asNum( const literalArg = asNum(
valToForce === 'ang' ? args[0].expr.value : args[1].expr.value valToForce === 'ang' ? args[0].expr.value : args[1].expr.value
) )
if (err(literalArg)) return literalArg if (err(literalArg)) return literalArg
return createCallWrapper( return createCallWrapper(
'angledLine', 'angledLine',
[ [
shouldForceAng ? forceValueUsedInTransform : nonForcedAng, shouldForceAng ? forceValueUsedInTransform : nonForcedAng,
shouldForceLen ? forceValueUsedInTransform : nonForcedLen, shouldForceLen ? forceValueUsedInTransform : nonForcedLen,
], ],
tag, tag,
literalArg literalArg
) )
} }
const angledLineAngleCreateNode: CreateStdLibSketchCallExpr = ({ const angledLineAngleCreateNode: CreateStdLibSketchCallExpr = ({
referenceSegName, referenceSegName,
inputs, inputs,
@ -495,57 +502,57 @@ function getClosesAngleDirection(
const setHorzVertDistanceCreateNode = const setHorzVertDistanceCreateNode =
(xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr => (xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr =>
({ ({
referenceSegName, referenceSegName,
tag, tag,
forceValueUsedInTransform, forceValueUsedInTransform,
rawArgs: args, rawArgs: args,
referencedSegment, referencedSegment,
}) => { }) => {
const refNum = referencedSegment?.to?.[index] const refNum = referencedSegment?.to?.[index]
const literalArg = asNum(args?.[index].expr.value) const literalArg = asNum(args?.[index].expr.value)
if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR
const valueUsedInTransform = roundOff(literalArg - refNum, 2) const valueUsedInTransform = roundOff(literalArg - refNum, 2)
let finalValue: Node<Expr> = createBinaryExpressionWithUnary([ let finalValue: Node<Expr> = createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, !index), createSegEnd(referenceSegName, !index),
forceValueUsedInTransform || createLiteral(valueUsedInTransform), forceValueUsedInTransform || createLiteral(valueUsedInTransform),
]) ])
if (isValueZero(forceValueUsedInTransform)) { if (isValueZero(forceValueUsedInTransform)) {
finalValue = createSegEnd(referenceSegName, !index) finalValue = createSegEnd(referenceSegName, !index)
}
return createCallWrapper(
'lineTo',
!index ? [finalValue, args[1].expr] : [args[0].expr, finalValue],
tag,
valueUsedInTransform
)
} }
return createCallWrapper(
'lineTo',
!index ? [finalValue, args[1].expr] : [args[0].expr, finalValue],
tag,
valueUsedInTransform
)
}
const setHorzVertDistanceForAngleLineCreateNode = const setHorzVertDistanceForAngleLineCreateNode =
(xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr => (xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr =>
({ ({
referenceSegName, referenceSegName,
tag,
forceValueUsedInTransform,
inputs,
rawArgs: args,
referencedSegment,
}) => {
const refNum = referencedSegment?.to?.[index]
const literalArg = asNum(args?.[1].expr.value)
if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR
const valueUsedInTransform = roundOff(literalArg - refNum, 2)
const binExp = createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, !index),
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
])
return createCallWrapper(
xOrY === 'x' ? 'angledLineToX' : 'angledLineToY',
[inputs[0].expr, binExp],
tag, tag,
forceValueUsedInTransform, valueUsedInTransform
inputs, )
rawArgs: args, }
referencedSegment,
}) => {
const refNum = referencedSegment?.to?.[index]
const literalArg = asNum(args?.[1].expr.value)
if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR
const valueUsedInTransform = roundOff(literalArg - refNum, 2)
const binExp = createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, !index),
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
])
return createCallWrapper(
xOrY === 'x' ? 'angledLineToX' : 'angledLineToY',
[inputs[0].expr, binExp],
tag,
valueUsedInTransform
)
}
const setAbsDistanceCreateNode = const setAbsDistanceCreateNode =
( (
@ -553,94 +560,94 @@ const setAbsDistanceCreateNode =
isXOrYLine = false, isXOrYLine = false,
index = xOrY === 'x' ? 0 : 1 index = xOrY === 'x' ? 0 : 1
): CreateStdLibSketchCallExpr => ): CreateStdLibSketchCallExpr =>
({ tag, forceValueUsedInTransform, rawArgs: args }) => { ({ tag, forceValueUsedInTransform, rawArgs: args }) => {
const literalArg = asNum(args?.[index].expr.value) const literalArg = asNum(args?.[index].expr.value)
if (err(literalArg)) return literalArg if (err(literalArg)) return literalArg
const valueUsedInTransform = roundOff(literalArg, 2) const valueUsedInTransform = roundOff(literalArg, 2)
const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform) const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform)
if (isXOrYLine) { if (isXOrYLine) {
return createCallWrapper(
xOrY === 'x' ? 'xLineTo' : 'yLineTo',
val,
tag,
valueUsedInTransform
)
}
return createCallWrapper( return createCallWrapper(
'lineTo', xOrY === 'x' ? 'xLineTo' : 'yLineTo',
!index ? [val, args[1].expr] : [args[0].expr, val], val,
tag, tag,
valueUsedInTransform valueUsedInTransform
) )
} }
return createCallWrapper(
'lineTo',
!index ? [val, args[1].expr] : [args[0].expr, val],
tag,
valueUsedInTransform
)
}
const setAbsDistanceForAngleLineCreateNode = const setAbsDistanceForAngleLineCreateNode =
(xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr => (xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr =>
({ tag, forceValueUsedInTransform, inputs, rawArgs: args }) => { ({ tag, forceValueUsedInTransform, inputs, rawArgs: args }) => {
const literalArg = asNum(args?.[1].expr.value) const literalArg = asNum(args?.[1].expr.value)
if (err(literalArg)) return literalArg if (err(literalArg)) return literalArg
const valueUsedInTransform = roundOff(literalArg, 2) const valueUsedInTransform = roundOff(literalArg, 2)
const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform) const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform)
return createCallWrapper( return createCallWrapper(
xOrY === 'x' ? 'angledLineToX' : 'angledLineToY', xOrY === 'x' ? 'angledLineToX' : 'angledLineToY',
[inputs[0].expr, val], [inputs[0].expr, val],
tag, tag,
valueUsedInTransform valueUsedInTransform
) )
} }
const setHorVertDistanceForXYLines = const setHorVertDistanceForXYLines =
(xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr => (xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr =>
({ ({
referenceSegName, referenceSegName,
tag,
forceValueUsedInTransform,
rawArgs: args,
referencedSegment,
}) => {
const index = xOrY === 'x' ? 0 : 1
const refNum = referencedSegment?.to?.[index]
const literalArg = asNum(args?.[index].expr.value)
if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR
const valueUsedInTransform = roundOff(literalArg - refNum, 2)
const makeBinExp = createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, xOrY === 'x'),
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
])
return createCallWrapper(
xOrY === 'x' ? 'xLineTo' : 'yLineTo',
makeBinExp,
tag, tag,
forceValueUsedInTransform, valueUsedInTransform
rawArgs: args, )
referencedSegment, }
}) => {
const index = xOrY === 'x' ? 0 : 1
const refNum = referencedSegment?.to?.[index]
const literalArg = asNum(args?.[index].expr.value)
if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR
const valueUsedInTransform = roundOff(literalArg - refNum, 2)
const makeBinExp = createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, xOrY === 'x'),
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
])
return createCallWrapper(
xOrY === 'x' ? 'xLineTo' : 'yLineTo',
makeBinExp,
tag,
valueUsedInTransform
)
}
const setHorzVertDistanceConstraintLineCreateNode = const setHorzVertDistanceConstraintLineCreateNode =
(isX: boolean): CreateStdLibSketchCallExpr => (isX: boolean): CreateStdLibSketchCallExpr =>
({ referenceSegName, tag, inputs, rawArgs: args, referencedSegment }) => { ({ referenceSegName, tag, inputs, rawArgs: args, referencedSegment }) => {
let varVal = isX ? inputs[1].expr : inputs[0].expr let varVal = isX ? inputs[1].expr : inputs[0].expr
varVal = isExprBinaryPart(varVal) ? varVal : createLiteral(0) varVal = isExprBinaryPart(varVal) ? varVal : createLiteral(0)
const varValBinExp = createBinaryExpressionWithUnary([ const varValBinExp = createBinaryExpressionWithUnary([
createLastSeg(!isX), createLastSeg(!isX),
varVal, varVal,
]) ])
const makeBinExp = (index: 0 | 1) => { const makeBinExp = (index: 0 | 1) => {
const arg = asNum(args?.[index].expr.value) const arg = asNum(args?.[index].expr.value)
const refNum = referencedSegment?.to?.[index] const refNum = referencedSegment?.to?.[index]
if (err(arg) || isUndef(refNum)) return REF_NUM_ERR if (err(arg) || isUndef(refNum)) return REF_NUM_ERR
return createBinaryExpressionWithUnary([ return createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, isX), createSegEnd(referenceSegName, isX),
createLiteral(roundOff(arg - refNum, 2)), createLiteral(roundOff(arg - refNum, 2)),
]) ])
}
const binExpr = isX ? makeBinExp(0) : makeBinExp(1)
if (err(binExpr)) return new Error('Invalid value for distance')
return createCallWrapper(
'lineTo',
isX ? [binExpr, varValBinExp] : [varValBinExp, binExpr],
tag
)
} }
const binExpr = isX ? makeBinExp(0) : makeBinExp(1)
if (err(binExpr)) return new Error('Invalid value for distance')
return createCallWrapper(
'lineTo',
isX ? [binExpr, varValBinExp] : [varValBinExp, binExpr],
tag
)
}
const setAngledIntersectLineForLines: CreateStdLibSketchCallExpr = ({ const setAngledIntersectLineForLines: CreateStdLibSketchCallExpr = ({
referenceSegName, referenceSegName,
@ -693,48 +700,48 @@ const setAngledIntersectForAngledLines: CreateStdLibSketchCallExpr = ({
const setAngleBetweenCreateNode = const setAngleBetweenCreateNode =
(tranformToType: 'none' | 'xAbs' | 'yAbs'): CreateStdLibSketchCallExpr => (tranformToType: 'none' | 'xAbs' | 'yAbs'): CreateStdLibSketchCallExpr =>
({ ({
referenceSegName, referenceSegName,
tag, tag,
forceValueUsedInTransform, forceValueUsedInTransform,
inputs, inputs,
rawArgs: args, rawArgs: args,
referencedSegment, referencedSegment,
}) => { }) => {
const refAngle = referencedSegment const refAngle = referencedSegment
? getAngle(referencedSegment?.from, referencedSegment?.to) ? getAngle(referencedSegment?.from, referencedSegment?.to)
: 0 : 0
const val = asNum(args[0].expr.value) const val = asNum(args[0].expr.value)
if (err(val)) return val if (err(val)) return val
let valueUsedInTransform = roundOff(normaliseAngle(val - refAngle)) let valueUsedInTransform = roundOff(normaliseAngle(val - refAngle))
let firstHalfValue = createSegAngle(referenceSegName) let firstHalfValue = createSegAngle(referenceSegName)
if (Math.abs(valueUsedInTransform) > 90) { if (Math.abs(valueUsedInTransform) > 90) {
firstHalfValue = createBinaryExpression([ firstHalfValue = createBinaryExpression([
firstHalfValue,
'+',
createName(['turns'], 'HALF_TURN'),
])
valueUsedInTransform = normaliseAngle(valueUsedInTransform - 180)
}
const binExp = createBinaryExpressionWithUnary([
firstHalfValue, firstHalfValue,
forceValueUsedInTransform || createLiteral(valueUsedInTransform), '+',
createName(['turns'], 'HALF_TURN'),
]) ])
return createCallWrapper( valueUsedInTransform = normaliseAngle(valueUsedInTransform - 180)
tranformToType === 'none'
? 'angledLine'
: tranformToType === 'xAbs'
? 'angledLineToX'
: 'angledLineToY',
tranformToType === 'none'
? [binExp, args[1].expr]
: tranformToType === 'xAbs'
? [binExp, inputs[0].expr]
: [binExp, inputs[1].expr],
tag,
valueUsedInTransform
)
} }
const binExp = createBinaryExpressionWithUnary([
firstHalfValue,
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
])
return createCallWrapper(
tranformToType === 'none'
? 'angledLine'
: tranformToType === 'xAbs'
? 'angledLineToX'
: 'angledLineToY',
tranformToType === 'none'
? [binExp, args[1].expr]
: tranformToType === 'xAbs'
? [binExp, inputs[0].expr]
: [binExp, inputs[1].expr],
tag,
valueUsedInTransform
)
}
/** /**
IMO, the transformMap is a nested structure that maps like this: IMO, the transformMap is a nested structure that maps like this:
@ -1548,7 +1555,7 @@ export function removeSingleConstraint({
rawValue.type === 'arrayInObject' && rawValue.type === 'arrayInObject' &&
rawValue.key === currentArg.key && rawValue.key === currentArg.key &&
rawValue.index === rawValue.index ===
(currentArg.type === 'arrayInObject' ? currentArg.index : -1) (currentArg.type === 'arrayInObject' ? currentArg.index : -1)
) )
const rawLiteralObjProp = rawArgs.find( const rawLiteralObjProp = rawArgs.find(
(rawValue) => (rawValue) =>
@ -1654,10 +1661,10 @@ function getTransformMapPath(
constraintType: ConstraintType constraintType: ConstraintType
): ):
| { | {
toolTip: ToolTip toolTip: ToolTip
lineInputType: LineInputsType | 'free' lineInputType: LineInputsType | 'free'
constraintType: ConstraintType constraintType: ConstraintType
} }
| false { | false {
const name = sketchFnExp.callee.name.name as ToolTip const name = sketchFnExp.callee.name.name as ToolTip
if (!toolTips.includes(name)) { if (!toolTips.includes(name)) {
@ -1711,10 +1718,10 @@ function getTransformMapPathKw(
constraintType: ConstraintType constraintType: ConstraintType
): ):
| { | {
toolTip: ToolTip toolTip: ToolTip
lineInputType: LineInputsType | 'free' lineInputType: LineInputsType | 'free'
constraintType: ConstraintType constraintType: ConstraintType
} }
| false { | false {
const name = sketchFnExp.callee.name.name as ToolTip const name = sketchFnExp.callee.name.name as ToolTip
if (name === 'circleThreePoint') { if (name === 'circleThreePoint') {
@ -1916,14 +1923,14 @@ export function transformSecondarySketchLinesTagFirst({
forceValueUsedInTransform?: BinaryPart forceValueUsedInTransform?: BinaryPart
}): }):
| { | {
modifiedAst: Node<Program> modifiedAst: Node<Program>
valueUsedInTransform?: number valueUsedInTransform?: number
pathToNodeMap: PathToNodeMap pathToNodeMap: PathToNodeMap
tagInfo: { tagInfo: {
tag: string tag: string
isTagExisting: boolean isTagExisting: boolean
}
} }
}
| Error { | Error {
// let node = structuredClone(ast) // let node = structuredClone(ast)
@ -1995,10 +2002,10 @@ export function transformAstSketchLines({
forceValueUsedInTransform?: BinaryPart forceValueUsedInTransform?: BinaryPart
}): }):
| { | {
modifiedAst: Node<Program> modifiedAst: Node<Program>
valueUsedInTransform?: number valueUsedInTransform?: number
pathToNodeMap: PathToNodeMap pathToNodeMap: PathToNodeMap
} }
| Error { | Error {
// deep clone since we are mutating in a loop, of which any could fail // deep clone since we are mutating in a loop, of which any could fail
let node = structuredClone(ast) let node = structuredClone(ast)
@ -2143,25 +2150,25 @@ export function transformAstSketchLines({
segmentInput: segmentInput:
seg.type === 'Circle' seg.type === 'Circle'
? { ? {
type: 'arc-segment', type: 'arc-segment',
center: seg.center, center: seg.center,
radius: seg.radius, radius: seg.radius,
from, from,
to: from, // For a full circle, to is the same as from to: from, // For a full circle, to is the same as from
ccw: true, // Default to counter-clockwise for circles ccw: true, // Default to counter-clockwise for circles
} }
: seg.type === 'CircleThreePoint' || seg.type === 'ArcThreePoint' : seg.type === 'CircleThreePoint' || seg.type === 'ArcThreePoint'
? { ? {
type: 'circle-three-point-segment', type: 'circle-three-point-segment',
p1: seg.p1, p1: seg.p1,
p2: seg.p2, p2: seg.p2,
p3: seg.p3, p3: seg.p3,
} }
: { : {
type: 'straight-segment', type: 'straight-segment',
to, to,
from, from,
}, },
replaceExistingCallback: (rawArgs) => replaceExistingCallback: (rawArgs) =>
callBack({ callBack({