Revit Selection Filter
Selection.PickObject takes an ISelectionFilter that constrains what the user may pick.
SelectionConfiguration (from Nice3point.Revit.Toolkit) builds that filter from two lambdas; no hand-rolled class is needed.
It drives an interactive pick and needs the Revit UI.
When to use
- Restricting an interactive pick to a category, type, or geometry kind.
When not to use
- Constraining a headless API callback such as family load or duplicate-type options — use a Toolkit option handler like
FamilyLoadOptions.
Workflow
Step 1: Configure the allowed elements and references
Allow.Element gates which elements are pickable; Allow.Reference gates which references (faces, edges, points).
Set either or both — each returns the configuration and they chain — then pass configuration.Filter to the pick call.
var configuration = new SelectionConfiguration()
.Allow.Element(element => element.Category.Id.IsCategory(BuiltInCategory.OST_Walls))
.Allow.Reference((reference, position) => false);
var picked = uiDocument.Selection.PickObject(ObjectType.Element, configuration.Filter);
Step 2: Verify
Run the command and confirm only the intended elements or references highlight and accept a pick.
Validation
- The filter uses
SelectionConfiguration, not a hand-rolledISelectionFilter. -
Allow.Element/Allow.Referenceexpress the rule with a lambda, not a new class.
Common Pitfalls
| Pitfall | Correct approach |
|---|---|
A bespoke ISelectionFilter for a category check |
Use SelectionConfiguration().Allow.Element(...). |
| Filtering references with an element-only filter | Add Allow.Reference((reference, position) => ...). |
SelectionConfiguration not found |
The Nice3point.Revit.Toolkit package is not referenced. |