Revit二次开发实战02(选择对象Selection)
Revit二次开发实战
Selection主要用于和用户交互,通过用户的选择,设置操作对象,以便进行处理;
Selection属于界面操作的范畴,因此位于UIDocument类下面,而不是Document类下面;
可以选择一个对象、多个对象、选择点、选择矩形框、框选多个对象等;
通过过滤器可以提供一个强大的功能,可以通过各种条件筛选出想要选择的对象;
using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RevitHello { //选择一个对象 [Transaction(TransactionMode.Manual)] class CSelectOne : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //获取UIDocument对象 UIDocument uiDoc = commandData.Application.ActiveUIDocument; //选择一个元素,并返回该元素的引用 //这是一个阻塞方法,当没有选择任何对象时,后面的代码不会执行 Reference reference = uiDoc.Selection.PickObject(ObjectType.Face); TaskDialog.Show("GetType().FullName", reference.GetType().FullName); //获取Document对象 Document doc = uiDoc.Document; //从引用获取元素对象 Element element = doc.GetElement(reference); //显示元素相关参数 TaskDialog.Show("element", $"Name={element.Name}\nId={element.Id}\nCategory.Name={element.Category.Name}"); return Result.Succeeded; } } //选择多个对象 [Transaction(TransactionMode.Manual)] class CSelectMany : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uiDoc = commandData.Application.ActiveUIDocument; //获取多个元素引用的列表 IList<Reference> refList = uiDoc.Selection.PickObjects(ObjectType.Element); Document doc = uiDoc.Document; StringBuilder sb = new StringBuilder(); //遍历所有元素 foreach (var r in refList) { Element e = doc.GetElement(r); string s = $"Name={e.Name},Id={e.Id},Category={e.Category.Name}\n"; sb.Append(s); } //显示信息 TaskDialog.Show("PickObjects", sb.ToString()); return Result.Cancelled; } } //使用过滤器进行选择 [Transaction(TransactionMode.Manual)] class CSelectFilter : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //获取文档对象 UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; //使用过滤器进行选择 IList<Reference> refList = uidoc.Selection.PickObjects(ObjectType.Element,new DoorFilter()); //获取选择对象的信息 StringBuilder sb = new StringBuilder(); foreach (var r in refList) { Element e = doc.GetElement(r); sb.AppendLine($"Name={e.Name},Id={e.Id}"); } //显示信息 TaskDialog.Show(typeof(CSelectFilter).Name,sb.ToString() ); return Result.Cancelled; } } class DoorFilter : ISelectionFilter { public bool AllowElement(Element elem) { if (elem is FamilyInstance) return true; return false; } public bool AllowReference(Reference reference, XYZ position) { return true; } } }
分类:
.NET Framework
, Revit二次开发
标签:
.NET Framework
, Revit二次开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律