WIP
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -2,7 +2,7 @@ mod cache;
 | 
			
		||||
 | 
			
		||||
use kcl_lib::{
 | 
			
		||||
    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.
 | 
			
		||||
@ -26,7 +26,7 @@ pub(crate) fn assert_out(test_name: &str, result: &image::DynamicImage) -> Strin
 | 
			
		||||
async fn kcl_test_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 = err.as_kcl_error().unwrap();
 | 
			
		||||
@ -48,7 +48,7 @@ async fn kcl_test_execute_engine_error_return() {
 | 
			
		||||
  |> 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_eq!(
 | 
			
		||||
        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.
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,7 @@ async fn kcl_test_execute_i_shape() {
 | 
			
		||||
async fn kcl_test_execute_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,7 @@ async fn kcl_test_execute_pipes_on_pipes() {
 | 
			
		||||
async fn kcl_test_execute_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,7 @@ async fn kcl_test_execute_cylinder() {
 | 
			
		||||
async fn kcl_test_execute_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -94,7 +94,7 @@ async fn kcl_test_execute_kittycad_svg() {
 | 
			
		||||
async fn kcl_test_execute_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -102,7 +102,7 @@ async fn kcl_test_execute_lsystem() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -110,7 +110,7 @@ async fn kcl_test_member_expression_sketch() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -118,7 +118,7 @@ async fn kcl_test_helix_defaults() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -126,7 +126,7 @@ async fn kcl_test_helix_defaults_negative_extrude() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -134,7 +134,7 @@ async fn kcl_test_helix_with_length() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -142,7 +142,7 @@ async fn kcl_test_dimensions_match() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -150,7 +150,7 @@ async fn kcl_test_close_arc() {
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -164,7 +164,7 @@ async fn kcl_test_basic_tangential_arc_with_point() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -178,7 +178,7 @@ async fn kcl_test_basic_tangential_arc_to() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -205,7 +205,7 @@ box(30, 43, 18, '-xy')
 | 
			
		||||
let thing = box(-12, -15, 10, 'yz')
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -263,7 +263,7 @@ part004 = startSketchOn('YZ')
 | 
			
		||||
  |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -280,7 +280,7 @@ async fn kcl_test_holes() {
 | 
			
		||||
  |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -299,7 +299,7 @@ async fn optional_params() {
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -335,7 +335,7 @@ part = roundedRectangle([0, 0], 20, 20, 4)
 | 
			
		||||
  |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -343,7 +343,7 @@ part = roundedRectangle([0, 0], 20, 20, 4)
 | 
			
		||||
async fn kcl_test_top_level_expression() {
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -357,7 +357,7 @@ part =  startSketchOn('XY')
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -369,7 +369,7 @@ async fn kcl_test_patterns_linear_basic() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -385,7 +385,7 @@ async fn kcl_test_patterns_linear_basic_3d() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -397,7 +397,7 @@ async fn kcl_test_patterns_linear_basic_negative_distance() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -409,7 +409,7 @@ async fn kcl_test_patterns_linear_basic_negative_axis() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -442,7 +442,7 @@ async fn kcl_test_patterns_circular_basic_2d() {
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -483,7 +483,7 @@ async fn kcl_test_import_file_doesnt_exist() {
 | 
			
		||||
    let code = r#"import 'thing.obj'
 | 
			
		||||
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_eq!(
 | 
			
		||||
        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'
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -506,7 +506,7 @@ async fn kcl_test_import_obj_with_mtl_units() {
 | 
			
		||||
import 'e2e/executor/inputs/cube.obj'
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -524,7 +524,7 @@ async fn kcl_test_import_gltf_with_bin() {
 | 
			
		||||
    let code = r#"import 'e2e/executor/inputs/cube.gltf'
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -533,7 +533,7 @@ async fn kcl_test_import_gltf_embedded() {
 | 
			
		||||
    let code = r#"import 'e2e/executor/inputs/cube-embedded.gltf' as 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -542,7 +542,7 @@ async fn kcl_test_import_glb() {
 | 
			
		||||
    let code = r#"import 'e2e/executor/inputs/cube.glb'
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -551,7 +551,7 @@ async fn kcl_test_import_glb_no_assign() {
 | 
			
		||||
    let code = r#"import 'e2e/executor/inputs/cube.glb'
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -561,7 +561,7 @@ async fn kcl_test_import_ext_doesnt_match() {
 | 
			
		||||
import 'e2e/executor/inputs/cube.gltf'
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -572,7 +572,7 @@ model = cube"#;
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_cube_mm() {
 | 
			
		||||
    let code = r#"fn cube = (pos, scale) => {
 | 
			
		||||
  sg = startSketchOn('XY')
 | 
			
		||||
  sg = startSketchOn(XY)
 | 
			
		||||
    |> startProfileAt(pos, %)
 | 
			
		||||
    |> line(end = [0, scale])
 | 
			
		||||
    |> line(end = [scale, 0])
 | 
			
		||||
@ -586,13 +586,14 @@ async fn kcl_test_cube_mm() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
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')
 | 
			
		||||
    |> startProfileAt(pos, %)
 | 
			
		||||
    |> line(end = [0, scale])
 | 
			
		||||
@ -607,13 +608,14 @@ async fn kcl_test_cube_cm() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
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')
 | 
			
		||||
    |> startProfileAt(pos, %)
 | 
			
		||||
    |> line(end = [0, scale])
 | 
			
		||||
@ -628,13 +630,14 @@ async fn kcl_test_cube_m() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
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')
 | 
			
		||||
    |> startProfileAt(pos, %)
 | 
			
		||||
    |> line(end = [0, scale])
 | 
			
		||||
@ -649,13 +652,14 @@ async fn kcl_test_cube_in() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
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')
 | 
			
		||||
    |> startProfileAt(pos, %)
 | 
			
		||||
    |> line(end = [0, scale])
 | 
			
		||||
@ -670,13 +674,14 @@ async fn kcl_test_cube_ft() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
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')
 | 
			
		||||
    |> startProfileAt(pos, %)
 | 
			
		||||
    |> line(end = [0, scale])
 | 
			
		||||
@ -691,7 +696,7 @@ async fn kcl_test_cube_yd() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -719,7 +724,7 @@ part002 = startSketchOn(part001, part001.sketch.tags.here)
 | 
			
		||||
  |> 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 ExecError::Kcl(err) = err else {
 | 
			
		||||
@ -763,7 +768,7 @@ part003 = startSketchOn(part002, "end")
 | 
			
		||||
  |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -780,7 +785,7 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() {
 | 
			
		||||
  |> 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 ExecError::Kcl(err) = err else {
 | 
			
		||||
        panic!("Expected KCL error, found {err}");
 | 
			
		||||
@ -811,7 +816,7 @@ part002 = startSketchOn(part001, "end")
 | 
			
		||||
  |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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 ExecError::Kcl(err) = err else {
 | 
			
		||||
        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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
@ -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
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
    //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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1177,7 +1182,7 @@ part002 = startSketchOn(part001, 'end')
 | 
			
		||||
    |> 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1251,7 +1256,7 @@ plumbus1 = circle1
 | 
			
		||||
async fn kcl_test_empty_file_is_ok() {
 | 
			
		||||
    let code = r#""#;
 | 
			
		||||
 | 
			
		||||
    let result = execute_and_snapshot(code, UnitLength::Mm, None).await;
 | 
			
		||||
    let result = execute_and_snapshot(code, None).await;
 | 
			
		||||
    result.unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1281,7 +1286,7 @@ async fn kcl_test_member_expression_in_params() {
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1346,7 +1351,7 @@ secondSketch = startSketchOn(part001, '')
 | 
			
		||||
  |> 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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1377,7 +1382,7 @@ extrusion = startSketchOn('XY')
 | 
			
		||||
  |> 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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1410,7 +1415,7 @@ sketch001 = [profile001, profile002]
 | 
			
		||||
 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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 ExecError::Kcl(err) = err else {
 | 
			
		||||
        panic!("Expected KCL error, found {err}");
 | 
			
		||||
@ -1706,7 +1711,7 @@ async fn kcl_test_duplicate_tags_should_error() {
 | 
			
		||||
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 = err.as_kcl_error().unwrap();
 | 
			
		||||
    assert_eq!(err.message(), "Cannot redefine `a`");
 | 
			
		||||
@ -1715,49 +1720,49 @@ let p = triangle(200)
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1799,7 +1804,7 @@ async fn kcl_test_angled_line_to_x_90() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1819,7 +1824,7 @@ async fn kcl_test_angled_line_to_x_270() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1839,7 +1844,7 @@ async fn kcl_test_angled_line_to_y_0() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1859,7 +1864,7 @@ async fn kcl_test_angled_line_to_y_180() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1879,7 +1884,7 @@ async fn kcl_test_angled_line_of_x_length_90() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1899,7 +1904,7 @@ async fn kcl_test_angled_line_of_x_length_270() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1921,7 +1926,7 @@ async fn kcl_test_angled_line_of_y_length_0() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        result.err().unwrap().to_string(),
 | 
			
		||||
@ -1943,7 +1948,7 @@ async fn kcl_test_angled_line_of_y_length_180() {
 | 
			
		||||
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_eq!(
 | 
			
		||||
        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)
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    let result = execute_and_snapshot(code, UnitLength::Mm, None).await;
 | 
			
		||||
    let result = execute_and_snapshot(code, None).await;
 | 
			
		||||
    assert!(result.is_err());
 | 
			
		||||
    assert_eq!(
 | 
			
		||||
        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')
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    let result = execute_and_snapshot(code, UnitLength::Mm, None).await;
 | 
			
		||||
    let result = execute_and_snapshot(code, None).await;
 | 
			
		||||
    assert!(result.is_err());
 | 
			
		||||
    assert_eq!(
 | 
			
		||||
        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')
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    let result = execute_and_snapshot(code, UnitLength::Mm, None).await;
 | 
			
		||||
    let result = execute_and_snapshot(code, None).await;
 | 
			
		||||
    assert!(result.is_err());
 | 
			
		||||
    assert_eq!(
 | 
			
		||||
        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
 | 
			
		||||
        .err()
 | 
			
		||||
@ -2053,9 +2058,7 @@ sketch000 = startSketchOn('XY')
 | 
			
		||||
    |> line(end = [0, innerDiameter / 2])
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default())
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let ctx = kcl_lib::ExecutorContext::new_with_default_client().await.unwrap();
 | 
			
		||||
    let mut exec_state = kcl_lib::ExecState::new(&ctx);
 | 
			
		||||
    let program = kcl_lib::Program::parse_no_errs(code).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.
 | 
			
		||||
    std::env::set_current_dir(path.parent().unwrap()).unwrap();
 | 
			
		||||
 | 
			
		||||
    let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default())
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let ctx = kcl_lib::ExecutorContext::new_with_default_client().await.unwrap();
 | 
			
		||||
    let mut exec_state = kcl_lib::ExecState::new(&ctx);
 | 
			
		||||
    let program = kcl_lib::Program::parse_no_errs(&code).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)
 | 
			
		||||
  |> 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() {
 | 
			
		||||
        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.
 | 
			
		||||
    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 {
 | 
			
		||||
        expectorate::assert_contents(
 | 
			
		||||
            format!("e2e/executor/outputs/helix_defaults_negative_extrude_{}", file.name),
 | 
			
		||||
 | 
			
		||||
@ -5,11 +5,16 @@ import type { Node } from '@rust/kcl-lib/bindings/Node'
 | 
			
		||||
import type { TagDeclarator } from '@rust/kcl-lib/bindings/TagDeclarator'
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  ARG_ANGLE,
 | 
			
		||||
  ARG_CIRCLE_CENTER,
 | 
			
		||||
  ARG_CIRCLE_RADIUS,
 | 
			
		||||
  ARG_END,
 | 
			
		||||
  ARG_END_ABSOLUTE,
 | 
			
		||||
  ARG_END_ABSOLUTE_X,
 | 
			
		||||
  ARG_END_ABSOLUTE_Y,
 | 
			
		||||
  ARG_LENGTH,
 | 
			
		||||
  ARG_LENGTH_X,
 | 
			
		||||
  ARG_LENGTH_Y,
 | 
			
		||||
  ARG_TAG,
 | 
			
		||||
  DETERMINING_ARGS,
 | 
			
		||||
} from '@src/lang/constants'
 | 
			
		||||
@ -79,7 +84,13 @@ import type {
 | 
			
		||||
} from '@src/lang/wasm'
 | 
			
		||||
import { sketchFromKclValue } from '@src/lang/wasm'
 | 
			
		||||
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'
 | 
			
		||||
 | 
			
		||||
const STRAIGHT_SEGMENT_ERR = new Error(
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,11 @@
 | 
			
		||||
import { ARG_END, ARG_END_ABSOLUTE } from '@src/lang/constants'
 | 
			
		||||
import type { ToolTip } from '@src/lang/langHelpers'
 | 
			
		||||
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 {
 | 
			
		||||
  ConstraintLevel,
 | 
			
		||||
  ConstraintType,
 | 
			
		||||
@ -13,7 +17,7 @@ import {
 | 
			
		||||
  transformAstSketchLines,
 | 
			
		||||
  transformSecondarySketchLinesTagFirst,
 | 
			
		||||
} 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 { assertParse, initPromise, recast } from '@src/lang/wasm'
 | 
			
		||||
import type { Selection, Selections } from '@src/lib/selections'
 | 
			
		||||
@ -93,7 +97,7 @@ function getConstraintTypeFromSourceHelper(
 | 
			
		||||
        )
 | 
			
		||||
      }
 | 
			
		||||
      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)
 | 
			
		||||
    }
 | 
			
		||||
    case 'CallExpressionKw': {
 | 
			
		||||
@ -104,7 +108,7 @@ function getConstraintTypeFromSourceHelper(
 | 
			
		||||
        return new Error("couldn't find either end or endAbsolute in KW call")
 | 
			
		||||
      }
 | 
			
		||||
      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)) {
 | 
			
		||||
        return fnName
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -1,16 +1,16 @@
 | 
			
		||||
import type { Node } from '@rust/kcl-lib/bindings/Node'
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  ARG_ANGLE,
 | 
			
		||||
  ARG_END,
 | 
			
		||||
  ARG_END_ABSOLUTE,
 | 
			
		||||
  ARG_LENGTH,
 | 
			
		||||
  ARG_TAG,
 | 
			
		||||
  ARG_ANGLE,
 | 
			
		||||
  DETERMINING_ARGS,
 | 
			
		||||
  ARG_END_ABSOLUTE_X,
 | 
			
		||||
  ARG_END_ABSOLUTE_Y,
 | 
			
		||||
  ARG_LENGTH,
 | 
			
		||||
  ARG_LENGTH_X,
 | 
			
		||||
  ARG_LENGTH_Y,
 | 
			
		||||
  ARG_TAG,
 | 
			
		||||
  DETERMINING_ARGS,
 | 
			
		||||
} from '@src/lang/constants'
 | 
			
		||||
import {
 | 
			
		||||
  createArrayExpression,
 | 
			
		||||
@ -34,6 +34,7 @@ import { getNodePathFromSourceRange } from '@src/lang/queryAstNodePathUtils'
 | 
			
		||||
import {
 | 
			
		||||
  createFirstArg,
 | 
			
		||||
  fnNameToTooltip,
 | 
			
		||||
  getAngledLine,
 | 
			
		||||
  getArgForEnd,
 | 
			
		||||
  getCircle,
 | 
			
		||||
  getConstraintInfo,
 | 
			
		||||
@ -73,7 +74,13 @@ import type {
 | 
			
		||||
import { sketchFromKclValue } from '@src/lang/wasm'
 | 
			
		||||
import type { Selections } from '@src/lib/selections'
 | 
			
		||||
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 =
 | 
			
		||||
  | 'xAbsolute'
 | 
			
		||||
@ -363,17 +370,17 @@ type TransformMap = {
 | 
			
		||||
 | 
			
		||||
const xyLineSetLength =
 | 
			
		||||
  (xOrY: 'xLine' | 'yLine', referenceSeg = false): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({ referenceSegName, tag, forceValueUsedInTransform, rawArgs: args }) => {
 | 
			
		||||
      const segRef = createSegLen(referenceSegName)
 | 
			
		||||
      const lineVal = forceValueUsedInTransform
 | 
			
		||||
        ? forceValueUsedInTransform
 | 
			
		||||
        : referenceSeg
 | 
			
		||||
          ? segRef
 | 
			
		||||
          : args[0].expr
 | 
			
		||||
      const literalArg = asNum(args[0].expr.value)
 | 
			
		||||
      if (err(literalArg)) return literalArg
 | 
			
		||||
      return createCallWrapper(xOrY, lineVal, tag, literalArg)
 | 
			
		||||
    }
 | 
			
		||||
  ({ referenceSegName, tag, forceValueUsedInTransform, rawArgs: args }) => {
 | 
			
		||||
    const segRef = createSegLen(referenceSegName)
 | 
			
		||||
    const lineVal = forceValueUsedInTransform
 | 
			
		||||
      ? forceValueUsedInTransform
 | 
			
		||||
      : referenceSeg
 | 
			
		||||
        ? segRef
 | 
			
		||||
        : args[0].expr
 | 
			
		||||
    const literalArg = asNum(args[0].expr.value)
 | 
			
		||||
    if (err(literalArg)) return literalArg
 | 
			
		||||
    return createCallWrapper(xOrY, lineVal, tag, literalArg)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
type AngLenNone = 'ang' | 'len' | 'none'
 | 
			
		||||
const basicAngledLineCreateNode =
 | 
			
		||||
@ -382,49 +389,49 @@ const basicAngledLineCreateNode =
 | 
			
		||||
    valToForce: AngLenNone = 'none',
 | 
			
		||||
    varValToUse: AngLenNone = 'none'
 | 
			
		||||
  ): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({
 | 
			
		||||
      referenceSegName,
 | 
			
		||||
      tag,
 | 
			
		||||
      forceValueUsedInTransform,
 | 
			
		||||
      inputs,
 | 
			
		||||
      rawArgs: args,
 | 
			
		||||
      referencedSegment: path,
 | 
			
		||||
    }) => {
 | 
			
		||||
      const refAng = path ? getAngle(path?.from, path?.to) : 0
 | 
			
		||||
      const argValue = asNum(args[0].expr.value)
 | 
			
		||||
      if (err(argValue)) return argValue
 | 
			
		||||
      const nonForcedAng =
 | 
			
		||||
        varValToUse === 'ang'
 | 
			
		||||
          ? inputs[0].expr
 | 
			
		||||
          : referenceSeg === 'ang'
 | 
			
		||||
            ? getClosesAngleDirection(
 | 
			
		||||
  ({
 | 
			
		||||
    referenceSegName,
 | 
			
		||||
    tag,
 | 
			
		||||
    forceValueUsedInTransform,
 | 
			
		||||
    inputs,
 | 
			
		||||
    rawArgs: args,
 | 
			
		||||
    referencedSegment: path,
 | 
			
		||||
  }) => {
 | 
			
		||||
    const refAng = path ? getAngle(path?.from, path?.to) : 0
 | 
			
		||||
    const argValue = asNum(args[0].expr.value)
 | 
			
		||||
    if (err(argValue)) return argValue
 | 
			
		||||
    const nonForcedAng =
 | 
			
		||||
      varValToUse === 'ang'
 | 
			
		||||
        ? inputs[0].expr
 | 
			
		||||
        : referenceSeg === 'ang'
 | 
			
		||||
          ? getClosesAngleDirection(
 | 
			
		||||
              argValue,
 | 
			
		||||
              refAng,
 | 
			
		||||
              createSegAngle(referenceSegName)
 | 
			
		||||
            )
 | 
			
		||||
            : args[0].expr
 | 
			
		||||
      const nonForcedLen =
 | 
			
		||||
        varValToUse === 'len'
 | 
			
		||||
          ? inputs[1].expr
 | 
			
		||||
          : referenceSeg === 'len'
 | 
			
		||||
            ? createSegLen(referenceSegName)
 | 
			
		||||
            : args[1].expr
 | 
			
		||||
      const shouldForceAng = valToForce === 'ang' && forceValueUsedInTransform
 | 
			
		||||
      const shouldForceLen = valToForce === 'len' && forceValueUsedInTransform
 | 
			
		||||
      const literalArg = asNum(
 | 
			
		||||
        valToForce === 'ang' ? args[0].expr.value : args[1].expr.value
 | 
			
		||||
      )
 | 
			
		||||
      if (err(literalArg)) return literalArg
 | 
			
		||||
      return createCallWrapper(
 | 
			
		||||
        'angledLine',
 | 
			
		||||
        [
 | 
			
		||||
          shouldForceAng ? forceValueUsedInTransform : nonForcedAng,
 | 
			
		||||
          shouldForceLen ? forceValueUsedInTransform : nonForcedLen,
 | 
			
		||||
        ],
 | 
			
		||||
        tag,
 | 
			
		||||
        literalArg
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
          : args[0].expr
 | 
			
		||||
    const nonForcedLen =
 | 
			
		||||
      varValToUse === 'len'
 | 
			
		||||
        ? inputs[1].expr
 | 
			
		||||
        : referenceSeg === 'len'
 | 
			
		||||
          ? createSegLen(referenceSegName)
 | 
			
		||||
          : args[1].expr
 | 
			
		||||
    const shouldForceAng = valToForce === 'ang' && forceValueUsedInTransform
 | 
			
		||||
    const shouldForceLen = valToForce === 'len' && forceValueUsedInTransform
 | 
			
		||||
    const literalArg = asNum(
 | 
			
		||||
      valToForce === 'ang' ? args[0].expr.value : args[1].expr.value
 | 
			
		||||
    )
 | 
			
		||||
    if (err(literalArg)) return literalArg
 | 
			
		||||
    return createCallWrapper(
 | 
			
		||||
      'angledLine',
 | 
			
		||||
      [
 | 
			
		||||
        shouldForceAng ? forceValueUsedInTransform : nonForcedAng,
 | 
			
		||||
        shouldForceLen ? forceValueUsedInTransform : nonForcedLen,
 | 
			
		||||
      ],
 | 
			
		||||
      tag,
 | 
			
		||||
      literalArg
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
const angledLineAngleCreateNode: CreateStdLibSketchCallExpr = ({
 | 
			
		||||
  referenceSegName,
 | 
			
		||||
  inputs,
 | 
			
		||||
@ -495,57 +502,57 @@ function getClosesAngleDirection(
 | 
			
		||||
 | 
			
		||||
const setHorzVertDistanceCreateNode =
 | 
			
		||||
  (xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({
 | 
			
		||||
      referenceSegName,
 | 
			
		||||
      tag,
 | 
			
		||||
      forceValueUsedInTransform,
 | 
			
		||||
      rawArgs: args,
 | 
			
		||||
      referencedSegment,
 | 
			
		||||
    }) => {
 | 
			
		||||
      const refNum = referencedSegment?.to?.[index]
 | 
			
		||||
      const literalArg = asNum(args?.[index].expr.value)
 | 
			
		||||
      if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR
 | 
			
		||||
  ({
 | 
			
		||||
    referenceSegName,
 | 
			
		||||
    tag,
 | 
			
		||||
    forceValueUsedInTransform,
 | 
			
		||||
    rawArgs: args,
 | 
			
		||||
    referencedSegment,
 | 
			
		||||
  }) => {
 | 
			
		||||
    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)
 | 
			
		||||
      let finalValue: Node<Expr> = createBinaryExpressionWithUnary([
 | 
			
		||||
        createSegEnd(referenceSegName, !index),
 | 
			
		||||
        forceValueUsedInTransform || createLiteral(valueUsedInTransform),
 | 
			
		||||
      ])
 | 
			
		||||
      if (isValueZero(forceValueUsedInTransform)) {
 | 
			
		||||
        finalValue = createSegEnd(referenceSegName, !index)
 | 
			
		||||
      }
 | 
			
		||||
      return createCallWrapper(
 | 
			
		||||
        'lineTo',
 | 
			
		||||
        !index ? [finalValue, args[1].expr] : [args[0].expr, finalValue],
 | 
			
		||||
        tag,
 | 
			
		||||
        valueUsedInTransform
 | 
			
		||||
      )
 | 
			
		||||
    const valueUsedInTransform = roundOff(literalArg - refNum, 2)
 | 
			
		||||
    let finalValue: Node<Expr> = createBinaryExpressionWithUnary([
 | 
			
		||||
      createSegEnd(referenceSegName, !index),
 | 
			
		||||
      forceValueUsedInTransform || createLiteral(valueUsedInTransform),
 | 
			
		||||
    ])
 | 
			
		||||
    if (isValueZero(forceValueUsedInTransform)) {
 | 
			
		||||
      finalValue = createSegEnd(referenceSegName, !index)
 | 
			
		||||
    }
 | 
			
		||||
    return createCallWrapper(
 | 
			
		||||
      'lineTo',
 | 
			
		||||
      !index ? [finalValue, args[1].expr] : [args[0].expr, finalValue],
 | 
			
		||||
      tag,
 | 
			
		||||
      valueUsedInTransform
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
const setHorzVertDistanceForAngleLineCreateNode =
 | 
			
		||||
  (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,
 | 
			
		||||
      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,
 | 
			
		||||
        valueUsedInTransform
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
      valueUsedInTransform
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
const setAbsDistanceCreateNode =
 | 
			
		||||
  (
 | 
			
		||||
@ -553,94 +560,94 @@ const setAbsDistanceCreateNode =
 | 
			
		||||
    isXOrYLine = false,
 | 
			
		||||
    index = xOrY === 'x' ? 0 : 1
 | 
			
		||||
  ): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({ tag, forceValueUsedInTransform, rawArgs: args }) => {
 | 
			
		||||
      const literalArg = asNum(args?.[index].expr.value)
 | 
			
		||||
      if (err(literalArg)) return literalArg
 | 
			
		||||
      const valueUsedInTransform = roundOff(literalArg, 2)
 | 
			
		||||
      const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform)
 | 
			
		||||
      if (isXOrYLine) {
 | 
			
		||||
        return createCallWrapper(
 | 
			
		||||
          xOrY === 'x' ? 'xLineTo' : 'yLineTo',
 | 
			
		||||
          val,
 | 
			
		||||
          tag,
 | 
			
		||||
          valueUsedInTransform
 | 
			
		||||
        )
 | 
			
		||||
      }
 | 
			
		||||
  ({ tag, forceValueUsedInTransform, rawArgs: args }) => {
 | 
			
		||||
    const literalArg = asNum(args?.[index].expr.value)
 | 
			
		||||
    if (err(literalArg)) return literalArg
 | 
			
		||||
    const valueUsedInTransform = roundOff(literalArg, 2)
 | 
			
		||||
    const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform)
 | 
			
		||||
    if (isXOrYLine) {
 | 
			
		||||
      return createCallWrapper(
 | 
			
		||||
        'lineTo',
 | 
			
		||||
        !index ? [val, args[1].expr] : [args[0].expr, val],
 | 
			
		||||
        xOrY === 'x' ? 'xLineTo' : 'yLineTo',
 | 
			
		||||
        val,
 | 
			
		||||
        tag,
 | 
			
		||||
        valueUsedInTransform
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
    return createCallWrapper(
 | 
			
		||||
      'lineTo',
 | 
			
		||||
      !index ? [val, args[1].expr] : [args[0].expr, val],
 | 
			
		||||
      tag,
 | 
			
		||||
      valueUsedInTransform
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
const setAbsDistanceForAngleLineCreateNode =
 | 
			
		||||
  (xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({ tag, forceValueUsedInTransform, inputs, rawArgs: args }) => {
 | 
			
		||||
      const literalArg = asNum(args?.[1].expr.value)
 | 
			
		||||
      if (err(literalArg)) return literalArg
 | 
			
		||||
      const valueUsedInTransform = roundOff(literalArg, 2)
 | 
			
		||||
      const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform)
 | 
			
		||||
      return createCallWrapper(
 | 
			
		||||
        xOrY === 'x' ? 'angledLineToX' : 'angledLineToY',
 | 
			
		||||
        [inputs[0].expr, val],
 | 
			
		||||
        tag,
 | 
			
		||||
        valueUsedInTransform
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  ({ tag, forceValueUsedInTransform, inputs, rawArgs: args }) => {
 | 
			
		||||
    const literalArg = asNum(args?.[1].expr.value)
 | 
			
		||||
    if (err(literalArg)) return literalArg
 | 
			
		||||
    const valueUsedInTransform = roundOff(literalArg, 2)
 | 
			
		||||
    const val = forceValueUsedInTransform || createLiteral(valueUsedInTransform)
 | 
			
		||||
    return createCallWrapper(
 | 
			
		||||
      xOrY === 'x' ? 'angledLineToX' : 'angledLineToY',
 | 
			
		||||
      [inputs[0].expr, val],
 | 
			
		||||
      tag,
 | 
			
		||||
      valueUsedInTransform
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
const setHorVertDistanceForXYLines =
 | 
			
		||||
  (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,
 | 
			
		||||
      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,
 | 
			
		||||
        valueUsedInTransform
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
      valueUsedInTransform
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
const setHorzVertDistanceConstraintLineCreateNode =
 | 
			
		||||
  (isX: boolean): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({ referenceSegName, tag, inputs, rawArgs: args, referencedSegment }) => {
 | 
			
		||||
      let varVal = isX ? inputs[1].expr : inputs[0].expr
 | 
			
		||||
      varVal = isExprBinaryPart(varVal) ? varVal : createLiteral(0)
 | 
			
		||||
      const varValBinExp = createBinaryExpressionWithUnary([
 | 
			
		||||
        createLastSeg(!isX),
 | 
			
		||||
        varVal,
 | 
			
		||||
      ])
 | 
			
		||||
  ({ referenceSegName, tag, inputs, rawArgs: args, referencedSegment }) => {
 | 
			
		||||
    let varVal = isX ? inputs[1].expr : inputs[0].expr
 | 
			
		||||
    varVal = isExprBinaryPart(varVal) ? varVal : createLiteral(0)
 | 
			
		||||
    const varValBinExp = createBinaryExpressionWithUnary([
 | 
			
		||||
      createLastSeg(!isX),
 | 
			
		||||
      varVal,
 | 
			
		||||
    ])
 | 
			
		||||
 | 
			
		||||
      const makeBinExp = (index: 0 | 1) => {
 | 
			
		||||
        const arg = asNum(args?.[index].expr.value)
 | 
			
		||||
        const refNum = referencedSegment?.to?.[index]
 | 
			
		||||
        if (err(arg) || isUndef(refNum)) return REF_NUM_ERR
 | 
			
		||||
        return createBinaryExpressionWithUnary([
 | 
			
		||||
          createSegEnd(referenceSegName, isX),
 | 
			
		||||
          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 makeBinExp = (index: 0 | 1) => {
 | 
			
		||||
      const arg = asNum(args?.[index].expr.value)
 | 
			
		||||
      const refNum = referencedSegment?.to?.[index]
 | 
			
		||||
      if (err(arg) || isUndef(refNum)) return REF_NUM_ERR
 | 
			
		||||
      return createBinaryExpressionWithUnary([
 | 
			
		||||
        createSegEnd(referenceSegName, isX),
 | 
			
		||||
        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 setAngledIntersectLineForLines: CreateStdLibSketchCallExpr = ({
 | 
			
		||||
  referenceSegName,
 | 
			
		||||
@ -693,48 +700,48 @@ const setAngledIntersectForAngledLines: CreateStdLibSketchCallExpr = ({
 | 
			
		||||
 | 
			
		||||
const setAngleBetweenCreateNode =
 | 
			
		||||
  (tranformToType: 'none' | 'xAbs' | 'yAbs'): CreateStdLibSketchCallExpr =>
 | 
			
		||||
    ({
 | 
			
		||||
      referenceSegName,
 | 
			
		||||
      tag,
 | 
			
		||||
      forceValueUsedInTransform,
 | 
			
		||||
      inputs,
 | 
			
		||||
      rawArgs: args,
 | 
			
		||||
      referencedSegment,
 | 
			
		||||
    }) => {
 | 
			
		||||
      const refAngle = referencedSegment
 | 
			
		||||
        ? getAngle(referencedSegment?.from, referencedSegment?.to)
 | 
			
		||||
        : 0
 | 
			
		||||
      const val = asNum(args[0].expr.value)
 | 
			
		||||
      if (err(val)) return val
 | 
			
		||||
      let valueUsedInTransform = roundOff(normaliseAngle(val - refAngle))
 | 
			
		||||
      let firstHalfValue = createSegAngle(referenceSegName)
 | 
			
		||||
      if (Math.abs(valueUsedInTransform) > 90) {
 | 
			
		||||
        firstHalfValue = createBinaryExpression([
 | 
			
		||||
          firstHalfValue,
 | 
			
		||||
          '+',
 | 
			
		||||
          createName(['turns'], 'HALF_TURN'),
 | 
			
		||||
        ])
 | 
			
		||||
        valueUsedInTransform = normaliseAngle(valueUsedInTransform - 180)
 | 
			
		||||
      }
 | 
			
		||||
      const binExp = createBinaryExpressionWithUnary([
 | 
			
		||||
  ({
 | 
			
		||||
    referenceSegName,
 | 
			
		||||
    tag,
 | 
			
		||||
    forceValueUsedInTransform,
 | 
			
		||||
    inputs,
 | 
			
		||||
    rawArgs: args,
 | 
			
		||||
    referencedSegment,
 | 
			
		||||
  }) => {
 | 
			
		||||
    const refAngle = referencedSegment
 | 
			
		||||
      ? getAngle(referencedSegment?.from, referencedSegment?.to)
 | 
			
		||||
      : 0
 | 
			
		||||
    const val = asNum(args[0].expr.value)
 | 
			
		||||
    if (err(val)) return val
 | 
			
		||||
    let valueUsedInTransform = roundOff(normaliseAngle(val - refAngle))
 | 
			
		||||
    let firstHalfValue = createSegAngle(referenceSegName)
 | 
			
		||||
    if (Math.abs(valueUsedInTransform) > 90) {
 | 
			
		||||
      firstHalfValue = createBinaryExpression([
 | 
			
		||||
        firstHalfValue,
 | 
			
		||||
        forceValueUsedInTransform || createLiteral(valueUsedInTransform),
 | 
			
		||||
        '+',
 | 
			
		||||
        createName(['turns'], 'HALF_TURN'),
 | 
			
		||||
      ])
 | 
			
		||||
      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
 | 
			
		||||
      )
 | 
			
		||||
      valueUsedInTransform = normaliseAngle(valueUsedInTransform - 180)
 | 
			
		||||
    }
 | 
			
		||||
    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:
 | 
			
		||||
@ -1548,7 +1555,7 @@ export function removeSingleConstraint({
 | 
			
		||||
              rawValue.type === 'arrayInObject' &&
 | 
			
		||||
              rawValue.key === currentArg.key &&
 | 
			
		||||
              rawValue.index ===
 | 
			
		||||
              (currentArg.type === 'arrayInObject' ? currentArg.index : -1)
 | 
			
		||||
                (currentArg.type === 'arrayInObject' ? currentArg.index : -1)
 | 
			
		||||
          )
 | 
			
		||||
          const rawLiteralObjProp = rawArgs.find(
 | 
			
		||||
            (rawValue) =>
 | 
			
		||||
@ -1654,10 +1661,10 @@ function getTransformMapPath(
 | 
			
		||||
  constraintType: ConstraintType
 | 
			
		||||
):
 | 
			
		||||
  | {
 | 
			
		||||
    toolTip: ToolTip
 | 
			
		||||
    lineInputType: LineInputsType | 'free'
 | 
			
		||||
    constraintType: ConstraintType
 | 
			
		||||
  }
 | 
			
		||||
      toolTip: ToolTip
 | 
			
		||||
      lineInputType: LineInputsType | 'free'
 | 
			
		||||
      constraintType: ConstraintType
 | 
			
		||||
    }
 | 
			
		||||
  | false {
 | 
			
		||||
  const name = sketchFnExp.callee.name.name as ToolTip
 | 
			
		||||
  if (!toolTips.includes(name)) {
 | 
			
		||||
@ -1711,10 +1718,10 @@ function getTransformMapPathKw(
 | 
			
		||||
  constraintType: ConstraintType
 | 
			
		||||
):
 | 
			
		||||
  | {
 | 
			
		||||
    toolTip: ToolTip
 | 
			
		||||
    lineInputType: LineInputsType | 'free'
 | 
			
		||||
    constraintType: ConstraintType
 | 
			
		||||
  }
 | 
			
		||||
      toolTip: ToolTip
 | 
			
		||||
      lineInputType: LineInputsType | 'free'
 | 
			
		||||
      constraintType: ConstraintType
 | 
			
		||||
    }
 | 
			
		||||
  | false {
 | 
			
		||||
  const name = sketchFnExp.callee.name.name as ToolTip
 | 
			
		||||
  if (name === 'circleThreePoint') {
 | 
			
		||||
@ -1916,14 +1923,14 @@ export function transformSecondarySketchLinesTagFirst({
 | 
			
		||||
  forceValueUsedInTransform?: BinaryPart
 | 
			
		||||
}):
 | 
			
		||||
  | {
 | 
			
		||||
    modifiedAst: Node<Program>
 | 
			
		||||
    valueUsedInTransform?: number
 | 
			
		||||
    pathToNodeMap: PathToNodeMap
 | 
			
		||||
    tagInfo: {
 | 
			
		||||
      tag: string
 | 
			
		||||
      isTagExisting: boolean
 | 
			
		||||
      modifiedAst: Node<Program>
 | 
			
		||||
      valueUsedInTransform?: number
 | 
			
		||||
      pathToNodeMap: PathToNodeMap
 | 
			
		||||
      tagInfo: {
 | 
			
		||||
        tag: string
 | 
			
		||||
        isTagExisting: boolean
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  | Error {
 | 
			
		||||
  // let node = structuredClone(ast)
 | 
			
		||||
 | 
			
		||||
@ -1995,10 +2002,10 @@ export function transformAstSketchLines({
 | 
			
		||||
  forceValueUsedInTransform?: BinaryPart
 | 
			
		||||
}):
 | 
			
		||||
  | {
 | 
			
		||||
    modifiedAst: Node<Program>
 | 
			
		||||
    valueUsedInTransform?: number
 | 
			
		||||
    pathToNodeMap: PathToNodeMap
 | 
			
		||||
  }
 | 
			
		||||
      modifiedAst: Node<Program>
 | 
			
		||||
      valueUsedInTransform?: number
 | 
			
		||||
      pathToNodeMap: PathToNodeMap
 | 
			
		||||
    }
 | 
			
		||||
  | Error {
 | 
			
		||||
  // deep clone since we are mutating in a loop, of which any could fail
 | 
			
		||||
  let node = structuredClone(ast)
 | 
			
		||||
@ -2143,25 +2150,25 @@ export function transformAstSketchLines({
 | 
			
		||||
      segmentInput:
 | 
			
		||||
        seg.type === 'Circle'
 | 
			
		||||
          ? {
 | 
			
		||||
            type: 'arc-segment',
 | 
			
		||||
            center: seg.center,
 | 
			
		||||
            radius: seg.radius,
 | 
			
		||||
            from,
 | 
			
		||||
            to: from, // For a full circle, to is the same as from
 | 
			
		||||
            ccw: true, // Default to counter-clockwise for circles
 | 
			
		||||
          }
 | 
			
		||||
              type: 'arc-segment',
 | 
			
		||||
              center: seg.center,
 | 
			
		||||
              radius: seg.radius,
 | 
			
		||||
              from,
 | 
			
		||||
              to: from, // For a full circle, to is the same as from
 | 
			
		||||
              ccw: true, // Default to counter-clockwise for circles
 | 
			
		||||
            }
 | 
			
		||||
          : seg.type === 'CircleThreePoint' || seg.type === 'ArcThreePoint'
 | 
			
		||||
            ? {
 | 
			
		||||
              type: 'circle-three-point-segment',
 | 
			
		||||
              p1: seg.p1,
 | 
			
		||||
              p2: seg.p2,
 | 
			
		||||
              p3: seg.p3,
 | 
			
		||||
            }
 | 
			
		||||
                type: 'circle-three-point-segment',
 | 
			
		||||
                p1: seg.p1,
 | 
			
		||||
                p2: seg.p2,
 | 
			
		||||
                p3: seg.p3,
 | 
			
		||||
              }
 | 
			
		||||
            : {
 | 
			
		||||
              type: 'straight-segment',
 | 
			
		||||
              to,
 | 
			
		||||
              from,
 | 
			
		||||
            },
 | 
			
		||||
                type: 'straight-segment',
 | 
			
		||||
                to,
 | 
			
		||||
                from,
 | 
			
		||||
              },
 | 
			
		||||
 | 
			
		||||
      replaceExistingCallback: (rawArgs) =>
 | 
			
		||||
        callBack({
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user