RevitAPI高效使用逻辑过滤器(ElementLogicalFilter)

Revit API有两种逻辑过滤器:LogicalOrFilter和LogicalAndFilter。

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 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 filterSet = new List(); 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 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  walls  =       
collector.OfClass(typeof(Wall)).ContainedInDesignOption(myDesignOptionId).ToElementIds(); 

例子2:构建了使用了情形1的两个类过滤器,并构建了第三个过滤器结构墙用法过滤器(StructuralWallUsageFiher),然后将这三个过滤器集合组合成一个逻辑“与”过滤器,最后将文档中符合某种设计选项的结构承重墙都查找出来。
foreach (ElementId curId in designOptIds) { // 构造逻辑与过滤器 List filters = new List(); 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)); } 

=========【更多高级应用请关注公众号】========


==================================






本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部