DYNAMO a jeho praktické využití: přečíslování místností; UPDATE 25.03.2017

V dnešním článku se zaměříme opět na vizuální programovací nástroj Dynamo a pokusíme se pomocí tohoto nástroje vytvořit algoritmus, který umožní efektivně očíslovat, resp. přečíslovat jednotlivé místnosti dle potřeby.

Ve fázi návrhu dispozičního řešení se může stát, že zadavatel zakázky vznese požadavek na doplnění určité místnosti do rozpracovaného půdorysu podlaží. Revit je velice silný nástroj pro zapracovávání dílčích změn, ale po osazení nové místnosti do půdorysu již nenabízí žádnou funkci, která by uživateli pomohla jednoduše přečíslovat všechny místnosti najednou. Uživatel je v této situaci nucen manuálně kliknout na každou místnost a přepsat její číslo tak, aby si číslování místností v půdoryse zachovalo jistou logiku. Tam, kde Revit ztrácí dech, předává pomyslný štafetový kolik programovacímu nástroji Dynamo.

Před sestavením algoritmu si musíme nejprve vytvořit testovací půdorys. Do daného půdorysu si zaneseme jednotlivé místnosti pomocí nástroje Automaticky umístit místnosti, který sice jedním kliknutím umístí místnosti do daného půdorysu, ale zároveň je očísluje značně chaoticky a ne vždy zrovna podle toho, jak uživatel potřebuje.


V dalším kroku je nutné si vytvořit podkategorii čáry, která nám bude definovat trajektorii přečíslování jednotlivých místností. Na kartě Správa, na panelu Nastavení vybereme nástroj Doplňková nastavení, pod kterým se skrývá celá řada podnástrojů. Vybereme podnástroj Styly čar, ve kterém si vytvoříme nový styl čáry, který si nazveme Přečíslování místností.



Následně si zaneseme do našeho půdorysu trajektorii přečíslování a jako styl čáry si vybereme právě styl Přečíslování místností.



Nyní už máme vše připravené a můžeme si nastartovat programovací nástroj Dynamo. Pro sestavení algoritmu je nutné si stáhnout nejaktuálnější verzi Dynama 1.2.1 ze stránek vývojového týmu nebo z cadstudio.cz/download

V minulých článcích jsme si k jednotlivým uzlům uváděli přesnou cestu, dnes bychom si popsali rychlejší způsob vkládání uzlů do grafu. Při kliknutí pravého tlačítka myši do plochy grafu se zpřístupní vyhledávací konzole, do které lze zadat přesný název hledaného uzlu. První část algoritmu sestavíme z následujících uzlů:

1.) Categories: Tento uzel umožňuje vybrat danou kategorii, kterou chceme načíst do prostředí Dynama. V našem případě si vybereme kategorii Čáry.
2.) All Elements of Category: Tento uzel načte všechny elementy zvolené kategorie.

Výše zmíněné uzly spolu propojíme a přes zkratku Ctrl+g uložíme do jedné skupiny, kterou nazveme Načtení kategorie čáry do dynama



Jelikož jsme Dynamu zadali instrukce, že má načíst celou kategorii Čáry, je nutné v dalším kroku si vytvořit algoritmus, který nám pomůže vyfiltrovat pouze styl čáry Přečíslování místností. Daný algoritmus obsahuje následující uzly:

3.) String: Do daného uzlu zapíšeme název parametru Styl čáry a propojíme s uzlem Element.GetParameterValueByName.
4.) Element.GetParameterValueByName: Tento uzel umožní získat hodnotu parametru z daného prvku, v našem případě budeme získávat hodnotu z parametru Styl čáry. Následně tento uzel propojíme s uzlem Element.Name.
5.) Element.Name: Tento uzel umožňuje získat název daného elementu, v našem případě budeme získávat název stylu čáry Přečíslování místností. Tento uzel propojíme s uzlem String.Contains.
6.) String: Do daného uzlu zapíšeme název stylu čáry Přečíslování místností a propojíme ho s uzlem String.Contains.
7.) Boolean: Na daném uzlu zvolíme možnost True a propojíme ho s uzlem String.Contains.
8.) String.Contains: Tento uzel určuje, zdali zadaný řetězec obsahuje daný dílčí řetězec. Tento uzel propojíme s uzlem List.FilterByBoolMask.
9.) List.FilterByBoolMask: Tento uzel umožní vyfiltrovat elementy, které definuje maska filtru. V našem případě je maska filtru definována uzlem String.Contains a seznam elementu definuje uzel All Elements of Category ze skupiny Načtení kategorie čáry do dynama.

Výše zmíněné uzly spolu propojíme a přes zkratku ctrl+g uložíme do jedné skupiny, kterou nazveme Vyfiltrování stylu čáry



V dalším kroku si na načtenou čáru rozmístíme body, jejichž pořadí na křivce nám následně pomůže při přečíslování místností. Algoritmus, který by měl s touto problematikou pomoci, obsahuje následující uzly:

