Ladder¶
frames.ladder
A towel rail (a short ladder): rods in blind holes in the inside faces of two stiles, from 120 above their feet, evenly up to 80 below their tops.
width is between the stiles; each rod goes 20 mm into either.
Parameters¶
| Parameter | Default |
|---|---|
height |
800 |
width |
450 |
rungs |
4 |
stile_width |
45 |
stock |
30 mm board, oak |
Change them in a design file (see Change an example):
Drawings¶
The plans in one PDF: plans.pdf.
Cut list¶
stile 800 x 45 x 30 mm oak, 2 pieces: stile_left, stile_right
- 4 x hole ø25, 22 deep, in top_face, 120 to 720 every 200 from left_end; centered
rung ø25 x 490 mm oak, 4 pieces: rung_1, rung_2, rung_3, rung_4
Code¶
From woodwright/examples/frames.py, which imports the names it uses (see From an example to your own design):
def ladder(
height: float = 800,
width: float = 450,
rungs: int = 4,
stile_width: float = 45,
stock: Stock = LADDER_OAK,
) -> Assembly:
"""A towel rail (a short ladder): rods in blind holes in the inside faces
of two stiles, from 120 above their feet, evenly up to 80 below their tops.
`width` is between the stiles; each rod goes 20 mm into either.
"""
asm = Assembly("ladder", root_location=orient(right_end=UP, ref_face=(1, 0, 0)))
left = asm.add(Board("stile_left", stock, length=height, width=stile_width))
# The mirror image of the left one, its ref face inside too, its left end at the foot.
right = asm.add(Board("stile_right", stock, length=height, width=stile_width, mirror=True))
rod_stock = Stock.rod(diameter=25, species="oak")
pitch = (height - 120 - 80) / (rungs - 1)
for i in range(rungs):
rung = asm.add(Rod(f"rung_{i + 1}", rod_stock, length=width))
at = offset(120 - rod_stock.diameter / 2 + i * pitch, ref=left.left_end)
asm.join(RoundMortiseTenon(rung.left_end, left.top_face, length=20, position=at))
at = offset(120 - rod_stock.diameter / 2 + i * pitch, ref=right.left_end)
asm.join(RoundMortiseTenon(rung.right_end, right.top_face, length=20, position=at))
return asm
Exported with woodwright 0.9.0 on 2026-10-25.