Revit开发之ElementLevelFilter、ElementParameterFilter、FamilylnstanceFilter、CurveElementFilter
程序员文章站
2022-06-11 08:07:23
...
下面几项是常用的慢速过滤器。
1) ElementLevelFilter
ElementLevelFilter是使用关联的标高(Level)来匹配其关联或不关联的元素。
注意:可以使用new ElementLevelFilter(levelId,true)来取得与传入标高不关联的所有元素。
2) ElementParameterFilter
ElementParameterFilter是使用一个或者多个参数过滤规则来匹配元素的过滤器。
如果想要査找文档中所有ID值大于99的元素集合,可以使用如下方法:
注意:
① ElementParameterFilter也提供了 inverted参数,用来匹配不符合传入规则的元素集。
② 如果参数含有单位(如长度、面积、体积等),该单位应当使用内部单位。比如说面积的内部单位是平方英尺(SF)。
3) FamilylnstanceFilter
FamilylnstanceFilter是使用族类型来匹配对应族实例元素的过滤器。
如要査找文档中族类型名字为"W10X49"对应的所有族实例,可以参考如下代码:
以下代码显示了如何用线元素类型 (CurveElememType)来匹配对应的线型元素,如果想找模型线、参考线等线型元素,使用这个过滤器会比较方便。
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来匹配非传入线元素类型的线型元素。
=========【更多高级应用请关注公众号】========
==================================