ArchPlug / Documentation / One Click Roof Structure

One Click Roof Structure — Detailed User Guide

Instantly generate accurate timber roof structures and structural beams.

Autodesk Revit 2022–2026 Windows One-time purchase — $45 Guide updated: July 2026
⬇︎ Download this guide as PDF View plugin & free trial →

Instantly generate accurate timber roof structures and structural beams in Autodesk Revit.


Overview

One Click Roof Structure turns any sloped Revit roof into a complete timber (or steel) roof frame — automatically. Select a roof, choose your beam families, click Run, and the plugin places four kinds of structural framing directly on the roof geometry:

Modeling a roof structure by hand is one of the most tedious tasks in Revit: every rafter must be drawn individually on a work plane, trimmed to the roof boundary, and re-done from scratch whenever the roof changes. One Click Roof Structure reads the actual geometry of the roof — every sloped face, every edge, every ridge — and computes exact beam start/end points itself. Rafters are automatically trimmed to the true boundary of each roof plane, including irregular shapes, hips, and valleys. What takes hours manually takes seconds.

Just as important: the plugin is non-destructive and re-runnable. Every beam it creates is tagged as belonging to a specific roof. When you change a setting and click Run again, the plugin replaces only the affected beams — no duplicates, no manual cleanup, and sections whose settings did not change are left untouched.

Key Benefits & Use Cases

Who it's for

Concrete scenarios

Requirements

Installation

  1. Run the provided .msi installer and follow the prompts.
  2. If Revit was closed during installation, no further steps are needed — the plugin is available the next time you start Revit. (A restart is only needed if Revit was running during the install.)
  3. Open Revit and look for the ArchPlug tab on the ribbon. One Click Roof Structure appears there as its own button.
  4. Click the button to open the Place Roof Structure window.

User Interface Walkthrough

The plugin opens a single window titled "Place Roof Structure". Key characteristics:

The window contains four collapsible-style option groups (top to bottom), a Hide/Unhide row, and a bottom button row.

"Rafters" group

Control Label What it does
Checkbox Enable Turns rafter creation on/off. When off, the rest of the group is covered by a dimmed overlay reading "Enable Rafters first" — only the Enable checkbox stays clickable.
Drop-down Family: The Structural Framing type used for rafters. Lists every Structural Framing type in the model, formatted as FamilyName : TypeName, sorted alphabetically.
Text field Spacing (cm): Target center-to-center rafter spacing. The unit suffix in the label follows your project's length display unit — it shows (mm), (cm), (m), (in) or (ft) depending on your project units, and the value is interpreted in that unit. Default: 80.

"Ridge Beam" group

Control Label What it does
Checkbox Enable Turns ridge beam creation on/off (overlay: "Enable Ridge Beam first").
Drop-down Family: Structural Framing type used for ridge beams.
Text field Offset (…): Vertical offset applied to the ridge beam, in project length units. Positive values move the beam up, negative down. Default: 0.

"Purlins (mid-rafter)" group

Control Label What it does
Checkbox Enable Turns purlin creation on/off (overlay: "Enable Purlins first").
Drop-down Family: Structural Framing type used for purlins.
Text field Vertical offset (…): Vertical (Z) offset applied to every purlin, in project length units. Default: 0.
Checkbox Equal distances When checked, purlin positions are computed automatically so all rows are evenly distributed along the slope (e.g. 1 row → 50%; 2 rows → 33.3% / 66.7%; 3 rows → 25% / 50% / 75%). The Position (%) column becomes read-only and updates live as you add/remove rows. Uncheck to type positions manually.
Table columns Purlin / Position (%) One row per purlin. Purlin is a free-text name (always editable, for your own reference). Position (%) is where the purlin sits on each roof plane: 0% = eave (bottom), 100% = ridge (top). Values are clamped to 0–100.
Button Add Adds a new row (named "Purlin N", position 50.0 — or auto-recomputed if Equal distances is on).
Button Delete Removes the selected row; if no row is selected, removes the last row.

Each purlin row is placed once per sloped roof face — so on a gable roof with two planes, one row produces two purlins (one per side), automatically trimmed to each plane's boundary.

"Cushions (under rafters)" group

Cushions are the horizontal pads/wall plates placed along every eave edge (the lowest edge) of each roof plane.