10.) CurveElement.Curve: Tento uzel převede čáru Revitu na křivku. Tento uzel propojím v první řadě s uzlem Curve.PointAtEqualChordLength a následně s uzlem Curve.SplitByPoints.
11.) Integer Slider: Tento uzle vytváří celočíselné hodnoty. Zadáme na posuvníku hodnotu 400 a daný uzel propojíme s uzlem Curve.PointAtEqualChordLength.
12.) Curve.PointAtEqualChordLength: Tento uzel rozmístí na danou křivku požadovaný počet bodů. Tento uzel následně propojíme s uzlem Curve.SplitByPoints.
13.) Curve.SplitByPoints: Tento uzel rozdělí křivku na více částí v daných bodech. Tento uzel následně propojíme s uzlem Curve.EndPoint.
14.) Curve.EndPoint: Tento uzel získá koncový bod podél křivky. Tento uzle následně propojíme s uzlem Flatten.
15.) Flatten: Tento uzel nám zruší jeden sublist, který byl vytvořen uzlem Curve.EndPoint.

Výše zmíněné uzly spolu propojíme a přes zkratku Ctrl+g uložíme do jedné skupiny, kterou nazveme Rozmístění bodů na křivce. 


Nyní si vytvoříme algoritmus, který bude pro změnu načítat kategorii Místnosti. Postup sestavení algoritmu bude identický jako v případě načítání kategorie Čáry.

16.) Categories: Tento uzel umožňuje vybrat danou kategorii, kterou chceme načíst do prostředí Dynama. V našem případě si vybereme kategorii Místnosti.
17.) All Elements of Category: Tento uzel načte všechny elementy zvolené kategorie. 

Výše zmíněné uzly spolu propojíme a přes zkratku Ctrl+g uložíme do jedné skupiny, kterou nazveme Načtení kategorie místnosti do Dynama. 


V dalším kroku si musíme vytvořit algoritmus, který nám v načtených místnostech identifikuje body rozmístěné po křivce. Daný algoritmus obsahuje následující uzly:

18.) Room.IsInsideRoom: Tento uzel zkontroluje, zda se nějaký bod nachází uvnitř načtených místností. Daný uzel propojíme s uzlem List.Map (uzel č.20).
19.) List.FilterByBoolMask: Tento uzel umožní vyfiltrovat elementy, které definuje maska filtru. V našem případě je maska filtru definována uzlem List.Map (uzel č.20.) a seznam elementu definuje uzel All Elements of Category ze skupiny Načtení kategorie místnosti do dynama. Tento uzel slouží jako funkce pro uzel List.Map (uzel č.21).
20.) List.Map: Tento uzel umožní použít funkci na všechny prvky v seznamu. V našem případě bude tento uzel aplikovat funkci z uzlu Room.IsInsideRoom na body, které jsme rozmístili na křivce. 
21.) List.Map: Tento bod umožní použít funkci na všechny prvky v seznamu. V našem případě bude tento uzel aplikovat funkci z uzlu List.FilterByBoolMask na body, které specifikuje uzel 
Room.IsInsideRoom hodnotou True.
22.) Flatten: Tento uzel nám zruší sublisty, které byly vytvořeny uzlem List.Map (uzel č.21).
23.) List.UniqueItems: Tento uzel vytvoří nový seznam obsahující všechny jedinečné položky v daném seznamu, resp. zamezí tomu, aby se v daném seznamu vyskytovali místnosti více než jednou.

Výše zmíněné uzly spolu propojíme a přes zkratku Ctrl+g uložíme do jedné skupiny, kterou nazveme Seřazení místností dle trajektorie čáry



Poslední část algoritmu, kterou musíme zasadit do našeho grafu, je část, která nadefinuje formát číslování místností a daný výstup zaimplementuje do parametru Číslo. Algoritmus obsahuje tyto uzly:

24.) Count: Tento uzel vypočítává počet položek v daném seznamu. Uzel propojíme s uzlem Sequence.
25.) Code Block: Do uzlu zapíšeme dvě numerické hodnoty, a to 101; klikneme na Enter a zapíšeme druhou hodnotu 1;. Obě hodnoty vytvoří automaticky dva výstupy, které propojíme s uzlem Sequence v následujícím pořadí: Hodnotu 101 propojíme se vstupem Start a hodnotu 1  propojíme s hodnotou Step
26.) Sequence: Tento uzel vytvoří posloupnost čísel. Dle propojení s uzlem Code Block by měl vytvořit posloupnost v daném formátu 101, 102, 103, ... Počet čísel v posloupnosti specifikuje uzel Count. Uzel následně propojíme s uzlem String from Object.
27.) String from Object: Převede seznam hodnot na formát, který lze načíst do uzlu Element.SetParameterByName.
28.) Code Block: Do uzlu zapíšeme hodnotu Číslo. Jelikož se jedná o textovou hodnotu, je nutné, aby byla v uvozovkách. Daný uzel propojíme s uzlem Element.SetParameterByName do jeho hodnoty vstupu parameterName.
29.) Element.SetParameterByName: Tento uzel umožní zapsat získané hodnoty z posloupnosti, které zapíše do parametru místností Číslo.

Algoritmus by měl mít tuto podobu:


Propojený algoritmus by měl mít tuto podobu:


Algoritmus funguje automaticky, tzn. že lze spouštět napřímo z funkce Dynamo Player. Tato funkce se vám zpřístupní až po instalaci nejnovějšího updatu na Revit 2017.1

Po aplikování algoritmu na daný půdorys by se čísla místnosti měla přečíslovat podle trajektorie dané křivky.



Videoukázka:


Komentáře