89 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Fan
 | 
						|
// Spinning axial fan that moves airflow
 | 
						|
 | 
						|
// Set units
 | 
						|
@settings(defaultLengthUnit = mm)
 | 
						|
 | 
						|
// Import parameters
 | 
						|
import * from "parameters.kcl"
 | 
						|
 | 
						|
// Model the center of the fan
 | 
						|
fanCenter = startSketchOn(XZ)
 | 
						|
  |> startProfileAt([-0.0001, fanHeight], %)
 | 
						|
  |> xLine(endAbsolute = -15 + 1.5)
 | 
						|
  |> tangentialArc(radius = 1.5, angle = 90)
 | 
						|
  |> yLine(endAbsolute = 4.5)
 | 
						|
  |> xLine(endAbsolute = -13)
 | 
						|
  |> yLine(endAbsolute = profileStartY(%) - 5)
 | 
						|
  |> tangentialArc(radius = 1, angle = -90)
 | 
						|
  |> xLine(endAbsolute = -1)
 | 
						|
  |> yLine(length = 2)
 | 
						|
  |> xLine(length = -0.15)
 | 
						|
  |> line(endAbsolute = [
 | 
						|
       profileStartX(%) - 1,
 | 
						|
       profileStartY(%) - 1.4
 | 
						|
     ])
 | 
						|
  |> xLine(endAbsolute = profileStartX(%))
 | 
						|
  |> yLine(endAbsolute = profileStartY(%))
 | 
						|
  |> close()
 | 
						|
  |> revolve(axis = {
 | 
						|
       direction = [0.0, 1.0],
 | 
						|
       origin = [0.0, 0.0]
 | 
						|
     })
 | 
						|
  |> appearance(color = "#f3e2d8")
 | 
						|
 | 
						|
// Create a function for a lofted fan blade cross section that rotates about the center hub of the fan
 | 
						|
fn fanBlade(offsetHeight, startAngle) {
 | 
						|
  fanBlade = startSketchOn(offsetPlane(XY, offset = offsetHeight))
 | 
						|
    |> startProfileAt([
 | 
						|
         15 * cos(toRadians(startAngle)),
 | 
						|
         15 * sin(toRadians(startAngle))
 | 
						|
       ], %)
 | 
						|
    |> arc(angleStart = startAngle, angleEnd = startAngle + 14, radius = 15)
 | 
						|
    |> arc(
 | 
						|
         endAbsolute = [
 | 
						|
           fanSize * 22 / 50 * cos(toRadians(startAngle - 20)),
 | 
						|
           fanSize * 22 / 50 * sin(toRadians(startAngle - 20))
 | 
						|
         ],
 | 
						|
         interiorAbsolute = [
 | 
						|
           fanSize * 11 / 50 * cos(toRadians(startAngle + 3)),
 | 
						|
           fanSize * 11 / 50 * sin(toRadians(startAngle + 3))
 | 
						|
         ],
 | 
						|
       )
 | 
						|
    |> arc(
 | 
						|
         endAbsolute = [
 | 
						|
           fanSize * 22 / 50 * cos(toRadians(startAngle - 24)),
 | 
						|
           fanSize * 22 / 50 * sin(toRadians(startAngle - 24))
 | 
						|
         ],
 | 
						|
         interiorAbsolute = [
 | 
						|
           fanSize * 22 / 50 * cos(toRadians(startAngle - 22)),
 | 
						|
           fanSize * 22 / 50 * sin(toRadians(startAngle - 22))
 | 
						|
         ],
 | 
						|
       )
 | 
						|
    |> arc(
 | 
						|
         endAbsolute = [profileStartX(%), profileStartY(%)],
 | 
						|
         interiorAbsolute = [
 | 
						|
           fanSize * 11 / 50 * cos(toRadians(startAngle - 5)),
 | 
						|
           fanSize * 11 / 50 * sin(toRadians(startAngle - 5))
 | 
						|
         ],
 | 
						|
       )
 | 
						|
    |> close()
 | 
						|
  return fanBlade
 | 
						|
}
 | 
						|
 | 
						|
// Loft the fan blade cross sections into a single blade, then pattern them about the fan center
 | 
						|
loft([
 | 
						|
       fanBlade(4.5, 50),
 | 
						|
       fanBlade((fanHeight - 2 - 4) / 2, 30),
 | 
						|
       fanBlade(fanHeight - 2, 0)
 | 
						|
     ])
 | 
						|
  |> appearance(color = "#f3e2d8")
 | 
						|
  |> patternCircular3d(
 | 
						|
       %,
 | 
						|
       instances = 9,
 | 
						|
       axis = [0, 0, 1],
 | 
						|
       center = [0, 0, 0],
 | 
						|
       arcDegrees = 360,
 | 
						|
       rotateDuplicates = true,
 | 
						|
     )
 |