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.

Verze rodin v projektu
Najít zastaralé rodiny v projektu může být jako hledání jehel v kupce sena. Hodně projektů znamená hodně kupek sena.

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.

První část skriptu pro porovnání rodin: Seznam rodin a jejich verzí v projektu.

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.

Druhá část skriptu: Seznam rodin a verzí v Knihovně.

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.