1

プロジェクト ドキュメントでファミリのドキュメントを呼び出し、FamilyManager メソッドを使用してファミリを編集することにより、新しいファミリ パラメータを作成しようとしています。Dynamo フォーラムで約 10 人がこれを求めていたので、試してみることにしました。以下は私のPythonスクリプトです。

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *
#The inputs to this node will be stored as a list in the IN variables.

familyInput = UnwrapElement(IN[0])

familySymbol = familyInput.Symbol.Family
doc = familySymbol.Document

par_name = IN[1]
par_type = ParameterType.Text
par_grp = BuiltInParameterGroup.PG_DATA


TransactionManager.Instance.EnsureInTransaction(doc)

familyDoc = doc.EditFamily(familySymbol)
OUT = familyDoc.FamilyManager.AddParameter(par_name,par_grp,par_type,False)

TransactionManager.Instance.TransactionTaskDone()

スクリプトを実行すると、次のエラーが表示されます。

Warning: IronPythonEvaluator.EvaluateIronPythonScript operation failed. 
Traceback (most recent call last):
  File "<string>", line 26, in <module>
Exception: The document is currently modifiable! Close the transaction before calling EditFamily.

このエラーは、スクリプトを使用して既に存在するファミリ ドキュメントを開き、その情報をプロジェクト ドキュメントに送り返さないためだと思いますか? またはそれに似たもの。これを回避する方法に関するヒントはありますか?

4

2 に答える 2

1

フォーラムでの議論をさらに発展させます:

import clr

clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *

par_name = IN[0]
exec("par_type = ParameterType.%s" % IN[1])
exec("par_grp = BuiltInParameterGroup.%s" % IN[2])
inst_or_typ = IN[3]
families = UnwrapElement(IN[4])

# class for overwriting loaded families in the project
class FamOpt1(IFamilyLoadOptions):
    def __init__(self): pass
    def OnFamilyFound(self,familyInUse, overwriteParameterValues): return True
    def OnSharedFamilyFound(self,familyInUse, source, overwriteParameterValues): return True

trans1 = TransactionManager.Instance
trans1.ForceCloseTransaction() #just to make sure everything is closed down
# Dynamo's transaction handling is pretty poor for
# multiple documents, so we'll need to force close
# every single transaction we open
result = []

for f1 in families:
    famdoc = doc.EditFamily(f1)
    try: # this might fail if the parameter exists or for some other reason
        trans1.EnsureInTransaction(famdoc)
        famdoc.FamilyManager.AddParameter(par_name, par_grp, par_type, inst_or_typ)
        trans1.ForceCloseTransaction()
        famdoc.LoadFamily(doc, FamOpt1())
        result.append(True)
    except: #you might want to import traceback for a more detailed error report
        result.append(False)
        trans1.ForceCloseTransaction()      
    famdoc.Close(False)

OUT = result

Dynamo グラフのイメージ

于 2016-02-21T08:29:03.393 に答える
0

エラー メッセージには、問題の内容が正確に示されています。「ドキュメントは現在変更可能です。EditFamily を呼び出す前にトランザクションを閉じてください。」

TransactionManager.Instance.EnsureInTransaction が指定されたドキュメントでトランザクションを開くと仮定します。開いているトランザクションで EditFamily を呼び出すことはできません。

これは、ヘルプ ファイルに明確に記載されています。

http://thebuildingcoder.typepad.com/blog/2012/05/edit-family-requires-no-transaction.html

EditFamily を呼び出す前にトランザクションを閉じるか、この場合は最初からまったく開かないでください。

ああ、もちろん、家族の文書を修正したいと思っています。これには確かにトランザクションが必要ですが、プロジェクト ドキュメント 'doc' ではなく、ファミリ ドキュメント 'familyDoc' に対してです。

これが最終的な解決策になるかどうかはわかりませんが、役立つかもしれません:

familyDoc = doc.EditFamily(familySymbol)

TransactionManager.Instance.EnsureInTransaction(familyDoc)
OUT = familyDoc.FamilyManager.AddParameter(par_name,par_grp,par_type,False)
TransactionManager.Instance.TransactionTaskDone()
于 2016-02-20T10:57:51.240 に答える