Control Label What it does
Checkbox Enable Turns cushion creation on/off (overlay: "Enable Cushions first").
Drop-down Family: Structural Framing type used for cushions.
Text field Vertical offset (…): Moves cushions up/down from the eave edge, in project length units. Default: 0.
Text field Inward offset (…): Shifts cushions horizontally toward the ridge (into the building), in project length units. Useful for placing the plate on the wall rather than at the roof edge. Default: 0.
Radio buttons Orientation:Horizontal / Vertical Vertical (default) keeps the beam profile upright (Cross-Section Rotation = 0°). Horizontal lays the profile flat by setting the beam's Cross-Section Rotation to 90° — exactly the value you see in Revit's Properties palette.

Hide / Unhide row

Button What it does
Hide all beams Hides every beam this plugin has ever created (all roofs, all types) in the active view only — a quick declutter that does not touch other views or delete anything. The status line reports e.g. "Hid 42 beam(s) in this view".
Unhide all beams Reverses the above in the active view.

Bottom row

Control What it does
Save Template button Opens a save dialog ("Save Roof Structure Template", filter JSON Template (*.json)) and writes all current settings — every checkbox, family choice, value, and the full purlin table — to a .json file. The default location is your Documents\ArchPlug\Templates folder; the default file name is roof_template.json. A confirmation shows the saved path.
Import Template button Opens a matching open dialog ("Import Roof Structure Template") and loads a previously saved template, filling every field in the window. Confirmed with "Template imported."
Status label A single-line, accent-colored status area between the template buttons and Run. Shows progress ("Running…", "Running on 2 roof(s)…") and results (see Workflow step 7).
Run button Executes placement/update on the currently selected roof(s). Does not close the window.

Keyboard

