Revit开发之如何使用快速过滤器(ElementQuickFilter)
程序员文章站
2022-06-11 08:10:26
...
下面介绍一些常用的快速过滤器的用法。
1) ElementCategoryFilter
ElementCategoryFiher是使用类别(Category)来查询元素的过滤器。
比如说,使用墙的类别(OST_Walls)来查询当前文档的元素,过滤文档中所有的墙实例以及墙类型。
示例代码:
2) ElementClassFilter
注意: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是用来匹配元素类型的过滤器,可以过滤出文档中所有元素类型的元素或者过滤出所有非元素类型的元素。
使用默认的构 数来过滤出文挡的所有元素类型可以查看以下代码:
注意:也可以使用传参的构造函数来得到所有非元素类型的元素。
4) FamilySymbolFilter
FamilySymbolFilter是使用传入的族来得到其所有族类型的过滤器。
先取得了文档的所有的族,然后使用FamilySymbolFilter得到所有族类型。
如果想得到一个没有族类型的元素类型集合,可以使用ExclusionFilter 。
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));
}
=========【更多高级应用请关注公众号】========
==================================