Files
modeling-app/public/kcl-samples/gridfinity-bins/main.kcl
Adam Chalmers 89bae66257 KCL: User-defined KCL functions in examples etc now use keywords (#6603)
Preparing for the removal of positional functions from the language. The first big step is to change all our KCL code examples, test code, public samples etc to all use keyword functions.

Apologies for how large this PR is. Most of it is:

- Changing example KCL that defined its own functions, so the functions now use keyword arguments rather than positional arguments. E.g. change `cube([20, 20])` to be `cube(center = [20, 20])`.
- Some parts of the code assumed positional code and didn't handle keyword calls, e.g. the linter would only check for positional calls to startSketchOn. Now they should work with either positional or keyword.
- Update all the artifacts

This does _not_ remove support for positional calls. That will be in a follow-up PR.
2025-05-01 12:36:51 -04:00

169 lines
4.8 KiB
Plaintext

// Gridfinity Bins
// Gridfinity is a system to help you work more efficiently. This is a system invented by Zack Freedman. There are two main components the baseplate and the bins. The components are comprised of a matrix of squares. Allowing easy stacking and expansion
// Set units in millimeters (mm)
@settings(defaultLengthUnit = mm)
// Define parameters
binLength = 41.5
binHeight = 7.0
binBaseLength = 2.95
binTol = 0.25
binThk = 1.2
cornerRadius = 3.75
firstStep = 0.8
secondStep = 1.8
thirdStep = 2.15
magOuterDiam = 6.5
magOffset = 4.8
magDepth = 2.4
// Number of bins in each direction
countBinWidth = 2
countBinLength = 3
countBinHeight = 2
// The total height of the baseplate is a summation of the vertical heights of the baseplate steps
height = firstStep + secondStep + thirdStep
// Define a function which builds the profile of the baseplate bin
fn face(@plane) {
faceSketch = startSketchOn(plane)
|> startProfile(at = [binBaseLength + binTol, 0])
|> yLine(length = height)
|> xLine(length = -binBaseLength)
|> angledLine(angle = -45, lengthY = thirdStep)
|> yLine(length = -secondStep)
|> angledLine(angle = -45, lengthY = firstStep)
|> close()
return faceSketch
}
// Extrude a single side of the bin
singleSide = extrude(face(offsetPlane(YZ, offset = cornerRadius + binTol)), length = binLength - (cornerRadius * 2))
// Create the other sides of the bin by using a circular pattern
sides = patternCircular3d(
singleSide,
arcDegrees = 360,
axis = [0, 0, 1],
center = [
(binLength + 2 * binTol) / 2,
(binLength + 2 * binTol) / 2,
0
],
instances = 4,
rotateDuplicates = true,
)
// Define an axis axis000
axis000 = {
direction = [0.0, 1.0],
origin = [
cornerRadius + binTol,
cornerRadius + binTol
]
}
// Create a single corner of the bin
singleCorner = revolve(face(offsetPlane(YZ, offset = cornerRadius + binTol)), angle = -90, axis = axis000)
// Create the corners of the bin
corners = patternCircular3d(
singleCorner,
arcDegrees = 360,
axis = [0, 0, 1],
center = [
(binLength + 2 * binTol) / 2,
(binLength + 2 * binTol) / 2,
0
],
instances = 4,
rotateDuplicates = true,
)
singleBinFill = startSketchOn(XY)
|> startProfile(at = [
binBaseLength + binTol,
binBaseLength + binTol
])
|> line(end = [binLength - (binBaseLength * 2), 0], tag = $line000)
|> line(end = [0, binLength - (binBaseLength * 2)], tag = $line001)
|> xLine(endAbsolute = profileStartX(%), tag = $line002)
|> close(tag = $line003)
|> extrude(length = height)
|> fillet(
radius = firstStep,
tags = [
getNextAdjacentEdge(line000),
getPreviousAdjacentEdge(line000),
getNextAdjacentEdge(line002),
getPreviousAdjacentEdge(line002)
],
)
magCutout000 = startSketchOn(singleBinFill, face = START)
|> circle(
center = [
-magOffset - binBaseLength - binTol,
magOffset + binBaseLength + binTol
],
radius = magOuterDiam / 2,
)
|> patternCircular2d(
arcDegrees = 360,
center = [
(-binLength + 2 * binTol) / 2,
(binLength + 2 * binTol) / 2
],
instances = 4,
rotateDuplicates = true,
)
|> extrude(length = -magDepth)
// Create the baseplate by patterning sides
binSides = patternLinear3d(
sides,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// Create the corners of the baseplate by patterning the corners
binCorners = patternLinear3d(
corners,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// Create the fill of the bin by patterning the corners
binFill = patternLinear3d(
singleBinFill,
axis = [1.0, 0.0, 0.0],
instances = countBinWidth,
distance = binLength + binTol * 2,
)
|> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength + binTol * 2)
// Create the top of the bin
binTop = startSketchOn(offsetPlane(XY, offset = height))
|> startProfile(at = [0, 0])
|> xLine(length = (binLength + 2 * binTol) * countBinWidth, tag = $line010)
|> yLine(length = (binLength + 2 * binTol) * countBinLength, tag = $line011)
|> xLine(endAbsolute = profileStartX(%), tag = $line012)
|> close(tag = $line013)
|> extrude(length = binHeight * countBinHeight)
|> fillet(
radius = cornerRadius,
tags = [
getNextAdjacentEdge(line010),
getPreviousAdjacentEdge(line010),
getNextAdjacentEdge(line012),
getPreviousAdjacentEdge(line012)
],
)
|> shell(faces = [END], thickness = binThk)