Skip to content
Molding

Node reference

The + menu on the Generators tab is organised into groups, whose headers render in capitals (SEGMENT, SHAPE, FORM…). Click + (tooltip Add element): one scrolling list opens with every node type under its group header; click a node type to add it to the Generators list. Click any node row to expand its argument fields. The table below is in menu order.

GroupNodesWhat they produce
Segmentline, arc, ellipseArc, splineOpen curves — used in loop.segments or as a form path
Shaperectangle, circle, ellipse, polygon, slot, loopClosed profiles — used in form profile fields
Formextrusion, blend, revolution, sweep, sweptBlend, opening3D solids and voids
CurvemodelCurve, symbolicCurveVisible lines (not solids)
ArraylinearArray, radialArrayCopies of a node in a line or circle
Transformmirror, move, rotate, copyRepositioned or duplicated geometry
TextmodelText3D extruded text
Annotationimage, textNote, filledRegion, detailCurve, control2D view-only elements
MEPconnectorAn MEP connector on a form
DatumreferencePlaneAn explicit named reference plane
FamilynestedFamilyA nested .rfa instance
AdaptiveadaptivePoint, adaptiveLoftForm, curveByPointsAdaptive component points and lofts

Materials and subcategories are not nodes — they are their own lanes in the family, listed below under Materials and subcategories.


Segments — open curves

Segment nodes produce open curves. Use them in two ways:

  • As segments inside a loop node to build a freeform closed profile.
  • As the path of a sweep or sweptBlend form.

line

A straight line between two points.

FieldUnitDescription
startPoint2D (mm)Start point [U, V]
endPoint2D (mm)End point [U, V]

arc (3-point)

A circular arc that passes through three points: start → mid → end.

FieldUnitDescription
startPoint2D (mm)First endpoint
midPoint2D (mm)A point on the arc (anywhere between start and end)
endPoint2D (mm)Second endpoint

ellipseArc

A partial ellipse defined by a centre, two semi-axes, and a start/end angle.

FieldUnitDescription
centerPoint2D (mm)Centre of the ellipse
radiusXCoord (mm)Semi-axis along U
radiusYCoord (mm)Semi-axis along V
startAngleCoord (rad)Start angle
endAngleCoord (rad)End angle

spline

A smooth interpolated curve through an ordered list of points.

FieldUnitDescription
pointsPoint2D[] (mm)Two or more points the spline passes through

Use the + point and × buttons in the expanded row to add and remove points.


Shapes — closed profiles

Shape nodes produce closed loops. They are the most common input to form profile fields.

Rejected: a size that is not positive at some family type. Every width, height, radius, radiusX, radiusY and slot length must come out greater than zero in every family type. Revit's curve builders produce no curves at all at zero or less, so the form that owns the profile would be dropped from the .rfa without an error — and a size is usually a parameter, which a formula can take to zero at one type while another type is fine. Molding checks every type and names the one that breaks.

rectangle

FieldUnitDescription
widthCoord (mm)Total width
heightCoord (mm)Total height
centerPoint2D (mm)Centre position; default [0, 0]
cornerRadiusCoord (mm)Rounds all four corners; default 0

Rejected: a cornerRadius below zero, or one that reaches or passes min(width, height) / 2 at any family type. At half the shorter side the two fillets of that side meet, so there is no straight segment left between them and the loop crosses itself.

circle

FieldUnitDescription
radiusCoord (mm)Radius
centerPoint2D (mm)Centre position; default [0, 0]

ellipse

FieldUnitDescription
radiusXCoord (mm)Semi-axis along U
radiusYCoord (mm)Semi-axis along V
centerPoint2D (mm)Centre position; default [0, 0]

Both radii flex: each semi-axis endpoint gets a labelled dimension, so the ellipse resizes in Revit when the parameter changes.

polygon

A regular polygon with equal sides. radius is the circumradius (centre to vertex).

FieldUnitDescription
sidesinteger literalSide count: 3 = triangle, 4 = square, 6 = hexagon… Must be a plain number
radiusCoord (mm)Circumradius — flexes (each vertex is dimensioned from the centre, keeping the polygon regular)
centerPoint2D (mm)Centre position; default [0, 0]

