Revite 二次开发——过滤器
选择一个建筑示例,选中其中一面墙
通过【附加模块】下的Revit Lookup可以查看墙的属性
可以查看具体的类别、ID、名称,然后点击category,显示具体的类别,复制BuiltInCategory的值。
代码示例:
namespace Filter
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//界面交互的doc
UIDocument uidoc = commandData.Application.ActiveUIDocument;
//实现内容的doc
Document doc = commandData.Application.ActiveUIDocument.Document;
//1.创建收集器
FilteredElementCollector collector = new FilteredElementCollector(doc);
FilteredElementCollector collectorTwo = new FilteredElementCollector(doc);
//2.过滤,获取值元素
//2-1快速过滤的方法
collector.OfCategory(BuiltInCategory. OST_Walls).OfClass(typeof(Wall));
//2-2通用过滤方法
//ElementCategoryFilter elementCategoryFilter = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
//ElementClassFilter elementClassFilter = new ElementClassFilter(typeof(Wall));
//collector.WherePasses(elementClassFilter).WherePasses(elementClassFilter);
//3某种墙族类型下族实例的获取
//3-1foreach获取
List<Element> elementList = new List<Element>();
foreach (var item in collector)
{
if (item.Name == "常规 - 200mm") {
elementList.Add(item);
}
}
//3-2转为list处理
List<Element> elementListTwo = collector.ToList<Element>();
//3-3 linq表达式
var wallElement = from element in collector
where element.Name == "常规 - 200mm"
select element;
//Element wallInstance = wallElement.LastOrDefault<Element>();
//4.某个族实例的获取
//4-1确定只有一个实例
//4-1-1list获取
//Element wallInstance = elementList[0];
//4-1-2 IEnumberable获取
// Element wallInstance = wallElement.FirstOrDefault<Element>();
//4-1-3 lambda表达式的一种写法
// Element wallInstance = collectorTwo.OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(Wall)).FirstOrDefault<Element>(y= > y.Name == "常规 - 200mm");
//4-2有多个实例,但是只想获取其中一个,可以使用ElementID,或者根据一般特征
Element wallInstance = doc.GetElement(new ElementId(392512));
//5类型转换与判断
foreach (var item in elementList)
{
if (item is Wall) {
Wall wall = item as Wall;
Wall wallTwo = (Wall)item;
}
}
//6.高亮显示实例
var sel = uidoc.Selection.GetElementIds();//选择集
foreach (var item in elementList) {
//TaskDialog.Show("查看结果", item.Name);
sel.Add(item.Id);
}
uidoc.Selection.SetElementIds(sel);
return Result.Succeeded;
}
}
}