在Revit API中由家庭过滤

时间:2017-06-29 17:56:22

标签: revit-api revit

有一段时间我一直在寻找一种方法来过滤他们家人的元素。例如,我想要所有家族接线盒的元素 - 加载。我对Revit API有点新,我知道类别过滤器甚至家庭实例过滤器。但我不明白如何获得Junction Box的家族符号 - 例如Load家族。有没有一个好方法这样做?或者我最好过滤家庭中的特定类型?如果是这样,我该怎么做呢?

谢谢!!!!

顺便说一下,我正在用C#编程

2 个答案:

答案 0 :(得分:0)

欢迎使用Revit编程!

使用Revit API开始学习和编程的最有效方法,包括安装和使用SDK,是通过入门材料,特别是DevTV和My First提供的分步说明。 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后处理或LINQ

The Building Coder上的主题组Retrieving Elements Using FilteredElementCollector提供了更多详细信息。

答案 1 :(得分:0)

雅各

杰里米的答案是对的。以下是可用于获取某些姓氏的所有家庭实例的代码示例:

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选择的两个快速过滤器相结合,但这仍然是一个相当大的开销,而不是使用LINQ可以采取更直接的方法。

您还询问了是否可以选择FamilySymbol

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