I was trying to obtain the same thing as this post, i.e. changing parameter groups and noticed the same error: once I save the family or the project then the parameters do not remember that they were moved and go back to their original state.
I tried both in the project and the family environment and could not permanently save the changed group, i.e. if I closed and reopened the file the parameters did not change. However if I did it by hand it worked. It seems like we are missing some sort of “update” button, or maybe we have to trick revit in thinking that the edit was done by a human and not by python.
In the project environment:
import clr clr.AddReference('RevitAPI') from Autodesk.Revit.DB import * import Autodesk clr.AddReference("RevitNodes") import Revit clr.ImportExtensions(Revit.Elements) clr.AddReference("RevitServices") import RevitServices from RevitServices.Persistence import DocumentManager import System from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument pgINstr=IN pgOUTstr=IN #From the input strings find the corresponding BuiltInParameterGroup bpgs=System.Enum.GetValues(BuiltInParameterGroup) for bpg in bpgs: if str(bpg)==pgINstr: pgIN=bpg if str(bpg)==pgOUTstr: pgOUT=bpg #Create a list with all the project parameters params =  iterator = doc.ParameterBindings.ForwardIterator() while iterator.MoveNext(): params.append(iterator.Key) #Change the parameter group of all parameters in the desired paramgroup pchanged= for pdef in params: TransactionManager.Instance.EnsureInTransaction(doc) if pdef.ParameterGroup==pgIN: pdef.ParameterGroup=pgOUT test=pdef.ParameterGroup pchanged.append(pdef.Name) TransactionManager.Instance.TransactionTaskDone() #TransactionManager.Instance.ForceCloseTransaction() OUT = pchanged
In the family environment:
import clr clr.AddReference('ProtoGeometry') from Autodesk.DesignScript.Geometry import * # Import DocumentManager and TransactionManager clr.AddReference("RevitServices") import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument uiapp = DocumentManager.Instance.CurrentUIApplication app = uiapp.Application # Import RevitAPI clr.AddReference("RevitAPI") import Autodesk from Autodesk.Revit.DB import * import System pgGroupStr=IN pgGroupStr2=IN bpgs=System.Enum.GetValues(BuiltInParameterGroup) for bpg in bpgs: if str(bpg)==pgGroupStr2: pgGroup2=bpg if str(bpg)==pgGroupStr: pgGroup=bpg rtn= TransactionManager.Instance.EnsureInTransaction(doc) params=doc.FamilyManager.Parameters for p in params: if p.Definition.ParameterGroup==pgGroup: rtn.append(p) p.Definition.ParameterGroup=pgGroup2 TransactionManager.Instance.ForceCloseTransaction() OUT=rtn
I tried playing around with ForceCloseTransaction() instead of TransactionTaskDone(), and inserting the transaction in the for loop but nothing changed.
I am not talking about changing a parameter group in a family, uploading it (again) in a project and noticing that the group does not change: this is a well known issue regardless of what Autodesk says: link
A really horrible “workaroud” I found is the following:
- For the project environemt: run the script, create a new file(rvt or rte template, as in my case), and transfer the standards (the parameters in my case) to the new file.Now use the new file…
- For the family environment: run the script, create a new file(rvt or rte), load and close the family in the project, export the family from the project.
This is the second time I found such a behaviour (recently I could not permanently change some MEP settings) and would love to understand what line of code I am missing