// 3D Boaty Function Library // The following file describes various functions to build the 3D boaty. The name of this file is a bit of misnomer, the shape of the object is a typical park bench. // Set units in millimeters (mm) @settings(defaultLengthUnit = mm, kclVersion = 1.0) export dividerThickness = 4 fn dividerSketch(@plane) { sketch000 = startSketchOn(plane) |> startProfile(at = [-16.82, 21.2]) |> line(end = [-0.13, -1.27]) |> tangentialArc(endAbsolute = [-15.94, profileStartY(%) - 7.73]) |> tangentialArc(endAbsolute = [-16.6, profileStartY(%) - 15.52]) |> tangentialArc(endAbsolute = [-18.38, profileStartY(%) - 18.63]) |> line(end = [-1.25, -2.6]) |> xLine(length = 6.04) |> line(end = [6.68, 7.87]) |> tangentialArc(endAbsolute = [10.06, profileStartY(%) - 12.69]) |> line(end = [7.28, -8.47]) |> xLine(length = 5.98) |> line(end = [-1.3, 3.01]) |> tangentialArc(endAbsolute = [22.45, profileStartY(%) - 2.84]) |> tangentialArc(endAbsolute = [25.08, profileStartY(%) + 6.42]) |> line(end = [2.35, 16.36]) |> line(end = [1.78, 1.15]) |> tangentialArc(endAbsolute = [23.93, profileStartY(%) + 27.29]) |> line(end = [-1.92, 0.21]) |> line(end = [-3.74, -26.54]) |> tangentialArc(endAbsolute = [15.13, profileStartY(%) - 1.72]) |> tangentialArc(endAbsolute = profileStart(%)) |> close() return sketch000 } export fn divider(@plane) { right = dividerSketch(plane) |> extrude(length = dividerThickness / 2) left = dividerSketch(plane) |> extrude(length = -dividerThickness / 2) shell(right, thickness = 1.5, faces = [END]) shell(left, thickness = 1.5, faces = [START]) return 0 } fn connectorSketch(@plane, start) { sketch001 = startSketchOn(plane) |> startProfile(at = start) |> polygon( radius = 1.2, numSides = 6, center = profileStart(%), inscribed = false, ) return sketch001 } export fn connector(@plane, length) { connectorSketch(plane, start = [-12, 8]) |> extrude(length) connectorSketch(plane, start = [16, 8]) |> extrude(length) return 0 } fn seatSlatSketch(@plane) { sketch003 = startSketchOn(plane) |> startProfile(at = [-7, 19]) |> line(end = [-10, 0.5]) |> line(end = [0.2, 2.5]) |> line(end = [1.5, 1.5]) |> line(end = [6.9, -0.5]) |> line(end = [1.5, -1.5]) |> line(endAbsolute = profileStart(%)) |> close() |> patternLinear2d(instances = 3, distance = 11, axis = [1, -0.05]) return sketch003 } export fn seatSlats(@plane, length) { seatSlatSketch(plane) |> extrude(length) return 0 } fn backSlatsSketch(@plane) { sketch004 = startSketchOn(plane) |> startProfile(at = [22, 38.5]) |> angledLine(angle = 173, length = 2) |> line(end = [-1.74, 2.03]) |> angledLine(angle = 82, length = 6.6) |> line(end = [2.23, 1.42]) |> angledLine(angle = -7, length = 2) |> line(endAbsolute = profileStart(%)) |> close() |> patternLinear2d(instances = 2, distance = 11, axis = [-0.137, -1]) return sketch004 } export fn backSlats(@plane, length) { b = backSlatsSketch(plane) |> extrude(length) return b } fn armRestPath(@plane) { sketch005 = startSketchOn(plane) |> startProfile(at = [20, 33]) |> xLine(length = -20) |> arc(angleStart = 90, angleEnd = 180, radius = 10) return sketch005 } fn armRestProfile(@plane, offset) { sketch006 = startSketchOn(plane) |> startProfile(at = [offset, 32.4]) |> xLine(length = 1.3) |> line(end = [0.3, 0.6]) |> line(end = [-0.3, 0.6]) |> xLine(length = -2.6) |> line(end = [-0.3, -0.6]) |> line(end = [0.3, -0.6]) |> close() return sketch006 } export fn armRest(@plane, offset) { path = armRestPath(offsetPlane(plane, offset = offset)) profile = armRestProfile(offsetPlane(-XZ, offset = 20), offset = -offset) sweep(profile, path = path) return 0 }