Skip to content

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.

Ladder, assembled

Ladder, exploded

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):

from woodwright.examples import frames

design = frames.ladder(height=1000)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Rung

rung

Stile

stile

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.