I had a look at it now, but without any luck. It seems that the doc.EditFamily(f)
doesn’t like to be called within Dynamo. I tested similar code in Revit Python Shell and it worked without problems. Strangly some very similar workflows for setting shared parameters in families seem to work:
- revitpythonshell - Revit API & Dynamo, Creating a Family Parameter from Project Document - Stack Overflow
- http://dynamobim.org/forums/topic/modify-room-calculation-point-toggle-builtin-parameter/
- Batch add shared parameters to families in project from .txt file with ui.multipleinputform ++ - #6 by i.tzivanidis
Maybe @Mostafa_El_Ayoubi understand why? It’s probably something about how Dynamo handles transactions.
Here is the python script if you wold like to try:
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
class FamilyOption(IFamilyLoadOptions):
def OnFamilyFound(self,familyInUse,overwriteParameterValues):
overwriteParameterValues = True
return True
def OnSharedFamilyFound(self, sharedFamily, familyInUse, FamilySource, overwriteParameterValues):
overwriteParameterValues = True
return True
#Preparing input from dynamo to revit
f = UnwrapElement(IN[0])
o = IN[1]
OUT = []
famdoc = doc.EditFamily(f)
thisFamily = famdoc.OwnerFamily
parOmniclass = thisFamily.get_Parameter(BuiltInParameter.OMNICLASS_CODE)
TransactionManager.Instance.EnsureInTransaction(famdoc)
parOmniclass.Set(o)
TransactionManager.Instance.TransactionTaskDone()
TransactionManager.Instance.ForceCloseTransaction()
famdoc.LoadFamily(doc, FamilyOption())
famdoc.Close(False)
OUT = 0
Here is the code I used in Revit Python Shell:
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
app = __revit__.Application
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
class FamilyOption(IFamilyLoadOptions):
def OnFamilyFound(self,familyInUse,overwriteParameterValues):
return True
def OnSharedFamilyFound(self, sharedFamily, familyInUse, FamilySource, overwriteParameterValues):
return True
#Preparing input from dynamo to revit
fec = FilteredElementCollector(doc).OfClass(Family)
for f1 in fec:
if f1.Name == "NO_Column_CastInPlace_Round":
f = f1
break
o = "23.25.30.11.14.11"
famdoc = doc.EditFamily(f)
thisFamily = famdoc.OwnerFamily
parOmniclass = thisFamily.get_Parameter(BuiltInParameter.OMNICLASS_CODE)
t = Transaction(famdoc)
t.Start("Edit o")
parOmniclass.Set(o)
t.Commit()
print famdoc.LoadFamily(doc, FamilyOption())
print famdoc.Close(False)