| 
									
										
										
										
											2025-04-17 17:22:19 -07:00
										 |  |  | --- | 
					
						
							|  |  |  | source: kcl-lib/src/simulation_tests.rs | 
					
						
							|  |  |  | description: Result of unparsing import_async.kcl | 
					
						
							|  |  |  | --- | 
					
						
							|  |  |  | @settings(defaultLengthUnit = mm) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @(lengthUnit = m) | 
					
						
							|  |  |  | import "../../e2e/executor/inputs/2-5-long-m8-chc-screw.stl" as screw | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | myScrew = screw | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-13 21:07:24 -07:00
										 |  |  | // Define a function to create a helical gear | 
					
						
							|  |  |  | fn helicalGear(nTeeth, module, pressureAngle, helixAngle, gearHeight) { | 
					
						
							|  |  |  |   // Calculate gear parameters | 
					
						
							|  |  |  |   pitchDiameter = module * nTeeth | 
					
						
							|  |  |  |   addendum = module | 
					
						
							|  |  |  |   deddendum = 1.25 * module | 
					
						
							|  |  |  |   baseDiameter = pitchDiameter * cos(pressureAngle) | 
					
						
							|  |  |  |   tipDiameter = pitchDiameter + 2 * module | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Define the constants of the keyway and the bore hole | 
					
						
							|  |  |  |   keywayWidth = 2 | 
					
						
							|  |  |  |   keywayDepth = keywayWidth / 2 | 
					
						
							|  |  |  |   holeDiam = 7 | 
					
						
							|  |  |  |   holeRadius = holeDiam / 2 | 
					
						
							|  |  |  |   startAngle = asin(keywayWidth / 2 / holeRadius) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Sketch the keyway and center hole | 
					
						
							|  |  |  |   holeWithKeyway = startSketchOn(XY) | 
					
						
							|  |  |  |     |> startProfile(at = [ | 
					
						
							|  |  |  |          holeRadius * cos(startAngle), | 
					
						
							|  |  |  |          holeRadius * sin(startAngle) | 
					
						
							|  |  |  |        ]) | 
					
						
							|  |  |  |     |> xLine(length = keywayDepth) | 
					
						
							|  |  |  |     |> yLine(length = -keywayWidth) | 
					
						
							|  |  |  |     |> xLine(length = -keywayDepth) | 
					
						
							|  |  |  |     |> arc(angleStart = -1 * startAngle + 360, angleEnd = 180, radius = holeRadius) | 
					
						
							|  |  |  |     |> arc(angleStart = 180, angleEnd = startAngle, radius = holeRadius) | 
					
						
							|  |  |  |     |> close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Define a function to create a rotated gear sketch on an offset plane | 
					
						
							|  |  |  |   fn helicalGearSketch(offsetHeight) { | 
					
						
							|  |  |  |     // Calculate the amount to rotate each planar sketch of the gear given the gear helix angle and total gear height | 
					
						
							|  |  |  |     helixCalc = acos(offsetHeight * tan(helixAngle) / (tipDiameter / 2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Using the gear parameters, sketch an involute tooth spanning from the base diameter to the tip diameter | 
					
						
							|  |  |  |     helicalGearSketch = startSketchOn(offsetPlane(XY, offset = offsetHeight)) | 
					
						
							|  |  |  |       |> startProfile(at = polar(angle = helixCalc, length = baseDiameter / 2)) | 
					
						
							|  |  |  |       |> involuteCircular( | 
					
						
							|  |  |  |            startRadius = baseDiameter / 2, | 
					
						
							|  |  |  |            endRadius = tipDiameter / 2, | 
					
						
							|  |  |  |            angle = helixCalc, | 
					
						
							|  |  |  |            tag = $seg01, | 
					
						
							|  |  |  |          ) | 
					
						
							|  |  |  |       |> line(endAbsolute = polar(angle = 160 / nTeeth + helixCalc, length = tipDiameter / 2)) | 
					
						
							|  |  |  |       |> involuteCircular( | 
					
						
							|  |  |  |            startRadius = baseDiameter / 2, | 
					
						
							|  |  |  |            endRadius = tipDiameter / 2, | 
					
						
							|  |  |  |            angle = -(4 * atan(segEndY(seg01) / segEndX(seg01)) - (3 * helixCalc)), | 
					
						
							|  |  |  |            reverse = true, | 
					
						
							|  |  |  |          ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Position the end line of the sketch at the start of the next tooth | 
					
						
							|  |  |  |       |> line(endAbsolute = polar(angle = 360 / nTeeth + helixCalc, length = baseDiameter / 2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Pattern the sketch about the center by the specified number of teeth, then close the sketch | 
					
						
							|  |  |  |       |> patternCircular2d( | 
					
						
							|  |  |  |            %, | 
					
						
							|  |  |  |            instances = nTeeth, | 
					
						
							|  |  |  |            center = [0, 0], | 
					
						
							|  |  |  |            arcDegrees = 360, | 
					
						
							|  |  |  |            rotateDuplicates = true, | 
					
						
							|  |  |  |          ) | 
					
						
							|  |  |  |       |> close() | 
					
						
							|  |  |  |       |> subtract2d(tool = holeWithKeyway) | 
					
						
							|  |  |  |     return helicalGearSketch | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Draw a gear sketch on the base plane | 
					
						
							|  |  |  |   gearSketch001 = helicalGearSketch(offsetHeight = 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Draw a rotated gear sketch on a middle interstitial plane | 
					
						
							|  |  |  |   gearSketch002 = helicalGearSketch(offsetHeight = gearHeight / 2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Draw a rotated gear sketch at the gear height offset plane | 
					
						
							|  |  |  |   gearSketch003 = helicalGearSketch(offsetHeight = gearHeight) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Loft each rotated gear sketch together to form a helical gear | 
					
						
							|  |  |  |   helicalGear = loft([ | 
					
						
							|  |  |  |     gearSketch001, | 
					
						
							|  |  |  |     gearSketch002, | 
					
						
							|  |  |  |     gearSketch003 | 
					
						
							|  |  |  |   ]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return helicalGear | 
					
						
							| 
									
										
										
										
											2025-04-17 17:22:19 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-13 21:07:24 -07:00
										 |  |  | helicalGear( | 
					
						
							|  |  |  |   nTeeth = 21, | 
					
						
							|  |  |  |   module = 2, | 
					
						
							|  |  |  |   pressureAngle = 20, | 
					
						
							|  |  |  |   helixAngle = 35, | 
					
						
							|  |  |  |   gearHeight = 7, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2025-04-17 17:22:19 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | myScrew | 
					
						
							|  |  |  |   |> translate(y = 10) |