Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions content/pages/docs/kcl-samples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ When you submit a PR to add or modify KCL samples, images will be generated and
[![c-shape-solid](screenshots/c-shape-solid.png)](c-shape-solid/main.kcl)
#### [car-wheel-assembly](car-wheel-assembly/main.kcl) ([screenshot](screenshots/car-wheel-assembly.png))
[![car-wheel-assembly](screenshots/car-wheel-assembly.png)](car-wheel-assembly/main.kcl)
#### [cassette](cassette/main.kcl) ([screenshot](screenshots/cassette.png))
[![cassette](screenshots/cassette.png)](cassette/main.kcl)
#### [clock](clock/main.kcl) ([screenshot](screenshots/clock.png))
[![clock](screenshots/clock.png)](clock/main.kcl)
#### [coilover-assembly](coilover-assembly/main.kcl) ([screenshot](screenshots/coilover-assembly.png))
Expand Down Expand Up @@ -119,6 +121,8 @@ When you submit a PR to add or modify KCL samples, images will be generated and
[![gridfinity-bins-stacking-lip](screenshots/gridfinity-bins-stacking-lip.png)](gridfinity-bins-stacking-lip/main.kcl)
#### [hammer](hammer/main.kcl) ([screenshot](screenshots/hammer.png))
[![hammer](screenshots/hammer.png)](hammer/main.kcl)
#### [hand-trolley](hand-trolley/main.kcl) ([screenshot](screenshots/hand-trolley.png))
[![hand-trolley](screenshots/hand-trolley.png)](hand-trolley/main.kcl)
#### [helical-gear](helical-gear/main.kcl) ([screenshot](screenshots/helical-gear.png))
[![helical-gear](screenshots/helical-gear.png)](helical-gear/main.kcl)
#### [helical-planetary-gearset](helical-planetary-gearset/main.kcl) ([screenshot](screenshots/helical-planetary-gearset.png))
Expand Down Expand Up @@ -225,6 +229,8 @@ When you submit a PR to add or modify KCL samples, images will be generated and
[![split-washer-spring-version](screenshots/split-washer-spring-version.png)](split-washer-spring-version/main.kcl)
#### [spool](spool/main.kcl) ([screenshot](screenshots/spool.png))
[![spool](screenshots/spool.png)](spool/main.kcl)
#### [sprocket](sprocket/main.kcl) ([screenshot](screenshots/sprocket.png))
[![sprocket](screenshots/sprocket.png)](sprocket/main.kcl)
#### [spur-gear](spur-gear/main.kcl) ([screenshot](screenshots/spur-gear.png))
[![spur-gear](screenshots/spur-gear.png)](spur-gear/main.kcl)
#### [spur-reduction-gearset](spur-reduction-gearset/main.kcl) ([screenshot](screenshots/spur-reduction-gearset.png))
Expand Down
1 change: 1 addition & 0 deletions content/pages/docs/kcl-samples/bike-hub-washer/main.kcl
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Bike hub washer
// Washer to protect the hub, it is made for the front wheel and might work for various generic front hubs.

@settings(defaultLengthUnit = mm)
Expand Down
63 changes: 63 additions & 0 deletions content/pages/docs/kcl-samples/cassette/main.kcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Sprocket Cassette
// A sprocket cassette is a stack of individual sprockets that mount together on a splined hub to provide multiple gear ratios

// Set Units
@settings(defaultLengthUnit = in)

// Define parameters
// #25 chain size
chainPitch = 1 / 4
rollerWidth = 3 / 32
rollerDiameter = 0.13
pinDiameter = 3 / 32
shaftDiameter = 12mm

