Panels

Parametric Slat Wall Panel

Guaranteed minimum protrusion for every slat. It is independent of relief amplitude (Pattern tab).

Compensates every pattern for the panel's own size. A pattern tuned for a 2x2 m panel needs this turned up to look the same on a 1x0.8 m panel, since most patterns measure frequency and distance in real meters, not panel fractions. Works on every pattern.

Whole turns only. Fractional values would leave a visible seam from center to edge.

Cell seed points are fixed. Use "Randomize pattern" below for a new cell layout.

No file loaded. The panel stays flat until you upload one.

Only elements are read (curves supported, arcs are not). If your SVG uses //etc., convert to paths first ("Object to Path" in Inkscape, "Flatten" in Figma). The shape is fit to the panel preserving its own aspect ratio, centered.

Number of plane waves summed at evenly spaced angles (De Bruijn's construction). Five is the classic Penrose-adjacent case; try 7 or 11 for denser star fields.

Each seed sits at the golden angle (~137.5°) from the last, with radius proportional to its index. It is the same rule sunflowers use. Fully determined by seed count, so there's nothing to randomize here.

r sweeps across the panel's width. This is the classic bifurcation-diagram axis. Below ~3 it settles to a fixed point, then period-doubles, then turns chaotic past ~3.57.

Cells are numbered outward in a square spiral from the center (1, 2, 3, ...). Raised cells mark primes. The diagonal and linear streaks are the actual Ulam spiral effect, not a rendering artifact.

Drop direction vectors on the panel below and the waves bend to flow along them. This is classic attractor-based patterning. Click empty space to add a vector, drag its arrowhead to aim and strengthen it, drag the dot to move it, double-click to delete.

Blurs the relief across neighboring slats and softens the stepped or faceted edges. Works with any pattern.

× Mm

Panel height is capped to fit one slat per sheet length.

Clear space kept around every part from the sheet's own edges. It leaves room for clamps and for the bit to safely plunge in and out. Also caps panel height, same as the sheet size above.

Gap kept between nested parts on the same sheet, so the cutter has clearance and adjacent parts never share a single cut line.

Round plywood washer threaded between every pair of adjacent slats on each rod, to set their spacing. Set to 0 to disable it. Whichever is bigger, this or the rod hole, sets the minimum relief depth below.

Every slat threads onto these rods, then glues to a backing panel. See "About this model".

At each row, ONE comb board screws to the wall. Its top and bottom bands are teeth in the gaps between slats, always exactly "Gap between slats" wide (Slats tab), plus valleys under each slat. Its middle band is a solid spine every slat must clear.

Distance between adjacent rows. With 2 rows they move apart evenly from the panel's center; with 3, the middle row stays centered and the outer pair moves apart.

Height of the rail's middle spine and of the matching back window cut into every slat at this row.

Height of the comb band at the rail's top edge, and again at its bottom edge.

Board material thickness. This is also the window's depth (the rail is flush/flat against the wall, no Z protrusion).

No backing panel needed: the toothed rail screws to the wall, and slats hammer onto matching back pockets. See "About this model".

Minimum relief depth is forced to - Every slat must have at least that much material at its thinnest point to safely bury the rod hole / mounting pocket.

About this model

Each slat is a flat board, full panel height, mounted vertically side by side against a backing panel. One long edge of each board is CNC-cut to a wavy profile; the rest stays flat against the backing. The protrusion at every point is a height field: a sum of three tilted sine waves reshaped by a sharpness exponent, sampled along each slat's centerline.

Two mounting options, above. Tie rods: every slat gets drilled hole(s) and threads onto steel rod(s) for alignment and a permanent mechanical connection, in addition to gluing each slat's flat back to a backing panel. Because each slat's protrusion differs, the hole must sit inside the [0, minDepth] band. This is the one Z-range guaranteed to have material on every slat, which is why minimum relief depth is derived from rod diameter, not set independently.

Cleat rail: no backing panel. At each row, ONE flat comb board screws FLUSH to the wall (no standoff; the comb shape lives entirely in the wall's plane, not protruding outward). Its top and bottom bands are the actual comb. Teeth sit in the gaps BETWEEN slats, with tooth width always equal to "Gap between slats". It is never an independent dial, so a tooth exactly fills the gap it sits in. The teeth act as limiters that set the spacing between adjacent slats, while its valleys (exactly slat-width) are cut away so every slat just drops in. The board's middle band is a continuous solid spine, present at every position including under each slat, since that is the only part of the rail a slat's own position cannot avoid. Every slat gets ONE rectangular window cut into its back at each row, as tall as that spine (minus a little for an interference fit) and deep enough to clear the board's own thickness. Nothing else holds the slat's back off the wall there. Minimum relief depth is derived from that rail thickness for the same reason as the rod case: it is a blind recess, so it just needs the front face to clear it with a safety margin.

This is the exact model used by the "Generate DXF" button (right panel) and by generate-dxf.mjs. Each slat's outline (flat back + wavy front edge) plus its mounting feature(s) is exported as real DXF entities, nested onto sheets of the selected plywood size, including the rail parts themselves when "Cleat rail" is selected (toothed boards with screw-clearance holes). Each slat's number is also engraved directly on the part (layer "ENGRAVE", near the back edge) so it stays identifiable after parts are cut apart and separated from the sheet.

The button downloads TWO files. A -MACHINE.dxf file contains only real operations (CUT/DRILL/ENGRAVE), so load only this one into your CAM software. A separate -reference.dxf file contains the sheet boundary and part-picking labels for a human, kept physically separate so it can never accidentally get machined.

Rough USD ballpark, not a quote. Plug in your own local prices/rates. See "Estimated cost" below for the live total.

Estimated cost-
Material-
Machine-
Hardware-
Labor-
Specification
Slat count
-
Max protrusion
-
Panel area
-
Sheets needed
-
Cut length
-
- -
Presets

Saved settings in this browser only

Auto-saves to presets-data.json in the project as you go. It survives accidental tab close and works across browsers. Needs the project's server (node server.mjs), not a plain static server.