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

Revit开发之如何使用快速过滤器(ElementQuickFilter)

程序员文章站 2022-06-11 08:10:26
...
下面介绍一些常用的快速过滤器的用法。

1) ElementCategoryFilter
ElementCategoryFiher是使用类别(Category)来查询元素的过滤器。

比如说,使用墙的类别(OST_Walls)来查询当前文档的元素,过滤文档中所有的墙实例以及墙类型。

示例代码:
void TestElementCategoryFilter(Document doc) 
{ 
   // 找到所有属于墙类别的元素:墙实例和墙类型都将会被过滤出来 
   FilteredElementCollector collector = new FilteredElementCollector(doc); 
   ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_Walls); 
   ICollection<Element> founds = collector.WherePasses(filter).ToElements(); 
   foreach (Element elem in founds) 
   { 
     Trace.WriteLine(String.Format("    Element  id:  {0},  type:  {1}",  elem.Id.IntegerValue, 
elem.GetType().Name)); 
   } 
} 

2) ElementClassFilter

ElementClassFilter是使用类来査询元素的过滤器,它将会精确匹配传入的类或者该类的子类。

void TestElementClassFilter(Document doc) 
{ 
  // 找到所有属于FamilySymbol的元素:元素的子类也将被过滤出来 
  FilteredElementCollector collector = new FilteredElementCollector(doc); 
  ElementClassFilter filter = new ElementClassFilter(typeof(FamilySymbol)); 
  ICollection<ElementId> founds = collector.WherePasses(filter).ToElementIds(); 
  Trace.WriteLine(String.Format("    Found {0} FamilySymbols.", founds.Count)); 
} 

注意:ElementClassFilter不支持API中一小部分的元素子类。这是由于这些类只存在于API中,Revit并没有对应的内部模型对象。因此,如果想用类过滤器来查找这些类是不支持的。
这时需要使用更高一级的父类来过滤,并且对过滤出来的元素要进行更进一步的匹配来查找这些子类。

下面列出的是上文所说的受到限制影响且并不支持的类型。
Autodesk. Revit. DB. Material 子类
Autodesk. Revit. DB. CurveElement 子类
Autodesk. Revit. DB. ConnectorElement 子类
Autodesk. Revit. DB. HostedSweep 子类
Autodesk. Revit. DB. Architecture. Room 子类
Autodesk. Revit. DB. Mechanical. Space 子类
Autodesk. Revit. DB. Area 子类
Autodesk. Revit. DB. Architecture. RoomTag 子类
Autodesk. Revit. DB. Mechanical. SpaceTag 子类
Autodesk. Revit. DB. AreaTag 子类
Autodesk. Revit. DB. CombinableElement 子类
Autodesk. Revit. DB. Mullion 子类
Autodesk. Revit. DB. Panel 子类
Autodesk. Revit. DB. AnnotationSymbol 子类
Autodesk. Revit. DB. Structure. AreaReinforcementType 子类
Autodesk. Revit. DB. Structure. PathReinforcementType 子类
Autodesk. Revit. DB. AnnotationSymbolType 子类
Autodesk. Revit. DB. Architecture. RoomTagType 子类
Autodesk, Revit. DB. Mechanical. SpaceTagType 子类
Autodesk. Revit. DB. AreaTagType 子类
Autodesk. Revit. DB. Structure. TrussType 子类 

3) ElementIsElementTypeFilter
ElementIsElementTypeFilter是用来匹配元素类型的过滤器,可以过滤出文档中所有元素类型的元素或者过滤出所有非元素类型的元素。

使用默认的构 数来过滤出文挡的所有元素类型可以查看以下代码:

void TestElementIsElementTypeFilter(Document doc) 
{ 
  // 找到所有属于ElementType的元素 
  FilteredElementCollector collector = new FilteredElementCollector(doc); 
  ElementIsElementTypeFilter filter = new ElementIsElementTypeFilter(); 
  ICollection<ElementId> founds = collector.WherePasses(filter).ToElementIds(); 
    Trace.WriteLine(String.Format("    Found {0} ElementTypes.", founds.Count)); 
}

注意:也可以使用传参的构造函数来得到所有非元素类型的元素。

4) FamilySymbolFilter
FamilySymbolFilter是使用传入的族来得到其所有族类型的过滤器。

先取得了文档的所有的族,然后使用FamilySymbolFilter得到所有族类型。
void TestFamilySymbolFilter(Document doc) 
{ 
  // 找到当前文档中族实例所对应的族类型 
  FilteredElementCollector collector = new FilteredElementCollector(doc); 
  ICollection<ElementId> famIds = collector.OfClass(typeof(Family)).ToElementIds(); 
  foreach (ElementId famId in famIds) 
  { 
    collector = new FilteredElementCollector(doc); 
    FamilySymbolFilter filter = new FamilySymbolFilter(famId); 
    int count = collector.WherePasses(filter).ToElementIds().Count; 
    Trace.WriteLine(String.Format("    {0}  FamilySybmols  belong  to  Family  {1}.",  count, 
famId.IntegerValue)); 
  } 
}

5) ExclusionFilter

ExclusionFiher是自动排除某些元素集的过滤器。

如果想得到一个没有族类型的元素类型集合,可以使用ExclusionFilter

void TestExclusionFilter(Document doc) 
{ 
  // 找到所有除族类型FamilySymbol外的元素类型ElementType 
  FilteredElementCollector collector = new FilteredElementCollector(doc); 
  ICollection<ElementId> excludes = collector.OfClass(typeof(FamilySymbol)).ToElementIds(); 
     
  // 创建一个排除族类型FamilySymbol的过滤器 
  ExclusionFilter filter = new ExclusionFilter(excludes); 
  ICollection<ElementId>  founds  = 
collector.WhereElementIsElementType().WherePasses(filter).ToElementIds(); 
  Trace.WriteLine(String.Format("    Found  {0}  ElementTypes  which  are  not  FamilySybmols", 
founds.Count)); 
} 

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

Revit开发之如何使用快速过滤器(ElementQuickFilter)

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