Rejected: a parameter key in sides is refused before generation (nonParametricCoordinate). The side count decides how many curves the sketch holds, and Revit's solver drives values, never element counts — a sketch cannot gain or lose a curve when a family type flexes.

slot

A stadium — two parallel lines capped with semicircles (also called a pill or obround).

FieldUnitDescription
lengthnumber (mm)Total outer length (edge to edge); straight section = length − 2×radius. Must be a plain number
radiusnumber (mm)Radius of the semicircular ends. Must be a plain number
centerPoint2D (mm)Centre position; default [0, 0] — this one takes a parameter key

Rejected: a parameter key in length or radius is refused before generation (nonParametricCoordinate). The cap-to-cap span can be driven, but the slot's centre cannot be held: measured in Revit, every dimension scheme tried (a pinned centre plane to each cap, span plus a centring dimension, a three-reference EQ-style dimension) drove only the cap on the positive side, so a 800 mm slot centred on 0 came back spanning −550…250. The slot is positioned parametrically through center, but its size is fixed. If the shape itself must flex, use a rectangle with cornerRadius instead.

loop

A freeform closed profile assembled from ordered segment nodes.

FieldUnitDescription
segmentssegment key[]Ordered list of line / arc / ellipseArc / spline keys

The last point of each segment must connect to the first point of the next, forming a closed chain.

line segments flex, including diagonals. A line held at one coordinate on an axis (both endpoints naming the same key) is aligned to a labelled reference plane; a diagonal, whose ends move independently, has each endpoint dimensioned on its own axis.

Rejected: a parameter key in an arc / spline point, or in an ellipseArc radius or angle, is refused before generation (nonParametricCoordinate) when a form sketches that curve — that is, when it reaches a form's profile, bottomProfile, topProfile or path, either directly or through a loop. Only a straight line can be aligned to a labelled reference plane; a curve keeps a degree of freedom (an arc's bulge, a spline's interior points, an ellipse arc's radii) that no dimension can carry, so the value would be baked in and never flex. The same curve nodes keep parametric coordinates when they feed only a symbolicCurve, modelCurve or detailCurve — directly or through a loop — because those are never sketched into a form.


Forms — 3D solids and voids

Forms build 3D geometry from profiles. isSolid is an arg — the Solid checkbox in the expanded node row (cleared = void); a void cuts overlapping solids. Everything else about a form's appearance lives in its properties:

PropertyValueEffect
materiala materials-lane key, or a material parameter keyFixed material, or one the user picks per type/instance in Revit
subcategorya subcategories-lane keyAssigns the form to a subcategory (graphics overrides)
visibletrue / false, or a Yes/No parameter keyShows or hides the form; a parameter key makes it switchable in Revit
detailLevels{ coarse, medium, fine }Per-detail-level on/off; each defaults to true. Not bindable — Revit offers no parameter for it
"properties": {
  "material": "PanelMaterial",
  "subcategory": "Hardware",
  "visible": "ShowHandle",
  "detailLevels": { "coarse": false, "medium": true, "fine": true }
}

In the editor, open an element's ⚙ (Element settings) and look under the PROPERTIES heading: Label, Material (only on node kinds that take a material), Visible, Subcategory, Detail levels. The Material dropdown lists the family's materials and its material parameters — each option reads key · material or key · parameter so you can see which kind you are picking.

For a full walkthrough of each form type, see Form types.

extrusion

Sweeps a profile along the Z axis.

FieldUnitDescription
profileshape key[]Closed profiles: first = outer boundary, additional = holes (any closed shape: loop/rectangle/circle/ellipse/polygon/slot)
depthCoord (mm)Extrusion depth
startOffsetCoord (mm)Offset from the sketch plane; default 0
isSolidbooltrue (solid) or false (void); default true

blend

Lofts between a bottom profile and a top profile.

FieldUnitDescription
bottomProfileshape key[]Exactly one shape key — a blend cap holds no holes
topProfileshape key[]Exactly one shape key — a blend cap holds no holes
depthCoord (mm)Distance from bottom to top
bottomOffsetCoord (mm)Offset of the bottom from the sketch plane; default 0
isSolidbooldefault true

