欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Revit开发之ElementLevelFilter、ElementParameterFilter、FamilylnstanceFilter、CurveElementFilter

程序员文章站 2022-06-11 08:07:23
...
下面几项是常用的慢速过滤器。

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来匹配非传入线元素类型的线型元素。

=========【更多高级应用请关注公众号】========

Revit开发之ElementLevelFilter、ElementParameterFilter、FamilylnstanceFilter、CurveElementFilter

==================================