Skip to content
Molding

Form types

Forms build 3D geometry. They take one or more closed profiles (Shape or Loop nodes) and give them a third dimension. Every form can be a solid (default) or a void — a void cuts through every overlapping solid.

Choosing the right form

What you wantForm to use
Constant cross-section pushed straightextrusion
Cross-section that morphs between two shapesblend
Shape spun around a centre linerevolution
Profile pushed along a curved pathsweep
Profile that follows a path and morphssweptBlend
Cut a hole with a specific shapevoid extrusion (isSolid: false)
Cut a through-hole in a specific solidopening

Extrusion

An extrusion sweeps a profile along the Z axis (perpendicular to the sketch plane). It is the most common form.

How to build one:

  1. Add a shape node (e.g. Rectangle) and set its width, height, and centre.
  2. Add an Extrusion. In the expanded row, tick your rectangle in the Profile checkbox list.
  3. Set Depth — the thickness of the extrusion — to a parameter or a number.

Optional fields:

  • startOffset — the bottom of the extrusion starts this far above the sketch plane (useful for a raised sill).
  • Solid checkbox — clear it to make a cutting void.

Example — a centred door panel 900 × 2100 × 45 mm:

Parameters
  Width       length  value 900   Instance
  Height      length  value 2100  Instance
  Thickness   length  value 45
  HalfHeight  length  formula: Height / 2   Instance

Generators
  Rectangle  PanelProfile   width=Width  height=Height  center=[0, HalfHeight]
  Extrusion  Panel          profile=[PanelProfile]  depth=Thickness

HalfHeight is an instance parameter because it reads the instance parameter Height: a type parameter's formula cannot read an instance parameter (see Parameters & coordinates).


Blend

A blend lofts between a bottom profile and a top profile at different heights. The cross-section smoothly transitions from one shape to the other.

How to build one:

  1. Add a shape node for the bottom profile.
  2. Add a second shape node for the top profile.
  3. Add a Blend. In the expanded row:
    • Tick the bottom shape in Bottom Profile.
    • Tick the top shape in Top Profile.
    • Set Depth (the vertical distance between the two profiles).
    • Optionally set Bottom Offset to lift the bottom profile above the sketch plane.

Example — a column that starts square and ends oval:

Parameters
  BaseW    length  value 400
  TopRX    length  value 200
  TopRY    length  value 150
  ColH     length  value 3000

Generators
  Rectangle  BaseRect  width=BaseW  height=BaseW  center=[0, 0]
  Ellipse    TopOval   radiusX=TopRX  radiusY=TopRY  center=[0, 0]
  Blend      Column    bottomProfile=[BaseRect]  topProfile=[TopOval]  depth=ColH

Both caps are cut into 4 curves (a rectangle's 4 sides, an ellipse's 4 quarter arcs), so Revit's side walls follow both outlines — see the rule below.

Rejected — one loop per cap. Revit's NewBlend takes a single curve loop per end, so a cap naming more than one loop is refused before generation (unsupportedGeometry); a hole loop has no representation at all and would simply vanish from the .rfa. Cut the hole with a void form layered on top instead.

Rejected — both caps need the same number of curves. Revit rules a blend's side walls between the caps' curve junctions, not between their outlines. With unequal counts it collapses the richer cap's extra junctions onto one junction of the poorer cap, and the walls follow that collapse — measured 2026-09-24, a 400 mm square (4 curves) blended to a radius-150 circle (2 half-arcs) gave Revit 3.2888e7 mm³ against the preview's 3.3564e7 (2.0% apart), and the result depends on how each shape happens to be cut into curves, which the definition does not state.

Curve counts: circle = 2, ellipse = 4, rectangle = 4, slot = 4, polygon = one per side, loop = one per segment. So a square blends to a slot or an ellipse, and a circle to a circle; to reach a circle from a square, use a 4-segment loop of arcs, or a polygon with a matching side count.


Revolution

A revolution spins a profile around an axis, producing a solid of revolution — a column, dome, knob, bowl, or jar shape.

How to build one:

  1. Add a shape node for the cross-section. Position it offset from the axis (the profile must not cross the axis).
  2. Add a Revolution. In the expanded row:
    • Tick the shape in Profile.
    • Set Axis Start and Axis End — two points defining the spin axis in the sketch plane.
    • Leave Start Angle = 0 and End Angle ≈ 6.283 (2π) for a full revolution, or set a partial angle for an arc.

Example — a round column, axis along Y:

Parameters
  ColR    length  value 200
  ColH    length  value 3000
  HalfColH length formula: ColH / 2

Generators
  Circle     ColProfile  radius=ColR  center=[ColR, HalfColH]
  Revolution Column      profile=[ColProfile]
                         axisStart=[0, 0]   axisEnd=[0, ColH]

The circle's centre is shifted right by ColR so it sits to the right of the Y axis. Spinning it around Y produces a full cylinder.

Partial revolution: endAngle must be a Coord — since pi() is an expression, declare a parameter:

Parameters
  HalfTurn  number  formula: pi()   // ≈ 3.14159

Generators
  Revolution  HalfColumn  ...  endAngle=HalfTurn

Both angles flex: they reach Revit exactly as written and are associated to REVOLUTION_START_ANGLE / REVOLUTION_END_ANGLE, so the wedge is driven by the family parameters.

Rejected: literal angles that run backwards or span more than a full turn — the rule is startAngle ≤ endAngle ≤ startAngle + 2π (unsupportedGeometry). Normalising the interval silently would make the generated wedge differ from the numbers the parameters hold, so it is refused instead.


