Array 2-Point Adaptive Family on 3D Mass / Adaptive Curve
Select a source 3D Mass or Adaptive Component, pick any extracted edge as the array path, configure spacing and position, then place repeated 2-adaptive-point families along the curve in a single Revit transaction.
What Does This Tool Do?
The Adaptive 3D Array tool (ArraytAdaptive3D) places repeated instances of a 2-adaptive-point Revit family along any edge or curve extracted from a 3D Mass or Adaptive Component already placed in your model. Each instance spans between two computed station points — so the family stretches and orients precisely along the chosen curve with full control over spacing, gaps, elevation, and lateral offset.
3D Mass Source
Extracts every solid edge from any conceptual mass placed in the project.
Adaptive Curve
Uses form edges from any placed adaptive component as the array path.
Live 3D Preview
Interactive orbit/pan/zoom canvas — click curves directly to select them.
Station Control
Start, End, Interval Space, and Gap define the exact repeat pattern in metres.
Validated
AutoBRIDGE confirms the family has exactly 2 adaptive points before any placement.
- The target family must be an Adaptive Component with exactly 2 adaptive placement points.
- The family must be loaded as a Generic Model in the Revit project before opening this tool.
Form Layout — Five Zones
The form (ArraytAdaptive3D, 772 × 707 px borderless) is organised into three rows. Understanding each zone before starting makes the workflow faster:
| # | Zone | Purpose |
|---|---|---|
| 1 | Selector Bar (Row 1, 5%) | Four controls side-by-side: source mass picker, curve picker, reverse toggle (⇄), and target family picker. |
| 2 | 3D Canvas (Row 2 left, 87%) | Interactive GDI+ viewport showing all extracted edges. Click to select a curve; yellow dots update live to preview array station positions. |
| 3 | Parameter Panel (Row 2 right, 122 px fixed) | Six text inputs — Start, End, Interval Space, Gap, Level, Offset — all in metres. Changes update the canvas immediately. |
| 4 | Alignment Info (Row 3 left) | Displays the selected mass name and curve length for confirmation before running. |
| 5 | RUN Button (Row 3 right) | Cyan 120 × 40 px button that triggers validation and placement in a single Revit transaction. |
Select Source & Curve
The top row contains two linked dropdowns that identify what element to extract geometry from and which of its edges to use as the array path. Both must be set before any other step.
comboBox1 is populated on form load, not dynamically refreshed.
Select the Source Mass or Adaptive Component
The leftmost dropdown (comboBox1) lists every adaptive component and 3D mass instance currently placed in the project, populated by Adaptives.GetAllFamilyInstanceDoc(). Select the element whose edges you want to array along.
Once selected, AutoBRIDGE walks the full geometry tree — unpacking GeometryInstance objects recursively, extracting all Solid edges via edge.AsCurve(), and collecting standalone Curve objects — then sorts them longest first and populates the Curve dropdown.
Select the Target Curve
After selecting the source, comboBox2 is filled with all extracted curves labelled Curve N (Length: X.XXX) in metres, sorted longest first. Pick the edge you want to array along.
Selecting a curve immediately auto-fills the End field with the curve length using floor-truncation to 3 decimal places: Math.Floor(curve.Length × 0.3048 × 10³) / 10³. The chosen curve is highlighted red in the 3D canvas and yellow station dots appear instantly.
Optionally Reverse the Curve Direction
The ⇄ button between the two dropdowns is a CheckBox styled as a button. When checked, the selected curve is reversed via curve.CreateReversed() before placement — the array starts from the far end and runs toward the near end. The yellow preview dots update immediately.
Select the Adaptive Family
comboBox3 — the rightmost dropdown in the top bar — lists all Generic Model family symbols loaded in the project, sorted alphabetically. Select the 2-point adaptive family you want to repeat along the curve.
Select the Family from the Dropdown
Pick the Generic Model family you want to array. The list is populated by PopulateComboBox3(), which collects all FamilySymbol objects in the OST_GenericModel category, deduplicates by name, and sorts alphabetically.
How the 2-Point Validation Works
When RUN is clicked, AutoBRIDGE performs a three-step check before placing anything in the model:
- Find the Family by name — searches the document for a
Familyobject matching the selected item. Shows an error if not found. - Confirm it is Adaptive — calls
AdaptiveComponentInstanceUtils.IsAdaptiveFamilySymbol(symbol). Non-adaptive families are rejected here. - Count the adaptive points — creates a temporary instance inside a rolled-back transaction, calls
GetInstancePlacementPointElementRefIds()and checks the count equals 2 exactly. Deletes the temp instance, rolls back.
Configure Array Parameters
The right panel (panel1, 122 px wide) contains six input fields that control how instances are distributed along the curve. All values are in metres. Internal calculations convert to Revit's feet automatically. Every text change fires pictureBox2.Invalidate() — yellow preview dots refresh live.
Set Start and End Stations
Start (default: 0) is the station along the selected curve where the first instance begins. End is auto-filled from the selected curve length but can be reduced to restrict the array to a sub-range of the curve.
Validation rules: Start must be ≥ 0, End must be ≤ curve length, and Start must be < End. Any violation shows a clear error dialog and stops placement.
Set Interval Space and Gap
Interval Space (default: 10 m) is the arc length each family instance spans — the distance between its Point[0] and Point[1]. Gap (default: 0.2 m) is the empty space left between consecutive instances. After each instance is placed, the algorithm advances by Space + Gap.
Set Level and Offset Adjustments
Level + - (default: 0) adds a vertical Z shift in metres to both adaptive points of every instance. Positive = up, negative = down. Useful for aligning the family to a bearing seat or deck soffit level.
Offset (default: 0) shifts instances laterally perpendicular to the curve. The perpendicular direction is computed as curve_tangent × Z-up (cross product), normalised, then scaled. Positive = left relative to curve direction, negative = right.
Reading the 3D Preview Canvas
The large pictureBox2 GDI+ canvas provides a real-time perspective view of all curves extracted from the selected element. Use it to orbit, identify, and click-select the correct curve before committing the run.
Understand What the Canvas Renders
The canvas draws five visual layers on a medium-grey background (#7D7D7D):
- Fine grid — grey lines at 10 m spacing on the XY ground plane
- Coarse grid — slightly blue-grey lines at 50 m spacing
- All form edges — white, 2 px — every curve extracted from the selected mass
- Selected curve — red, 3 px — the curve chosen in comboBox2 or by canvas click
- Station dots — yellow, 4 px radius — one dot per adaptive point placement; updates live as parameters change
An XYZ axis indicator (X=red, Y=green, Z=blue) is pinned to the bottom-right corner in screen space.
Interact with the Canvas to Verify Placement
Use the canvas to orbit around the mass and inspect station dot positions from different angles before committing the run:
| Action | Input | Effect |
|---|---|---|
| Orbit | Ctrl + left-drag | Rotates azimuth (0.5°/px) and elevation (0.5°/px, clamped 5°–175°) |
| Pan | Left-drag (no Ctrl) | Shifts viewport offset in screen space |
| Zoom | Scroll wheel | Adjusts camera radius ×10% per step, minimum radius 1 |
| Reset view | Double-click | Resets pan offset to zero and restores fit-to-content radius |
| Select a curve | Left-click near a curve | Selects nearest projected curve within 10 px; syncs comboBox2 and auto-fills End |
| Deselect | Left-click on empty space | Clears selection; comboBox2 index reset to −1 |
Run the Placement & Validate
The RUN button triggers a sequence that validates inputs, computes all station points, and places every instance in a single Revit transaction. A progress bar appears below the run bar during execution.
Review the Alignment Info Bar and Click RUN
Before clicking RUN, verify the Alignment info group box shows the correct mass name and curve. Then click the cyan RUN button (bottom-right, 120 × 40 px). The tool first checks that a curve is selected and a family is chosen — if either is missing, an error dialog appears and nothing changes in the model.
All Instances Placed in One Transaction
After validation passes, all instances are created inside a single Revit transaction named "Place Multiple Adaptive Components". For each span, the tool creates an adaptive component instance, retrieves both ReferencePoint objects, and sets rp1.Position = point1 and rp2.Position = point2 from the pre-computed station list. If a single instance fails due to a geometry fault, it is silently skipped via continue and the rest proceed.
Confirm Success in the 3D View
A dialog confirms how many instances were placed. Open a 3D view in Revit to verify — instances should span precisely between the computed stations along the selected curve edge, with the correct Level and Offset applied throughout.
If the arrayed family forms part of a bridge corridor cross-section, see: Corridor Creation Workflow →
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
| comboBox1 is empty | No 3D Mass or Adaptive Component placed in the project | Place at least one mass or adaptive family instance before opening the form |
| comboBox2 is empty after selecting source | The element has no extractable geometry edges in the active view | Ensure the mass has a resolved solid form; the tool uses IncludeNonVisibleObjects = true but still requires a valid active view |
| Canvas shows "No form edges" | Geometry extraction returned zero curves | Try a different mass, or verify the element has a joined solid form in Revit |
| RUN rejects — "not 2 adaptive points" | The selected family has 1, 3, or more adaptive points | Only use Generic Model families with exactly 2 adaptive placement points |
| Yellow dots don't appear along the red curve | Start ≥ End, or Interval Space ≤ 0 | Check all parameter values; End must exceed Start and Space must be positive |
| Instances placed at wrong elevation | Level field not adjusted | Set Level + - to the required vertical adjustment in metres |
| Instances are laterally shifted | Offset field is non-zero | Reset Offset to 0 for on-curve placement with no lateral displacement |
| >1000 instance warning appears | Curve is long relative to spacing | Increase Interval Space, reduce the End station, or confirm and proceed if the count is intentional |