Revit二次开发小白学习笔记7——Revit元素过滤器

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());
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ping_Kingzero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值