revit二次开发——过滤器5.ElementLevelFilter、ElementParameterFilter、FamilylnstanceFilter、CurveElementFilter

下面几项是常用的慢速过滤器。

1、ElementLevelFilter

ElementLevelFilter是使用关联的标高(Level)来匹配其关联或不关联的元素。

void TestElementLevelFilter(Document doc) 
{ 
  // 找到当前所有标高对应的所有元素 
  FilteredElementCollector collector = new FilteredElementCollector(doc); 
  ICollection<ElementId> levelIds = collector.OfClass(typeof(Level)).ToElementIds(); 
  foreach (ElementId levelId in levelIds) 
  { 
    collector = new FilteredElementCollector(doc); 
    ElementLevelFilter filter = new ElementLevelFilter(levelId); 
    ICollection<ElementId> founds = collector.WherePasses(filter).ToElementIds(); 
    Trace.WriteLine(String.Format("    {0}  Elements  are  associated  to  Level  {1}.",  founds.Count, 
levelId.IntegerValue)); 
  } 
}

注意:可以使用new ElementLevelFilter(levelId,true)来取得与传入标高不关联的所有元素。 

2、ElementParameterFilter

ElementParameterFilter是使用一个或者多个参数过滤规则来匹配元素的过滤器。
如果想要査找文档中所有ID值大于99的元素集合,可以使用如下方法:

void TestElementParameterFilter(Document doc) 
{ 
  // 找到所有id 大于99的元素 
  BuiltInParameter testParam = BuiltInParameter.ID_PARAM; 
  // 提供者 
  ParameterValueProvider pvp = new ParameterValueProvider(new ElementId((int)testParam)); 
  // 评估者 
  FilterNumericRuleEvaluator fnrv = new FilterNumericGreater(); 
  // 规则值    
  ElementId ruleValId = new ElementId(99); // Id 大于  99 
  // 创建规则过滤器及对应的元素参数过滤器 
  FilterRule fRule = new FilterElementIdRule(pvp, fnrv, ruleValId); 
  ElementParameterFilter filter = new ElementParameterFilter(fRule); 
  FilteredElementCollector collector = new FilteredElementCollector(doc); 
  ICollection<Element> founds = collector.WherePasses(filter).ToElements(); 
  foreach (Element elem in founds) 
  { 
    Trace.WriteLine(String.Format("    Element id: {0}", elem.Id.IntegerValue)); 
  } 
} 

注意:
①  ElementParameterFilter也提供了 inverted参数,用来匹配不符合传入规则的元素集。
②  如果参数含有单位(如长度、面积、体积等),该单位应当使用内部单位。比如说面积的内部单位是平方英尺(SF)。

3、FamilylnstanceFilter

FamilylnstanceFilter是使用族类型来匹配对应族实例元素的过滤器。

如要査找文档中族类型名字为"W10X49"对应的所有族实例,可以参考如下代码:

void TestFamilyInstanceFilter(Document doc) 
{ 
  // 找到名字"W10X49"的族类型 
  FilteredElementCollector collector = new FilteredElementCollector(Document); 
  collector = collector.OfClass(typeof(FamilySymbol)); 
  var query = from element in collector 
      where element.Name == "W10X49" 
      select element; // Linq 查询 
  List<Autodesk.Revit.DB.Element> famSyms = query.ToList<Autodesk.Revit.DB.Element>(); 
  ElementId symbolId = famSyms[0].Id; 
     
  // 创建过滤器并找到该族类型对应的所有族实例 
  collector = new FilteredElementCollector(doc); 
  FamilyInstanceFilter filter = new FamilyInstanceFilter(doc, symbolId); 
  ICollection<Element> founds = collector.WherePasses(filter).ToElements(); 
  foreach (FamilyInstance inst in founds) 
  { 
    Trace.WriteLine(String.Format("    FamilyInstance  {0},  FamilySybmol  Id  {1},  Name: 
{2}",inst.Id.IntegerValue, inst.Symbol.Id.IntegerValue, inst.Symbol.Name)); 
  } 
} 

4、CurveElementFilter

CurveElementFilter是匹配线型元素的过滤器。

以下代码显示了如何用线元素类型 (CurveElememType)来匹配对应的线型元素,如果想找模型线、参考线等线型元素,使用这个过滤器会比较方便。

void TestCurveElementFilter(Document doc) 
{ 
    // 找到所有线元素类型对应的线型元素 
    Array stTypes = Enum.GetValues(typeof(CurveElementType)); 
    foreach (CurveElementType tstType in stTypes) 
    { 
                if (tstType == CurveElementType.Invalid) continue; 
                FilteredElementCollector collector = new FilteredElementCollector(Document); 
                CurveElementFilter filter = new CurveElementFilter(tstType); 
                int foundNum = collector.WherePasses(filter).ToElementIds().Count; 
                Trace.WriteLine(String.Format("  {0}:  elements  amount  {1}",  tstType.GetType().Name, 
foundNum)); 
    } 
}

注意:CurveElementFilter也可以由参数inverted来匹配非传入线元素类型的线型元素。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值