欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-11 08:07:17
...
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<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)); 
  } 

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

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

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