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.
| Group | Nodes | What they produce |
|---|---|---|
| Segment | line, arc, ellipseArc, spline | Open curves — used in loop.segments or as a form path |
| Shape | rectangle, circle, ellipse, polygon, slot, loop | Closed profiles — used in form profile fields |
| Form | extrusion, blend, revolution, sweep, sweptBlend, opening | 3D solids and voids |
| Curve | modelCurve, symbolicCurve | Visible lines (not solids) |
| Array | linearArray, radialArray | Copies of a node in a line or circle |
| Transform | mirror, move, rotate, copy | Repositioned or duplicated geometry |
| Text | modelText | 3D extruded text |
| Annotation | image, textNote, filledRegion, detailCurve, control | 2D view-only elements |
| MEP | connector | An MEP connector on a form |
| Datum | referencePlane | An explicit named reference plane |
| Family | nestedFamily | A nested .rfa instance |
| Adaptive | adaptivePoint, adaptiveLoftForm, curveByPoints | Adaptive 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
loopnode to build a freeform closed profile. - As the
pathof asweeporsweptBlendform.
line
A straight line between two points.
| Field | Unit | Description |
|---|---|---|
| start | Point2D (mm) | Start point [U, V] |
| end | Point2D (mm) | End point [U, V] |
arc (3-point)
A circular arc that passes through three points: start → mid → end.
| Field | Unit | Description |
|---|---|---|
| start | Point2D (mm) | First endpoint |
| mid | Point2D (mm) | A point on the arc (anywhere between start and end) |
| end | Point2D (mm) | Second endpoint |
ellipseArc
A partial ellipse defined by a centre, two semi-axes, and a start/end angle.
| Field | Unit | Description |
|---|---|---|
| center | Point2D (mm) | Centre of the ellipse |
| radiusX | Coord (mm) | Semi-axis along U |
| radiusY | Coord (mm) | Semi-axis along V |
| startAngle | Coord (rad) | Start angle |
| endAngle | Coord (rad) | End angle |
spline
A smooth interpolated curve through an ordered list of points.
| Field | Unit | Description |
|---|---|---|
| points | Point2D[] (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,radiusYand slotlengthmust 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.rfawithout 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
| Field | Unit | Description |
|---|---|---|
| width | Coord (mm) | Total width |
| height | Coord (mm) | Total height |
| center | Point2D (mm) | Centre position; default [0, 0] |
| cornerRadius | Coord (mm) | Rounds all four corners; default 0 |
Rejected: a
cornerRadiusbelow zero, or one that reaches or passesmin(width, height) / 2at 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
| Field | Unit | Description |
|---|---|---|
| radius | Coord (mm) | Radius |
| center | Point2D (mm) | Centre position; default [0, 0] |
ellipse
| Field | Unit | Description |
|---|---|---|
| radiusX | Coord (mm) | Semi-axis along U |
| radiusY | Coord (mm) | Semi-axis along V |
| center | Point2D (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).
| Field | Unit | Description |
|---|---|---|
| sides | integer literal | Side count: 3 = triangle, 4 = square, 6 = hexagon… Must be a plain number |
| radius | Coord (mm) | Circumradius — flexes (each vertex is dimensioned from the centre, keeping the polygon regular) |
| center | Point2D (mm) | Centre position; default [0, 0] |
Rejected: a parameter key in
sidesis 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).
| Field | Unit | Description |
|---|---|---|
| length | number (mm) | Total outer length (edge to edge); straight section = length − 2×radius. Must be a plain number |
| radius | number (mm) | Radius of the semicircular ends. Must be a plain number |
| center | Point2D (mm) | Centre position; default [0, 0] — this one takes a parameter key |
Rejected: a parameter key in
lengthorradiusis 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 throughcenter, but its size is fixed. If the shape itself must flex, use arectanglewithcornerRadiusinstead.
loop
A freeform closed profile assembled from ordered segment nodes.
| Field | Unit | Description |
|---|---|---|
| segments | segment 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/splinepoint, or in anellipseArcradius or angle, is refused before generation (nonParametricCoordinate) when a form sketches that curve — that is, when it reaches a form'sprofile,bottomProfile,topProfileorpath, either directly or through aloop. 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 asymbolicCurve,modelCurveordetailCurve— 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:
| Property | Value | Effect |
|---|---|---|
material | a materials-lane key, or a material parameter key | Fixed material, or one the user picks per type/instance in Revit |
subcategory | a subcategories-lane key | Assigns the form to a subcategory (graphics overrides) |
visible | true / false, or a Yes/No parameter key | Shows 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.
| Field | Unit | Description |
|---|---|---|
| profile | shape key[] | Closed profiles: first = outer boundary, additional = holes (any closed shape: loop/rectangle/circle/ellipse/polygon/slot) |
| depth | Coord (mm) | Extrusion depth |
| startOffset | Coord (mm) | Offset from the sketch plane; default 0 |
| isSolid | bool | true (solid) or false (void); default true |
blend
Lofts between a bottom profile and a top profile.
| Field | Unit | Description |
|---|---|---|
| bottomProfile | shape key[] | Exactly one shape key — a blend cap holds no holes |
| topProfile | shape key[] | Exactly one shape key — a blend cap holds no holes |
| depth | Coord (mm) | Distance from bottom to top |
| bottomOffset | Coord (mm) | Offset of the bottom from the sketch plane; default 0 |
| isSolid | bool | default true |
Rejected: a cap naming more than one loop. Revit's
NewBlendtakes 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.
| Field | Unit | Description |
|---|---|---|
| profile | shape key[] | Cross-section to spin (must be on one side of the axis); any closed shape (loop/rectangle/circle/…) |
| axisStart | Point2D (mm) | Start of the revolution axis |
| axisEnd | Point2D (mm) | End of the revolution axis — must differ from axisStart |
| startAngle | Coord (rad) | Start angle; default 0 |
| endAngle | Coord (rad) | End angle; default 2π |
| isSolid | bool | default true |
sweep
Pushes a constant profile along a path.
| Field | Unit | Description |
|---|---|---|
| path | segment/loop key | A segment or loop node used as the path (all segments of a loop are used in order) |
| profile | shape key[] | Cross-section to push (any closed shape) |
| isSolid | bool | default true |
sweptBlend
Follows a path and morphs between two profiles.
| Field | Unit | Description |
|---|---|---|
| path | segment/loop key | Single path curve — a segment node or a loop (only first segment of the loop is used) |
| bottomProfile | shape key[] | Profiles at the path start (any closed shape; multi-loop: outer + holes) |
| topProfile | shape key[] | Profiles at the path end (any closed shape; multi-loop: outer + holes) |
| isSolid | bool | default true |
Rejected: a
paththat is a loop of more than one segment.NewSweptBlendtakes 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.
| Field | Unit | Description |
|---|---|---|
| host | form key | The form to cut through — the Host dropdown lists only form nodes |
| profile | shape key[] | Exactly one shape key — the shape of the opening |
Rejected: a
hostthat is not a form (extrusion,blend,revolution,sweep,sweptBlend,adaptiveLoftForm).NewOpeningcuts through the host form itself, so a curve, a datum or an annotation leaves nothing to cut.
Rejected: a
profilenaming more than one loop. An opening is a single outer loop. For perforated cuts (holes with holes), use a voidextrusionwithisSolid: falseinstead.
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.
| Field | Unit | Description |
|---|---|---|
| curve | segment key | A 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.
| Field | Unit | Description |
|---|---|---|
| curve | segment key | A single open-curve segment: line, arc, ellipseArc, or spline (loops and closed shapes are not supported) |
| view | plan | front | back | left | right | Which 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:
| view | U axis | V axis | Shows in |
|---|---|---|---|
plan | X | Y | Floor plans |
front | X | Z | Front elevation |
back | −X | Z | Back elevation |
left | Y | Z | Left elevation |
right | −Y | Z | Right 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.
countis required, and a missing one is a hard error before generation — not a default. Revit'sLinearArray.Create/RadialArray.Createtake the total member count and refuse anything below 2, so an array with no count has no meaning to fall back to.countcan 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, …) — atext,material,urlor Yes/No parameter is refused, because Revit has no dimension for one.countmust 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 nomax) — or state the members as their own forms.linearArray.offsetcan 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 (itscount, itsoffsetand 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.totalAnglemust 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:InvalidObjectExceptionfor radial reference planes and for arrayed reference lines alike). Thecountof a radial array still flexes.
linearArray
Copies a node in a straight line.
| Field | Unit | Description |
|---|---|---|
| source | node key | Node to repeat |
| count | Coord (numeric) | Total copies including the original; 2 or more at every family type |
| offset | Point2D or Point3D (mm) | Per-copy offset [U, V] or [U, V, W] — never all-zero |
Rejected: an
offsetthat resolves to a zero vector at any family type.LinearArray.Createwith 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.
| Field | Unit | Description |
|---|---|---|
| source | node key | Node to repeat |
| count | Coord (numeric) | Number of copies; 2 or more at every family type |
| center | Point2D (mm) | Centre of the circle |
| totalAngle | Coord (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:
copyandmirror— the source is preserved and an additional copy is produced.moveandrotate— the source is replaced in place (Revit moves/rotates the element; no duplicate is created). Their source must not be a form or anopening: 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), orcopy/mirrorit.moveandrotateremain 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.angleornestedFamily.rotation. These reachElementTransformUtils(andNewFamilyInstance) 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.rfadoes not do. Move the parametric part into the form's own profile, or state the copies as their own forms.
mirror
| Field | Unit | Description |
|---|---|---|
| source | node key | Node to mirror |
| axis | x or y | Mirror about the model X axis or Y axis |
move
| Field | Unit | Description |
|---|---|---|
| source | node key | Node to move |
| offset | Point3D (mm) | Translation [X, Y, Z] |
rotate
| Field | Unit | Description |
|---|---|---|
| source | node key | Node to rotate |
| axis | x, y, or z | Rotation axis through the model origin |
| angle | Coord (rad) | Rotation angle |
copy
| Field | Unit | Description |
|---|---|---|
| source | node key | Node to copy |
| offset | Point3D (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.
| Field | Unit | Description |
|---|---|---|
| name | string | Visible name in the Family Editor |
| axis | x or y | The plane is perpendicular to this axis |
| offset | Coord (mm) | Distance from the origin along the axis — flexes (the runner drives it with a labelled dimension) |
| isReference | select | Revit'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:
| Value | In Revit |
|---|---|
notAReference | Not a Reference |
strong | Strong Reference |
weak | Weak Reference — the default for a new reference plane |
left / centerLeftRight / right | Left · Center (Left/Right) · Right |
front / centerFrontBack / back | Front · Center (Front/Back) · Back |
bottom / centerElevation / top | Bottom · 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.
| Field | Unit | Description |
|---|---|---|
| key | string | The Revit material name |
| label | string | Editor display name; optional |
| args.color | [R, G, B] | Colour, RGB 0–255 |
| args.transparency | number | Transparency 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.
| Field | Unit | Description |
|---|---|---|
| key | string | The Revit subcategory name |
| label | string | Editor display name; optional |
| args.material | materials key | The 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.
| Field | Unit | Description |
|---|---|---|
| text | string | Text content |
| position | Point2D (mm) | Placement point |
| depth | Coord (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
| Field | Unit | Description |
|---|---|---|
| text | string | Text content |
| position | Point2D (mm) | Placement point |
filledRegion
A filled hatch region.
Template: Revit only allows
filledRegionanddetailCurvein 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).
| Field | Unit | Description |
|---|---|---|
| profile | shape 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
filledRegionanddetailCurvein 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).
| Field | Unit | Description |
|---|---|---|
| curve | segment key | A 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.
| Field | Unit | Description |
|---|---|---|
| shape | string | horizontal, vertical, doubleHorizontal, or doubleVertical |
| position | Point2D (mm) | Placement point |
image
A raster image placed in the first 2D view.
| Field | Unit | Description |
|---|---|---|
| path | file path | Absolute path to the image file (.png / .jpg) on the Revit machine |
| position | Point2D (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…).
| Field | Unit | Description |
|---|---|---|
| kind | string | electrical, pipe, duct, conduit, or cableTray |
| host | form key | The 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
hostthat 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).
| Field | Unit | Description |
|---|---|---|
| position | Point3D (mm) | Default position [X, Y, Z] |
adaptiveLoftForm
A lofted solid or surface through profiles of adaptive points.
| Field | Unit | Description |
|---|---|---|
| profiles | [[keys]…] | Outer array = profile sequence; inner = ordered adaptive point keys per cross-section, at least 3 per section |
| isSolid | bool | default 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.
| Field | Unit | Description |
|---|---|---|
| points | adaptivePoint key[] | Ordered list (minimum 2) |
Family
nestedFamily
Places a nested .rfa instance inside this family.
| Field | Unit | Description |
|---|---|---|
| path | file path | Absolute path to the .rfa file on the Revit machine |
| position | Point2D (mm) | Placement point [U, V] |
| symbol | string | Family type to place; default = first type |
| rotation | number (rad) | Rotation about Z at the placement point. Must be a plain number — see the transform note above |
| parameterLinks | map | { 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.