2.revit过滤器查找

namespace revit_text

{

    [TransactionAttribute(TransactionMode.Manual)]

    [RegenerationAttribute(RegenerationOption.Manual)]

    class FiltersPractise : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)

        {

            //FilterElementCollect 元素收集器的使用

            UIDocument uiDoc = commandData.Application.ActiveUIDocument;

            Document doc = uiDoc.Document;

            FilteredElementCollector collector = new FilteredElementCollector(doc);

 

            //QuickFilter 快速过滤;OST_Windows :过滤的是窗; FamilySymbol:过滤类型是族类型

            collector = collector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilySymbol));

 

            //FamilyInstanceFilter找1200*1500mm的窗

            //from in where select :from 表示查询语句,in 表示 执行遍历; where 条件判断,select 选择满足添加的数据返回

            //这句话的意思是: 从 collector中遍历出(Name == "1200 * 1500mm")条件,的元素,并返回它

            var quer = from element in collector

                       where element.Name == "0915 x 1830mm"

                       select element;

 

            List<Autodesk.Revit.DB.Element> famSyms = quer.ToList<Autodesk.Revit.DB.Element>();

            ElementId symbolId = famSyms[0].Id;

            //FamilyInstanceFilter 用于查找给定实例的元素过滤器

            FamilyInstanceFilter fiFliter = new FamilyInstanceFilter(doc,symbolId);

 

            FilteredElementCollector cl = new FilteredElementCollector(doc);

            ICollection<Element> found = cl.WherePasses(fiFliter).ToElements();

 

            //ElementParameterFilter找到标记小于五的窗

            ElementId ruleValId = new ElementId(-1001203);

            //CreateLessRule:表示小于这个数,

            //查询标记小于5的

            //FilterRule 定义可用于从文档中剔除元素的布尔操作

            //ParameterFilterRuleFactory 根据参数创建适当的过滤器规则对象

            FilterRule fr = ParameterFilterRuleFactory.CreateLessRule(ruleValId,"5",true);

            //ElementParameterFilter 用于通过一个或多个参数筛选器规则匹配元素的过滤器。

            ElementParameterFilter pFilter = new ElementParameterFilter(fr);

            FilteredElementCollector c2 = new FilteredElementCollector(doc);

            c2 = c2.OfCategory(BuiltInCategory.OST_Windows).WherePasses(fiFliter).WherePasses(pFilter);

 

            //LogicalOrFilter计算门窗总和

            //ElementCategoryFilter 用于根据元素的类别匹配元素的筛选器

            ElementCategoryFilter doorFilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors);

            ElementCategoryFilter windowFilter = new ElementCategoryFilter(BuiltInCategory.OST_Windows);

            LogicalOrFilter lFilter = new LogicalOrFilter(doorFilter,windowFilter);

            FilteredElementCollector c3 = new FilteredElementCollector(doc);

            ICollection<Element> fds = c3.OfClass(typeof(FamilyInstance)).WherePasses(lFilter).ToElements();

 

            TaskDialog.Show("查找","已找到型号为:“1200 * 1500mm的推拉窗”" + found.Count.ToString() + "个" + "\n"+

                "其中标记小于5的有"+ c2.ToList().Count.ToString() + "个"+"\n"+

                "门窗总和为:"+ fds.Count.ToString());

            return Result.Succeeded;

        }

    }

}

猜你喜欢

转载自blog.csdn.net/qq_25909453/article/details/81517457