如何在 revitpythonshell 中选择正确的 LoadFamily 函数

Mar*_*son 2 python overloading revit revit-api revitpythonshell

revitpythonshell 提供了两种非常相似的方法来加载族。

LoadFamily(self: Document, filename:str) -> (bool, Family)
LoadFamily(self: Document, filename:str) -> bool
Run Code Online (Sandbox Code Playgroud)

所以似乎只有返回值不同。我尝试以几种不同的方式调用它:

(success, newFamily) = doc.LoadFamily(path)
success, newFamily = doc.LoadFamily(path)
o = doc.LoadFamily(path)
Run Code Online (Sandbox Code Playgroud)

但我总是得到一个布尔值。我也想要家人

Dar*_*mas 5

您可以像这样获得您正在寻找的过载:

import clr
family = clr.Reference[Family]()
# family is now an Object reference (not set to an instance of an object!)
success = doc.LoadFamily(path, family)  # explicitly choose the overload
# family is now a Revit Family object and can be used as you wish
Run Code Online (Sandbox Code Playgroud)

这通过创建一个对象引用来传递到函数中来工作,方法重载结果现在知道要查找哪个。

在 RPS 帮助中显示的重载列表与它们出现的顺序相同的假设下工作 - 我认为这是一个非常安全的假设,您也可以这样做:

success, family = doc.LoadFamily.Overloads.Functions[0](path)
Run Code Online (Sandbox Code Playgroud)

这确实会返回一个 tuple (bool, Autodesk.Revit.DB.Family)

请注意,这必须在事务内部发生,因此一个完整的示例可能是:

t = Transaction(doc, 'loadfamily')
t.Start()
try:
    success, family = doc.LoadFamily.Overloads.Functions[0](path)
    # do stuff with the family
    t.Commit()
except:
    t.Rollback()
Run Code Online (Sandbox Code Playgroud)