예제 #1
0
 public JtSelectionFilter(
     Type t,
     BuiltInCategory?bic,
     IsSelectable f)
 {
     _t   = t;
     _bic = bic;
     _f   = f;
 }
예제 #2
0
        /// <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;
        }