Butt frame and panel¶
frames.butt_frame_and_panel
A frame butt-joined at the corners, a panel tongued on all four edges into grooves along its inside edges.
The panel's design size is the opening of the frame, the tongues add to it; it is centered in the frame's thickness. The grooves in the rails run through, into those in the stiles, which are stopped where the rails' grooves meet them, so that they don't show at the stiles' ends. The glued corners hold little (end grain on long grain): a frame for a light panel, or one to be screwed or dowelled (not modelled).
Parameters¶
| Parameter | Default |
|---|---|
stile_length |
500 |
rail_length |
300 |
width |
60 |
tongue_length |
10 |
stock |
20 mm board, oak |
panel_stock |
10 mm board, oak |
Change them in a design file (see Change an example):
Drawings¶
The plans in one PDF: plans.pdf.
Cut list¶
stile 500 x 60 x 20 mm oak, 2 pieces: stile_left, stile_right
- stopped groove 6 mm, 10 deep, in back_edge, 50 mm short of left_end and 50 mm short of right_end
rail 300 x 60 x 20 mm oak, 2 pieces: rail_top, rail_bottom
- groove 6 mm, 10 deep, in back_edge
panel 400 x 320 x 10 mm oak
- tongue 6 mm thick, 10 long, on front_edge
- tongue 6 mm thick, 10 long, on back_edge
- tongue 6 mm thick, 10 long, on right_end
- tongue 6 mm thick, 10 long, on left_end
Code¶
From woodwright/examples/frames.py, which imports the names it uses (see From an example to your own design):
def butt_frame_and_panel(
stile_length: float = 500,
rail_length: float = 300,
width: float = 60,
tongue_length: float = 10,
stock: Stock = OAK,
panel_stock: Stock = THIN_OAK,
) -> Assembly:
"""A frame butt-joined at the corners, a panel tongued on all four edges
into grooves along its inside edges.
The panel's design size is the opening of the frame, the tongues add to
it; it is centered in the frame's thickness. The grooves in the rails
run through, into those in the stiles, which are stopped where the
rails' grooves meet them, so that they don't show at the stiles' ends.
The glued corners hold little (end grain on long grain): a frame for a
light panel, or one to be screwed or dowelled (not modelled).
"""
def corner(rail_end: SideRef, stile_edge: SideRef, position: Position, outer: SideRef) -> Joint:
return Butt(stile_edge, rail_end, position=position)
asm, (stile_left, stile_right, rail_top, rail_bottom) = _frame(
"butt_frame_and_panel", corner, stile_length, rail_length, width, stock
)
panel = asm.add(Board("panel", panel_stock, length=stile_length - 2 * width, width=rail_length))
stop = width - tongue_length # where the rails' grooves end
for groove, edge, stopped in [
(
stile_left.back_edge,
panel.front_edge,
{stile_left.left_end: stop, stile_left.right_end: stop},
),
(
stile_right.front_edge,
panel.back_edge,
{stile_right.left_end: stop, stile_right.right_end: stop},
),
(rail_top.back_edge, panel.right_end, None),
(rail_bottom.front_edge, panel.left_end, None),
]:
asm.join(
TongueAndGroove(
tongue=edge,
groove=groove,
tongue_length=tongue_length,
across=CENTERED,
stopped=stopped,
)
)
return asm
Exported with woodwright 0.9.0 on 2026-10-25.