* 3d models * Update kcl-samples simulation test output * typos * Update kcl-samples simulation test output --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
		
			
				
	
	
		
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Shepherd’s Hook Bolt
 | 
						||
// A bent bolt with a curved hook, typically used for hanging or anchoring loads. The threaded end allows secure attachment to surfaces or materials, while the curved hook resists pull-out under tension.
 | 
						||
 | 
						||
// Set units in millimeters (mm)
 | 
						||
@settings(defaultLengthUnit = mm, kclVersion = 1.0)
 | 
						||
 | 
						||
// Define bolt geometry parameters
 | 
						||
boltDiameter = 5
 | 
						||
hookRadius = 12
 | 
						||
shankLength = 5
 | 
						||
threadedEndLength = 30
 | 
						||
nutDistance = 20
 | 
						||
hookStartAngle = 290
 | 
						||
hookEndAngle = 150
 | 
						||
 | 
						||
approximatePitch = boltDiameter * 0.15
 | 
						||
threadDepth = 0.6134 * approximatePitch
 | 
						||
innerRadius = boltDiameter / 2 - threadDepth
 | 
						||
boltNumberOfRevolutions = threadedEndLength / approximatePitch
 | 
						||
 | 
						||
// Helper values for computing geometry transitions between straight shaft and hook arc
 | 
						||
hypotenuse = hookRadius / cos(hookStartAngle - 270)
 | 
						||
side = sqrt(pow(hypotenuse, exp = 2) - pow(hookRadius, exp = 2))
 | 
						||
shankOffset = hypotenuse + side
 | 
						||
 | 
						||
// Converts polar coordinates to cartesian points for drawing arcs
 | 
						||
fn polarToCartesian(radius, angle) {
 | 
						||
  x = radius * cos(angle)
 | 
						||
  y = radius * sin(angle)
 | 
						||
  return [x, y]
 | 
						||
}
 | 
						||
 | 
						||
// Create the hook and shank profile path
 | 
						||
// Includes straight segment and two connected arcs forming the hook
 | 
						||
hookProfilePlane = startSketchOn(XZ)
 | 
						||
hookProfileShape = startProfile(hookProfilePlane, at = [0, -shankOffset - shankLength])
 | 
						||
  |> line(endAbsolute = [0, -shankOffset])
 | 
						||
  |> tangentialArc(endAbsolute = polarToCartesian(radius = hookRadius, angle = hookStartAngle))
 | 
						||
  |> tangentialArc(endAbsolute = polarToCartesian(radius = hookRadius, angle = hookEndAngle), tag = $hook)
 | 
						||
 | 
						||
// Create the circular cross-section used for sweeping along the hook path
 | 
						||
hookSectionPlane = offsetPlane(XY, offset = -shankOffset - shankLength)
 | 
						||
hookSectionShape = circle(hookSectionPlane, center = [0, 0], radius = boltDiameter / 2)
 | 
						||
 | 
						||
// Sweep the section along the hook profile to form the main body of the hook bolt
 | 
						||
hookBody = sweep(hookSectionShape, path = hookProfileShape, sectional = true)
 | 
						||
 | 
						||
// Add a cylindrical tip at the hook end
 | 
						||
tipPlane = startSketchOn(hookBody, face = END)
 | 
						||
tipShape = circle(
 | 
						||
  tipPlane,
 | 
						||
  center = [hookRadius, 0],
 | 
						||
  radius = boltDiameter / 2,
 | 
						||
  tag = $seg01,
 | 
						||
)
 | 
						||
tipBody = extrude(
 | 
						||
       tipShape,
 | 
						||
       length = hookRadius * 0.5,
 | 
						||
       tagStart = $startTag,
 | 
						||
       tagEnd = $capEnd001,
 | 
						||
     )
 | 
						||
  |> fillet(
 | 
						||
       radius = boltDiameter / 4,
 | 
						||
       tags = [
 | 
						||
         getCommonEdge(faces = [seg01, capEnd001])
 | 
						||
       ],
 | 
						||
     )
 | 
						||
 | 
						||
  // Create the threaded end of the bolt
 | 
						||
 | 
						||
// Construct the triangular profile for thread cutting
 | 
						||
boltThreadSectionPlane = startSketchOn(XZ)
 | 
						||
boltThreadSectionShapeForRevolve = startProfile(
 | 
						||
       boltThreadSectionPlane,
 | 
						||
       at = [
 | 
						||
         innerRadius,
 | 
						||
         -shankOffset - shankLength - threadedEndLength
 | 
						||
       ],
 | 
						||
     )
 | 
						||
  |> line(end = [threadDepth, approximatePitch / 2])
 | 
						||
  |> line(end = [-threadDepth, approximatePitch / 2])
 | 
						||
  |> patternLinear2d(axis = [0, 1], instances = boltNumberOfRevolutions, distance = approximatePitch)
 | 
						||
  |> xLine(length = -innerRadius * 0.9)
 | 
						||
  |> yLine(length = -threadedEndLength)
 | 
						||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
						||
  |> close()
 | 
						||
 | 
						||
// Create a revolved solid representing the thread geometry by repeating and revolving the profile around the shaft
 | 
						||
boltThreadRevolve = revolve(boltThreadSectionShapeForRevolve, angle = 360, axis = Y)
 |