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