Select
Turns a rule into a named group — tag a range, every Nth element, everything matching a comparison, a stable random subset, or everything inside a shape, then drive any Apply To field, Connect Points' From/To, or a delete with it.
Category: Point Ops Menu path: Point Ops > Select
Ports
| Port | Type | Direction | Description |
|---|---|---|---|
in | points / shape | input | The stream to tag. Polymorphic like Point Delete — connect points or a shape and out follows the input type |
shape_in | shape | input | Spatial rule only: the region to test containment against (signed-distance; a point exactly on the outline counts inside) |
mask_in | scalarField | input | Spatial rule only, when no shape_in: field sampled at each element, > 0.5 = inside |
out | points / shape | output | Same geometry, with the group written |
Parameters
| Param | Type | Default | Description |
|---|---|---|---|
name | string | group | The group to write. A group is just a scalar attribute — members get 1, the rest 0 — so anything that reads attributes reads groups. @ names are refused (write target) |
domain | enum | Point | Point marks points/vertices; Path marks whole sub-paths (shape input; Spatial tests each path's centroid) |
mode | enum | Set | How this Select composes with an existing group of the same name: Set (define it), Add (union), Remove (subtract), Intersect (narrow — chain two Selects for compound predicates: @x > 0 ∩ scale > 2) |
rule | enum | All | Who's a member: All, Range, Every Nth, Attribute, Random, Spatial |
rangeFirst / rangeLast | scalar | 0 / 9 | Range rule: inclusive element-order span (@index). "Tag the first 50" = 0–49 |
everyN / everyOffset | scalar | 2 / 0 | Every Nth rule: element i is a member when (i − offset) mod n = 0 |
attrName | string | (empty) | Attribute rule: the column to compare — any attribute or intrinsic (@x, @id, glyphIndex). Missing column = no members |
attrRule | enum | Greater Than | Greater Than, At Least, Less Than, At Most, Equals, Not Equal, Between. Equals/Not Equal are exact — meant for integer columns (indices, tags) |
attrValue / attrValue2 | scalar | 0 / 1 | Comparison operand(s). attrValue2 appears only for Between (inclusive both ends) |
percent / seed | scalar | 50 / 0 | Random rule: a stable subset — keyed on @id, so membership survives points being added or removed elsewhere in the stream. Path domain keys on path order |
region | enum | Inside | Spatial rule: members are inside (or outside) the shape_in region / mask_in field. Nothing connected = no members |
value | scalar | 1 | What members get written. Any value — Select doubles as a conditional scalar stamp |
writeElse | boolean | true | Set mode only: whether non-members are written (elseValue) or left untouched. Off makes Set behave like Add |
elseValue | scalar | 0 | What non-members get (Set with writeElse, Remove, Intersect) |
Expose Channels
None.
How It Works
The rule marks members; the write policy turns membership into a scalar attribute on the chosen domain. Positions, ids and every other attribute pass through untouched — Select is an attribute-only node, so it never disturbs simulation caches, trails, or downstream bounds.
The group lands as a plain scalar column, which is the whole design: AttributeToField("group") turns it into a 0/1 mask field, Apply To fields consume it by name, Connect Points bridges between two of them, Point Delete removes it. Nothing downstream knows or cares that a Select wrote it rather than a Point Attributes.
Usage Examples
Basic: delete every 3rd point
Grid → Select (rule Every Nth, every 3) → PointDelete (attribute group) → DrawPoints. Change every to re-thin live.
Random half, stable under change
PointScatter → Select (rule Random, 50%) → Apply To: group on DrawPoints. The subset is keyed on point ids, so animating the scatter count doesn't re-roll every point's membership.
Compound predicate without an expression box
Select (Attribute: @x Greater Than 0, mode Set) → Select (Attribute: scale Greater Than 2, mode Intersect) → the group is "right of center AND big". Add a third Select with mode Add to union in another set.
Creative: points inside a moving logo
TextToShape → Select.shape_in; PointScatter → Select.in (rule Spatial, Inside) → Apply To on Point Advect. Only the points inside the letterforms flow; animate the text's transform upstream and re-select per frame follows it.
Viewport Feedback
With the Select node selected, the viewer overlays its output in gizmo cyan with membership baked in: members draw bright (solid paths, larger dots), everything else dim. Change the rule or scrub the values and the overlay re-resolves from the engine — what you see is the group the engine actually wrote, not a client-side guess.
Tips
- Chain order matters for modes:
Setdefines, laterAdd/Remove/Intersectedit. Keep the defining Select first. value≠ 1 turns Select into a conditional stamp — e.g. write5into ascalecolumn for members and leave the rest viawriteElseoff.- The Attribute rule's picker lists the point-domain stream; with
domain: Pathtype the per-path name directly (glyphIndex,index). - A group is per-element data: it survives MergePoints (union merge fills non-members with 0) and rides through every passthrough op.
Related Nodes
- PointAttributes — field-driven attribute writing; Select is the rule-driven sibling
- PointDelete / PathDelete — consume a group to remove elements
- ConnectPoints — From/To bridges between groups
- AttributeToField — any group into a 0/1 mask field
- DistanceField — soft-falloff spatial fields (Select's Spatial rule is the hard-membership version)