// Define a function to create a sprocket with a specific number of teeth
fn sprocket(@speed, nTeeth) {
pitchDiameter = chainPitch * 1 / sin(180deg / nTeeth)

// Sketch the central mounting spine to be cut from each sprocket profile
spline = startSketchOn(XZ)
|> startProfile(at = [shaftDiameter / 2, 0])
|> arc(angleStart = 0, angleEnd = 10, radius = shaftDiameter / 2)
|> line(endAbsolute = polar(angle = 10deg, length = shaftDiameter / 2 - 0.01))
|> arc(angleStart = 10, angleEnd = 20, radius = shaftDiameter / 2 - 0.01)
|> line(endAbsolute = polar(angle = 20deg, length = shaftDiameter / 2))
|> patternCircular2d(instances = 360 / 20, center = [0, 0])
|> close()

// build the sprocket
sprocket = startSketchOn(offsetPlane(XZ, offset = -speed * rollerWidth))
|> startProfile(at = [
(pitchDiameter - rollerDiameter) / 2,
0
])
|> arc(angleStart = 180, angleEnd = 90 + 360 / nTeeth, diameter = rollerDiameter)
|> tangentialArc(angle = 28deg, radius = chainPitch - (rollerDiameter / 2))
|> arc(interiorAbsolute = polar(angle = 170 / nTeeth, length = sqrt(lastSegX() ^ 2 + lastSegY() ^ 2)), endAbsolute = polar(angle = 180 / nTeeth, length = sqrt(lastSegX() ^ 2 + lastSegY() ^ 2)))
|> mirror2d(axis = X)
|> patternCircular2d(instances = nTeeth, center = [0, 0])
|> close()
|> subtract2d(tool = spline)
|> extrude(length = rollerWidth / 2)

// Place a mounting spacer between each sprocket body
spacer = startSketchOn(sprocket, face = END)
|> circle(center = [0, 0], diameter = shaftDiameter * 1.3)
|> subtract2d(tool = circle(center = [0, 0], diameter = shaftDiameter))
|> extrude(length = rollerWidth / 2, method = NEW)
|> appearance(color = "#0f0f0f")

return sprocket
}

// Create a 7-speed cassette from 11 to 36 teeth
reduce(
[11, 15, 19, 23, 27, 31, 36],
initial = 0_,
f = fn(@nTeeth, accum) {
// speed index is accum + 1 since accum starts at 0
sprocket(accum + 1, nTeeth = nTeeth)
return accum + 1
},
)
203 changes: 203 additions & 0 deletions content/pages/docs/kcl-samples/hand-trolley/axle.kcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
// Hand Trolley Axle

// Set units
@settings(defaultLengthUnit = in)

// Import parameters
import * from "parameters.kcl"

// Model the lifting grate as a sheet metal part
grate = startSketchOn(-YZ)
|> startProfile(at = [-grateDepth, 0])
|> yLine(length = grateThickness, tag = $seg11)
|> xLine(endAbsolute = tubeDiameter)
|> tangentialArc(angle = 90deg, radius = bendRadius)
|> yLine(length = 1.5, tag = $seg01)
|> xLine(length = grateThickness, tag = $seg10)
|> yLine(length = -segLen(seg01))
|> tangentialArc(angle = -90deg, radius = bendRadius + grateThickness)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> extrude(
length = frameWidth + tubeDiameter,
symmetric = true,
tagStart = $capStart001,
tagEnd = $capEnd001,
)
|> fillet(
radius = 1,
tags = [
getCommonEdge(faces = [seg10, capStart001]),
getCommonEdge(faces = [seg11, capEnd001]),
getCommonEdge(faces = [seg10, capEnd001]),
getCommonEdge(faces = [seg11, capStart001])
],
)

// Model the path of the outer rail of the trolley frame
outerRail = startSketchOn(offsetPlane(XZ, offset = tubeDiameter / 2))
|> startProfile(at = [-frameWidth / 2, grateThickness])
|> yLine(endAbsolute = height - tubeBend)
|> tangentialArc(angle = -90deg, radius = tubeBend)
|> xLine(endAbsolute = 0, tag = $seg02)
|> xLine(length = segLen(seg02))
|> tangentialArc(angle = -90deg, radius = tubeBend)
|> yLine(endAbsolute = profileStartY())

// Sweep the tube profile around the outer rail path to give it a thickness
outerRailThicken = startSketchOn(offsetPlane(XY, offset = grateThickness))
|> circle(center = [-frameWidth / 2, -tubeDiameter / 2], diameter = tubeDiameter)
|> sweep(path = outerRail)

