public JtSelectionFilter( Type t, BuiltInCategory?bic, IsSelectable f) { _t = t; _bic = bic; _f = f; }
/// <summary> /// Instantiate and run element selector. /// </summary> /// <param name="uidoc">UIDocument.</param> /// <param name="bic">Built-in category or null.</param> /// <param name="description">Description of the elements to select.</param> /// <param name="f">Validation method.</param> public JtSelectorMulti( UIDocument uidoc, BuiltInCategory?bic, string description, IsSelectable f) { _selected = null; _msg = null; Document doc = uidoc.Document; if (null == doc) { _msg = "Please run this command in a valid" + " Revit project document."; _result = Result.Failed; } // Check for pre-selected elements Selection sel = uidoc.Selection; ICollection <ElementId> ids = sel.GetElementIds(); int n = ids.Count; if (0 < n) { //if( 1 != n ) //{ // _msg = _usage_error; // _result = Result.Failed; //} foreach (ElementId id in ids) { Element e = doc.GetElement(id); if (!f(e)) { _msg = string.Format( _usage_error, description); _result = Result.Failed; } if (null == _selected) { _selected = new List <T>(n); } _selected.Add(e as T); } } // If no elements were pre-selected, // prompt for post-selection if (null == _selected || 0 == _selected.Count) { IList <Reference> refs = null; try { refs = sel.PickObjects( ObjectType.Element, new JtSelectionFilter(typeof(T), bic, f), string.Format( "Please select {0}s.", description)); } catch (Autodesk.Revit.Exceptions .OperationCanceledException) { _result = Result.Cancelled; } if (null != refs && 0 < refs.Count) { _selected = new List <T>( refs.Select <Reference, T>( r => doc.GetElement(r.ElementId) as T)); } } Debug.Assert( null == _selected || 0 < _selected.Count, "ensure we return only non-empty collections"); _result = (null == _selected) ? Result.Cancelled : Result.Succeeded; }