1

我刚刚开始使用 Revit API,我有一个问题。我现在一直在寻找一种按族过滤 Revit 元素的方法。这是我的程序:首先我做了一个过滤元素收集器来获取所有家庭符号 ID。

Families = FilteredElementCollector(doc).OfClass(Family).ToElements()
for fam in Families:
    if fam.Name == 'Family Name':
        FamSymb = fam.ID

这应该让我得到家庭符号 ID。然后,我尝试使用此 ID 创建过滤后的元素收集器。

ElementFilter = FamilySymbolFilter(ElementId(FamSymb))
New_Collector = FilteredElementCollector(doc).WherePasses(ElementFilter).ToElementIds()

这给了我以下错误:Microsoft.Scripting.ArgumentTypeException: expected BuiltInParameter, got ElementId

BuiltInParameter如果FamilySymbolFilters要求元素 ID ,我不知道为什么它期待一个。无论如何,任何帮助将不胜感激。谢谢!

4

2 回答 2

0

欢迎使用 Revit API。首先通读入门材料,您可能会节省一些时间、精力和头疼的问题。此外,它将帮助您了解族定义与其类型之间的区别,后者在项目环境中生成符号,这些符号作为单独的实例放置。

您所命名FamSymb的实际上是标识您找到的家庭的元素 id。您看到的错误是由于您将该 ElementId 实例提供给ElementId构造函数的事实引起的。但是,ElementId不实现采用元素 id 参数的(复制)构造函数。然而,它确实实现了一个采取 a 的BuiltInParameter方法,参见。ElementId文档

您可以立即实例化FamilySymbolFilter(FamSymb)(尽管我强烈建议您以FamSymb不同的方式命名)。

于 2020-05-13T05:49:04.847 回答
0

我认为您已经拥有所需的代码 - 但只是添加了一个不必要的条件。

看起来您正在搜索一个Family名为“姓氏”的人。像这样调整您的代码会获取所有家庭作为Family对象,并检查一个名为“家庭名称”的家庭:

Families = FilteredElementCollector(doc).OfClass(Family)
for fam in Families:
    if fam.Name == 'Family Name':
         # fam is the Family object called 'Family Name', do your worst!
         print fam.Name,'found!'
         print fam.FamilyCategory.Name
于 2020-05-13T21:26:52.217 回答