Chair¶
projects.chair
A simple chair, all square; outside sizes of the frame.
The back legs run up into the back. Under the seat, rails rail_width
wide are tenoned into the legs as in a table frame, flush with the tops
of the front legs. The seat, a panel glued up from seat_boards boards
edge to edge, its grain from side to side, lies on them, its top
seat_height above the floor; it overhangs the frame by overhang at
the front and the sides and the back board is notched at the corners
around the back legs, flush with their outsides. The arrises around
the seat, top and bottom, are chamfered. Stretchers near the floor and
two rails in the back (their top edges at stretcher_heights, for the
front and back and for the sides, and at back_rails) have through
tenons standing protrusion proud of the legs, their ends chamfered.
The side stretchers are lower than the front and back ones, so that the
tenons don't meet inside the legs. Between the back rails stand
splats, as thick as the rails, with blind tenons in their edges. The
tops of the back legs are chamfered all round; the legs taper on their
inner sides from leg_taper_length above the floor, below the
stretchers, to leg_taper thinner at the floor.
Parameters¶
| Parameter | Default |
|---|---|
width |
440 |
depth |
420 |
seat_height |
450 |
height |
900 |
rail_width |
80 |
stretcher_width |
30 |
stretcher_heights |
(230, 180) |
back_rails |
(620, 870) |
back_rail_width |
60 |
setback |
3 |
protrusion |
2 |
tenon_chamfer |
2 |
top_chamfer |
4 |
overhang |
10 |
seat_boards |
2 |
seat_chamfer |
3 |
splats |
3 |
splat_width |
30 |
splat_tenon_length |
20 |
leg_taper |
5 |
leg_taper_length |
140 |
leg_stock |
40 mm board, oak |
stock |
20 mm board, oak |
seat_stock |
20 mm board, oak |
Change them in a design file (see Change an example):
Drawings¶
The plans in one PDF: plans.pdf.
Cut list¶
leg_front 430 x 40 x 40 mm oak, 2 pieces: leg_front_left; mirror image: leg_front_right
- taper 5 mm over 140 on top_face towards left_end
- taper 5 mm over 140 on back_edge towards left_end
- mortise 60 x 8 mm, 33 deep, in back_edge
- mortise 60 x 8 mm, 33 deep, in top_face
- through mortise 20 x 8 mm in back_edge
- through mortise 20 x 8 mm in top_face
leg_back 900 x 40 x 40 mm oak, 2 pieces: leg_back_right; mirror image: leg_back_left
- chamfer 4 mm on right_end_top_face_arris
- chamfer 4 mm on right_end_bottom_face_arris
- chamfer 4 mm on right_end_front_edge_arris
- chamfer 4 mm on right_end_back_edge_arris
- taper 5 mm over 140 on top_face towards left_end
- taper 5 mm over 140 on back_edge towards left_end
- mortise 60 x 8 mm, 33 deep, in top_face
- mortise 60 x 8 mm, 33 deep, in back_edge
- through mortise 20 x 8 mm in top_face
- through mortise 20 x 8 mm in back_edge
- 2 x through mortise 50 x 8 mm in back_edge
seat_rail_front_back 422 x 80 x 20 mm oak, 2 pieces: seat_rail_front, seat_rail_back
- tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on left_end
- tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on right_end
seat_rail_right_left 402 x 80 x 20 mm oak, 2 pieces: seat_rail_right, seat_rail_left
- tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on left_end
- tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on right_end
stretcher_front_back 444 x 30 x 20 mm oak, 2 pieces: stretcher_front, stretcher_back
- tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on left_end
- tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on right_end
stretcher_right_left 424 x 30 x 20 mm oak, 2 pieces: stretcher_right, stretcher_left
- tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on left_end
- tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on right_end
back_rail 444 x 60 x 20 mm oak, 2 pieces: back_rail_lower, back_rail_upper
- tenon 50 x 8 mm, 42 long, end chamfered 2 mm, on left_end
- tenon 50 x 8 mm, 42 long, end chamfered 2 mm, on right_end
- 3 x mortise 20 x 8 mm, 22 deep, in back_edge
splat 230 x 30 x 20 mm oak, 3 pieces: splat_1, splat_2, splat_3
- tenon 20 x 8 mm, 20 long, on left_end
- tenon 20 x 8 mm, 20 long, on right_end
seat_1 460 x 215 x 20 mm oak
- chamfer 3 mm on top_face_left_end_arris
- chamfer 3 mm on bottom_face_left_end_arris
- chamfer 3 mm on top_face_right_end_arris
- chamfer 3 mm on bottom_face_right_end_arris
- chamfer 3 mm on top_face_front_edge_arris
- chamfer 3 mm on bottom_face_front_edge_arris
seat_2 460 x 215 x 20 mm oak
- notch 50 mm, 40 deep, in back_edge at left_end
- notch 50 mm, 40 deep, in back_edge at right_end
- chamfer 3 mm on top_face_left_end_arris
- chamfer 3 mm on bottom_face_left_end_arris
- chamfer 3 mm on top_face_right_end_arris
- chamfer 3 mm on bottom_face_right_end_arris
- chamfer 3 mm on top_face_back_edge_arris
- chamfer 3 mm on bottom_face_back_edge_arris
Code¶
From woodwright/examples/projects.py, which imports the names it uses (see From an example to your own design):
def chair(
width: float = 440,
depth: float = 420,
seat_height: float = 450,
height: float = 900,
rail_width: float = 80,
stretcher_width: float = 30,
stretcher_heights: tuple[float, float] = (230, 180),
back_rails: tuple[float, float] = (620, 870),
back_rail_width: float = 60,
setback: float = 3,
protrusion: float = 2,
tenon_chamfer: float = 2,
top_chamfer: float = 4,
overhang: float = 10,
seat_boards: int = 2,
seat_chamfer: float = 3,
splats: int = 3,
splat_width: float = 30,
splat_tenon_length: float = 20,
leg_taper: float = 5,
leg_taper_length: float = 140,
leg_stock: Stock = CHAIR_LEG_STOCK,
stock: Stock = OAK,
seat_stock: Stock = OAK,
) -> Assembly:
"""A simple chair, all square; outside sizes of the frame.
The back legs run up into the back. Under the seat, rails `rail_width`
wide are tenoned into the legs as in a table frame, flush with the tops
of the front legs. The seat, a panel glued up from `seat_boards` boards
edge to edge, its grain from side to side, lies on them, its top
`seat_height` above the floor; it overhangs the frame by `overhang` at
the front and the sides and the back board is notched at the corners
around the back legs, flush with their outsides. The arrises around
the seat, top and bottom, are chamfered. Stretchers near the floor and
two rails in the back (their top edges at `stretcher_heights`, for the
front and back and for the sides, and at `back_rails`) have through
tenons standing `protrusion` proud of the legs, their ends chamfered.
The side stretchers are lower than the front and back ones, so that the
tenons don't meet inside the legs. Between the back rails stand
`splats`, as thick as the rails, with blind tenons in their edges. The
tops of the back legs are chamfered all round; the legs taper on their
inner sides from `leg_taper_length` above the floor, below the
stretchers, to `leg_taper` thinner at the floor.
"""
asm = Assembly("chair", root_location=STANDING)
seat = seat_height - seat_stock.thickness
legs, rails = _table_frame(
asm,
width,
depth,
seat,
rail_width,
setback,
leg_stock,
stock,
leg_lengths=(seat, seat, height, height),
apron_name="seat_rail",
)
back_rail_spans = [
(f"back_rail_{name}", 2, level, back_rail_width)
for name, level in zip(["lower", "upper"], back_rails, strict=True)
]
members = _leg_rails(
asm,
legs,
width,
depth,
_stretchers(stretcher_heights, stretcher_width) + back_rail_spans,
stock,
tenon_length=leg_stock.thickness + protrusion,
tenon_chamfer=tenon_chamfer,
)
for leg in legs[2:]:
for side in (leg.top_face, leg.bottom_face, leg.front_edge, leg.back_edge):
leg.cut(Chamfer(leg.arris(leg.right_end, side), size=top_chamfer))
# The outer sides of the legs are their bottom faces and front edges.
for leg in legs:
for side in (leg.top_face, leg.back_edge):
leg.cut(Taper(side, end=leg.left_end, amount=leg_taper, length=leg_taper_length))
# The splats stand evenly spaced between the back rails, whose back edges are up.
lower, upper = members["back_rail_lower"], members["back_rail_upper"]
splat_length = back_rails[1] - back_rail_width - back_rails[0]
gap = (lower.length - splats * splat_width) / (splats + 1)
for j in range(splats):
splat = asm.add(Board(f"splat_{j + 1}", stock, length=splat_length, width=splat_width))
distance = gap + j * (gap + splat_width)
for end, mortise in [
(splat.left_end, lower.back_edge),
(splat.right_end, upper.front_edge),
]:
rail = mortise.part
asm.join(
MortiseTenon(
tenon=end,
mortise=mortise,
position=offset(distance, ref=rail.left_end),
flush=(rail.ref_face, splat.ref_face),
tenon_length=splat_tenon_length,
)
)
boards = _glued_top(
asm,
rails[0],
"seat",
width,
depth,
overhang,
0,
seat_boards,
leg_stock,
setback,
seat_stock,
)
front, back = boards[0], boards[-1]
# The notches reach from the back edge (y = back.width) and the ends.
leg_width = leg_stock.thickness
notch_x, notch_y = overhang + leg_width, (back.width - leg_width, INF)
for x in [(-INF, notch_x), (back.length - notch_x, INF)]:
back.cut(Pocket(back.back_edge, (x, notch_y, (-INF, INF)), kind="notch"))
for board in boards:
sides = [board.left_end, board.right_end]
sides += [
edge
for edge, outer in [(board.front_edge, front), (board.back_edge, back)]
if board is outer
]
for side in sides:
for face in (board.top_face, board.bottom_face):
board.cut(Chamfer(board.arris(face, side), size=seat_chamfer))
return asm
Exported with woodwright 0.9.0 on 2026-10-25.