RevitAPI高效使用逻辑过滤器(ElementLogicalFilter)
程序员文章站
2022-06-11 08:07:17
...
Revit API有两种逻辑过滤器:LogicalOrFilter和LogicalAndFilter。
1) LogicalOrFilter
LogicalOrFilter是过滤器的逻辑或集合,可以查找匹配符合任意一个过滤器条件的元素。
例子1:构建:墙和标高的类别过滤器,然后将这两种过滤器通过逻辑“或”组合成一个逻辑或过滤器,最后将文档中符合墙和标高类别之一的所有元素査找出来。
例子2:构建墙、标高、楼板、钢筋和MEP系统的类过滤器集合,然后将这个集合组合成一个逻辑“或”过滤器,最后将文档中符合任意一个条件的元素都查找出来。
2) LogicalAndFilter
LogicalAndFilter是过滤器的逻辑与集合,可以查找匹配符合所有过滤器条件的元素。
例子1:构建墙和设计选型的类过滤器,然后将这两种过滤器通过逻辑与组合成一个逻辑“与”的过滤器,最后将文档中符合某种设计选项的对应的墙查找出来。
例子2:构建了使用了情形1的两个类过滤器,并构建了第三个过滤器结构墙用法过滤器(StructuralWallUsageFiher),然后将这三个过滤器集合组合成一个逻辑“与”过滤器,最后将文档中符合某种设计选项的结构承重墙都查找出来。
1) LogicalOrFilter
LogicalOrFilter是过滤器的逻辑或集合,可以查找匹配符合任意一个过滤器条件的元素。
例子1:构建:墙和标高的类别过滤器,然后将这两种过滤器通过逻辑“或”组合成一个逻辑或过滤器,最后将文档中符合墙和标高类别之一的所有元素査找出来。
// 找到所有属于墙类别或者属于标高类别的元素
ElementCategoryFilter filterWall = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
ElementCategoryFilter filterLevel = new ElementCategoryFilter(BuiltInCategory.OST_Levels);
LogicalOrFilter orFilter = new LogicalOrFilter(filterWall, filterLevel);
FilteredElementCollector collector = new FilteredElementCollector(doc);
ICollection<Element> founds = collector.WherePasses(orFilter).ToElements();
foreach(Element elem in founds)
{
Trace.WriteLine(String.Format(" Element Id {0}, type {1}", elem.Id.IntegerValue,
elem.GetType()));
}
例子2:构建墙、标高、楼板、钢筋和MEP系统的类过滤器集合,然后将这个集合组合成一个逻辑“或”过滤器,最后将文档中符合任意一个条件的元素都查找出来。
Type[] elemTypes = { typeof(Wall), typeof(Level), typeof(Floor), typeof(Rebar),
typeof(MEPSystem)};
List<ElementFilter> filterSet = new List<ElementFilter>();
foreach (Type elemType in elemTypes)
{
ElementClassFilter filter = new ElementClassFilter(elemType);
filterSet.Add(filter);
}
orFilter = new LogicalOrFilter(filterSet);
collector = new FilteredElementCollector(doc);
founds = collector.WherePasses(orFilter).ToElements();
foreach (Element elem in founds)
{
Trace.WriteLine(String.Format(" Element Id {0}, type {1}", elem.Id.IntegerValue,
elem.GetType().Name));
}
2) LogicalAndFilter
LogicalAndFilter是过滤器的逻辑与集合,可以查找匹配符合所有过滤器条件的元素。
例子1:构建墙和设计选型的类过滤器,然后将这两种过滤器通过逻辑与组合成一个逻辑“与”的过滤器,最后将文档中符合某种设计选项的对应的墙查找出来。
ElementClassFilter wallFilter = new ElementClassFilter(typeof(Wall));
FilteredElementCollector collector = new FilteredElementCollector(doc);
ICollection<ElementId> designOptIds = collector.OfClass(typeof(DesignOption)).ToElementIds();
foreach(ElementId curId in designOptIds)
{
ElementDesignOptionFilter designFilter = new ElementDesignOptionFilter(curId);
LogicalAndFilter andFilter = new LogicalAndFilter(wallFilter, designFilter);
collector = new FilteredElementCollector(doc);
int wallCount = collector.WherePasses(andFilter).ToElementIds().Count;
Trace.WriteLine(String.Format(" {0} Walls belong to DesignOption {1}.", wallCount,
curId.IntegerValue));
}
也可以使用快捷方法达到同样的功能,以下代码能极大减少代码的行数。
FilteredElementCollector collector = new FilteredElementCollector(document);
// 找到所有符合某种特定设计选项的墙
optionICollection<ElementId> walls =
collector.OfClass(typeof(Wall)).ContainedInDesignOption(myDesignOptionId).ToElementIds();
例子2:构建了使用了情形1的两个类过滤器,并构建了第三个过滤器结构墙用法过滤器(StructuralWallUsageFiher),然后将这三个过滤器集合组合成一个逻辑“与”过滤器,最后将文档中符合某种设计选项的结构承重墙都查找出来。
foreach (ElementId curId in designOptIds)
{
// 构造逻辑与过滤器
List<ElementFilter> filters = new List<ElementFilter>();
filters.Add(wallFilter);
filters.Add(new ElementDesignOptionFilter(curId));
filters.Add(new StructuralWallUsageFilter(StructuralWallUsage.Bearing));
LogicalAndFilter andFilter = new LogicalAndFilter(filters);
// 应用该过滤器并遍历获取到的元素
collector = new FilteredElementCollector(doc);
int wallCount = collector.WherePasses(andFilter).ToElementIds().Count;
Trace.WriteLine(String.Format(" {0} Bearing Walls belong to DesignOption {1}.", wallCount,
curId.IntegerValue));
}
=========【更多高级应用请关注公众号】========
==================================