RevitAPI(三) 过滤器

        总结一下常用的过滤器API和写法。

         一  过滤器的使用思路

                1.new一个FilteredElementCollector(收集器);

                2.对它运用一个或多个ElementFilter;

                3.获取过滤出来的Element或ID 。

        二 FilterElementCollector

                FilterElementCollector的三种构造方法:

 //1.收集器的三种构造方法

 //普通           
 FilteredElementCollector elements1=new FilteredElementCollector(doc);
 //ids
 List<ElementId> ids=new List<ElementId>();
 FilteredElementCollector elements2 =new FilteredElementCollector(doc,ids);
 Element element = elements2.ToElements().FirstOrDefault();

 //指定视图,不指定视图则收集收集所有视图的元素
 ElementId viewId = null;
 FilteredElementCollector elements3=new FilteredElementCollector(doc, viewId);

        三 ElementFilter 

        继承于ElementFilter的三类过滤器。                


         快速过滤器(Quickfilters):

        只检查记录的元素并防止元素在内存中展开。这种过滤器可以提高迭代的效率并且减少内存的消耗。       

               
        慢速过滤器(Slowfilters):

        先在内存中获取和展开元素,再进行查询,因此在效率上会比较低。推荐的方法是慢速过滤器和快速过滤器结合起来用,这样会减少展开元素的数量。


        逻辑过滤器(Logicalfilters):

        由两个及以上的过滤器逻辑组成的过滤器。逻辑与LogicalAndFilter或逻辑或LogicalOrFilter

        

        常见的一些过滤器:        


        1.房间过滤器:RoomFilter
        2.元素相交过滤器:BoundingBoxIntersectsFilter
        3.元素包含过滤器:BoundingBoxlsInsideFilter
        4.元素类别过滤器:ElementCategoryFilter等同于OfCategory()        
        用法:
        1.new过滤器如RoomFilter roomFilter=   new RoomFilter();
        2.放入WherePasses()如WherePasses(roomFilter)

       

           //2.根据收集器得到各种类型
           FilteredElementCollector collector = new FilteredElementCollector(doc);
           StringBuilder stringBuilder = new StringBuilder();

           //通过类过滤
           IList<Element> eles = collector.ToElements();
           IList<Element> familyInstances = collector.OfClass(typeof(FamilyInstance)).ToElements();
           IList<Element> familySymbols = collector.OfClass(typeof(FamilySymbol)).ToElements();
           IList<Element> families = collector.OfClass(typeof(Family)).ToElements();

           //通过类型过滤
           IList<Element> windows = collector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilyInstance)).ToElements();

           //通过WherePasses()和过滤器
           RoomFilter roomFilter = new RoomFilter();
           List<Room> roomList=collector.WherePasses(roomFilter).Cast<Room>().ToList();
           //注意房间明细表,若在实例中删除房间,在房间明细表也会统计房间数量
           foreach (Room room in roomList)
           {
               if (room.Level.Name.Equals("标高 2") && room.Location != null)
               {
                   stringBuilder.AppendLine(room.Name.ToString());
               }
           }
           TaskDialog.Show("房间", stringBuilder.ToString());

           //3.元素相交过滤器

           //得到房间
           Room room1=doc.GetElement(new ElementId(1101806)) as Room;
           //得到房间的编辑框
           BoundingBoxXYZ boundingBoxXYZ = room1.get_BoundingBox(uIDocument.ActiveView);
           //通过边界框创建一个OutLine
           Outline outline = new Outline(boundingBoxXYZ.Min, boundingBoxXYZ.Max);
           //通过outLine创建一个元素边界过滤器
           BoundingBoxIntersectsFilter boundingBoxIntersectsFilter = new BoundingBoxIntersectsFilter(outline);

           FilteredElementCollector col = new FilteredElementCollector(doc);
           IList<Element> eleList= col.WherePasses(boundingBoxIntersectsFilter).ToElements();

           foreach (Element ele in eleList)
           {
              
                   stringBuilder.AppendLine(ele.Name.ToString());
               
           }
           TaskDialog.Show("元素", stringBuilder.ToString());

           //3.元素包含过滤器
           
           

           //4.元素类别过滤器
           

           ElementCategoryFilter elementCategoryFilter1 = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
           ElementCategoryFilter elementCategoryFilter2 = new ElementCategoryFilter(BuiltInCategory.OST_Wire);
           FilteredElementCollector elements4 = new FilteredElementCollector(doc);

