Verze rodin v projektu
U dlouhodobě běžících projektů je potřeba zajistit průběžnou aktualizaci načtených rodin. Pokud se tak neděje, již vyřešené problémy se vrací jako bumerang. V článku představím řešení, které používám.

Předpokladem je, že používáme knihovnu rodin, která prochází stálým vývojem: Přibývají různá vylepšení nebo dochází alespoň k základní údržbě. Ve větších firmách se o to stará nějaký CAD/BIM manažer, menší subjekty využívají externí služby nebo knihovnu spravují svépomocně. Předpokládejme tedy, že průběžně vznikají vylepšené verze původních rodin.
Abychom se v tom neztratili, je vhodné rodiny od prvopočátku začít verzovat, tzn. označovat jejich jednotlivá vydání. Již při vytvoření rodiny můžeme přidat parametr Verze a označit si první vydání rodiny.
Abychom mohli přemýšlet o nějaké automatizaci vyhledávání zastaralých rodin v projektu, je potřeba také evidovat seznam rodin s označením aktuální verze každé rodiny.
Načtené rodiny v projektu
Všechny načtené rodiny a samozřejmě také jejich verze zjistíme nejlépe pomocí Dynama. Pokud jsme parametr Verze vyrobili jako sdílený, pak bychom sice dokázali vyrobit výpis ve formě výkazových tabulek, ale pouze u prvků použítých v modelu. Hledal jsem nějaký vhodný nod, který by svedl vypsat všechny načtené rodiny v projektu (tedy i ty neumístěné), ale nebyl jsem prozatím úspěšný - proto jsem si napsal takovýto jednoduchý Python skriptík. Python Script je v Dynamu speciální typ nodu, do kterého je možné vložit kód napsaný v jazyce Python.
import sys
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
fam_types = FilteredElementCollector(doc).OfClass(Family)
out = []
for f in fam_types:
if (f.IsEditable):
out.append(f)
OUT = out
Výstupem tohoto nodu typu Python Script je seznam všech rodin načtených do projektu.
V další části skriptu ze seznamu rodin vyseparujeme jejich jmenný seznam a jejich verze. Dynamo skript bude vypadat nějak takto. Výstupem budou dva "stringové" seznamy. Na obrázku níže první nod zleva obsahuje výše uvedený kód.

Seznam aktuálních rodin
Pro druhou větev skriptu si připravíme seznam aktuálních rodin. Já tyto rodiny eviduji v excelové tabulce spolu s dalšími údaji, pro náš skript ale využívám extrakt do TXT, který obsahuje pouze jméno rodiny, za kterým následuje středníkem oddělená verze.

Porovnáváme dva seznamy
Nyní máme připravené všechny potřebné datové vstupy. Oba seznamy nyní stačí porovnat. V Excelu bychom použili patrně nějakou obdobnou vyhledávací funkci, my máme k dispozici Dynamo. Oba seznamy musíme považovat za nesetřízené a v jednom seznamu mohou některé položky oproti druhému seznamu chybět i přebývat.
Abychom nemuseli složitě vázat uzlíky a vymýšlet komplikovanou logiku pomocí klasických Nodů, použijeme opět nod typu Python Script, který oba seznamy porovná a na výstup nám vypíše seznam rodin, které jsou v seznamu obou větví skriptu, ale kde není shoda ve verzi:
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
def compare_items(names, values, data):
mismatched_items = []
for item in data:
item_name, item_value = item.split(";")
if item_name in names:
index = names.index(item_name)
if values[index] != item_value:
mismatched_items.append(f"{item_name}: {values[index]} versus {item_value}")
return mismatched_items
names = IN[0]
values = IN[1]
data = IN[2]
mismatched = compare_items(names, values, data)
if len(mismatched) > 0:
print("Neshodující se položky:")
for item in mismatched:
print(item)
else:
mismatched = "Vypadá to, že všechny verzované rodiny v projektu jsou aktuální."
OUT = mismatched
Hotový Dynamo skript si můžeme uložit přímo do složky Dynamo Playeru. Vstupní nod File Path ještě nastavíme jako vstupní a nod Python Scriptu jako výstupní, abychom mohli přímo z prostředí Revitu měnit cestu k TXT souboru a dostali jsme výstup podobný tomu, co je na obrázku níže.
Kdykoliv je potřeba ověřit, že v projektu používáme aktuální rodiny, stačí skriptík spustit. Report je možné samozřejmě libovolně dál velebit.
