Jedną z bardziej przydatnych, wbudowanych w Revita, automatyzacji jest możliwość hurtowego tagowania elementów, nie posiadających jeszcze znacznika. Niestety komenda działa wyłącznie dla jednego, aktywnego widoku. W przypadku większych projektów nierzadko mamy do czynienia z kilkudziesięcioma rysunkami na których musimy powtórzyć tę czynność. Stąd też próba utworzenia skryptu Dynamo/Python eliminującego tę niedogodność.
Sam graf Dynamo jest bardzo prosty. W zasadzie musimy tylko wyfiltrować potrzebne widoki, określić kategorię elementu oraz wybrać tag.

Cała praca odbywa się wewnątrz węzła Pythonowego. Pierwszą czynnością jest konwersja kategorii elementu na tzw. BuiltInCategory, które będzie mogło posłużyć nam jako filtr w obiekcie FilteredElementCollector.
import System bic = System.Enum.ToObject(BuiltInCategory,category.Id.IntegerValue)
W skrypcie użyjemy dwóch obiektów FilteredElementCollector. Pierwszy z nich znajdzie wszystkie elementy z widoku, które potencjalnie mogą wymagać tagowania. Drugi zbierze tagi.
elementCollector = FilteredElementCollector(doc,v.Id).OfCategory(bic) tagCollector = FilteredElementCollector(doc,v.Id).OfClass(IndependentTag)
Następnie musimy sprawdzić, które elementy nie posiadają jeszcze tagu w danym widoku. W tym celu porównujemy id obiektu z id metkowanego obiektu dla każdego z tagów.
notTagged = [] for e in elementCollector: tagged = False for t in tagCollector: if t.TaggedLocalElementId==e.Id: tagged = True if not tagged: notTagged.append(e)
Teraz pozostaje nam już tylko utworzyć brakujące tagi i przypisać im odpowiedni typ elementu.
for e in notTagged: t = IndependentTag.Create(doc,v.Id,Reference(e),False,TagMode.TM_ADDBY_CATEGORY,TagOrientation.Horizontal,e.Location.Point) t.ChangeTypeId(tag.Id)
Cały kod węzła oraz plik z kompletną definicją do pobrania poniżej.
import clr import System clr.AddReference("RevitAPI") from Autodesk.Revit.DB import * clr.AddReference("RevitServices") import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument #The inputs to this node will be stored as a list in the IN variables. views = UnwrapElement(IN[0]) category = UnwrapElement(IN[1]) tag = UnwrapElement(IN[2]) bic = System.Enum.ToObject(BuiltInCategory,category.Id.IntegerValue) output = [] TransactionManager.Instance.EnsureInTransaction(doc) for v in views: if not v.IsTemplate: elementCollector = FilteredElementCollector(doc,v.Id).OfCategory(bic) tagCollector = FilteredElementCollector(doc,v.Id).OfClass(IndependentTag) notTagged = [] for e in elementCollector: tagged = False for t in tagCollector: if t.TaggedLocalElementId==e.Id: tagged = True if not tagged: notTagged.append(e) for e in notTagged: t = IndependentTag.Create(doc,v.Id,Reference(e),False,TagMode.TM_ADDBY_CATEGORY,TagOrientation.Horizontal,e.Location.Point) t.ChangeTypeId(tag.Id) output.append(t) TransactionManager.Instance.TransactionTaskDone() #Assign your output to the OUT variable. OUT = output