四 用泛型和扩展方法写一个过滤器

        在做二开的时候经常能碰到写过滤器,每次都要根据需求重写一遍过滤器和收集器着实有些麻烦,这里用泛型和扩展方法封装一个过滤器 ,方便重复使用。

        

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace Revit_CreatInstane
{
    public static class FilteredTool
    {
        //用扩展方法和泛型封装过滤器
        public static List<T> SpeedFilter<T>(this Document document)
        {
            List<T> elements =new FilteredElementCollector(document).OfClass(typeof(T)).Cast<T>().ToList();
            return elements;
        }
        public static List<T> SpeedFilter<T>(this Document document,BuiltInCategory builtInCategory)
        {
            List<T> elements = new FilteredElementCollector(document).OfCategory(builtInCategory).OfClass(typeof(T)).Cast<T>().ToList();
            return elements;
        }
    }
}

     五 Revit内建过滤器

内建过滤器类型符合条件值快捷方法
LogicalAndFilter逻辑必须符合两个或两个以上的过滤器的
元素
WherePasses():添加另外一个过
滤 器 ;
IntersectWith():合并两个独立的
过滤器的集合
LogicalOrFilter逻辑必须符合两个或两个以上的过滤器中
的其中一个过滤器的元素
UnionWith():合并两个独立的过
滤器的集合
ElementCategoryFilter符合传入类别ID的元素OfCategoryld()
ElementMulticategoryFilter符合任意一个传入类别ID的元素
ElementClassFilter符合传入类的元素OfClass()
ElementMulticlassFilter符合任意一个传入类的元素
ElementIsElement TypeFilter是元素类型的元素WhereElementIsElement Type(),
WhereElementIsNotElement Type()
ElementOwnerViewFilter是视图相关的元素OwnedByView(),
WhereElementIs ViewIndependent()
ElementDesignOptionFilter符合在特定设定选项的元素ContainedInDesignOption()
ElementIsCurveDrivenFilter是由线驱动的元素WhereElementlsCurveDriven()
ElementStructuralTypeFilter符合给定结构类型的元素
ElementWorksetFilter符合在给定工作集里面的元素
FamilySymbolFilter特定的族类型
ExclusionFilter除传入过滤器的元素外的所有元素Excluding()
BoundingBoxIntersectsFilter其边界盒与给定的轮廓(outline)相交
的元素
BoundingBoxIsInsideFilter其边界盒在给定轮廓(outline)内的
元素
BoundingBoxContainsPointFilter其边界盒包含了给定点的元素
FamilyInstanceFilter特定族类型的实例
ElementLevelFilter和指定标高(level)联系的元素
ElementPhaseStatusFilter和指定阶段状态联系的元素
ElementParameterFilter符合一个或多个参数值的元素
ElementIntersectsElementFilter使用冲突检测来查找符合与传入的元
素在几何上相交的元素
ElementIntersectsSolidFilter使用接口检测来查找符合与传入的实
体在几何(solid)上相交的元素
PrimaryDesignOptionMemberFilter主选项所拥有的元素
StructurallnstanceUsageFilter属于传入的结构实例用法
(StructurallnstanceUsage)的族实例
StructuralWallUsageFilter属于传入结构墙用法
(StructuralWallUsage)的墙
StructuralMaterialTypeFilter属于传入结构材料类型
(StructuralMaterialType)的族实例
RoomFilter房间元素
SpaceFilter空间元素
AreaFilter面积元素
RoomTagFilter房间标签元素
SpaceTagFilter空间标签元素
AreaTagFilter面积标签元素
CurveElementFilter属于或者不属于(inverted)传人线类
型的线型元素

 

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值