using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using System; using System.Collections.Generic; using System.Linq; namespace Szmedi.Toolkit.RvExtensions; public static class UIDocumentExtensions { /// /// 运行命令选择元素或选择元素执行操作 /// public static List GetSelectedElems( this UIDocument uidoc, string prompt = "请选择元素", ISelectionFilter filter = null, ObjectType type = ObjectType.Element ) { //取到当前文档。 Document doc = uidoc.Document; //取到当前文档的选择集。 List collection = uidoc.Selection.GetElementIds().Select(id => doc.GetElement(id)).ToList(); if (collection.Any()) { return collection; } try { IList references = filter == null ? uidoc.Selection.PickObjects(type, prompt) : uidoc.Selection.PickObjects(type, filter, prompt); collection = references.Select(refer => doc.GetElement(refer)).ToList(); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { } return collection; } /// /// 重复命令 /// /// /// /// public static void RepeatCommand(this UIDocument uidoc, Action action) { try { action?.Invoke(); uidoc.RepeatCommand(action); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { } } /// /// 按类型选择元素 /// /// /// /// /// /// public static T SelectObject(this UIDocument uidoc, string prompt = "请选择元素", ObjectType objectType = ObjectType.Element) where T : Element { try { Reference reference = uidoc.Selection.PickObject(objectType, new GenericFilter(), prompt); return uidoc.Document.GetElement(reference) as T; } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { return null; } } /// /// 按类型框选元素 /// /// /// /// /// public static IList SelectObjectsByRectangle(this UIDocument uidoc, string prompt = "请框选元素") where T : Element { try { return uidoc.Selection.PickElementsByRectangle(new GenericFilter(), prompt).Cast().ToList(); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { return null; } } /// /// 选择元素 /// /// /// /// /// public static Element SelectObject( this UIDocument uidoc, FuncFilter funcFilter, string prompt = "请选择元素", ObjectType objectType = ObjectType.Element ) { try { var reference = uidoc.Selection.PickObject(objectType, funcFilter, prompt); return uidoc.Document.GetElement(reference); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { return null; } } public static List SelectObjects( this UIDocument uidoc, FuncFilter funcFilter, string prompt = "请选择元素", ObjectType objectType = ObjectType.Element ) { try { var references = uidoc.Selection.PickObjects(objectType, funcFilter, prompt); return [.. references.Select(uidoc.Document.GetElement)]; } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { return null; } } /// /// 按类型选择多个元素 /// /// /// /// /// /// public static List SelectObjects(this UIDocument uidoc, string prompt = "请选择多个元素", ObjectType objectType = ObjectType.Element) where T : Element { try { IList references = uidoc.Selection.PickObjects(objectType, new GenericFilter(), prompt); return references.Select(refer => uidoc.Document.GetElement(refer) as T).ToList(); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { return []; } } }