Step-by-Step Workflow

  1. Open a view where you can see and select the roof — a 3D view is most convenient.
  2. Launch the plugin from the ArchPlug ribbon tab. The Place Roof Structure window opens with your last-used settings already filled in.
  3. Select the roof(s) in the model. Because the window is modeless, you can do this with the window open, before or after adjusting settings. You may select one roof or several — each is processed independently. (Other selected elements are simply ignored; only roofs count.)
  4. Enable the sections you want — Rafters, Ridge Beam, Purlins, Cushions — and pick a Family: for each enabled section. Disabled sections are dimmed with an "Enable … first" overlay.
  5. Set the values: rafter Spacing, ridge Offset, purlin rows and offsets, cushion offsets and Orientation. All lengths are in your project's display unit, as shown in each label. Decimal commas are accepted (e.g. "62,5" works the same as "62.5").
  6. Click Run. The plugin: - validates your input (a roof must be selected; at least one section must be enabled; each enabled section's family must exist; rafter spacing must be a positive number), - deletes any of its own previously created beams for the selected roof(s) in sections whose settings changed (or were disabled), - reads the roof geometry, finds all sloped faces, and places the new beams, - commits everything in one Revit transaction named "Roof Structure - Update" — a single Ctrl+Z in Revit reverses the entire run, - suppresses non-critical Revit warnings (such as overlapping framing) so the run never stalls on warning pop-ups.
  7. Read the result in the status line, e.g. Done (1 roof). R=24 | Ri=1 | P=4 | C=6 — R = rafters placed, Ri = ridge beams, P = purlins, C = cushions; =del means that section's beams were deleted because you disabled it. On success there is no pop-up — only errors produce a dialog.
  8. Iterate if needed: change a value, click Run again. Only the sections you changed are rebuilt; everything else is left exactly as it was.
  9. Close the window with X or Esc when done. All settings, the purlin table, and the window position are remembered for next time.

Feature Reference

Smart Update (no duplicates, ever)

Every beam the plugin creates is tagged in its Comments parameter with a marker identifying its roof and its role (rafter, ridge, cushion, or purlin). This drives the update logic:

The per-roof settings memory persists between sessions, so re-running tomorrow with identical settings still changes nothing. After each run the plugin also verifies that its new beams carry the marker correctly and warns you if not (see Troubleshooting).

Practical consequence: do not clear or edit the Comments parameter on plugin-created beams. The Comments value is how the plugin recognizes its own work; if you overwrite it, the next Run will treat those beams as foreign and create fresh ones alongside them.

Multi-roof processing

Select any number of roofs before clicking Run. Each roof is processed independently with its own tagged beam set and its own change-tracking, and the whole batch is committed atomically in a single transaction. The status line reports the total, e.g. Done (3 roofs). R=71 | C=18.

Rafter placement logic

For each sloped face of the roof (the underside plane of each roof slope):

Ridge beam logic

Ridge lines are detected as edges shared between two sloped faces — the natural ridges and hips-to-ridge lines of the roof. If the roof has no such shared edge (e.g. a single-plane shed roof), the plugin falls back to the topmost edge of each slope, so a shed roof still receives a beam along its high edge. Duplicates are filtered out, and the optional vertical Offset is applied to the whole beam.

Purlin placement logic

For each enabled purlin row, one horizontal beam is placed per sloped face at the given Position (%) measured up the slope: 0% = eave, 100% = ridge. Each purlin spans the full width of the face at that height, trimmed to the face boundary (so on a hip face, purlins get shorter toward the top — correctly). The Vertical offset raises or lowers all purlins. With Equal distances checked, positions are recomputed automatically from the number of rows.

Cushion placement logic

Cushions are placed along the eave edges — edges of each sloped face lying at that face's lowest level. Edges shared by adjacent faces are deduplicated so you never get doubled pads. Controls:

Families and types

Level assignment

Created beams are assigned the roof's own reference level. If the roof has no level, the plugin falls back to the nearest level at or below the roof; failing that, the lowest level in the project. If no level can be found at all, that roof is skipped with an error message.

Units and input

Persistence, templates, undo

Tips & Best Practices

Troubleshooting & FAQ

"Please select one or more roofs, then click Run." Nothing in your current selection is a roof. Select the roof element itself (a footprint or extrusion roof), not walls, fascias, or gutters, then click Run again. Roofs inside groups or links cannot be selected directly.

"Please enable at least one section." All four Enable checkboxes are off. Enable at least one of Rafters, Ridge Beam, Purlins, or Cushions.

"No Structural Framing types found in the model." The project contains no beam family at all, so the drop-downs would be empty. Load any Structural Framing family (Insert → Load Family → Structural Framing), then relaunch the plugin.

"Rafter family not found: …" (or Ridge/Cushion/Purlin family not found) The family type shown in the drop-down no longer exists in the model — typically because it was deleted or the settings came from a template saved in a different project. Re-pick a valid type from the Family: drop-down.

"Enter a valid rafter spacing in centimeters." The Spacing value is zero, negative, or not a number. Enter a positive number (in your project's length unit).

"Roof …: no sloped faces — skipped." The plugin found no sloped planar underside on that roof. This happens with flat roofs (no slope — there is nothing for rafters to follow) and with curved/domed roofs (non-planar faces are not supported). Give the roof a slope, or model that structure manually.

"Roof …: no Level found — skipped." The project has no level the beams could be assigned to. Ensure the project contains at least one level.

Beams appear doubled after a Run. Almost always caused by the Comments tag having been cleared or overwritten on previously generated beams (the plugin then cannot recognize them as its own). Delete the stray beams manually, leave Comments untouched in the future, and re-run. The plugin also warns you proactively after a run if tagging could not be applied: "Re-running will create duplicates instead of updating." — if you see that message, the chosen beam family is preventing the Comments parameter from being written; switch to a standard beam family.

"Cushion rotation: N of M beam(s) failed…" The selected cushion family would not accept the Cross-Section Rotation value, and the geometric fallback also failed. Try a different (standard) Structural Framing family for cushions. Note that the plugin automatically re-attempts the rotation on the next Run.

I clicked Run and nothing changed. If the status line says "Done … — nothing changed.", Smart Update determined that the selected roofs already have beams matching the current settings — that is the intended no-duplicate behavior. Change a setting (or disable/re-enable a section) to force a rebuild.

Rafter spacing in the model isn't exactly what I typed. By design: the plugin uses the nearest equal division of each roof plane so rafters land exactly on both edges with uniform gaps. The actual spacing is as close to your value as the plane width allows.

Where did the pop-up with results go? There is none on success — results go to the in-window status line. Pop-ups appear only for errors (first 10 are listed).

Can I undo a run? Yes. Each Run is a single Revit transaction named "Roof Structure - Update" — one press of Ctrl+Z in Revit (with the model window focused) reverts everything the run did. Ctrl+Z while the plugin window is focused instead undoes your edits to the plugin's input fields.

Does it work on roofs with holes, hips, and valleys? Yes — rafters and purlins are trimmed against the true boundary of each roof plane, and hip/ridge edges shared between two planes receive ridge beams. Each sloped plane is framed independently.

The window opened on the wrong monitor / off-screen. The window restores its last position but checks that it is still visible on a connected screen; if the saved position is off-screen (e.g. a monitor was unplugged), it opens centered instead. It also adapts automatically to mixed-DPI multi-monitor setups.

Are warnings like "structural framing overlaps" suppressed? Yes. Non-critical Revit warnings raised during placement are dismissed silently so the run completes without interruption. Genuine errors are still collected and reported.

ArchPlug — Revit plugins for architects. archplug.com · All plugin guides · Privacy · Terms

All plugins include a 7-day free trial — no credit card required.