在 Revit 中按族过滤 API

Filtering by a Family in Revit API

一段时间以来,我一直在寻找一种按家人过滤元素的方法。例如,我想要 Junction Boxes - Load 系列的所有元素。我是 Revit API 的新手,我知道类别过滤器甚至族实例过滤器。但是我不明白我是如何获得接线盒的系列符号的 - 例如负载系列。甚至有这样做的好方法吗?还是我最好过滤家庭中的特定类型?如果是这样,我该怎么做?

欢迎使用 Revit 编程!

开始使用 Revit API 学习和编程(包括安装和使用 SDK)的最有效方法是完成入门 material,尤其是循序渐进DevTV 和我的第一个 Revit 插件视频教程提供的步骤说明:

http://thebuildingcoder.typepad.com/blog/about-the-author.html#2

回答您的问题:您使用过滤元素收集器从 Revit 数据库中检索元素:

http://www.revitapidocs.com/2017/263cf06b-98be-6f91-c4da-fb47d01688f3.htm

您可以对它们应用许多过滤器。在您的情况下,您可以直接筛选 FamilySymbol 个实例。

有两种方法可以进一步限制搜索以仅检索您感兴趣的内容,名称为"Junction Boxes - Load":

  • 高效:使用参数过滤器
  • 简单:使用 .NET post-processing 或 LINQ

The Building Coder in the topic group on Retrieving Elements Using FilteredElementCollector提供了更多详细信息。

雅各布,

Jeremy 的回答是正确的。下面是一个代码示例,可用于获取某个家族名称的所有家族实例:

Jeremy 提到的有效方法是使用参数过滤器:

var famType = new FilteredElementCollector(m_doc)
    .OfClass(typeof(Family)) // This is called a class filter
    .FirstOrDefault(x => x.Name == "YourFamilyName");

if (famType != null)
{
    const BuiltInParameter testParam = BuiltInParameter.ELEM_FAMILY_PARAM;
    var pvp = new ParameterValueProvider(new ElementId((int)testParam));
    var fnrv = new FilterNumericEquals();
    var ruleValId = famType.Id;
    var paramFr = new FilterElementIdRule(pvp, fnrv, ruleValId);
    var epf = new ElementParameterFilter(paramFr);

    var results = new FilteredElementCollector(m_doc)
        .OfClass(typeof(FamilyInstance))
        .WherePasses(epf)
        .ToElements();
}

效率较低的方法是这样做:

var result = new FilteredElementCollector(m_doc)
    .OfClass(typeof(FamilyInstance))
    .Cast<FamilyInstance>()
    .Where(x => x.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == "YourFamilyName");

我知道 Jeremy 提到第二种方法效率较低,但我个人并不完全确定。 ElementParameterFilter 是一个慢速过滤器,无论如何都会扩展内存中的所有元素。尽管它与 FamilyFamilyInstance selection 的两个快速过滤器相结合,但与您可以使用 LINQ 采取的更直接的方法相比,这仍然是一个相当大的开销。

您还询问了能够 select FamilySymbol

var famType = new FilteredElementCollector(m_doc)
        .OfClass(typeof(FamilySymbol))
        .FirstOrDefault(x => x.Name == "YourFamilyTypeName");