Stool¶
projects.stool
A stool: four round legs wedged through a solid seat, round stretchers between them; straight legs (splayed ones come later).
The seat, glued up from seat_boards boards edge to edge, its grain
from side to side, is height above the floor; its arrises are
chamfered all round on top. The legs' axes are leg_inset in from the
seat's ends and edges; their round tenons, tenon wide, go through the
seat flush with its top, each wedged in a kerf across the seat's grain,
so that the wedge spreads the tenon along the grain and doesn't split
the seat. The stretchers (their axes at stretcher_heights, for the
front and back and for the sides) have round tenons in cross holes in
the legs, the side ones higher, so that the holes don't meet.
Parameters¶
| Parameter | Default |
|---|---|
width |
360 |
depth |
300 |
height |
450 |
seat_boards |
2 |
leg_inset |
55 |
tenon |
25 |
stretcher_heights |
(150, 190) |
seat_chamfer |
3 |
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¶
seat 360 x 150 x 30 mm oak, 2 pieces: seat_1, seat_2
- chamfer 3 mm on top_face_left_end_arris
- chamfer 3 mm on top_face_right_end_arris
- chamfer 3 mm on top_face_front_edge_arris
- 2 x through hole ø25, in bottom_face, 55 and 305 from left_end; 55 from front_edge
leg ø40 x 450 mm oak, 4 pieces: leg_front_left, leg_back_right; mirror image: leg_front_right, leg_back_left
- chamfer 2 mm around left_end
- round tenon ø25, 30 long, a saw kerf 2 mm, 20 deep, for a wedge, on right_end
- hole ø16, 27 deep, in bottom_face, 150 from left_end, centered
- hole ø16, 27 deep, in back_edge, 190 from left_end, centered
wedge 20 x 6 x 24 mm oak, 4 pieces: wedge_front_left, wedge_front_right, wedge_back_right, wedge_back_left
- taper 2 mm on front_edge towards right_end
- taper 2 mm on back_edge towards right_end
stretcher_front_back ø25 x 260 mm oak, 2 pieces: stretcher_front, stretcher_back
- round tenon ø16, 25 long, on left_end
- round tenon ø16, 25 long, on right_end
stretcher_right_left ø25 x 200 mm oak, 2 pieces: stretcher_right, stretcher_left
- round tenon ø16, 25 long, on left_end
- round tenon ø16, 25 long, on right_end
Code¶
From woodwright/examples/projects.py, which imports the names it uses (see From an example to your own design):
def stool(
width: float = 360,
depth: float = 300,
height: float = 450,
seat_boards: int = 2,
leg_inset: float = 55,
tenon: float = 25,
stretcher_heights: tuple[float, float] = (150, 190),
seat_chamfer: float = 3,
stock: Stock = THICK_OAK,
) -> Assembly:
"""A stool: four round legs wedged through a solid seat, round stretchers
between them; straight legs (splayed ones come later).
The seat, glued up from `seat_boards` boards edge to edge, its grain
from side to side, is `height` above the floor; its arrises are
chamfered all round on top. The legs' axes are `leg_inset` in from the
seat's ends and edges; their round tenons, `tenon` wide, go through the
seat flush with its top, each wedged in a kerf across the seat's grain,
so that the wedge spreads the tenon along the grain and doesn't split
the seat. The stretchers (their axes at `stretcher_heights`, for the
front and back and for the sides) have round tenons in cross holes in
the legs, the side ones higher, so that the holes don't meet.
"""
floor = orient(at=(0, 0, height - stock.thickness), top_face=UP, back_edge=BACK)
asm = Assembly("stool", root_location=floor)
seat = [
asm.add(Board(f"seat_{i + 1}", stock, length=width, width=depth / seat_boards))
for i in range(seat_boards)
]
for a, b in itertools.pairwise(seat):
asm.join(Butt(a.back_edge, b.front_edge))
for board in seat:
sides = [board.left_end, board.right_end]
sides += [
edge
for edge, outer in [(board.front_edge, seat[0]), (board.back_edge, seat[-1])]
if board is outer
]
for side in sides:
board.cut(Chamfer(board.arris(board.top_face, side), size=seat_chamfer))
legs = _wedged_legs(
asm,
seat,
height - stock.thickness,
(leg_inset, leg_inset),
tenon,
kerf=2,
flare=2,
wedge_length=20,
)
front_back, sides = stretcher_heights
spans = [
("stretcher_front", 0, front_back),
("stretcher_right", 1, sides),
("stretcher_back", 2, front_back),
("stretcher_left", 3, sides),
]
between = (width - 2 * leg_inset, depth - 2 * leg_inset)
_rod_stretchers(asm, legs, spans, between, tenon=16)
return asm
Exported with woodwright 0.9.0 on 2026-10-25.