In my last post on nested tags I went into detail on how to connect and nest a label object within a family in such a way as to allow it to behave similarly to a tag while providing some benefits that, in my opinion, enhance usability beyond the default tagging method employed by most Revit users.
One of the chief disadvantages of this method, as I stated in the previous blog post, is that each family instance which uses this method must have its angle parameter manually updated to orient the label to the sheet view. I also said that I’d write a script that would automate this process. I’m a fan of Python coding and utilize an excellent add-in call RevitPythonShell, in my scripting.
The following script targets Revit 2015 and will require some adjustment to maintain functionality in Revit 2016:
from math import *
class OrientText(UI.IExternalCommand):
def Execute(self):
NestedTextElements = list(DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ElectricalFixtures).WherePasses(DB.ElementParameterFilter(DB.SharedParameterApplicableRule("TEXT ANGLE"))))
t.Start("Nested Text Orienting")
for a in NestedTextElements:
angleadd = float()
X = a.FacingOrientation.X
Y = a.FacingOrientation.Y
if X >= 0 and Y >= 0:
angleadd = radians(90)
elif X = 0:
angleadd = radians(90)
elif X < 0 and Y = 0 and Y < 0:
angleadd = radians(270)
if X != 0:
baseangle = atan(abs(Y)/abs(X))
else:
baseangle = radians(90)
if a.FacingFlipped == True:
if X < 0 and Y = 0 and Y >= 0:
anglesign = 1
else:
anglesign = -1
else:
if X < 0 and Y = 0 and Y >= 0:
anglesign = -1
else:
anglesign = 1
textangle = a.GetParameters("TEXT ANGLE")[0]
textangle.Set(anglesign * (baseangle - angleadd))
t.Commit()
return UI.Result.Succeeded
OT = OrientText()
OT.Execute()





