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;
}
}
}