3D String from
3D Mass / Adaptive Edge
Select any placed 3D Mass or Adaptive Component, click an edge in the interactive 3D canvas to choose your path curve, then generate a parametric 3D spline family that exactly follows that geometry edge — no topography reference required.
What Does This Tool Do?
The 3D Mass / Adaptive Edge tool (AlignmentAdaptive3D) extracts an edge curve directly from the solid geometry of a placed 3D Mass or Adaptive Component already in the Revit model. It tessellates the selected edge at a fixed 1-metre interval, adjusts all points relative to the first point, then creates a CurveByPoints spline family that precisely traces that edge in 3D space.
This tool is fundamentally different from the other 3D string tools — it reads geometry that already exists in 3D in Revit. No topography, no Civil 3D, no model lines are needed. The edge itself carries the full X, Y, and Z information.
Direct from Mass
Reads solid edges from any Conceptual Mass or placed Adaptive Component — geometry already in 3D.
Click to Select
Click directly on an edge in the interactive 3D canvas — no need to identify curves from a list.
Full 3D Orbit
Orbit (Ctrl+drag), pan (middle-drag), zoom (scroll) — inspect the mass from any angle before selecting.
No Topography
No terrain reference needed. The edge already has the correct Z from the 3D mass geometry.
How This Tool Differs from the Others
Civil 3D
Horizontal alignment + vertical profile from a running C3D session. Needs Civil 3D.
MLine + Toposolid
Model lines + Toposolid (Revit 2024+) for terrain Z. Needs grouped model lines.
MLine + Topography
Model lines + legacy TopographySurface. Revit 2023 and earlier terrain.
3D Mass Edge (this)
Edge directly from a 3D mass or adaptive component. No extra data needed — geometry is already 3D.
Key Unique Characteristics
| Characteristic | 3D Mass / Adaptive Edge tool |
|---|---|
| Interval | Fixed at 1 m (3.28084 ft) — hardcoded, no user spinner |
| Canvas type | Single 3D perspective canvas with full orbit/pan/zoom — not a 2D plan view |
| Elevation view | None — the selected edge already carries full 3D XYZ from the mass geometry |
| Topography | Not used or required |
| Output family name | AutoBRIDGE_3DCurveFromEdge_IDxxxxx |
| Source types | FamilyInstance (Adaptive Component), Wall, Floor, or any element with solid geometry edges |
Select the Source Element
The top row contains two linked dropdowns. comboBox1 (left, placeholder: "3D Mass / Adaptive") lists all Adaptive Component family instances in the project, populated by PopulateFamilyComboBox() which calls Adaptives.GetAllFamilyInstanceDoc().
Select the 3D Mass or Adaptive Component
Click comboBox1 and choose the element whose edges you want to use. After selection, comboBox1_SelectedIndexChanged fires PopulateAdaptiveComponentCurves() which walks the full geometry tree of the selected element:
- Unpacks any
GeometryInstanceobjects recursively - Collects all
Solidedges viaedge.AsCurve() - Collects any standalone
Curveobjects - Sorts all found curves longest first
- Populates
comboBox2with entries labelledCurve N (Length: X.XX)
Simultaneously, the 3D canvas redraws showing all extracted edges of the selected element as white lines.
Select the Edge Curve
After selecting the source element, you can select the target edge curve in two ways — via the dropdown or by clicking directly in the 3D canvas. Both methods are equivalent and sync with each other.
Method A — Dropdown (comboBox2)
comboBox2 (right dropdown, placeholder: "Curve Length") lists all extracted edges sorted longest first, labelled Curve N (Length: X.XX) where the length is in Revit internal feet units. Select the edge by name. The canvas immediately highlights the selected edge in red (3 px) while all other edges remain white.
Method B — Click in the 3D Canvas
Left-click (without Ctrl) anywhere near an edge in the 3D canvas. The tool measures the screen-space distance from the click point to every projected edge segment. If the closest edge is within 10 pixels, it is selected — the canvas highlights it red and comboBox2 updates to match. Clicking in empty space clears the selection.
This is the recommended method for complex masses with many edges — orbit to a view where the desired edge is clearly visible, then click it directly.
Navigating the 3D Canvas
The 3D canvas (pictureBox2, background #7D7D7D) renders a perspective projection of all extracted edges. The camera is positioned using spherical coordinates (azimuth, elevation, radius) and supports full orbit, pan, and zoom.
Canvas Controls
| Action | Input | Detail |
|---|---|---|
| Select edge | Left-click (no Ctrl) | Selects nearest projected edge within 10 px threshold; clears selection if clicking empty space |
| Orbit | Ctrl + left-drag | Horizontal drag: azimuth (0.5°/px). Vertical drag: elevation (0.5°/px), clamped to 5°–175° to avoid gimbal flip |
| Pan | Middle-button drag | Shifts the viewport origin in screen space by the mouse delta |
| Zoom | Scroll wheel | Radius × 10% per scroll step; minimum radius = 1 unit |
| Reset view | Double-click | Resets pan offset to (0,0) and radius to the auto-fit value computed from the geometry bounding box |
fitRadius = maxExtent × 1.5 where maxExtent is the largest of the bounding box X, Y, Z dimensions. The view is fitted to show the entire element. Double-click to restore this fit-radius if you have zoomed in too far.
What the Canvas Renders
- Fine grid — grey lines at 10 m spacing on the XY ground plane (colour: RGB 136,136,136)
- Coarse grid — slightly darker lines at 50 m spacing (colour: RGB 100,100,118)
- All edges — white, 2 px — every curve extracted from the selected mass
- Selected edge — red, 3 px — the edge from
comboBox2or the last canvas click - No station dots in this tool — the interval is fixed at 1 m and tessellation happens only at RUN time, not in the preview
- XYZ axis indicator — pinned top-left (X=red, Y=green, Z=blue)
"No form edges in adaptive component": The selected element has no extractable solid edges in the current active view. Try a different element or ensure the mass has a resolved solid form.
Run and Validate
Click RUN — Five-Stage Pipeline
The cyan RUN button (bottom-right, 120×38 px) runs the following pipeline, tracked by a marquee-style progress bar:
- Curve validation — checks that
cachedSelectedCurvePointsis non-null and non-empty. Error: "Please select a curve from the form edges." Progress: 0%. - Tessellation at 1 m — calls
TessellateCurveWithInterval(cachedSelectedCurvePoints, 3.28084). Walks the cached tessellation points, accumulates segment lengths, and interpolates new points at every 1-metre arc-length interval along the edge. The start and end points are always included. Progress: 20%. - Point adjustment — calls
AdjustPointsRelativeToFirst(): subtracts the first point's coordinates from all points so the spline origin is at (0,0,0) within the family document. The original first point is stored asfirstPointfor placement. Progress: 30%. - Family document creation — opens a new family from the selected template (.rft), saves it as
AutoBRIDGE_3DCurveFromEdge_IDxxxxx.rfain the Temp folder, creates aReferencePointArraywith oneReferencePointper tessellation point, and callsfamilyDoc.FamilyCreate.NewCurveByPoints()to build the 3D spline. Progress: 40–80%. - Load & place — loads the .rfa into the active Revit document with
familyDoc.LoadFamily(doc), then places an instance atfirstPointusingAdaptives.PlaceAdaptiveFamily2(). Progress: 80–100%.
AutoBRIDGE_3DCurveFromEdge_IDxxxxx is placed in the model at the first point of the selected edge. The 3D spline inside the family traces the full edge at 1-metre intervals. The .rfa file is saved to Documents\AutoBRIDGE\Modeler\2026\family_template\{template}\Temp\.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| comboBox1 is empty | No Adaptive Component family instances placed in the project | Place at least one Adaptive Component instance in the model before opening the form |
| comboBox2 is empty after selecting source | Element has no extractable solid edges in the active view | Ensure the mass has a joined solid form; try with IncludeNonVisibleObjects — if still empty, the element's geometry may not have edge-level access |
| Canvas shows "No form edges" | Geometry extraction returned zero curves | Select a different mass element or verify the adaptive component has a solid body (not just reference lines) |
| Canvas click selects wrong edge | Edges are close together in projection; click threshold is 10 px | Orbit the view (Ctrl+drag) until the desired edge is clearly separated from its neighbours, then click |
| RUN error: "Please select a curve" | No edge selected in canvas or comboBox2 | Click on an edge in the canvas or select one from comboBox2 before clicking RUN |
| RUN error: "Not enough points to create a 3D curve" | The selected edge is shorter than 1 m (one interval) | Select a longer edge; the minimum usable edge length is slightly above 1 m |
| Placed family appears at wrong location | Mass is not at the Revit project origin | This is expected — the family is placed at firstPoint which is the first tessellation point of the selected edge in project coordinates |
| Spline does not match the edge exactly | 1 m interval introduces chord error on tight curves | The interval is fixed. For very tight curves (radius < 5 m) the chord approximation may be visible — this is a current limitation of the fixed 1 m tessellation |
| Template not found | AutoBRIDGE template setting is blank | Open AutoBRIDGE global settings and select a family template (.rft) before using this tool |
Complete Workflow Summary
| Step | Action | Result |
|---|---|---|
| 1 | Select source from comboBox1 | Canvas draws all edges of the mass; comboBox2 populated with curves sorted longest first |
| 2 | Orbit the canvas if needed (Ctrl+drag) | Rotate to a view angle where the desired edge is clearly visible and isolated |
| 3 | Left-click on the target edge in canvas | Edge highlighted red; comboBox2 synced to matching curve entry |
| 4 | Verify the red highlight is on the correct edge | If wrong, click again on the correct edge or use comboBox2 to switch |
| 5 | Click RUN | Tessellate at 1 m → adjust relative to first point → create family → load → place in Revit |
| 6 | Confirm success dialog | Family AutoBRIDGE_3DCurveFromEdge_IDxxxxx placed at the first edge point in the model |