Building Coder(Revit 二次开发) - 针对视图和阶段进行过滤

Building Coder 链接:http://thebuildingcoder.typepad.com/blog/2010/09/filter-for-view-and-phase.html

Revit 二次开发论坛链接:http://revit.5d6d.com/viewthread.php?tid=1306&extra=


关于过滤的话题总是没完没了。这不又来新需求了:这回是需要过滤出指定视图中属于指定阶段的元素。

问题:
我需要获取在指定视图中属于同一阶段的所有元素。它们应该已经被创建,但是还没有被显示。

回答:
获取指定视图中的元素可以使用 FilteredElementCollector 类的一个重载版本的构造器:FilteredElementCollector(Document, ElementId)。为第二个参数传入
指定视图的 ElementId 就可。这样在由 ElementId 确定的视图中的所有可见元素都能被找到。

既然“创建阶段”是个参数,你可以利用 ElementParameterFilter 来设定针对这个参数的过滤条件。将其和之前指定视图 ElementId 的 FilteredElementCollector
构造函数版本结合起来,就能实现你的需求。

    FilteredElementCollector collector
      = new FilteredElementCollector(
        doc, doc.ActiveView.Id );
 
    // 获取名称为 "New construction" 的阶段元素
 
    ElementId idPhase = GetPhaseId(
      "New Construction", doc );
 
    // 参数值提供者
    ParameterValueProvider provider
      = new ParameterValueProvider(
        new ElementId( ( int )
          BuiltInParameter.PHASE_CREATED ) );
 
    // 数值过滤规则判断器(条件是相等)
    FilterNumericRuleEvaluator evaluator
      = new FilterNumericEquals();
 
    // 数值过滤规则
    FilterElementIdRule rule
      = new FilterElementIdRule(
        provider, evaluator, idPhase );
 
    // 限制阶段名称为 "New construction" 的过滤器
    ElementParameterFilter parafilter
      = new ElementParameterFilter( rule );
 
    // 应用过滤器到元素收集器
    collector.WherePasses( parafilter );


GetPhaseId()方法实现如下:
  public ElementId GetPhaseId(
    string phaseName,
    Document doc )
  {
    ElementId id = null;
 
    FilteredElementCollector collector
      = new FilteredElementCollector( doc );
 
    collector.OfClass( typeof( Phase ) );
 
    var phases = from Phase phase in collector
                 where phase.Name.Equals( phaseName )
                 select phase;
 
    id = phases.First().Id;
 
    return id;
  }


你可能感兴趣的:(Building Coder(Revit 二次开发) - 针对视图和阶段进行过滤)