Rejected: a cap naming more than one loop. Revit's NewBlend takes a single curve loop per cap, so the extra loops would simply vanish from the .rfa. Cut the hole with a void form instead.

Rejected: caps whose shapes are cut into different numbers of curves. Revit rules the side walls between the caps' curve junctions, not between their outlines, so mismatched caps collapse the extra junctions of the richer cap onto one junction of the poorer one and the walls follow the collapse (measured 2026-09-24: a 400 mm square blended to a radius-150 circle gives Revit 3.2888e7 mm³ against the preview's 3.3564e7, 2.0% apart). Give both caps the same curve count: a circle is 2 curves, an ellipse 4, a rectangle 4, a slot 4, and a polygon or a loop one per side or segment.

revolution

Spins a profile around an axis.

FieldUnitDescription
profileshape key[]Cross-section to spin (must be on one side of the axis); any closed shape (loop/rectangle/circle/…)
axisStartPoint2D (mm)Start of the revolution axis
axisEndPoint2D (mm)End of the revolution axis — must differ from axisStart
startAngleCoord (rad)Start angle; default 0
endAngleCoord (rad)End angle; default 2π
isSolidbooldefault true

sweep

Pushes a constant profile along a path.

FieldUnitDescription
pathsegment/loop keyA segment or loop node used as the path (all segments of a loop are used in order)
profileshape key[]Cross-section to push (any closed shape)
isSolidbooldefault true

sweptBlend

Follows a path and morphs between two profiles.

FieldUnitDescription
pathsegment/loop keySingle path curve — a segment node or a loop (only first segment of the loop is used)
bottomProfileshape key[]Profiles at the path start (any closed shape; multi-loop: outer + holes)
topProfileshape key[]Profiles at the path end (any closed shape; multi-loop: outer + holes)
isSolidbooldefault true

Rejected: a path that is a loop of more than one segment. NewSweptBlend takes a single curve, so only the opening segment would be used and the rest would be silently dropped. Name one segment node instead.

opening

Cuts a hole through a specific host form.

FieldUnitDescription
hostform keyThe form to cut through — the Host dropdown lists only form nodes
profileshape key[]Exactly one shape key — the shape of the opening

Rejected: a host that is not a form (extrusion, blend, revolution, sweep, sweptBlend, adaptiveLoftForm). NewOpening cuts through the host form itself, so a curve, a datum or an annotation leaves nothing to cut.

Rejected: a profile naming more than one loop. An opening is a single outer loop. For perforated cuts (holes with holes), use a void extrusion with isSolid: false instead.


Curves — visible line elements

Curve nodes produce visible lines in the Revit family, not geometry. They use the same segment nodes as profiles.

modelCurve

A 3D model line visible in all views.

FieldUnitDescription
curvesegment keyA single open-curve segment: line, arc, ellipseArc, or spline (loops and closed shapes are not supported)

