A common pain in Revit is to manage object’s reference level :
- If you change a duct/pipe reference level. It stays at the same location which is great.
- If you change any fitting/accessory reference level. It move at the same offset on the defined level. It generates many errors when you change a level elevation during a project…
from Autodesk.Revit.DB import *
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
getselection = uidoc.Selection.GetElementIds
#Get current selection and store it
selection = getselection()
#Ask user to pick an object which has the desired reference level
def pickobject():
from Autodesk.Revit.UI.Selection import ObjectType
__window__.Hide()
picked = uidoc.Selection.PickObject(ObjectType.Element, "Sélectionnez la référence")
__window__.Show()
return picked
#Retrieve needed information from reference object
ref_object = doc.GetElement(pickobject().ElementId)
ref_level = ref_object.ReferenceLevel
ref_levelid = ref_level.Id
t = Transaction(doc, "Change reference level")
t.Start()
#Change reference level and relative offset for each selected object in order to change reference plane without moving the object
for e in selection:
object = doc.GetElement(e)
object_param_level = object.get_Parameter(BuiltInParameter.FAMILY_LEVEL_PARAM)
object_Level = doc.GetElement(object_param_level.AsElementId())
object_param_offset = object.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM)
object_newoffset = object_param_offset.AsDouble() + object_Level.Elevation - ref_level.Elevation
object_param_level.Set(ref_levelid)
object_param_offset.Set(object_newoffset)
t.Commit()
I hope you’ll enjoy it as much as I do.