Radial Array¶
Modal operator that arrays selected object hierarchies around a pivot/axis with a live 3D preview. It covers full circles, fixed-angle arcs, and a free Active-to-Cursor arc, with separate alignment, source-grouping and clone-type modes, plus an interactive lock/skip system for editing individual slots before commit.
Overview¶
The operator builds a radial array as a separate, interactive workflow rather than as a modifier. Sources can be the active object, an active subtree, the whole selection treated as a rigid group, or a pool from which random extras are picked once the slot count exceeds the source count. Pivot, axis, arc type and alignment are all hot-swappable while the modal is running, with parameters and key hints surfaced on the HUD and help overlay.
Use it instead of the Array modifier when you need a true rotational layout with per-instance control, when the axis or radius is derived from the 3D cursor or an active object's frame, or when you want to lock individual slots out before committing.
The result is a new collection _RadialArray_<root> containing duplicated or linked clones; in REPLACE mode the source objects are moved in place instead and overflow slots become linked instances in that same collection.
Usage¶
- Object mode, VIEW_3D, with at least one selected object and an active object.
- No default keymap binding; invoke via search or menu (
iops.object_radial_array). - On invoke the active object marks slot 0; clones spread around the pivot from there.
- Tweak parameters with the modal keys below; commit with Space/Enter or cancel with Esc/RMB.
Modal Controls¶
| Key | Action |
|---|---|
| Q | Cycle pivot: Active-Cursor / Cursor / Active. Remaps the axis letter to the new pivot's frame. |
| W | Cycle arc mode: 360 / 180 / 90 / 45 / Active to Cursor. |
| E | Toggle axis-offset mode (then LMB-drag the axis handle to slide the array along the rotation axis). |
| R | Cycle alignment: Align / Rotate / Random All / Random X / Random Y / Random Z. |
| D | Cycle clone type: Duplicate / Instance / Replace. |
| T | Cycle source mode: Active / Hierarchy / Group / Pool. |
| A | Toggle Match: snap source objects to nearest arc slot (live re-snap on parameter change); press again to restore originals. |
| G | Re-roll random pool seed (Pool source mode only). |
| S | Toggle Start point clone (also clones slot 0). |
| F | Toggle End point inclusive (arc modes other than 360). |
| X / Y / Z | Toggle axis letter between pivot-frame (cursor or local) and Global. |
| V | Use view axis. |
| C | Arm face-pick: hover a face to highlight, click to snap the 3D cursor (location and Z-normal) to the nearest face vertex / edge mid / center. Esc cancels. |
| N | Toggle locked-clone display: Show (tinted) / Hide. Picking is always live. |
| M | Lock every drawn slot (or unlock if all locked) — click slots to keep. |
| I | Flip the arc apex side (Active-to-Cursor arc only). |
| B | Reset all parameters to defaults (sources and pivot kept). |
| 1 / 2 / 3 / 4 / 5 | Set local rotation step to 1° / 5° / 15° / 45° / 90°. |
| Left / Right / Up | Nudge local X / Y / Z rotation by current step (hold Shift to reverse). |
| Down | Reset per-clone local rotation. |
| + / = | Count +1 (max 1024). |
| - | Count -1 (min 2). |
| Ctrl + Wheel | Count ±1 (±10 with Shift). |
| LMB on clone | Lock / unlock that slot. |
| LMB on ring + drag | Change radius (fixed arcs) or drag arc curve (Active-to-Cursor). |
| LMB on center + drag | Move arc center along the AB perpendicular bisector (Active-to-Cursor). |
| LMB drag (axis-offset mode) | Slide whole array along the rotation axis. |
| Ctrl + Z | Step back through parameter history. |
| Ctrl + Shift + Z | Redo. |
| H | Toggle help / HUD overlays. |
| Space / Enter | Apply. |
| Esc / RMB | Cancel. |
| MMB, plain Wheel, trackpad | Pass through (viewport navigation). |
HUD¶
Always-on parameters: Count, Pivot, arc Type, Alignment, Axis, Source.
Contextual parameters appear only when relevant: Axis offset (in offset mode or when nonzero), Start point (when on), End point (any arc mode but 360), Rot step and Local Rot (when local rotation is nonzero), Skip/delete (mode plus locked-slot count, when locked slots exist or HIDE), Match (when active), Clone type (when not Duplicate).
3D preview uses theme roles: GHOST_DEFAULT for clone fill, GHOST_LOCKED for locked clones (in Show mode), GHOST_CLOSEST for the hovered clone, GHOST_EDGE for all clone wireframes, PREVIEW_LINE / PREVIEW_POINT for the ring and slot markers, PIVOT for the arc center, ACTIVE_POINT for the arc-end marker, ACTIVE_LINE for the axis handle in offset mode, and LOCKED_POINT for locked-slot markers. The face-pick overlay also uses CLOSEST_LINE / CLOSEST_POINT.
Notes¶
- The operator declares
bl_options = {"REGISTER", "UNDO"}but the in-modal Ctrl+Z / Ctrl+Shift+Z step through an internal 64-state history snapshot of parameters, not Blender's undo stack. Drags collapse to a single history entry; Match is excluded from history (it has its own toggle). - Match mutates the original objects in place. Toggling Match off restores the captured matrices; applying with Match active commits those positions and creates no clones.
- Apply outputs into a fresh
_RadialArray_<root_name>collection. In Duplicate mode mesh data is also copied; in Instance mode data is shared. In Replace mode the source objects move to the slots; if the slot count exceeds the source count (Pool) or in non-Pool source modes, additional slots become linked instances inside the same_RadialArray_collection. - Per-mesh vertex / edge / loop-triangle caches are built once on source rebuild so the per-frame preview is matrix-multiplies only.
- Locked slots are stored as an in-modal set of slot indices and excluded at apply time.
- Slot 0 always sits at the active object's angle around the pivot (every arc mode), so the active is the visual anchor of the array.
- Pivot
ACTIVE_CURSORkeeps the axis from the 3D cursor but lifts the circle plane to pass through the active object; the center recomputes whenever axis or pivot changes.