Revit二次开发小白学习笔记7——Revit元素过滤器
- 1.说明
- 2.FilteredElementCollector三种方法
- 3.FilteredElementCollector的OfCategory()、OfCategoryId()方法
- 4.FilteredElementCollector的OfClass()
- 5.FilteredElementCollector方法的组合应用
- 6.FilteredElementCollector使用List<ElementId>筛选对象
- 7.FilteredElementCollector使用View筛选对象
- 8.FilteredElementCollector的WherePasses()
- 8.5.WherePasses(boundingBoxIsInsideFilter)使用包含过滤器筛选要素
1.说明
1.1收集过滤器:FilteredElementCollector【Ctrl+D可以复制行】
- 收集全部元素:FilteredElementCollector(Documnet document)
- 根据指定的Id集合:FilteredElementCollector(Documnet document,Listids)
- 根据指定的视图:FilteredElementCollector(Documnet document,ElementId viewId)
1.2.FilteredElementCollector常用方法
- 通过类型:OfCategory()、OfCategoryId()
- 通过类:OfClass()
- 通过WherePasses()
2.FilteredElementCollector三种方法
//方法1:抓取文档内所有要素
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document);
//方法2:通过ElementId列表,抓取要素
List<ElementId> ids = new List<ElementId>();
FilteredElementCollector elementCollector2 = new FilteredElementCollector(document,ids);
//方法3:抓取某一视图(标高1)中所有要素
ElementId viewId = null;
FilteredElementCollector elementCollector3 = new FilteredElementCollector(document,viewId);
3.FilteredElementCollector的OfCategory()、OfCategoryId()方法
通过族的ID或者标识,筛选当前收集过滤器中对应的族类型和实例
3.1.FilteredElementCollector的OfCategoryId()
//抓取文档内所有要素
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document);
//抓取族类型和族实例
IList<Element> elements1 = elementCollector1.OfCategoryId(new ElementId(-2000023)).ToElements();
StringBuilder stringBuilder1 = new StringBuilder();
//将会显示与族Id-2000023对应的所有族类型和族实例
foreach (Element item in elements1)
{
stringBuilder1.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
}
TaskDialog.Show("提示",stringBuilder1.ToString());
3.2.FilteredElementCollector的OfCategory()
//抓取文档内所有要素
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document);
//抓取族类型和族实例
IList<Element> elements2 = elementCollector1.OfCategory(BuiltInCategory.OST_Doors).ToElements();
StringBuilder stringBuilder2 = new StringBuilder();
//将会显示与族【OST_Doors】对应的所有族类型和族实例
foreach (Element item in elements2)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
}
TaskDialog.Show("提示",stringBuilder2.ToString());
4.FilteredElementCollector的OfClass()
通过输入的筛选类型,筛选当前收集过滤器中符合要求的对象
//抓取文档内所有要素
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document);
//获取现文档内所有族实例
IList<Element> elements3 = elementCollector1.OfClass(typeof(FamilyInstance)).ToElements();//typeof(FamilySymbol)
StringBuilder stringBuilder2 = new StringBuilder();
foreach (Element item in elements3)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
}
TaskDialog.Show("提示",stringBuilder2.ToString());
5.FilteredElementCollector方法的组合应用
FilteredElementCollector和函数可以叠加使用,筛选一次后形成的对象库还能再次筛选
IList<Element> elements4 = elementCollector1.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)).ToElements();
StringBuilder stringBuilder2 = new StringBuilder();
foreach (Element item in elements4)
{
Level level = document.GetElement(item.LevelId) as Level;
//获取指定标高平面内的实例
if (level.Name.Equals("Level 2"))
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
}
}
TaskDialog.Show("提示",stringBuilder2.ToString());
6.FilteredElementCollector使用List筛选对象
- 使用UIDocument.Selection.PickObjects()方法获取Reference
- Reference获取ElementId,并组建列表
- 根据List构建选择器筛选对象
//只能获取指定ElementId列表中的要素对象
IList<Reference> references = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element);
List<ElementId> ids = new List<ElementId>();
//根据References获取ElementId
foreach (Reference item in references)
{
ids.Add(item.ElementId);
}
FilteredElementCollector elementCollector2 = new FilteredElementCollector(document, ids);
IList<Element> elements4 = elementCollector2.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)).ToElements();
StringBuilder stringBuilder2 = new StringBuilder();
foreach (Element item in elements4)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
}
TaskDialog.Show("提示", stringBuilder2.ToString());
7.FilteredElementCollector使用View筛选对象
- 新建ViewId对象
- 通过Document和ViewId获取对象
只能获取指定视图中的要素:如标高1
ElementId viewId = new ElementId(13073);
FilteredElementCollector elementCollector3 = new FilteredElementCollector(document,viewId);
IList<Element> elements4 = elementCollector3.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)).ToElements();
StringBuilder stringBuilder2 = new StringBuilder();
List<ElementId> ids = new List<ElementId>();
foreach (Element item in elements4)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
ids.Add(item.Id);
}
TaskDialog.Show("提示", stringBuilder2.ToString());
//将选中对象高亮显示
uIDocument.Selection.SetElementIds(ids);
8.FilteredElementCollector的WherePasses()
8.1.常用过滤器 ElementFilter filter
- 房间过滤器:RoomFilter
- 元素相交过滤器:BoundingBoxIntersectsFilter
- 元素包含过滤器:BoundingBoxIsInsideFilter
- 元素类别过滤器:ElementCategoryFilter等同于OfCategory()
- 元素过滤器:ElementFilter 等同于OfClass()
8.2.用法
- new 过滤器:如RoomFilter roomFilter = new RoomFilter();
- 放入 WherePasses():如WherePasses(roomFilter)
8.3.WherePasses(RoomFilter)过滤收集器中房间对象
RoomFilter roomFilter = new RoomFilter();
//只能获取指定视图中的要素:如标高2
ElementId viewId = new ElementId(15915);
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document,viewId);
List<Room> rooms = elementCollector1.WherePasses(roomFilter).Cast<Room>().ToList();//获取房间集合
StringBuilder stringBuilder2 = new StringBuilder();
foreach (Element item in rooms)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
}
TaskDialog.Show("提示", stringBuilder2.ToString());
8.4WherePasses(BoundingBoxIntersectsFilter)使用相交过滤器筛选要素
会包含自身
//边界框相交过滤器
//得到房间
Room room = document.GetElement(new ElementId(203841)) as Room;
//得到边界框
BoundingBoxXYZ boundingBoxXYZ = room.get_BoundingBox(document.ActiveView);
//通过边界框创建Outline
Outline outline = new Outline(boundingBoxXYZ.Min,boundingBoxXYZ.Max);
//Outline outline = new Outline(new XYZ(24.8287665921073, -75.2072782080872, 17.0603674540682),new XYZ(30.0781104241283, -70.1166553376465, 17.0603674540682));
//通过Outline创建一个BoundingBoxIntersectsFilter(元素边界相交过滤器)
BoundingBoxIntersectsFilter boundingBoxIntersectsFilter = new BoundingBoxIntersectsFilter(outline);
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document);
IList<Element> elements1 = elementCollector1.WherePasses(boundingBoxIntersectsFilter).ToElements();
StringBuilder stringBuilder2 = new StringBuilder();
List<ElementId> ids = new List<ElementId>();
foreach (Element item in elements1)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
ids.Add(item.Id);
}
uIDocument.Selection.SetElementIds(ids);
TaskDialog.Show("提示", stringBuilder2.ToString());
8.5.WherePasses(boundingBoxIsInsideFilter)使用包含过滤器筛选要素
//元素包含过滤器
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document);
//得到房间
Room room = document.GetElement(new ElementId(203841)) as Room;
//得到边界框
BoundingBoxXYZ boundingBoxXYZ = room.get_BoundingBox(document.ActiveView);
//通过边界框创建Outline
Outline outline = new Outline(boundingBoxXYZ.Min, boundingBoxXYZ.Max);
//Outline outline = new Outline(new XYZ(24.8287665921073, -75.2072782080872, 17.0603674540682),new XYZ(30.0781104241283, -70.1166553376465, 17.0603674540682));
//通过Outline创建一个BoundingBoxIntersectsFilter(元素边界相交过滤器)
BoundingBoxIsInsideFilter boundingBoxIsInsideFilter = new BoundingBoxIsInsideFilter(outline);
IList<Element> elements1 = elementCollector1.WherePasses(boundingBoxIsInsideFilter).ToElements();
StringBuilder stringBuilder2 = new StringBuilder();
List<ElementId> ids = new List<ElementId>();
foreach (Element item in elements1)
{
stringBuilder2.AppendLine("抓取对象:\t\t" + item.Name + " " + item.Id);
ids.Add(item.Id);
}
uIDocument.Selection.SetElementIds(ids);
TaskDialog.Show("提示", stringBuilder2.ToString());