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

下面介绍一些常用的快速过滤器的用法。

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)); 
} 

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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值