Tworzenie tagów na wielu widokach z Dynamo

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
Posts created 34

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top