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 want | Form to use |
|---|---|
| Constant cross-section pushed straight | extrusion |
| Cross-section that morphs between two shapes | blend |
| Shape spun around a centre line | revolution |
| Profile pushed along a curved path | sweep |
| Profile that follows a path and morphs | sweptBlend |
| Cut a hole with a specific shape | void extrusion (isSolid: false) |
| Cut a through-hole in a specific solid | opening |
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:
- Add a shape node (e.g.
Rectangle) and set its width, height, and centre. - Add an
Extrusion. In the expanded row, tick your rectangle in the Profile checkbox list. - 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=ThicknessHalfHeight 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:
- Add a shape node for the bottom profile.
- Add a second shape node for the top profile.
- 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=ColHBoth 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
NewBlendtakes 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-segmentloopof arcs, or apolygonwith 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:
- Add a shape node for the cross-section. Position it offset from the axis (the profile must not cross the axis).
- 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=HalfTurnBoth 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:
- Add a segment node (e.g.
Arc) that defines the path. - Add a shape node (e.g.
Circle) that defines the cross-section. - 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:
- Add a segment node for the path.
- Add two shape nodes — one for the start cross-section, one for the end.
- 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
NewSweptBlendfollows a single curve, so aloopof more than one segment in Path is refused before generation: only its opening segment would reach the.rfaand 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:
| Situation | Use |
|---|---|
| Hole with a complex shape or holes-within-holes | void extrusion |
| Simple hole that goes through a specific named solid | opening |
Opening
opening cuts a hole through a specific host form using a profile. Unlike a void, it only cuts one named form.
| Field | Description |
|---|---|
| host | The form to cut through — the Host dropdown lists only form nodes |
| profile | The 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.
NewOpeningtakes 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,sweptBlendoradaptiveLoftForm, 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:
| Level | Typical use |
|---|---|
| Coarse | Simple bounding box only — fast plans at small scale |
| Medium | Main body visible — standard construction documents |
| Fine | Full 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" }