Associate family parameter in a family

Ok I got it sorted ! It needed an Autodesk.Revit.DB.Parameter for the element parameter and Autodesk.Revit.DB.FamilyParameter for the family parameter. The below is a bit messy and can use some improvement but it worked for my purposes. It will only process one element but it will associate multiple parameters; give the Python script node a list of parameter names (strings) and the family parameter names to associate them with like so:

Script:

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

clr.AddReference('RevitNodes')

import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

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

doc = DocumentManager.Instance.CurrentDBDocument

elem = UnwrapElement(IN[0])
paramNames = IN[1]
famNames = IN[2]

if not isinstance(paramNames, list):
	paramNames = [paramNames]
if not isinstance(famNames, list):
	famNames = [famNames]
	
elemParams = elem.Parameters
famParams = doc.FamilyManager.Parameters


elemAssoc = []
famAssoc = []

for param in elemParams:
	for name in paramNames:
		if param.Definition.Name == name:
			elemAssoc.append(param)

for fparam in famParams:
	for fname in famNames:
		if fparam.Definition.Name == fname:
			famAssoc.append(fparam)

TransactionManager.Instance.EnsureInTransaction(doc)

for i,j in zip(elemAssoc, famAssoc):
	doc.FamilyManager.AssociateElementParameterToFamilyParameter(i, j)
	
TransactionManager.Instance.TransactionTaskDone()

OUT = elem

Let me know if this works for you as well & if you improve upon it please share :slight_smile:

7 Likes