Curve nodes carry the same properties as a form minus material: subcategory (the line's subcategory — what Revit shows as its line style), visible (a literal or a Yes/No parameter key), and detailLevels.

symbolicCurve

A 2D symbolic line. Unlike modelCurve it is view-specific: Revit draws it only in views parallel to the plane it was sketched on, which view picks.

FieldUnitDescription
curvesegment keyA single open-curve segment: line, arc, ellipseArc, or spline (loops and closed shapes are not supported)
viewplan | front | back | left | rightWhich plane to draw on — optional, default plan

The curve's own [U, V] coordinates are read in that plane, so they keep the reading direction of the matching view:

viewU axisV axisShows in
planXYFloor plans
frontXZFront elevation
back−XZBack elevation
leftYZLeft elevation
right−YZRight elevation
{ "nodeType": "symbolicCurve", "key": "SwingArc", "args": { "curve": "SwingArcCurve" },
  "properties": { "subcategory": "Plan Swing" } }

A casement or awning swing belongs in an elevation, not in the plan — draw it with view: "front" rather than with a modelCurve, which would put a real 3D line in the model:

{ "nodeType": "symbolicCurve", "key": "SwingUpper",
  "args": { "curve": "SwingUpperCurve", "view": "front" },
  "properties": { "subcategory": "Elevation Swing" } }

Arrays

Array nodes repeat a source node.

  • count is required, and a missing one is a hard error before generation — not a default. Revit's LinearArray.Create / RadialArray.Create take the total member count and refuse anything below 2, so an array with no count has no meaning to fall back to.
  • count can flex: if it references a parameter, the runner labels the Revit array group with that family parameter, so changing it in the project adds or removes copies. Any numeric parameter type drives it (integer, number, length, …) — a text, material, url or Yes/No parameter is refused, because Revit has no dimension for one.
  • count must come out 2 or more in every family type. Below 2 Revit creates no array at all and the geometry it stands for simply disappears at that type, so Molding refuses it and names the type. Give the count a floor — point it at a parameter whose formula is, say, if(Shelves < 2, 2, Shelves) (Revit formulas have no max) — or state the members as their own forms.
  • linearArray.offset can flex: each axis of the offset that names a parameter gets a labelled step dimension between the source and its first copy, so the spacing changes with the parameter.
  • The arrayed form's profile does not flex. Revit's array puts every member, the source included, into a group, and grouping removes each constraint between a group member and an element outside it — which is what the alignments holding the profile to its reference planes are. The profile is therefore baked at the size it was generated with (measured 2026-09-24, Revit 2023: an arrayed 800 × 300 mm shelf stayed 800 × 300 at a family type asking for 900 × 350). So an array whose source form has a parameter key anywhere in its profile is refused before generation (nonParametricCoordinate) — a hard error, not a notice. Give the arrayed form a profile of plain numbers (its count, its offset and the form's own depth still flex), or, for a shape that must resize per type, place the copies as separate forms instead of arraying one.
  • radialArray.totalAngle must be a plain number — a parameter key there is refused before generation (nonParametricCoordinate). An angular dimension is the only way to label an angle, and Revit accepts no reference an arrayed element can offer for one (measured 2026-09-24: InvalidObjectException for radial reference planes and for arrayed reference lines alike). The count of a radial array still flexes.

linearArray

Copies a node in a straight line.

FieldUnitDescription
sourcenode keyNode to repeat
countCoord (numeric)Total copies including the original; 2 or more at every family type
offsetPoint2D or Point3D (mm)Per-copy offset [U, V] or [U, V, W] — never all-zero

Rejected: an offset that resolves to a zero vector at any family type. LinearArray.Create with a zero step puts every member on top of the source, so the runner creates no array and the preview would stack coincident copies.

U and V stay in the sketch plane; the optional third component W runs along the sketch-plane normal, which is how a level-based family stacks copies upward:

{ "nodeType": "linearArray", "key": "ShelfStack",
  "args": { "source": "Shelf", "count": "ShelfCount", "offset": [0, 0, "ShelfPitch"] } }

A vertical step still flexes: the runner places the array in an elevation view and dimensions the step there, exactly as it does for a horizontal one in the plan.

radialArray

Copies a node in a circle.

FieldUnitDescription
sourcenode keyNode to repeat
countCoord (numeric)Number of copies; 2 or more at every family type
centerPoint2D (mm)Centre of the circle
totalAngleCoord (rad)Total sweep angle (2π = full circle)

Arrays and transforms — ordering requirement

Arrays and transforms operate on already-created Revit geometry. Their source node — and an opening's or connector's host — must appear earlier in the nodes array: the runner resolves these to element ids while walking the list in order, so a reference pointing forward finds nothing. Molding refuses a forward reference before generation (forwardNodeReference) and names the node to move up, rather than letting the element be dropped in silence.

Exception (no ordering required): adaptivePoint nodes are processed in a separate pre-pass before all other geometry, so they can appear anywhere in the list. Materials and subcategories are lanes, not nodes, and are created before any geometry.

Shapes and curves (rectangle, circle, loop, arc, etc.) referenced by forms can also appear in any order — forms resolve them by key from the JSON dictionary before creating geometry.

Convention: declare shapes/forms first, then arrays and transforms that reference them.

Transforms

Transform nodes reposition geometry. Behaviour differs by type:

  • copy and mirror — the source is preserved and an additional copy is produced.
  • move and rotate — the source is replaced in place (Revit moves/rotates the element; no duplicate is created). Their source must not be a form or an opening: a form's sketch is locked to the reference planes that hold its size and position, and moving it in place breaks those locks (Revit reports Constraints are not satisfied), so Molding refuses it (unsupportedGeometry). Place a form through its profile coordinates (a shape's Center), or copy / mirror it. move and rotate remain for curves, text and nested families.

There is no scale node. Revit's ElementTransformUtils has no scale operation in any version, so nothing could carry a scale into the .rfa — drive the form's own sizes with a parameter instead.

A transform's source may be any element the runner created, not only a form: a modelCurve, a symbolicCurve, a referencePlane or a nestedFamily can be copied, mirrored, arrayed, moved or rotated; an opening, like a form, can only be copied, mirrored or arrayed. The 3D preview shows no mesh for the ones it cannot build (a curve, a datum, an annotation, a nested .rfa) — they still reach the .rfa. Transforming an opening copies the cut host, hole included.

Rejected: a parameter key in move.offset, copy.offset, rotate.angle or nestedFamily.rotation. These reach ElementTransformUtils (and NewFamilyInstance) as a plain number, with no element parameter left to associate, so the value would be baked at generation and never flex in Revit — while the editor's preview would keep re-deriving it per family type and show something the .rfa does not do. Move the parametric part into the form's own profile, or state the copies as their own forms.

mirror

FieldUnitDescription
sourcenode keyNode to mirror
axisx or yMirror about the model X axis or Y axis

move

FieldUnitDescription
sourcenode keyNode to move
offsetPoint3D (mm)Translation [X, Y, Z]

rotate

FieldUnitDescription
sourcenode keyNode to rotate
axisx, y, or zRotation axis through the model origin
angleCoord (rad)Rotation angle

copy

FieldUnitDescription
sourcenode keyNode to copy
offsetPoint3D (mm)Translation [X, Y, Z]

Datum

referencePlane

An explicit named reference plane. Molding auto-generates reference planes for every parametric coordinate — only add one manually when it must be visible and named in the Family Editor, or when it must carry an Is Reference slot.

FieldUnitDescription
namestringVisible name in the Family Editor
axisx or yThe plane is perpendicular to this axis
offsetCoord (mm)Distance from the origin along the axis — flexes (the runner drives it with a labelled dimension)
isReferenceselectRevit's Is Reference setting; default weak

isReference is what the plane offers once the family is placed in a project: a reference a dimension or an alignment can grab. The Is Reference dropdown lists Revit's own entries:

ValueIn Revit
notAReferenceNot a Reference
strongStrong Reference
weakWeak Reference — the default for a new reference plane
left / centerLeftRight / rightLeft · Center (Left/Right) · Right
front / centerFrontBack / backFront · Center (Front/Back) · Back
bottom / centerElevation / topBottom · Center (Elevation) · Top

Each named slot (Left, Center (Left/Right), …) belongs to one plane only — give two planes the same slot and Revit keeps the last one.


Materials and subcategories

These are not nodes. They live in their own lanes at the root of the family, beside parameters and nodes, and are created before any geometry — so a node can reference one declared anywhere. In the editor they are the Materials tab: two lists, Materials and Subcategories, each with a + to add an entry. Each entry has two inputs: the first (tooltip Key (the Revit name of this record)) is its Revit name, the second (tooltip Editor label) is the editor name.

materials

Each entry's key is the Revit material name: the runner reuses a material of that name if the template already has one, otherwise it creates it and applies the args.

FieldUnitDescription
keystringThe Revit material name
labelstringEditor display name; optional
args.color[R, G, B]Colour, RGB 0–255
args.transparencynumberTransparency 0–100

To apply one, set a form's properties.material to that key. Point it at a material parameter key instead and the material becomes editable per type or instance in Revit.

"materials": [
  { "key": "Wood - Walnut",  "args": { "color": [120, 81, 45], "transparency": 0 } },
  { "key": "Metal - Chrome", "args": { "color": [205, 205, 210] } }
]

subcategories

A subcategory of the family's own category (what Revit shows in Object Styles). The key is the subcategory name, reused if the template already has it.

FieldUnitDescription
keystringThe Revit subcategory name
labelstringEditor display name; optional
args.materialmaterials keyThe subcategory's "By Category" material; optional

Set a node's properties.subcategory to the key. For curve nodes this is what Revit calls the line style.

"subcategories": [
  { "key": "Hardware",   "args": { "material": "Metal - Chrome" } },
  { "key": "Plan Swing", "args": {} }
]

Text

modelText

3D extruded text. Has no 3D viewport preview — it appears only in the generated .rfa.

FieldUnitDescription
textstringText content
positionPoint2D (mm)Placement point
depthCoord (mm)Extrusion depth of the letters

modelText takes the same properties as a form (material, subcategory, visible, detailLevels). Set label to give the element a readable name in the editor.


Annotations — 2D, view-only

Annotation nodes create view-specific 2D elements. They appear only in plan/section views inside Revit and have no 3D viewport preview.

textNote

FieldUnitDescription
textstringText content
positionPoint2D (mm)Placement point

filledRegion

A filled hatch region.

Template: Revit only allows filledRegion and detailCurve in a detail-item family. The validator refuses them in any other template (unsupportedTemplate); accepted templates: metric-detail-item, metric-detail-item-line-based (measured in Revit 2023: refused in the generic model, furniture and door templates).

FieldUnitDescription
profileshape key[]Outer boundary and optional holes — any closed shape key (loop, rectangle, circle, ellipse, polygon, slot)

detailCurve

A 2D detail line.

Template: Revit only allows filledRegion and detailCurve in a detail-item family. The validator refuses them in any other template (unsupportedTemplate); accepted templates: metric-detail-item, metric-detail-item-line-based (measured in Revit 2023: refused in the generic model, furniture and door templates).

FieldUnitDescription
curvesegment keyA single open-curve segment: line, arc, ellipseArc, or spline (loops and closed shapes are not supported)

Same properties as the other curve nodes: subcategory (its line style), visible, detailLevels.

control

Flip/rotate arrows added to the family for use in the project.

FieldUnitDescription
shapestringhorizontal, vertical, doubleHorizontal, or doubleVertical
positionPoint2D (mm)Placement point

image

A raster image placed in the first 2D view.

FieldUnitDescription
pathfile pathAbsolute path to the image file (.png / .jpg) on the Revit machine
positionPoint2D (mm)Placement point

MEP

connector

An MEP connector attached to a form face. The family must be in an MEP category (Electrical Fixtures, Mechanical Equipment, Plumbing Fixtures…).

FieldUnitDescription
kindstringelectrical, pipe, duct, conduit, or cableTray
hostform keyThe form the connector attaches to — the Host dropdown lists only form nodes

The connector is placed on the first planar face of the host form.

Rejected: a host that is not a form (extrusion, blend, revolution, sweep, sweptBlend, adaptiveLoftForm). A connector needs a face of a solid; a curve or an annotation has none.


Adaptive

Adaptive nodes require an adaptive family template (e.g. metric-generic-model-adaptive). They make the family snap to points the user clicks when placing it in a Revit model.

adaptivePoint

A placement click point. Points are activated in the order they appear in the Generators list (first node = first click).

FieldUnitDescription
positionPoint3D (mm)Default position [X, Y, Z]

adaptiveLoftForm

A lofted solid or surface through profiles of adaptive points.

FieldUnitDescription
profiles[[keys]…]Outer array = profile sequence; inner = ordered adaptive point keys per cross-section, at least 3 per section
isSolidbooldefault true

One profile → a cap surface. Two or more profiles → a loft.

Rejected: a cross-section of fewer than 3 adaptive points. The runner connects a section's points pairwise and wraps the last back to the first, so two points enclose no area and there is nothing for the cap or the loft to span.

curveByPoints

A reference curve through adaptive points.

FieldUnitDescription
pointsadaptivePoint key[]Ordered list (minimum 2)

Family

nestedFamily

Places a nested .rfa instance inside this family.

FieldUnitDescription
pathfile pathAbsolute path to the .rfa file on the Revit machine
positionPoint2D (mm)Placement point [U, V]
symbolstringFamily type to place; default = first type
rotationnumber (rad)Rotation about Z at the placement point. Must be a plain number — see the transform note above
parameterLinksmap{ nestedParam: hostParamKey } — drives nested instance parameters from this family's parameters

To wire nested parameters, use the Parameter Links editor that appears in the expanded node row.

📖 24 min read