Python Scripting to Orient Nested Tags in Revit

by Trevor Karstens on November 21, 2015

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()
Share

{ 0 comments… add one now }

Leave a Comment