// The minimum allowable straight length should equal double the bend radius
centerRail = startSketchOn(YZ)
|> startProfile(at = [-tubeDiameter / 2, grateThickness])
|> yLine(length = tubeBend * 2)
|> tangentialArc(angle = 30deg, radius = tubeBend, tag = $seg03)
|> angledLine(angle = tangentToEnd(seg03), length = tubeBend * 2)
|> tangentialArc(angle = -30deg, radius = tubeBend, tag = $seg04)
|> angledLine(angle = tangentToEnd(seg04), endAbsoluteY = height - (tubeBend * 3.835), tag = $seg27)
|> tangentialArc(angle = 45deg, radius = tubeBend, tag = $seg05)
|> angledLine(angle = tangentToEnd(seg05), length = tubeBend * 2)
|> tangentialArc(angle = -135deg, radius = tubeBend, tag = $seg06)
|> angledLine(angle = tangentToEnd(seg06), endAbsoluteX = -tubeDiameter / 2)

// Sweep the tube profile around the center rail path to give it a thickness
centerRailThicken = startSketchOn(XY)
|> circle(center = [0, -tubeDiameter / 2], diameter = tubeDiameter)
|> sweep(path = centerRail)

// Model supporting ribs for the trolley frame
rib = startSketchOn(offsetPlane(XY, offset = 14))
|> startProfile(at = [
-(frameWidth - tubeDiameter) / 2 - .05,
-.6
])
|> arc(interiorAbsolute = [0, -3.15], endAbsolute = [-profileStartX(), profileStartY()], tag = $seg14)
|> angledLine(angle = tangentToEnd(seg14) + 90, length = grateThickness)
|> arc(interiorAbsolute = [0, -3.15 + grateThickness], endAbsolute = [-lastSegX(), lastSegY()])
|> line(endAbsolute = [profileStartX(), profileStartY()])
|> close()
|> extrude(length = 1)
|> patternLinear3d(instances = 3, distance = segLen(seg27) / 3, axis = [0, 0, 1])

// Create welded brackets to support the axle
brackets = startSketchOn(offsetPlane(YZ, offset = frameWidth / 2))
|> startProfile(at = [-tubeDiameter, wheelDiameter / 2 - 3])
|> yLine(length = 0.54, tag = $seg16)
|> tangentialArc(angle = 60deg, radius = bendRadius, tag = $seg07)
|> angledLine(angle = tangentToEnd(seg07), length = 2.58, tag = $seg15)
|> tangentialArc(angle = -90deg, radius = bendRadius + grateThickness)
|> tangentialArc(angle = 60deg, radius = 1.5)
|> tangentialArc(angle = -90deg, radius = bendRadius + grateThickness, tag = $seg08)
|> angledLine(angle = tangentToEnd(seg08), length = segLen(seg15))
|> tangentialArc(angle = 60deg, radius = bendRadius, tag = $seg09)
|> yLine(length = segLen(seg16))
|> xLine(length = grateThickness)
|> yLine(length = -segLen(seg16))
|> tangentialArc(angle = -60deg, radius = bendRadius + grateThickness, tag = $seg17)
|> angledLine(angle = tangentToEnd(seg17), length = segLen(seg15))
|> tangentialArc(angle = 90deg, radius = bendRadius)
|> tangentialArc(angle = -60deg, radius = 1.5 + grateThickness)
|> tangentialArc(angle = 90deg, radius = bendRadius, tag = $seg18)
|> angledLine(angle = tangentToEnd(seg18), length = segLen(seg15))
|> tangentialArc(angle = -60deg, radius = bendRadius + grateThickness, tag = $seg19)
|> yLine(length = -segLen(seg16))
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> extrude(length = 0.75 * tubeDiameter, symmetric = true)

// Model a bearing for the axle on each bracket
axlebearing = startSketchOn(offsetPlane(YZ, offset = frameWidth / 2))
|> circle(center = [-3.67, wheelDiameter / 2], diameter = 1)
|> subtract2d(tool = circle(center = [-3.67, wheelDiameter / 2], diameter = .75))
|> extrude(length = tubeDiameter, symmetric = true)

patternLinear3d(
[brackets, axlebearing],
instances = 2,
distance = frameWidth,
axis = [-1, 0, 0],
)

axle = startSketchOn(-YZ)
|> circle(center = [3.67, wheelDiameter / 2], diameter = 0.75)
|> extrude(length = frameWidth + 4, symmetric = true)

