* Change array functions to call user function with keyword args * Fix KCL to use keyword params * Remove unneeded positional call code * Update docs * Update output
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Dodecahedron
 | 
						|
// A regular dodecahedron or pentagonal dodecahedron is a dodecahedron composed of regular pentagonal faces, three meeting at each vertex. This example shows constructing the a dodecahedron with a series of intersects.
 | 
						|
 | 
						|
// Set units
 | 
						|
@settings(defaultLengthUnit = in, kclVersion = 1.0)
 | 
						|
 | 
						|
// Define the dihedral angle for a regular dodecahedron
 | 
						|
dihedral = 116.565
 | 
						|
 | 
						|
// Create a face template function that makes a large thin cube
 | 
						|
fn createFaceTemplate(@dither) {
 | 
						|
  baseSketch = startSketchOn(XY)
 | 
						|
    |> startProfile(at = [-1000 - dither, -1000 - dither])
 | 
						|
    |> line(endAbsolute = [1000 + dither, -1000 - dither])
 | 
						|
    |> line(endAbsolute = [1000 + dither, 1000 + dither])
 | 
						|
    |> line(endAbsolute = [-1000 - dither, 1000 + dither])
 | 
						|
    |> close()
 | 
						|
  extruded = extrude(baseSketch, length = 1000 + dither + 1000)
 | 
						|
  return extruded
 | 
						|
    |> translate(x = 0, y = 0, z = -260 - dither)
 | 
						|
}
 | 
						|
 | 
						|
// Define the rotations array with [pitch, roll, yaw, dither] for each face
 | 
						|
faceRotations = [
 | 
						|
  [0, 0, 0, 0],
 | 
						|
  // face1 - reference face
 | 
						|
  [dihedral, 0, 0, 0.1],
 | 
						|
  // face2
 | 
						|
  [dihedral, 0, 72, 0.2],
 | 
						|
  // face3
 | 
						|
  [dihedral, 0, 144, 0.3],
 | 
						|
  // face4
 | 
						|
  [dihedral, 0, 216, 0.4],
 | 
						|
  // face5
 | 
						|
  [dihedral, 0, 288, 0.5],
 | 
						|
  // face6
 | 
						|
  [180, 0, 0, 0.6],
 | 
						|
  // face7
 | 
						|
  [180 - dihedral, 0, 36, 0.7],
 | 
						|
  // face8
 | 
						|
  [180 - dihedral, 0, 108, 0.8],
 | 
						|
  // face9
 | 
						|
  [180 - dihedral, 0, 180, 0.9],
 | 
						|
  // face10
 | 
						|
  [180 - dihedral, 0, 252, 0.11],
 | 
						|
  // face11
 | 
						|
  [180 - dihedral, 0, 324, 0.12],
 | 
						|
  // face12
 | 
						|
]
 | 
						|
 | 
						|
// Create faces by mapping over the rotations array
 | 
						|
dodecFaces = map(
 | 
						|
  faceRotations,
 | 
						|
  f = fn(@rotation) {
 | 
						|
    return createFaceTemplate(rotation[3])
 | 
						|
      |> rotate(
 | 
						|
           pitch = rotation[0],
 | 
						|
           roll = rotation[1],
 | 
						|
           yaw = rotation[2],
 | 
						|
           global = true,
 | 
						|
         )
 | 
						|
  },
 | 
						|
)
 | 
						|
 | 
						|
fn calculateArrayLength(@arr) {
 | 
						|
  return reduce(
 | 
						|
    arr,
 | 
						|
    initial = 0,
 | 
						|
    f = fn(@item, accum) {
 | 
						|
      return accum + 1
 | 
						|
    },
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
fn createIntersection(@solids) {
 | 
						|
  fn reduceIntersect(@previous, accum) {
 | 
						|
    return intersect([previous, accum])
 | 
						|
  }
 | 
						|
  lastIndex = calculateArrayLength(solids) - 1
 | 
						|
  lastSolid = solids[lastIndex]
 | 
						|
  remainingSolids = pop(solids)
 | 
						|
  return reduce(remainingSolids, initial = lastSolid, f = reduceIntersect)
 | 
						|
}
 | 
						|
 | 
						|
// Apply intersection to all faces
 | 
						|
createIntersection(dodecFaces)
 |