Skip to content

Shoji frame

frames.shoji_frame

A small shoji lattice of three vertical and three horizontal bars, crossing in nine cross laps; outside sizes.

The bars reach overhang beyond the outer ones. They are bar_width wide in the lattice and the stock thick across it; each lap takes half of that. Where they cross, the vertical bars keep their front halves and the horizontal ones their back halves (the reference faces are at the back).

Shoji frame, assembled

Shoji frame, exploded

Parameters

Parameter Default
width 200
height 300
bar_width 5
overhang 20
stock 20 mm board, oak

Change them in a design file (see Change an example):

from woodwright.examples import frames

design = frames.shoji_frame(width=250)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Horizontal

horizontal

Vertical

vertical

Cut list

vertical    300 x 5 x 20 mm  oak, 3 pieces: vertical_1, vertical_2, vertical_3
            - 3 x dado 5 mm, 10 deep, in top_face
horizontal  200 x 5 x 20 mm  oak, 3 pieces: horizontal_1, horizontal_2, horizontal_3
            - 3 x dado 5 mm, 10 deep, in bottom_face

Code

From woodwright/examples/frames.py, which imports the names it uses (see From an example to your own design):

def shoji_frame(
    width: float = 200,
    height: float = 300,
    bar_width: float = 5,
    overhang: float = 20,
    stock: Stock = KUMIKO,
) -> Assembly:
    """A small shoji lattice of three vertical and three horizontal bars,
    crossing in nine cross laps; outside sizes.

    The bars reach `overhang` beyond the outer ones. They are `bar_width`
    wide in the lattice and the stock thick across it; each lap takes half
    of that. Where they cross, the vertical bars keep their front halves and
    the horizontal ones their back halves (the reference faces are at the back).
    """
    asm = Assembly("shoji_frame", root_location=STANDING)
    verticals = [asm.add(Board(f"vertical_{i + 1}", stock, height, bar_width)) for i in range(3)]
    horizontals = [asm.add(Board(f"horizontal_{i + 1}", stock, width, bar_width)) for i in range(3)]

    def starts(length: float) -> list[float]:
        """Where the three bars crossing a bar of this length start along it."""
        return [overhang, (length - bar_width) / 2, length - overhang - bar_width]

    # The horizontal bars run to the right, so their left ends cross each
    # vertical bar from its back edge.
    for vertical, x in zip(verticals, starts(width), strict=True):
        for horizontal, y in zip(horizontals, starts(height), strict=True):
            asm.join(
                CrossLap(
                    vertical.back_edge,
                    horizontal.left_end,
                    position=offset(y, vertical.left_end),
                    overhang=x,
                )
            )
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.