// Revolve a wheel that mounts to the trolley axle
wheel = startSketchOn(offsetPlane(XY, offset = wheelDiameter / 2))
|> startProfile(at = [
-frameWidth / 2 - 0.65,
-3.67 + 0.75 / 2
])
|> xLine(length = -2.7)
|> yLine(endAbsolute = -3.67)
|> xLine(length = -0.5)
|> yLine(length = 0.44)
|> tangentialArc(angle = -85deg, radius = 0.2, tag = $seg21)
|> angledLine(angle = tangentToEnd(seg21), length = 1.14)
|> tangentialArc(angle = 85deg, radius = 0.1, tag = $seg22)
|> angledLine(angle = tangentToEnd(seg22), length = 1.28)
|> tangentialArc(angle = 85deg, radius = 0.1, tag = $seg23)
|> angledLine(angle = tangentToEnd(seg23), length = 0.95)
|> tangentialArc(angle = -80deg, radius = 0.2, tag = $seg24)
|> angledLine(angle = tangentToEnd(seg24), length = 0.77)
|> xLine(length = 0.15)
|> angledLine(angle = tangentToEnd(seg24), length = -0.7)
|> xLine(length = 2)
|> angledLine(angle = -tangentToEnd(seg24), length = -0.7)
|> xLine(length = 0.12)
|> angledLine(angle = -tangentToEnd(seg24), length = 0.77)
|> tangentialArc(angle = -80deg, radius = 0.2, tag = $seg25)
|> angledLine(angle = tangentToEnd(seg25), length = 0.43)
|> tangentialArc(angle = 85deg, radius = 0.1)
|> yLine(length = -0.91)
|> tangentialArc(angle = 85deg, radius = 0.1)
|> angledLine(angle = -tangentToEnd(seg25), endAbsoluteX = profileStartX())
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve(axis = {
direction = [1.0, 0.0],
origin = [0.0, -3.67]
})

tire = startSketchOn(offsetPlane(XY, offset = wheelDiameter / 2))
|> startProfile(at = [-frameWidth / 2 - 3.55, -1.05])
|> angledLine(angle = 100, length = 0.73, tag = $seg26)
|> tangentialArc(endAbsolute = [lastSegX(), wheelDiameter / 2.1 - 3.67])
|> tangentialArc(angle = 10deg, radius = 1)
|> tangentialArc(angle = -90deg, radius = wheelDiameter / 100, tag = $seg12)
|> angledLine(angle = tangentToEnd(seg12), length = 2.25)
|> tangentialArc(angle = -90deg, radius = wheelDiameter / 100)
|> tangentialArc(angle = 10deg, radius = 1)
|> tangentialArc(endAbsolute = [lastSegX(), segEndY(seg26)], tag = $seg13)
|> angledLine(angle = -100deg, length = segLen(seg26))
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
|> revolve(axis = {
direction = [1.0, 0.0],
origin = [0.0, -3.67]
})
|> appearance(color = "#010101", metalness = 10, roughness = 70)

patternCircular3d(
[wheel, tire],
instances = 2,
axis = [0, 0, 1],
center = [0, -3.67, 0],
)

appearance(
[
grate,
brackets,
axlebearing,
outerRailThicken,
centerRailThicken,
rib,
wheel
],
color,
metalness = 40,
roughness,
)
14 changes: 14 additions & 0 deletions content/pages/docs/kcl-samples/hand-trolley/main.kcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Hand Trolley
// A hand trolley, also known as a hand truck, is a small, wheeled cart with a weldment frame, used to move heavy or bulky items over short distances. It's essentially a simple lever system that makes lifting and moving objects much easier

// Set units
@settings(defaultLengthUnit = in)

// Import parameters
import * from "parameters.kcl"
import "wheel.kcl" as wheel
import "weldment.kcl" as weldment

import "axle.kcl" as axle
wheel
|> patternCircular3d(instances = 2, axis = [0, 0, 1], center = [0, -3.67, 0])
17 changes: 17 additions & 0 deletions content/pages/docs/kcl-samples/hand-trolley/parameters.kcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Set units
@settings(defaultLengthUnit = in)

// Define parameters
export frameWidth = 20
export tubeDiameter = 1
export height = 51
export grateDepth = 10
export grateThickness = 0.090
export wheelDiameter = 10
export color = "#c00c0c"
export metalness = 40
export roughness = 30

// Calculate stock material bend radii
export tubeBend = tubeDiameter * 2.5
export bendRadius = grateThickness * 1.25
Loading
Loading