1

revitpythonshell предоставляет два очень похожих метода для загрузки семейства.Как выбрать правильную функцию LoadFamily в revitpythonshell

LoadFamily(self: Document, filename:str) -> (bool, Family) 
LoadFamily(self: Document, filename:str) -> bool 

Так что кажется, что только возвращаемые значения различаются. Я попытался назвать это несколькими различными способами:

(success, newFamily) = doc.LoadFamily(path) 
success, newFamily = doc.LoadFamily(path) 
o = doc.LoadFamily(path) 

Но я всегда просто получаю назад. Я тоже хочу семью.

+0

Я считаю, что проблема заключается в том, как Python обрабатывает перегрузки и компилятор запутывается ... не уверен, если есть решение для него, поскольку я считаю, что Python не был «разработан», чтобы иметь перегрузки (например, другие языки .NET, оригинальный Revit API). Возможно, я ошибаюсь. –

ответ

3

Вы можете получить на перегрузках вы ищете, как это:

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 

Это работает путем создания ссылки на объект для передачи в функцию и перегрузка методы resultion штуковину теперь знает, какой из них искать.

Работы в предположении, что список перегрузок показаны на RPS помощи в том же порядке, как они появляются - что я думаю, что это довольно безопасное предположение сделать, вы можете сделать это:

success, family = doc.LoadFamily.Overloads.Functions[0](path) 

и это действительно вернет кортеж (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() 
+0

Спасибо, много Daren. Это здорово! –

+0

Тебе очень нравится Мартин! –