[Revit二次开发] 元素过滤-QuickFilter和SlowFilter

本文详细介绍如何使用Revit API的FilteredElementCollector结合QuickFilter、SlowFilter及LogicalFilter等技术,精准筛选出特定型号和标记的门窗,并计算其总数。通过实际项目代码演示,展示门窗筛选的具体步骤和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要:

  在Revit范例图中计算过滤出所有型号为1200*1500mm,且标记为小于5的窗的数量。识别并计算门窗总和。

Revit API:

FilteredElementCollectorQuickFilter以及SlowFilter
ElementParameterFilterLogicalFilter

完整项目代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;

namespace FilterPractise
{
    [TransactionAttribute(TransactionMode.Manual)]
    [RegenerationAttribute(RegenerationOption.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //FilterElementCollector的使用
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;//当前打开的文件
            Document doc = uiDoc.Document; //uiDoc转为Document
            FilteredElementCollector collector = new FilteredElementCollector(doc);//收集打开的Document中的元素

            //QuickFilter过滤所有窗
            collector = collector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilySymbol));

            //FamilyInstanceFilter找1200*1500的窗
            var query = from element in collector //找到collector中的element
                        where element.Name == "1200 x 1500mm" //注意:1200 x 1500mm应从Revit中赋值,不要手写打入
                        select element;//选择找到的元素

            List<Autodesk.Revit.DB.Element> famSyms = query.ToList<Autodesk.Revit.DB.Element>();//存储找到的List
            ElementId symbolId = famSyms[1].Id;//选择第二种:famSyms[1],第一种是famSyms[0]
            FamilyInstanceFilter fiFilter = new FamilyInstanceFilter(doc, symbolId);
            FilteredElementCollector c1 = new FilteredElementCollector(doc);
            ICollection<Element> found = c1.WherePasses(fiFilter).ToElements();

            //ElementParameterFilter找到标记小于五的窗
            ElementId ruleValId = new ElementId(337460);//使用LookUp找到Id
            FilterRule fr = ParameterFilterRuleFactory.CreateLessRule(ruleValId, "5", true);
            ElementParameterFilter pFilter = new ElementParameterFilter(fr);
            FilteredElementCollector c2 = new FilteredElementCollector(doc);
            c2 = c2.OfCategory(BuiltInCategory.OST_Windows).WherePasses(fiFilter).WherePasses(pFilter);

            //LogicalOrFilter计算门窗总和
            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;
        }
    }
}

效果:

参考文献:

  周婧祎《Autodesk Revit 2016二次开发入门教程》 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值