Fix units bug with involuteCircular (#6711)
Signed-off-by: Nick Cameron <nrc@ncameron.org>
This commit is contained in:
		@ -91945,7 +91945,7 @@
 | 
			
		||||
        "type": "number",
 | 
			
		||||
        "schema": {
 | 
			
		||||
          "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
 | 
			
		||||
          "title": "double",
 | 
			
		||||
          "title": "TyF64",
 | 
			
		||||
          "type": "number",
 | 
			
		||||
          "format": "double",
 | 
			
		||||
          "definitions": {
 | 
			
		||||
@ -93550,7 +93550,7 @@
 | 
			
		||||
        "type": "number",
 | 
			
		||||
        "schema": {
 | 
			
		||||
          "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
 | 
			
		||||
          "title": "double",
 | 
			
		||||
          "title": "TyF64",
 | 
			
		||||
          "type": "number",
 | 
			
		||||
          "format": "double",
 | 
			
		||||
          "definitions": {
 | 
			
		||||
@ -95155,7 +95155,7 @@
 | 
			
		||||
        "type": "number",
 | 
			
		||||
        "schema": {
 | 
			
		||||
          "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
 | 
			
		||||
          "title": "double",
 | 
			
		||||
          "title": "TyF64",
 | 
			
		||||
          "type": "number",
 | 
			
		||||
          "format": "double",
 | 
			
		||||
          "definitions": {
 | 
			
		||||
 | 
			
		||||
@ -2708,3 +2708,24 @@ mod clone_w_shell {
 | 
			
		||||
        super::execute(TEST_NAME, true).await
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
mod involute_circular_units {
 | 
			
		||||
    const TEST_NAME: &str = "involute_circular_units";
 | 
			
		||||
 | 
			
		||||
    /// Test parsing KCL.
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn parse() {
 | 
			
		||||
        super::parse(TEST_NAME)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Test that parsing and unparsing KCL produces the original KCL input.
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
    async fn unparse() {
 | 
			
		||||
        super::unparse(TEST_NAME).await
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Test that KCL is executed correctly.
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
    async fn kcl_test_execute() {
 | 
			
		||||
        super::execute(TEST_NAME, true).await
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -107,17 +107,8 @@ pub async fn involute_circular(exec_state: &mut ExecState, args: Args) -> Result
 | 
			
		||||
    let angle: TyF64 = args.get_kw_arg_typed("angle", &RuntimeType::angle(), exec_state)?;
 | 
			
		||||
    let reverse = args.get_kw_arg_opt("reverse")?;
 | 
			
		||||
    let tag = args.get_kw_arg_opt(NEW_TAG_KW)?;
 | 
			
		||||
    let new_sketch = inner_involute_circular(
 | 
			
		||||
        sketch,
 | 
			
		||||
        start_radius.n,
 | 
			
		||||
        end_radius.n,
 | 
			
		||||
        angle.n,
 | 
			
		||||
        reverse,
 | 
			
		||||
        tag,
 | 
			
		||||
        exec_state,
 | 
			
		||||
        args,
 | 
			
		||||
    )
 | 
			
		||||
    .await?;
 | 
			
		||||
    let new_sketch =
 | 
			
		||||
        inner_involute_circular(sketch, start_radius, end_radius, angle, reverse, tag, exec_state, args).await?;
 | 
			
		||||
    Ok(KclValue::Sketch {
 | 
			
		||||
        value: Box::new(new_sketch),
 | 
			
		||||
    })
 | 
			
		||||
@ -157,33 +148,35 @@ fn involute_curve(radius: f64, angle: f64) -> (f64, f64) {
 | 
			
		||||
#[allow(clippy::too_many_arguments)]
 | 
			
		||||
async fn inner_involute_circular(
 | 
			
		||||
    sketch: Sketch,
 | 
			
		||||
    start_radius: f64,
 | 
			
		||||
    end_radius: f64,
 | 
			
		||||
    angle: f64,
 | 
			
		||||
    start_radius: TyF64,
 | 
			
		||||
    end_radius: TyF64,
 | 
			
		||||
    angle: TyF64,
 | 
			
		||||
    reverse: Option<bool>,
 | 
			
		||||
    tag: Option<TagNode>,
 | 
			
		||||
    exec_state: &mut ExecState,
 | 
			
		||||
    args: Args,
 | 
			
		||||
) -> Result<Sketch, KclError> {
 | 
			
		||||
    let id = exec_state.next_uuid();
 | 
			
		||||
    let angle = Angle::from_degrees(angle);
 | 
			
		||||
    let segment = PathSegment::CircularInvolute {
 | 
			
		||||
        start_radius: LengthUnit(start_radius),
 | 
			
		||||
        end_radius: LengthUnit(end_radius),
 | 
			
		||||
        angle,
 | 
			
		||||
        reverse: reverse.unwrap_or_default(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    args.batch_modeling_cmd(
 | 
			
		||||
        id,
 | 
			
		||||
        ModelingCmd::from(mcmd::ExtendPath {
 | 
			
		||||
            path: sketch.id.into(),
 | 
			
		||||
            segment,
 | 
			
		||||
            segment: PathSegment::CircularInvolute {
 | 
			
		||||
                start_radius: LengthUnit(start_radius.to_mm()),
 | 
			
		||||
                end_radius: LengthUnit(end_radius.to_mm()),
 | 
			
		||||
                angle: Angle::from_degrees(angle.to_degrees()),
 | 
			
		||||
                reverse: reverse.unwrap_or_default(),
 | 
			
		||||
            },
 | 
			
		||||
        }),
 | 
			
		||||
    )
 | 
			
		||||
    .await?;
 | 
			
		||||
 | 
			
		||||
    let from = sketch.current_pen_position()?;
 | 
			
		||||
 | 
			
		||||
    let start_radius = start_radius.to_length_units(from.units);
 | 
			
		||||
    let end_radius = end_radius.to_length_units(from.units);
 | 
			
		||||
 | 
			
		||||
    let mut end: KPoint3d<f64> = Default::default(); // ADAM: TODO impl this below.
 | 
			
		||||
    let theta = f64::sqrt(end_radius * end_radius - start_radius * start_radius) / start_radius;
 | 
			
		||||
    let (x, y) = involute_curve(start_radius, theta);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6356
									
								
								rust/kcl-lib/tests/involute_circular_units/artifact_commands.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6356
									
								
								rust/kcl-lib/tests/involute_circular_units/artifact_commands.snap
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl-lib/src/simulation_tests.rs
 | 
			
		||||
description: Artifact graph flowchart involute_circular_units.kcl
 | 
			
		||||
extension: md
 | 
			
		||||
snapshot_kind: binary
 | 
			
		||||
---
 | 
			
		||||
@ -0,0 +1,121 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path2 [Path]
 | 
			
		||||
    2["Path<br>[335, 375, 0]"]
 | 
			
		||||
    4["Segment<br>[381, 519, 0]"]
 | 
			
		||||
    5["Segment<br>[525, 571, 0]"]
 | 
			
		||||
    6["Segment<br>[577, 722, 0]"]
 | 
			
		||||
    7["Segment<br>[728, 870, 0]"]
 | 
			
		||||
    8["Segment<br>[876, 922, 0]"]
 | 
			
		||||
    9["Segment<br>[928, 1002, 0]"]
 | 
			
		||||
    10["Segment<br>[1157, 1164, 0]"]
 | 
			
		||||
    13[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path3 [Path]
 | 
			
		||||
    3["Path<br>[1188, 1223, 0]"]
 | 
			
		||||
    11["Segment<br>[1188, 1223, 0]"]
 | 
			
		||||
    12[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[312, 329, 0]"]
 | 
			
		||||
  14["Sweep Extrusion<br>[1230, 1258, 0]"]
 | 
			
		||||
  15[Wall]
 | 
			
		||||
  16[Wall]
 | 
			
		||||
  17[Wall]
 | 
			
		||||
  18[Wall]
 | 
			
		||||
  19[Wall]
 | 
			
		||||
  20[Wall]
 | 
			
		||||
  21["Cap Start"]
 | 
			
		||||
  22["Cap End"]
 | 
			
		||||
  23["SweepEdge Opposite"]
 | 
			
		||||
  24["SweepEdge Opposite"]
 | 
			
		||||
  25["SweepEdge Opposite"]
 | 
			
		||||
  26["SweepEdge Opposite"]
 | 
			
		||||
  27["SweepEdge Opposite"]
 | 
			
		||||
  28["SweepEdge Opposite"]
 | 
			
		||||
  29["SweepEdge Adjacent"]
 | 
			
		||||
  30["SweepEdge Adjacent"]
 | 
			
		||||
  31["SweepEdge Adjacent"]
 | 
			
		||||
  32["SweepEdge Adjacent"]
 | 
			
		||||
  33["SweepEdge Adjacent"]
 | 
			
		||||
  34["SweepEdge Adjacent"]
 | 
			
		||||
  1 --- 2
 | 
			
		||||
  1 --- 3
 | 
			
		||||
  2 --- 4
 | 
			
		||||
  2 --- 5
 | 
			
		||||
  2 --- 6
 | 
			
		||||
  2 --- 7
 | 
			
		||||
  2 --- 8
 | 
			
		||||
  2 --- 9
 | 
			
		||||
  2 --- 10
 | 
			
		||||
  2 --- 13
 | 
			
		||||
  2 ---- 14
 | 
			
		||||
  3 --- 11
 | 
			
		||||
  3 --- 12
 | 
			
		||||
  4 --- 20
 | 
			
		||||
  4 x--> 21
 | 
			
		||||
  4 --- 25
 | 
			
		||||
  4 --- 32
 | 
			
		||||
  5 --- 18
 | 
			
		||||
  5 x--> 21
 | 
			
		||||
  5 --- 23
 | 
			
		||||
  5 --- 29
 | 
			
		||||
  6 --- 17
 | 
			
		||||
  6 x--> 21
 | 
			
		||||
  6 --- 24
 | 
			
		||||
  6 --- 31
 | 
			
		||||
  7 --- 19
 | 
			
		||||
  7 x--> 21
 | 
			
		||||
  7 --- 26
 | 
			
		||||
  7 --- 33
 | 
			
		||||
  8 --- 16
 | 
			
		||||
  8 x--> 21
 | 
			
		||||
  8 --- 28
 | 
			
		||||
  8 --- 30
 | 
			
		||||
  9 --- 15
 | 
			
		||||
  9 x--> 21
 | 
			
		||||
  9 --- 27
 | 
			
		||||
  9 --- 34
 | 
			
		||||
  14 --- 15
 | 
			
		||||
  14 --- 16
 | 
			
		||||
  14 --- 17
 | 
			
		||||
  14 --- 18
 | 
			
		||||
  14 --- 19
 | 
			
		||||
  14 --- 20
 | 
			
		||||
  14 --- 21
 | 
			
		||||
  14 --- 22
 | 
			
		||||
  14 --- 23
 | 
			
		||||
  14 --- 24
 | 
			
		||||
  14 --- 25
 | 
			
		||||
  14 --- 26
 | 
			
		||||
  14 --- 27
 | 
			
		||||
  14 --- 28
 | 
			
		||||
  14 --- 29
 | 
			
		||||
  14 --- 30
 | 
			
		||||
  14 --- 31
 | 
			
		||||
  14 --- 32
 | 
			
		||||
  14 --- 33
 | 
			
		||||
  14 --- 34
 | 
			
		||||
  27 <--x 15
 | 
			
		||||
  30 <--x 15
 | 
			
		||||
  34 <--x 15
 | 
			
		||||
  28 <--x 16
 | 
			
		||||
  30 <--x 16
 | 
			
		||||
  33 <--x 16
 | 
			
		||||
  24 <--x 17
 | 
			
		||||
  29 <--x 17
 | 
			
		||||
  31 <--x 17
 | 
			
		||||
  23 <--x 18
 | 
			
		||||
  29 <--x 18
 | 
			
		||||
  32 <--x 18
 | 
			
		||||
  26 <--x 19
 | 
			
		||||
  31 <--x 19
 | 
			
		||||
  33 <--x 19
 | 
			
		||||
  25 <--x 20
 | 
			
		||||
  32 <--x 20
 | 
			
		||||
  23 <--x 22
 | 
			
		||||
  24 <--x 22
 | 
			
		||||
  25 <--x 22
 | 
			
		||||
  26 <--x 22
 | 
			
		||||
  27 <--x 22
 | 
			
		||||
  28 <--x 22
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										1979
									
								
								rust/kcl-lib/tests/involute_circular_units/ast.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1979
									
								
								rust/kcl-lib/tests/involute_circular_units/ast.snap
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										47
									
								
								rust/kcl-lib/tests/involute_circular_units/input.kcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								rust/kcl-lib/tests/involute_circular_units/input.kcl
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
			
		||||
@settings(defaultLengthUnit = cm)
 | 
			
		||||
 | 
			
		||||
// Define parameters
 | 
			
		||||
nTeeth = 21
 | 
			
		||||
module = 0.5
 | 
			
		||||
pitchDiameter = module * nTeeth
 | 
			
		||||
pressureAngle = 20deg
 | 
			
		||||
addendum = module
 | 
			
		||||
deddendum = 1.25 * module
 | 
			
		||||
baseDiameter = pitchDiameter * cos(pressureAngle)
 | 
			
		||||
tipDiameter = pitchDiameter + 2 * module
 | 
			
		||||
gearHeight = .3
 | 
			
		||||
 | 
			
		||||
angle001 = 6
 | 
			
		||||
sketch001 = startSketchOn(XY)
 | 
			
		||||
  |> startProfile(at = [baseDiameter / 2, 0])
 | 
			
		||||
  |> involuteCircular(
 | 
			
		||||
       startRadius = baseDiameter / 2,
 | 
			
		||||
       endRadius = tipDiameter / 2,
 | 
			
		||||
       angle = 0,
 | 
			
		||||
       tag = $seg01,
 | 
			
		||||
     )
 | 
			
		||||
  |> line(endAbsolute = [lastSegX(%), lastSegY(%)])
 | 
			
		||||
  |> arc(
 | 
			
		||||
       angleStart = asin(segEndY(seg01) / segEndX(seg01)),
 | 
			
		||||
       angleEnd = 9,
 | 
			
		||||
       radius = tipDiameter / 2,
 | 
			
		||||
       tag = $seg02,
 | 
			
		||||
     )
 | 
			
		||||
  |> involuteCircular(
 | 
			
		||||
       startRadius = baseDiameter / 2,
 | 
			
		||||
       endRadius = tipDiameter / 2,
 | 
			
		||||
       angle = -12,
 | 
			
		||||
       reverse = true,
 | 
			
		||||
     )
 | 
			
		||||
  |> line(endAbsolute = [lastSegX(%), lastSegY(%)])
 | 
			
		||||
  |> line(endAbsolute = polar(angle = 360 / nTeeth, length = baseDiameter / 2))
 | 
			
		||||
  |> patternCircular2d(
 | 
			
		||||
       %,
 | 
			
		||||
       instances = nTeeth,
 | 
			
		||||
       center = [0, 0],
 | 
			
		||||
       arcDegrees = 360,
 | 
			
		||||
       rotateDuplicates = true,
 | 
			
		||||
     )
 | 
			
		||||
  |> close()
 | 
			
		||||
  |> subtract2d(tool = circle(center = [0, 0], radius = 1))
 | 
			
		||||
  |> extrude(length = gearHeight)
 | 
			
		||||
							
								
								
									
										124
									
								
								rust/kcl-lib/tests/involute_circular_units/ops.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								rust/kcl-lib/tests/involute_circular_units/ops.snap
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,124 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl-lib/src/simulation_tests.rs
 | 
			
		||||
assertion_line: 282
 | 
			
		||||
description: Operations executed involute_circular_units.kcl
 | 
			
		||||
---
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "labeledArgs": {},
 | 
			
		||||
    "name": "startSketchOn",
 | 
			
		||||
    "sourceRange": [],
 | 
			
		||||
    "type": "StdLibCall",
 | 
			
		||||
    "unlabeledArg": {
 | 
			
		||||
      "value": {
 | 
			
		||||
        "type": "Plane",
 | 
			
		||||
        "artifact_id": "[uuid]"
 | 
			
		||||
      },
 | 
			
		||||
      "sourceRange": []
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "type": "GroupBegin",
 | 
			
		||||
    "group": {
 | 
			
		||||
      "type": "FunctionCall",
 | 
			
		||||
      "name": "polar",
 | 
			
		||||
      "functionSourceRange": [],
 | 
			
		||||
      "unlabeledArg": null,
 | 
			
		||||
      "labeledArgs": {
 | 
			
		||||
        "angle": {
 | 
			
		||||
          "value": {
 | 
			
		||||
            "type": "Number",
 | 
			
		||||
            "value": 17.142857142857142,
 | 
			
		||||
            "ty": {
 | 
			
		||||
              "type": "Default",
 | 
			
		||||
              "len": {
 | 
			
		||||
                "type": "Cm"
 | 
			
		||||
              },
 | 
			
		||||
              "angle": {
 | 
			
		||||
                "type": "Degrees"
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          "sourceRange": []
 | 
			
		||||
        },
 | 
			
		||||
        "length": {
 | 
			
		||||
          "value": {
 | 
			
		||||
            "type": "Number",
 | 
			
		||||
            "value": 4.933386259126019,
 | 
			
		||||
            "ty": {
 | 
			
		||||
              "type": "Default",
 | 
			
		||||
              "len": {
 | 
			
		||||
                "type": "Cm"
 | 
			
		||||
              },
 | 
			
		||||
              "angle": {
 | 
			
		||||
                "type": "Degrees"
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          "sourceRange": []
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "sourceRange": []
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "labeledArgs": {
 | 
			
		||||
      "tool": {
 | 
			
		||||
        "value": {
 | 
			
		||||
          "type": "Sketch",
 | 
			
		||||
          "value": {
 | 
			
		||||
            "artifactId": "[uuid]"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "sourceRange": []
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "name": "subtract2d",
 | 
			
		||||
    "sourceRange": [],
 | 
			
		||||
    "type": "StdLibCall",
 | 
			
		||||
    "unlabeledArg": {
 | 
			
		||||
      "value": {
 | 
			
		||||
        "type": "Sketch",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "artifactId": "[uuid]"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "sourceRange": []
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "labeledArgs": {
 | 
			
		||||
      "length": {
 | 
			
		||||
        "value": {
 | 
			
		||||
          "type": "Number",
 | 
			
		||||
          "value": 0.3,
 | 
			
		||||
          "ty": {
 | 
			
		||||
            "type": "Default",
 | 
			
		||||
            "len": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            },
 | 
			
		||||
            "angle": {
 | 
			
		||||
              "type": "Degrees"
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "sourceRange": []
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "name": "extrude",
 | 
			
		||||
    "sourceRange": [],
 | 
			
		||||
    "type": "StdLibCall",
 | 
			
		||||
    "unlabeledArg": {
 | 
			
		||||
      "value": {
 | 
			
		||||
        "type": "Sketch",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "artifactId": "[uuid]"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "sourceRange": []
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "type": "GroupEnd"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										434
									
								
								rust/kcl-lib/tests/involute_circular_units/program_memory.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										434
									
								
								rust/kcl-lib/tests/involute_circular_units/program_memory.snap
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,434 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl-lib/src/simulation_tests.rs
 | 
			
		||||
assertion_line: 187
 | 
			
		||||
description: Variables in memory after executing involute_circular_units.kcl
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "addendum": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 0.5,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "angle001": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 6.0,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "baseDiameter": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 9.8668,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "deddendum": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 0.625,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "gearHeight": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 0.3,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "module": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 0.5,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "nTeeth": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 21.0,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "pitchDiameter": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 10.5,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "pressureAngle": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 20.0,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Known",
 | 
			
		||||
      "type": "Angle",
 | 
			
		||||
      "type": "Degrees"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "seg01": {
 | 
			
		||||
    "type": "TagIdentifier",
 | 
			
		||||
    "type": "TagIdentifier",
 | 
			
		||||
    "value": "seg01"
 | 
			
		||||
  },
 | 
			
		||||
  "seg02": {
 | 
			
		||||
    "type": "TagIdentifier",
 | 
			
		||||
    "type": "TagIdentifier",
 | 
			
		||||
    "value": "seg02"
 | 
			
		||||
  },
 | 
			
		||||
  "sketch001": {
 | 
			
		||||
    "type": "Solid",
 | 
			
		||||
    "value": {
 | 
			
		||||
      "type": "Solid",
 | 
			
		||||
      "id": "[uuid]",
 | 
			
		||||
      "artifactId": "[uuid]",
 | 
			
		||||
      "value": [
 | 
			
		||||
        {
 | 
			
		||||
          "faceId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "sourceRange": [],
 | 
			
		||||
          "tag": {
 | 
			
		||||
            "commentStart": 505,
 | 
			
		||||
            "end": 511,
 | 
			
		||||
            "start": 505,
 | 
			
		||||
            "type": "TagDeclarator",
 | 
			
		||||
            "value": "seg01"
 | 
			
		||||
          },
 | 
			
		||||
          "type": "extrudePlane"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "faceId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "sourceRange": [],
 | 
			
		||||
          "tag": null,
 | 
			
		||||
          "type": "extrudePlane"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "faceId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "sourceRange": [],
 | 
			
		||||
          "tag": {
 | 
			
		||||
            "commentStart": 708,
 | 
			
		||||
            "end": 714,
 | 
			
		||||
            "start": 708,
 | 
			
		||||
            "type": "TagDeclarator",
 | 
			
		||||
            "value": "seg02"
 | 
			
		||||
          },
 | 
			
		||||
          "type": "extrudeArc"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "faceId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "sourceRange": [],
 | 
			
		||||
          "tag": null,
 | 
			
		||||
          "type": "extrudePlane"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "faceId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "sourceRange": [],
 | 
			
		||||
          "tag": null,
 | 
			
		||||
          "type": "extrudePlane"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "faceId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "sourceRange": [],
 | 
			
		||||
          "tag": null,
 | 
			
		||||
          "type": "extrudePlane"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "sketch": {
 | 
			
		||||
        "type": "Sketch",
 | 
			
		||||
        "id": "[uuid]",
 | 
			
		||||
        "paths": [
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "from": [
 | 
			
		||||
              4.9334,
 | 
			
		||||
              0.0
 | 
			
		||||
            ],
 | 
			
		||||
            "tag": {
 | 
			
		||||
              "commentStart": 505,
 | 
			
		||||
              "end": 511,
 | 
			
		||||
              "start": 505,
 | 
			
		||||
              "type": "TagDeclarator",
 | 
			
		||||
              "value": "seg01"
 | 
			
		||||
            },
 | 
			
		||||
            "to": [
 | 
			
		||||
              5.7399,
 | 
			
		||||
              0.3404
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "ToPoint",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "from": [
 | 
			
		||||
              5.7399,
 | 
			
		||||
              0.3404
 | 
			
		||||
            ],
 | 
			
		||||
            "tag": null,
 | 
			
		||||
            "to": [
 | 
			
		||||
              5.7399,
 | 
			
		||||
              0.3404
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "ToPoint",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "ccw": true,
 | 
			
		||||
            "center": [
 | 
			
		||||
              0.0,
 | 
			
		||||
              -0.0006
 | 
			
		||||
            ],
 | 
			
		||||
            "from": [
 | 
			
		||||
              5.7399,
 | 
			
		||||
              0.3404
 | 
			
		||||
            ],
 | 
			
		||||
            "radius": 5.75,
 | 
			
		||||
            "tag": {
 | 
			
		||||
              "commentStart": 708,
 | 
			
		||||
              "end": 714,
 | 
			
		||||
              "start": 708,
 | 
			
		||||
              "type": "TagDeclarator",
 | 
			
		||||
              "value": "seg02"
 | 
			
		||||
            },
 | 
			
		||||
            "to": [
 | 
			
		||||
              5.6792,
 | 
			
		||||
              0.8989
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "Arc",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "from": [
 | 
			
		||||
              5.6792,
 | 
			
		||||
              0.8989
 | 
			
		||||
            ],
 | 
			
		||||
            "tag": null,
 | 
			
		||||
            "to": [
 | 
			
		||||
              4.8196,
 | 
			
		||||
              1.0642
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "ToPoint",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "from": [
 | 
			
		||||
              4.8196,
 | 
			
		||||
              1.0642
 | 
			
		||||
            ],
 | 
			
		||||
            "tag": null,
 | 
			
		||||
            "to": [
 | 
			
		||||
              4.8196,
 | 
			
		||||
              1.0642
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "ToPoint",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "from": [
 | 
			
		||||
              4.8196,
 | 
			
		||||
              1.0642
 | 
			
		||||
            ],
 | 
			
		||||
            "tag": null,
 | 
			
		||||
            "to": [
 | 
			
		||||
              4.7142,
 | 
			
		||||
              1.4541
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "ToPoint",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "__geoMeta": {
 | 
			
		||||
              "id": "[uuid]",
 | 
			
		||||
              "sourceRange": []
 | 
			
		||||
            },
 | 
			
		||||
            "from": [
 | 
			
		||||
              4.7142,
 | 
			
		||||
              1.4541
 | 
			
		||||
            ],
 | 
			
		||||
            "tag": null,
 | 
			
		||||
            "to": [
 | 
			
		||||
              4.9334,
 | 
			
		||||
              0.0
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "ToPoint",
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Cm"
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "on": {
 | 
			
		||||
          "artifactId": "[uuid]",
 | 
			
		||||
          "id": "[uuid]",
 | 
			
		||||
          "origin": {
 | 
			
		||||
            "x": 0.0,
 | 
			
		||||
            "y": 0.0,
 | 
			
		||||
            "z": 0.0,
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Mm"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          "type": "plane",
 | 
			
		||||
          "value": "XY",
 | 
			
		||||
          "xAxis": {
 | 
			
		||||
            "x": 1.0,
 | 
			
		||||
            "y": 0.0,
 | 
			
		||||
            "z": 0.0,
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Unknown"
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          "yAxis": {
 | 
			
		||||
            "x": 0.0,
 | 
			
		||||
            "y": 1.0,
 | 
			
		||||
            "z": 0.0,
 | 
			
		||||
            "units": {
 | 
			
		||||
              "type": "Unknown"
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "start": {
 | 
			
		||||
          "from": [
 | 
			
		||||
            4.9334,
 | 
			
		||||
            0.0
 | 
			
		||||
          ],
 | 
			
		||||
          "to": [
 | 
			
		||||
            4.9334,
 | 
			
		||||
            0.0
 | 
			
		||||
          ],
 | 
			
		||||
          "units": {
 | 
			
		||||
            "type": "Cm"
 | 
			
		||||
          },
 | 
			
		||||
          "tag": null,
 | 
			
		||||
          "__geoMeta": {
 | 
			
		||||
            "id": "[uuid]",
 | 
			
		||||
            "sourceRange": []
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "tags": {
 | 
			
		||||
          "seg01": {
 | 
			
		||||
            "type": "TagIdentifier",
 | 
			
		||||
            "value": "seg01"
 | 
			
		||||
          },
 | 
			
		||||
          "seg02": {
 | 
			
		||||
            "type": "TagIdentifier",
 | 
			
		||||
            "value": "seg02"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "artifactId": "[uuid]",
 | 
			
		||||
        "originalId": "[uuid]",
 | 
			
		||||
        "units": {
 | 
			
		||||
          "type": "Cm"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "height": 0.3,
 | 
			
		||||
      "startCapId": "[uuid]",
 | 
			
		||||
      "endCapId": "[uuid]",
 | 
			
		||||
      "units": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "sectional": false
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "tipDiameter": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
    "value": 11.5,
 | 
			
		||||
    "ty": {
 | 
			
		||||
      "type": "Default",
 | 
			
		||||
      "len": {
 | 
			
		||||
        "type": "Cm"
 | 
			
		||||
      },
 | 
			
		||||
      "angle": {
 | 
			
		||||
        "type": "Degrees"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								rust/kcl-lib/tests/involute_circular_units/rendered_model.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								rust/kcl-lib/tests/involute_circular_units/rendered_model.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 50 KiB  | 
							
								
								
									
										52
									
								
								rust/kcl-lib/tests/involute_circular_units/unparsed.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								rust/kcl-lib/tests/involute_circular_units/unparsed.snap
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl-lib/src/simulation_tests.rs
 | 
			
		||||
assertion_line: 109
 | 
			
		||||
description: Result of unparsing involute_circular_units.kcl
 | 
			
		||||
---
 | 
			
		||||
@settings(defaultLengthUnit = cm)
 | 
			
		||||
 | 
			
		||||
// Define parameters
 | 
			
		||||
nTeeth = 21
 | 
			
		||||
module = 0.5
 | 
			
		||||
pitchDiameter = module * nTeeth
 | 
			
		||||
pressureAngle = 20deg
 | 
			
		||||
addendum = module
 | 
			
		||||
deddendum = 1.25 * module
 | 
			
		||||
baseDiameter = pitchDiameter * cos(pressureAngle)
 | 
			
		||||
tipDiameter = pitchDiameter + 2 * module
 | 
			
		||||
gearHeight = .3
 | 
			
		||||
 | 
			
		||||
angle001 = 6
 | 
			
		||||
sketch001 = startSketchOn(XY)
 | 
			
		||||
  |> startProfile(at = [baseDiameter / 2, 0])
 | 
			
		||||
  |> involuteCircular(
 | 
			
		||||
       startRadius = baseDiameter / 2,
 | 
			
		||||
       endRadius = tipDiameter / 2,
 | 
			
		||||
       angle = 0,
 | 
			
		||||
       tag = $seg01,
 | 
			
		||||
     )
 | 
			
		||||
  |> line(endAbsolute = [lastSegX(%), lastSegY(%)])
 | 
			
		||||
  |> arc(
 | 
			
		||||
       angleStart = asin(segEndY(seg01) / segEndX(seg01)),
 | 
			
		||||
       angleEnd = 9,
 | 
			
		||||
       radius = tipDiameter / 2,
 | 
			
		||||
       tag = $seg02,
 | 
			
		||||
     )
 | 
			
		||||
  |> involuteCircular(
 | 
			
		||||
       startRadius = baseDiameter / 2,
 | 
			
		||||
       endRadius = tipDiameter / 2,
 | 
			
		||||
       angle = -12,
 | 
			
		||||
       reverse = true,
 | 
			
		||||
     )
 | 
			
		||||
  |> line(endAbsolute = [lastSegX(%), lastSegY(%)])
 | 
			
		||||
  |> line(endAbsolute = polar(angle = 360 / nTeeth, length = baseDiameter / 2))
 | 
			
		||||
  |> patternCircular2d(
 | 
			
		||||
       %,
 | 
			
		||||
       instances = nTeeth,
 | 
			
		||||
       center = [0, 0],
 | 
			
		||||
       arcDegrees = 360,
 | 
			
		||||
       rotateDuplicates = true,
 | 
			
		||||
     )
 | 
			
		||||
  |> close()
 | 
			
		||||
  |> subtract2d(tool = circle(center = [0, 0], radius = 1))
 | 
			
		||||
  |> extrude(length = gearHeight)
 | 
			
		||||
		Reference in New Issue
	
	Block a user