概要:
在Revit范例图中计算过滤出所有型号为1200*1500mm,且标记为小于5的窗的数量。识别并计算门窗总和。
Revit API:
FilteredElementCollector | QuickFilter以及SlowFilter |
ElementParameterFilter | LogicalFilter |
完整项目代码:
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二次开发入门教程》