通过指定过滤器获取图元的基本步骤如下:
①新建一个FilteredElementCollector。
②对它运用一个或多个过滤器。
③获取滤过的图元或图元ID。
过滤器的某些类型有其专用过滤器,如RoomFilter。
1、new过滤器 如RoomFilter roomFilter = new RoomFilter();
2、放入WherePasses() 如WherePasses(roomFilter)
using Autodesk.Revit.Attributes;using Autodesk.Revit.DB;using Autodesk.Revit.DB.Architecture;using Autodesk.Revit.DB.Structure;using Autodesk.Revit.UI;using Autodesk.Revit.UI.Selection;using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;namespace work03._1{[TransactionAttribute(TransactionMode.Manual)]public class 练习书本例题 : IExternalCommand{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){//获取文档UIDocument uIDocument = commandData.Application.ActiveUIDocument;Document document = uIDocument.Document;Selection selection = uIDocument.Selection;//创建房间过滤器RoomFilter roomFilter = new RoomFilter();StringBuilder stringBuilder = new StringBuilder();//创建收集器FilteredElementCollector collector = new FilteredElementCollector(document);//应用过滤器过滤List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();//遍历元素foreach (Room item in rooms){stringBuilder.Append(item.Name);}TaskDialog.Show("提示",stringBuilder.ToString());return Result.Succeeded;}}}
如果revit操作中将其中一个房间删除,但是该房间仍保留在此项目中,这时按照上述代码执行,仍然显示删除掉的那个房间。
这时可以通过判断房间的location值是否为空值来判断。
这里有两种写法:
写法一:通过if来判断
using Autodesk.Revit.Attributes;using Autodesk.Revit.DB;using Autodesk.Revit.DB.Architecture;using Autodesk.Revit.DB.Structure;using Autodesk.Revit.UI;using Autodesk.Revit.UI.Selection;using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;namespace work03._1{[TransactionAttribute(TransactionMode.Manual)]public class 练习书本例题 : IExternalCommand{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){UIDocument uIDocument = commandData.Application.ActiveUIDocument;Document document = uIDocument.Document;Selection selection = uIDocument.Selection;RoomFilter roomFilter = new RoomFilter();StringBuilder stringBuilder = new StringBuilder();FilteredElementCollector collector = new FilteredElementCollector(document);List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();foreach (Room item in rooms){if(item.Level.Name.Equals("标高 1")&& item.Location !=null){stringBuilder.Append(item.Name);}}TaskDialog.Show("提示",stringBuilder.ToString());return Result.Succeeded;}}}
写法二:Where(x=>x.Location!=null)进行判断location值不为空的筛选过滤
using Autodesk.Revit.Attributes;using Autodesk.Revit.DB;using Autodesk.Revit.DB.Architecture;using Autodesk.Revit.DB.Structure;using Autodesk.Revit.UI;using Autodesk.Revit.UI.Selection;using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;namespace work03._1{[TransactionAttribute(TransactionMode.Manual)]public class 练习书本例题 : IExternalCommand{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){UIDocument uIDocument = commandData.Application.ActiveUIDocument;Document document = uIDocument.Document;Selection selection = uIDocument.Selection;RoomFilter roomFilter = new RoomFilter();StringBuilder stringBuilder = new StringBuilder();FilteredElementCollector collector = new FilteredElementCollector(document);List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().Where(x=>x.Location!=null).ToList();foreach (Room item in rooms){stringBuilder.Append(item.Name);}TaskDialog.Show("提示",stringBuilder.ToString());return Result.Succeeded;}}}