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