# 文档内的查询
Introduction
文档内的查询,可以把查询的范围锁定在文档内的所有相关的图元,扩展包提供多种 快速查询
的方式
# 按类型查询
按类型查询大概是我们最常用,最直接的方式之一,我们可以通过图元的对象类型,查询文档内对应的结果。
比如我们最常用的方式:
FilteredElementCollector elements = document.GetElements(typeof(Wall));
又或者是指定泛型:
IEnumerable<Wall> walls=document.GetElements<Wall>();
IEnumerable<Wall> walls=document.GetElements<Wall>(w => w.Name == "100");
这两者的差异从主要表现为结果不同,FilteredElementCollector (opens new window) 包含了一系列的方法可以给我们使用,所以扩展包保留了这个类的返回值。
Remarks
要注意的是,不是所有 Element
的子类都可以 快速查询
,比如一些描述空间的类型就不被允许;
为了方便使用,扩展包在按类型查询的时候,会额外支持这部分类并进行 慢速查询
;
具体类型如下:
- Autodesk.Revit.DB.Architecture.Room
- Autodesk.Revit.DB.Architecture.RoomTag
- Autodesk.Revit.DB.Area
- Autodesk.Revit.DB.AreaTag
- Autodesk.Revit.DB.Mechanical.Space
- Autodesk.Revit.DB.Mechanical.SpaceTag
IEnumerable<Room> elements = document.GetElements<Room>();
IEnumerable<RoomTag> elements = document.GetElements<RoomTag>();
金枪鱼也支持多类型查询的方法:
IEnumerable<Room> elements = document.GetElements(typeof(Wall), typeof(Floor));
# 按类别查询
按类型查询从结果上范围比较大(比如 FamilyInstance
就描述了所有的可载入对象),所以我们也可以选择按类别查询。按类别查询有两种方式:
- 通过
BuiltInCategory
内置的类别:
FilteredElementCollector elements=document.GetElements(BuiltInCategory.OST_Walls);
- 通过内置类别的
ElementId
:
在参数条件合适的情况,我们也会传入类别的 ElementId
进行查询,我们可以通过 BuiltInCategories 访问内置类别的 ElementId
FilteredElementCollector elements=document.GetElements(BuiltInCategories.Door);
以上两种方式都支持多个参数的查询方式。
# 按标高查询
根据标高过滤出文档中约束为当前标高的实例对象
FilteredElementCollector elements=document.GetElements(level);
# 按族类型查询
根据族类型过滤出文档中的族实例对象
FilteredElementCollector elements=document.GetElements(familySymbol);
# 按模型行为的材质查询
模型行为的材质
具备 模型行为的材质
参数的对象,一般都是结构对象。所以我们研究的对象如果是结构专业,用这种方式查询也是一个不错的选择。
金枪鱼提供了两个关于 模型行为的材质
的查询方式,分别是:
- 过滤族:根据结构族参数 「用于模型行为的材质」 过滤出文档中的结构族对象
IEnumberable<Family> families=document.GetStructualFamilies(StructuralMaterialType.Wood);
- 过滤结构图元:根据结构族参数 「用于模型行为的材质」 过滤出文档中的结构图元对象
FilteredElementCollector elements=document.GetElements(StructuralMaterialType.Wood);
# 按结构类型查询
这种查询方式主要是针对结构对象。
FilteredElementCollector elements = document.GetElements(StructuralType.Column);
# 按结构用途查询
这种查询方式主要也是针对结构对象,它是对结构对象在行为上做了更细致的划分,比如结构梁在用途上除了可以是梁也可以是檩条
FilteredElementCollector elements = document.GetElements(StructuralInstanceUsage.Column);
# 按线类型查询
这种查询方式主要查询线性的图元
FilteredElementCollector elements = document.GetElements(CurveElementType.ModelCurve);
# 按墙体用途查询
这种查询方式主要墙体对象。
FilteredElementCollector elements = document.GetElements(StructuralWallUsage.Bearing);
# 按过滤器查询
这是金枪鱼最基础的查询方式,如果扩展包提供的过滤方式不能满足需求,您还可以自己实例化过滤器进行过滤
FilteredElementCollector elements=document.GetElements(new ElementClassFilter(typeof(Wall)));
# 查询图元类型
上面介绍的方法主要都是查询图元,在文档这个查询范围内,除了查询图元,我们还可以查询图元类型。
当然,金枪鱼也提供了许多种方式查询图元类型:
- 按类型查询:
IEnumerable<WallType> wallTypes = document.GetElementTypes<WallType>();
- 按类别查询:
FilteredElementCollector elementTypes = document.GetElementTypes(BuiltInCategories.Door);
又或者是
FilteredElementCollector elementTypes = document.GetElementTypes(BuiltInCategory.OST_Walls);
同样的,这两种方式都支持多参数的输入。
- 按族查询:这种查询方式可以根据族的
ElementId
过滤出文档中的族类别
IEnumberable<FamilySymbol> familySymbols = document.GetFamilySymbols(familyId);
# 查询三维图元
金枪鱼封装了对文档中所有三维图形的查询
IEnumberable<Element> elements = document.GetGraphicElements();