Sweep

A sweep pushes a constant cross-section profile along a path curve. The path can be any segment node (line, arc, ellipseArc, spline) or a loop.

How to build one:

  1. Add a segment node (e.g. Arc) that defines the path.
  2. Add a shape node (e.g. Circle) that defines the cross-section.
  3. Add a Sweep. In the expanded row:
    • In the Path dropdown, pick the segment node.
    • Tick the shape in Profile.

The profile is placed perpendicular to the path at its start point and then follows the curve. Its origin ([0, 0] of the shape's coordinates) sits on the path start: the profile's X runs to the left of the path direction and its Y runs up, out of the sketch plane. A profile drawn away from the origin — a moulding whose section starts at one corner, say — is therefore swept offset from the path by exactly that amount, as it is in Revit. The same placement holds for both profiles of a swept blend.

Example — a curved handrail:

Parameters
  RailR   length  value 25

Generators
  Arc     RailPath  start=[0, 0]  mid=[2250, 3000]  end=[4500, 0]
  Circle  RailXS    radius=RailR
  Sweep   Rail      path=RailPath  profile=[RailXS]

The cross-section flexes (RailR is a parameter), the arc path does not: a curve a form sketches — as a path here, or inside a profile loop — must hold plain numbers. A line path takes parameter keys normally (see the swept blend below).


Swept Blend

A swept blend follows a path like a sweep, but also morphs between two profiles — one at the start, one at the end. Use it for elements that taper, twist, or transition along their length.

How to build one:

  1. Add a segment node for the path.
  2. Add two shape nodes — one for the start cross-section, one for the end.
  3. Add a SweptBlend. In the expanded row:
    • Pick the segment in Path.
    • Tick one shape in Bottom Profile (start) and the other in Top Profile (end).

Example — a gutter that widens along its length:

Parameters
  GutterLen  length  value 3000
  StartW     length  value 100
  StartH     length  value 80
  EndW       length  value 180
  EndH       length  value 120

Generators
  Line       GutterPath   start=[0, 0]  end=[GutterLen, 0]
  Rectangle  GutterStart  width=StartW  height=StartH
  Rectangle  GutterEnd    width=EndW    height=EndH
  SweptBlend Gutter       path=GutterPath  bottomProfile=[GutterStart]  topProfile=[GutterEnd]

Rejected — one curve of path. Revit's NewSweptBlend follows a single curve, so a loop of more than one segment in Path is refused before generation: only its opening segment would reach the .rfa and the rest would vanish. Pick a segment node, or a single-segment loop.


Voids

Any form becomes a void by clearing the Solid checkbox in its expanded row (or setting isSolid: false in JSON). A void cuts through every overlapping solid in the family.

Example — a box with a slotted opening:

Generators
  Rectangle  BoxProfile   width=BoxW   height=BoxH
  Extrusion  BoxSolid     profile=[BoxProfile]  depth=BoxD        ← solid

  Slot       SlotProfile  length=600  radius=40  center=[0, SlotY]
  Extrusion  SlotVoid     profile=[SlotProfile]  depth=BoxD        ← void (Solid cleared)

The slot void overlaps the box and carves a slot-shaped channel through it. A slot's length and radius are plain numbers — only its center takes a parameter key. If the channel itself has to flex, cut it with a rectangle that has a cornerRadius.

When to use a void extrusion vs opening:

SituationUse
Hole with a complex shape or holes-within-holesvoid extrusion
Simple hole that goes through a specific named solidopening

Opening

opening cuts a hole through a specific host form using a profile. Unlike a void, it only cuts one named form.

FieldDescription
hostThe form to cut through — the Host dropdown lists only form nodes
profileThe shape of the opening (one outer loop)

Example:

Generators
  Rectangle  WallProfile  width=W  height=H
  Extrusion  WallSolid    profile=[WallProfile]  depth=D

  Circle     HoleProfile  radius=HoleR  center=[0, HalfH]
  Opening    PortHole     host=WallSolid  profile=[HoleProfile]

Rejected — one outer loop. NewOpening takes a single curve loop, so a profile naming more than one is refused before generation; no holes-within-holes. Use a void extrusion for those cases.

Rejected — the host must be a form. An opening cuts through the host form, so Host must name an extrusion, blend, revolution, sweep, sweptBlend or adaptiveLoftForm, and that form must be declared above the opening in the Generators list.

A later copy, mirror or array can take the opening itself as its source: the copy carries the cut host, hole included.


Subcategory and visibility

Every form has two optional settings for controlling its appearance in Revit:

Subcategory assigns the form to a named Revit family subcategory. Users can apply per-subcategory graphics overrides (colour, lineweight, visibility) in the project. Good names: Panel, Frame, Hardware, Glazing.

Detail levels controls per-detail-level display:

LevelTypical use
CoarseSimple bounding box only — fast plans at small scale
MediumMain body visible — standard construction documents
FineFull detail including hardware — large-scale details

Both live in the form's properties, alongside material and visible, and both are edited in the form's ⚙ (Element settings) popover as Subcategory and Detail levels. A subcategory must be declared in the family's subcategories lane first; detailLevels each default to true.

Example — a door knob that hides at coarse detail:

"properties": {
  "material": "Metal - Chrome",
  "subcategory": "Hardware",
  "detailLevels": { "coarse": false, "medium": true, "fine": true }
}

visible is the on/off switch for the whole form. Give it true/false, or the key of a Yes/No parameter — then the runner associates it to that parameter and the user toggles the form in Revit:

"properties": { "visible": "ShowHandle" }
📖 8 min read