2025-03-06 18:01:24 -05:00
// Sheet Metal Bracket
// A component typically made from flat sheet metal through various manufacturing processes such as bending, punching, cutting, and forming. These brackets are used to support, attach, or mount other hardware components, often providing a structural or functional base for assembly.
2025-04-04 11:03:13 -07:00
// Set units
2025-05-06 08:44:03 +12:00
@settings(defaultLengthUnit = in, kclVersion = 1.0)
2025-03-06 18:01:24 -05:00
2025-04-01 11:28:09 -07:00
// Input bolt pattern dimensions to mount the bracket
mountingBoltDiameter = 1 / 4
mountingBoltPatternX = 7
mountingBoltPatternY = 4
2025-03-06 18:01:24 -05:00
2025-04-01 11:28:09 -07:00
// Input bolt pattern dimensions to mount a component to the bracket
componentBoltDiameter = 3 / 16
componentBoltPatternX = 2
componentBoltPatternY = 3
2025-03-06 18:01:24 -05:00
2025-04-04 11:03:13 -07:00
// Define bracket parameters such as sheet metal thickness, bend radius, flange length, etc.
2025-04-01 11:28:09 -07:00
hatHeight = 2.5
bendAngle = 75
thickness = 0.125
interiorBendRadius = 0.125
2025-04-04 11:03:13 -07:00
// Calculate remaining parameters
2025-04-01 11:28:09 -07:00
exteriorBendRadius = interiorBendRadius + thickness
overhang = 3 * mountingBoltDiameter
flangeLength = 6 * mountingBoltDiameter
flangeExtrusion = if mountingBoltPatternY > componentBoltPatternY {
mountingBoltPatternY + overhang * 2
} else {
componentBoltPatternY + overhang * 2
}
// Draw the extrusion profile of the sheet metal bracket
bracketProfile = startSketchOn(XZ)
2025-04-25 16:01:35 -05:00
|> startProfile(at = [
2025-04-01 11:28:09 -07:00
-mountingBoltPatternX / 2 - overhang,
0
2025-04-25 16:01:35 -05:00
])
2025-04-01 11:28:09 -07:00
|> xLine(length = flangeLength)
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = exteriorBendRadius, angle = bendAngle)
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|> angledLine(angle = bendAngle, endAbsoluteY = hatHeight - thickness, tag = $seg01)
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = interiorBendRadius, angle = -bendAngle)
2025-04-01 11:28:09 -07:00
|> xLine(endAbsolute = 0, tag = $seg02)
|> xLine(length = segLen(seg02))
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = interiorBendRadius, angle = -bendAngle)
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|> angledLine(angle = -bendAngle, length = segLen(seg01))
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = exteriorBendRadius, angle = bendAngle)
2025-04-01 11:28:09 -07:00
|> xLine(length = flangeLength)
|> yLine(length = thickness, tag = $seg03)
|> xLine(length = -flangeLength, tag = $seg04)
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = interiorBendRadius, angle = -bendAngle)
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|> angledLine(angle = 180 - bendAngle, length = segLen(seg01))
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = exteriorBendRadius, angle = bendAngle)
2025-04-01 11:28:09 -07:00
|> xLine(endAbsolute = 0, tag = $seg05)
|> xLine(length = -segLen(seg05))
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = exteriorBendRadius, angle = bendAngle)
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|> angledLine(angle = bendAngle - 180, length = segLen(seg01))
2025-04-11 14:17:20 -04:00
|> tangentialArc(radius = interiorBendRadius, angle = -bendAngle)
2025-04-01 11:28:09 -07:00
|> xLine(length = -flangeLength, tag = $seg06)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg07)
2025-03-06 18:01:24 -05:00
|> close()
2025-04-01 11:28:09 -07:00
|> extrude(length = flangeExtrusion)
2025-03-06 18:01:24 -05:00
|> fillet(
2025-04-01 11:28:09 -07:00
radius = flangeLength / 3,
2025-03-06 18:01:24 -05:00
tags = [
2025-04-01 11:28:09 -07:00
seg03,
getOppositeEdge(seg03),
seg07,
getOppositeEdge(seg07)
2025-03-26 08:53:34 -07:00
],
2025-03-06 18:01:24 -05:00
)
2025-04-01 11:28:09 -07:00
// Cut the bolt pattern in the left base flange
2025-04-14 05:58:19 -04:00
leftFlangeBoltPattern = startSketchOn(bracketProfile, face = seg04)
2025-04-01 11:28:09 -07:00
|> circle(center = [-mountingBoltPatternX / 2, overhang], radius = mountingBoltDiameter / 2)
|> patternLinear2d(
%,
instances = 2,
distance = mountingBoltPatternY,
axis = [0, 1],
)
|> extrude(length = -thickness)
// Cut the bolt pattern in the right base flange
2025-04-14 05:58:19 -04:00
rightFlangeBoltPattern = startSketchOn(bracketProfile, face = seg06)
2025-04-01 11:28:09 -07:00
|> circle(center = [mountingBoltPatternX / 2, overhang], radius = mountingBoltDiameter / 2)
|> patternLinear2d(
%,
instances = 2,
distance = mountingBoltPatternY,
axis = [0, 1],
)
|> extrude(length = -thickness)
// Provision the top flange with holes to mount an object
2025-04-14 05:58:19 -04:00
topFlangeBoltPattern = startSketchOn(bracketProfile, face = seg05)
2025-04-01 11:28:09 -07:00
|> circle(
center = [
-componentBoltPatternX / 2,
-componentBoltPatternY / 2 + flangeExtrusion / 2
2025-03-26 08:53:34 -07:00
],
2025-04-01 11:28:09 -07:00
radius = componentBoltDiameter / 2,
2025-03-06 18:01:24 -05:00
)
2025-04-01 11:28:09 -07:00
|> patternLinear2d(
%,
instances = 2,
distance = componentBoltPatternX,
axis = [1, 0],
)
|> patternLinear2d(
%,
instances = 2,
distance = componentBoltPatternY,
axis = [0, 1],
)
|> extrude(length = -thickness)
// Place a hole at the center of the component bolt pattern to reduce mass
2025-04-14 05:58:19 -04:00
centeredHole = startSketchOn(bracketProfile, face = seg05)
2025-04-01 11:28:09 -07:00
|> circle(center = [0, flangeExtrusion / 2], radius = 0.75)
|> extrude(length = -thickness)