Seznam je kolekce prvků nebo položek. Vezměte si například trs banánů. Každý banán je položka v seznamu (nebo v trsu). Je jednodušší sebrat celý trs banánů, než brát každý banán jednotlivě, a to samé platí pro seskupení prvků podle parametrických vztahů v datové struktuře.
Autor fotografie: Augustus Binu.
Při nákupu potravin naskládáme všechny zakoupené položky do tašky. Tato taška je také seznamem. Pokud chceme vyrobit banánový chléb, potřebujeme 3 trsy banánů (chceme vyrobit hodně banánového chleba). Taška představuje seznam trsů banánů a každý trs představuje seznam banánů. Taška je seznam seznamů (dvourozměrný) a trs banánů je seznam (jednorozměrný).
V aplikaci Dynamo jsou data seznamu seřazena a první položka v každém seznamu má index „0“. Níže rozebereme způsob, jak v aplikaci Dynamo definovat seznamy a jak spolu více seznamů vzájemně souvisí.
Jedna věc, která se může zdát podivnou, je, že první index seznamu je vždy 0, nikoli 1. Čili pokud je řeč o první položce seznamu, ve skutečnosti máme na mysli položku s indexem 0.
Pokud byste například měli spočítat prsty na pravé ruce, existuje šance, že byste napočítali od 1 do 5. Pokud byste však vložili prsty do seznamu, aplikace Dynamo by jim přiřadila index 0 až 4. Ačkoli se toto může zdát začátečníkům v programování velmi zvláštní, nulové indexy jsou ve většině výpočetních systémů běžnou praxí.
Všimněte si, že v seznamu stále máme 5 položek; je to proto, že seznam používá systém počítání od nuly. A položky uložené v seznamu nemusí být jen čísla. Mohou to být položky jakéhokoli datového typu, který aplikace Dynamo podporuje, například body, křivky, povrchy, rodiny atd.
a. Index
b. Bod
c. Položka
Nejjednodušším způsobem, jak se je možné se dívat na datový typ uložený v seznamu je nejčastěji propojení uzlu Watch s výstupem jiného uzlu. Ve výchozím nastavení uzel Watch automaticky zobrazí všechny indexy na levé straně seznamu a data zobrazí vpravo.
Tyto indexy jsou velice důležitým prvkem při práci se seznamy.
Vstupy a výstupy náležející k seznamům se liší podle toho, jaký uzel aplikace Dynamo se použije. Jako příklad použijte seznam 5 bodů a připojte tento výstup ke dvěma různým uzlům aplikace Dynamo: PolyCurve.ByPoints a Circle.ByCenterPointRadius:
Vstup points uzlu PolyCurve.ByPoints hledá strukturu „Point[]“. Tato struktura představuje seznam bodů.
Výstup uzlu PolyCurve.ByPoints je samostatný objekt PolyCurve vytvořený ze seznamu pěti bodů.
Vstup centerPoint uzlu Circle.ByCenterPointRadius žádá o objekt „Point“.
Výstup uzlu Circle.ByCenterPointRadius je seznam pěti kružnic, jejichž středy odpovídají původnímu seznamu bodů.
Vstupní data pro uzly PolyCurve.ByPoints a Circle.ByCenterPointRadius jsou stejná, uzel PolyCurve.ByPoints však předává jeden objekt PolyCurve, zatímco uzel Circle.ByCenterPointRadius předává 5 kružnic se středy v každém bodu. Je to intuitivní: Objekt PolyCurve je vykreslen jako křivka spojující 5 bodů, zatímco kružnice v každém bodu vytvářejí jinou kružnici. Co se tedy děje s daty?
Po přejetí umístění kurzoru nad vstupem points uzlu Polycurve.ByPoints zjistíte, že vstup hledá strukturu „Point[]“. Všimněte si závorek na konci. To představuje seznam bodů a k vytvoření objektu PolyCurve je třeba na vstupu seznam pro každý objekt PolyCurve. Tento uzel proto zhušťuje každý seznam do jednoho objektu PolyCurve.
Na druhou stranu vstup centerPoint uzlu Circle.ByCenterPointRadius žádá objekt „Point“. Tento uzel hledá jeden bod jako položku k definování středu kružnice. Proto ze vstupních dat vznikne pět kružnic. Rozlišování těchto vstupů v aplikaci Dynamo vám pomůže pochopit, jak uzly při zpracování dat fungují.
Porovnávání dat je problém bez čistého řešení. Dochází k němu, pokud má uzel přístup různě velkým vstupům. Změna algoritmu porovnávání dat může vést k naprosto odlišným výsledkům.
Představte si uzel, který tvoří segmenty úseček mezi body (Line.ByStartPointEndPoint). Bude mít dva vstupní parametry, které oba předávají souřadnice bodů:
Nejjednodušším způsobem je spojovat vstupy jedna ku jedné, dokud jeden z datových proudů nedojde na konec. Tomuto se říká algoritmus „Nejkratší seznam“. Jedná se o výchozí chování uzlů aplikace Dynamo:
Algoritmus „Nejdelší seznam“ připojuje vstupy a opakovaně využívá prvky tak dlouho, dokud všechny datové proudy nedojdou na konec:
Metoda „Kartézský součin“ provede všechna možná připojení:
Jak vidíte, existují různé způsoby kreslení čar mezi těmito množinami bodů. Možnosti vázání naleznete po kliknutí pravým tlačítkem na střed uzlu a výběru nabídky „Vázání“.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Pomocí tohoto základního souboru znázorníme níže operace vázání tím, že definujeme nejkratší seznam, nejdelší seznam a kartézský součin.
U uzlu Point.ByCoordinates se změní vázání, ale nic jiného se u grafu výše nezmění.
Pokud jako možnost vázání vyberete nejkratší seznam (což je také výchozí možnost), získáte základní diagonální čáru složenou z pěti bodů. Pět bodů je délka kratšího seznamu, takže vázání nejkratšího seznamu se zastaví, jakmile dorazí na konec jednoho ze seznamů.
Změnou vázání na nejdelší seznam získáte diagonální čáru, která se vertikálně rozšíří. Poslední položka v seznamu 5 položek bude opakována tak dlouho, dokud nebude dosaženo délky delšího seznamu, což je stejné chování jako metoda koncepčního diagramu.
Změnou vázání na Kartézský součin získáte všechny kombinace mezi všemi seznamy, což vytvoří osnovu bodů o rozměrech 5x10. Jedná se o datovou strukturu ekvivalentní ke kartézskému součinu, jak je ukázáno v koncepčním diagramu výše, až na to, že data jsou nyní seznamy seznamů. Pokud připojíme objekt PolyCurve, uvidíme, že každý seznam je definovaný hodnotou X, což znamená, že máme řadu vertikálních čar.
V seznamech lze uspořádat data. V operačním systému počítače existují soubory a složky. V aplikaci Dynamo se jim říká položky a seznamy. Podobně jako v operačním systému, data je možné vytvářet, upravovat a dotazovat mnoha způsoby. Tato kapitola popisuje správu seznamů v aplikaci Dynamo.
Teď, když jsme stanovili, co je to seznam, pojďme si promluvit o operacích, které s ním můžeme provádět. Představte si seznam jako balíček karet. Seznam je balíček a každá karta představuje položku.
Autor fotografie: Christian Gidlöf
Jaké dotazy ze seznamu vytvoříme? Tím získáte přístup k existujícím vlastnostem.
Počet karet v balíčku? 52.
Počet barev? 4.
Materiál? Papír.
Délka? 3.5" nebo 89 mm.
Šířka? 2.5" nebo 64 mm.
Jaké akce můžeme se seznamem provést? Tím se změní seznam podle dané operace.
Můžeme zamíchat balíček.
Můžeme ho seřadit podle hodnot.
Můžeme ho seřadit podle barev.
Můžeme balíček rozdělit.
Můžeme balíček rozdělit rozdáním karet.
Můžeme z balíčku vybrat konkrétní kartu.
Všechny výše uvedené operace mají analogické uzly aplikace Dynamo pro práci se seznamy obecných dat. Níže uvedené lekce ukážou některé základní operace, které můžeme provádět na seznamech.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Obrázek níže je základní graf, ve kterém nakreslíme čáry mezi dvěma kružnicemi, které představují základní operace se seznamy. Prozkoumáme, jak spravovat data v seznamu a jak prezentovat vizuální výsledky pomocí akcí v seznamu níže.
Začněte uzlem Code Block s hodnotou
500;
.Propojte jej se vstupem x uzlu Point.ByCoordinates.
Uzel z předchozího kroku spojte se vstupem origin uzlu Plane.ByOriginNormal.
Pomocí uzlu Circle.ByPlaneRadius spojte uzel z předchozího kroku se vstupem plane.
Pomocí uzlu Code Block určete hodnotu
50;
pro vstup radius. Toto je první kruh, který vytvoříme.Pomocí uzlu Geometry.Translate posuňte kružnici o 100 jednotek ve směru osy Z.
Pomocí uzlu Code Block definujte rozsah deseti čísel mezi 0 a 1 s tímto řádkem kódu:
0..1..#10;
Blok kódu z předchozího kroku propojte se vstupem param dvou uzlů Curve.PointAtParameter. Propojte uzel Circle.ByPlaneRadius se vstupem curve horního uzlu a uzel Geometry.Translate se vstupem curve dolního uzlu.
Pomocí uzlu Line.ByStartPointEndPoint spojte dva uzly Curve.PointAtParameter.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Uzel List.Count je jednoduchý: spočítá počet hodnot v seznamu a vrátí výsledné číslo. Tento uzel je při práci se seznamy seznamů složitější, ale to si předvedeme v následujících částech.
Uzel **List.Count ****** vrací počet řádků v uzlu Line.ByStartPointEndPoint. V tomto případě je to hodnota 10, která souhlasí s počtem bodů vytvořených z původního uzlu Code Block.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
List.GetItemAtIndex je základní způsob, jak dotazovat položku v seznamu.
Nejprve kliknutím pravým tlačítkem myši na uzel Line.ByStartPointEndPoint vypněte jeho náhled.
Pomocí uzlu List.GetItemAtIndex vybereme index 0 nebo první položku v seznamu řádků.
Chcete-li pomocí uzlu List.GetItemAtIndex vybrat jinou položku, změňte hodnotu posuvníku v rozmezí od 0 do 9.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Možnost List.Reverse obrátí pořadí všech položek v seznamu.
Chcete-li správně zobrazit obrácený seznam čar, vytvořte více čar změnou uzlu Code Block na
0..1..#50;
.Duplikujte uzel Line.ByStartPointEndPoint, vložte uzel List.Reverse mezi uzel Curve.PointAtParameter a druhý uzel Line.ByStartPointEndPoint.
Pomocí uzlů Watch3D zobrazte náhled dvou různých výsledků. První zobrazí výsledek bez obráceného seznamu. Čáry se připojují vertikálně k sousedním bodům. Obrácený seznam však spojí všechny body v opačném pořadí v druhém seznamu.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
List.ShiftIndices je dobrý nástroj ke tvorbě zkroucení, šroubovicových vzorů nebo jiných podobných manipulací s daty. Tento uzel přemístí položky v seznamu do daného počtu indexů.
Stejným postupem jako při otáčení seznamu připojte uzel List.ShiftIndices k uzlu Curve.PointAtParameter a Line.ByStartPointEndPoint.
Pomocí uzlu Code Block s hodnotou 1 posuňte seznam o jeden index.
Všimněte si, že změna je jemná, ale všechny čáry v dolním uzlu Watch3D se posunuly o jeden index při připojení k druhé sadě bodů.
Pokud například změníme uzel Code Block na větší hodnotu, například 30, všimneme si významného rozdílu mezi příčnými čarami. V tomto případě funguje posun jako čočka kamery, což vytváří v původní válcové formě otočení.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Uzel List.FilterByBooleanMask odebere určité položky podle seznamu logických hodnot nebo podle hodnot true nebo false.
Aby bylo možné vytvořit seznam hodnot true nebo false, je třeba ještě trochu pracovat...
Pomocí uzlu Code Block definujte výraz pomocí této syntaxe:
0..List.Count(list);
. Připojte uzel Curve.PointAtParameter ke vstupu list. Toto nastavení projdeme více v kapitole bloku kódu, ale v tomto případě nám řádek kódu poskytuje seznam reprezentující každý index uzlu Curve.PointAtParameter.Pomocí uzlu %** (modulo)** spojte výstup uzlu _Code Block_se vstupem x a hodnotu 4 se vstupem y. Tak získáme zbytek po dělení seznamu indexů 4. Modulo je velmi užitečné pro vytváření vzorů. Všechny hodnoty budou možné zbytky po dělení 4: 0, 1, 2, 3.
Z uzlu %** (modulo)** víme, že hodnota 0 znamená, že index je dělitelný 4 (0, 4, 8 atd.). Pomocí uzlu == můžeme testovat dělitelnost porovnáním s hodnotou 0.
Uzel Watch zobrazuje pouze toto: máme vzor s hodnotou true/false, který je následující: true, false, false, false....
Pomocí tohoto vzoru true/false připojte vstupní hodnotu masky dvou uzlů List.FilterByBooleanMask.
Spojte uzel Curve.PointAtParameter s každým vstupem seznamu pro List.FilterByBooleanMask.
Výstup Filter.ByBooleanMask čte hodnoty in a out. In představuje hodnoty, které měly hodnotu masky true, zatímco out představuje hodnoty, které měly hodnotu false. Zadáním výstupů in do vstupů startPoint a endPoint uzlu Line.ByStartPointEndPoint jsme vytvořili filtrovaný seznam čar.
Uzel Watch3D ukazuje, že máme méně čar než bodů. Vybrali jsme pouze 25 % uzlů filtrováním pouze hodnot true.
Postoupíme dále ve složitosti a přidáme do hierarchie ještě více vrstev. Datovou strukturu je možné rozšířit daleko za hranice dvourozměrného seznamu seznamů. Vzhledem k tomu, že seznamy jsou v aplikaci Dynamo položky v nich samotných a jich samotných, je možné vytvořit data s tolika rozměry kolik je jen možné.
Analogie, se kterou budeme pracovat, je založena na ruských matrjoškách. Každý seznam je možné chápat jako kontejner obsahující více položek. Každý seznam má své vlastnosti a také je chápán jako svůj vlastní objekt.
Sada ruských matrjošek (autor fotografie: Zeta) je analogií pro n-rozměrné seznamy. Každá vrstva představuje seznam a každý seznam obsahuje položky. V případě aplikace Dynamo může mít každý kontejner uvnitř více kontejnerů (představujících položky každého seznamu).
N-rozměrné seznamy se těžko vysvětlují vizuálně, v této kapitole jsme však připravili několik cvičení, která se zaměřují na práci se seznamy přesahujícími dva rozměry.
Mapování je pravděpodobně nejsložitější součástí správy dat v aplikaci Dynamo a je obzvláště důležité při práci se složitými hierarchiemi seznamů. Pomocí řady cvičení níže si ukážeme, kdy je třeba použít mapování a kombinace, když se data stanou vícerozměrnými.
Předběžná představení uzlů List.Map a List.Combine najdete v předchozí části. V posledním cvičení níže použijeme tyto uzly na složitou datovou strukturu.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Toto cvičení je první v řadě tří, které se zaměřuje na členění importované geometrie. Každá část této řady cvičení zvýší složitost datové struktury.
Začněte souborem .sat ve složce souborů cvičení. Tento soubor můžete načíst pomocí uzlu File Path.
Pomocí uzlu Geometry.ImportFromSAT se geometrie importuje do náhledu aplikace Dynamo jako dva povrchy.
V tomto cvičení se pracuje z důvodu zjednodušení pouze s jedním povrchem.
Výběrem indexu 1 uchopte povrch. Index vyberete pomocí uzlu List.GetItemAtIndex.
Vypněte náhled geometrie v náhledu uzlu Geometry.ImportFromSAT.
Dalším krokem je rozdělení povrchu na osnovu bodů.
1. Pomocí bloku kódu vložte tyto dva řádky kódu:
0..1..#10;
0..1..#5;
.2. Připojte dvě hodnoty bloku kódu ke vstupům u a v uzlu Surface.PointAtParameter. Změňte vázání tohoto uzlu na „Vektorový součin“.
3. Výstup odhalí datovou strukturu, která je viditelná také v náhledu aplikace Dynamo.
Dále pomocí bodů z posledního kroku vygenerujte deset křivek podél povrchu.
Chcete-li se podívat, jak je datová struktura uspořádána, připojte objekt NurbsCurve.ByPoints k výstupu uzlu Surface.PointAtParameter.
Nyní můžete vypnout náhled z uzlu List.GetItemAtIndex, abyste získali jasnější výsledek.
Základní uzel List.Transpose převrátí sloupce a řádky seznamu seznamů.
Pokud se výstup uzlu List.Transpose připojí k uzlu NurbsCurve.ByPoints, přes povrch bude nyní horizontálně umístěno pět křivek.
Chcete-li dosáhnout stejného výsledku jako na obrázku, můžete v předchozím kroku vypnout náhled z uzlu NurbsCurve.ByPoints.
Zvýšíme složitost. Řekněme, že chcete provést operaci s křivkami vytvořenými v předchozím cvičení. Možná bude užitečné tyto křivky spojit s jiným povrchem a šablonovat mezi nimi. Toto vyžaduje věnování větší pozornosti datové struktuře, ale příslušná logika je stejná.
Začněte krokem z předchozího cvičení, který izoluje horní povrch importované geometrie pomocí uzlu List.GetItemAtIndex.
Pomocí uzlu Surface.Offset odsaďte povrch o hodnotu 10.
Stejným způsobem jako v předchozím cvičení definujte blok kódu s těmito dvěma řádky kódu:
0..1..#10;
0..1..#5;
.Tyto výstupy připojte ke dvěma uzlům Surface.PointAtParameter, z nichž každý má vázání nastaveno na Vektorový součin. Jeden z těchto uzlů je připojen k původnímu povrchu, zatímco druhý je připojen k odsazenému povrchu.
Vypněte náhled těchto povrchů.
Stejně jako v předchozím cvičení připojte výstupy ke dvěma uzlům NurbsCurve.ByPoints. Ve výsledku se zobrazí křivky odpovídající dvěma povrchům.
Pomocí uzlu List.Create je možné kombinovat dvě sady křivek do jednoho seznamu seznamů.
Všimněte si, že z výstupu máme dva seznamy každý po deseti položkách, přičemž každý z nich představuje připojenou sadu křivek nurbs.
Provedením operace uzlu Surface.ByLoft je možné vizuálně pochopit tuto datovou strukturu. Uzel šablonuje všechny křivky v každém dílčím seznamu.
Vypněte náhled z uzlu Surface.ByLoft v předchozím kroku.
Pokud použijete uzel List.Transpose, nezapomeňte, že se překlopí všechny sloupce a řádky. Tento uzel převede dva seznamy deseti křivek do deseti seznamů dvou křivek. Nyní je každá křivka nurbs vztažena k sousedící křivce na druhém povrchu.
Pomocí uzlu Surface.ByLoft jste vytvořili žebrovanou konstrukci.
Dále si ukážeme alternativní postup k dosažení tohoto výsledku.
Než začneme, vypněte náhled uzlu Surface.ByLoft v předchozím kroku, abyste se vyhnuli nejasnostem.
Alternativou uzlu List.Transpose je List.Combine. Tento uzel ovládá „kombinátor“ v každém dílčím seznamu.
V tomto případě použijeme uzel List.Create jako „kombinátor“, který vytvoří seznam jednotlivých položek v dílčích seznamech.
Pomocí uzlu Surface.ByLoft získáte stejné povrchy jako v předchozím kroku. Transpozice je v tomto případě jednodušší, pokud však bude datová struktura ještě složitější, uzel List.Combine je spolehlivější.
Pokud bychom v jednom z předchozích kroků chtěli přepnout orientaci křivek žebrované konstrukce, před připojením k uzlu NurbsCurve.ByPoints bychom použili uzel List.Transpose. Ten převrátí sloupce a řádky a vytvoří 5 vodorovných žeber.
Je čas postoupit o krok dál. V tomto cvičení budete pracovat s oběma importovanými povrchy a vytvoříte složitou datovou hierarchii. Stále je však naším cílem dokončení této operace pomocí stejné příslušné logiky.
Začněte u importovaného souboru z předchozího cvičení.
Stejně jako v předchozím cvičení přidejte pomocí uzlu Surface.Offset odsazení o hodnotu 10.
Všimněte si, že na výstupu se vytvořily dva povrchy s odsazeným uzlem.
Stejným způsobem jako v předchozím cvičení definujte blok kódu s těmito dvěma řádky kódu:
0..1..#20;
0..1..#20;
.Tyto výstupy připojte ke dvěma uzlům Surface.PointAtParameter, z nichž každý má vázání nastaveno na „Vektorový součin“. Jeden z těchto uzlů je připojen k původním povrchům, zatímco druhý je připojen k odsazeným povrchům.
Stejně jako v předchozím cvičení připojte výstupy ke dvěma uzlům NurbsCurve.ByPoints.
Při pohledu na výstup uzlu NurbsCurve.ByPoints si všimněte, že se jedná o seznam dvou seznamů, což je složitější struktura než v předchozím cvičení. Data jsou kategorizována podle základních povrchů, čili do strukturovaných dat byla přidána další vrstva.
Všimněte si, že v uzlu Surface.PointAtParameter se již situace stane složitější. V tomto případě máme seznam seznamů seznamů.
Než budeme pokračovat, vypněte náhled existujících povrchů.
Pomocí uzlu List.Create sloučíme křivky nurbs do jedné datové struktury, čímž vytvoříte seznam seznamů seznamů.
Připojením uzlu Surface.ByLoft získáte verzi původních povrchů, protože každý zůstane ve svém vlastním seznamu vytvořeném z původní datové struktury.
V předchozím cvičení bylo možné vytvořit žebrovanou konstrukci pomocí uzlu List.Transpose. Toto zde nebude fungovat. Transpozice by měla být použita na dvourozměrný seznam a vzhledem k tomu, že máme trojrozměrný seznam, operace „převrácení sloupců a řádků“ nebude fungovat tak snadno. Nezapomeňte, že seznamy jsou objekty, čili uzel List.Transpose převrátí naše seznamy bez dílčích seznamů, ale nepřevrátí křivky nurbs o jeden seznam níže v hierarchii.
Zde bude lépe fungovat uzel List.Combine. Když dojde na složitější datové struktury, chceme použít uzly List.Map a List.Combine.
Pokud použijeme uzel List.Create jako „kombinátor“, vytvoříme datovou strukturu, která nám bude lépe fungovat.
Datovou strukturu o jeden krok níže v hierarchii je stále třeba transponovat. Toto provedete pomocí uzlu List.Map. Funguje jako uzel List.Combine, jen má jeden vstupní seznam místo dvou a více.
Funkce použitá na uzel List.Map je List.Transpose, která převrátí sloupce a řádky dílčích seznamů v hlavním seznamu.
Nakonec můžete šablonovat křivky nurbs společně s vhodnou hierarchií dat. Tím vznikne žebrovaná konstrukce.
Nyní přidáme do geometrie hloubku pomocí uzlu Surface.Thicken se vstupním nastavením, jak je znázorněno na obrázku.
Bylo by vhodné přidat do této struktury podkladový povrch. Přidejte tedy další uzel Surface.ByLoft a jako vstup použijte první výstup uzlu NurbsCurve.ByPoints ze staršího kroku.
Protože se náhled stává nepřehledným, vypněte náhled pro tyto uzly kliknutím pravým tlačítkem na každý z nich a zrušením zaškrtnutí políčka Náhled, abyste lépe viděli výsledek.
A zesílením těchto vybraných povrchů je dokončeno i členění.
Nejedná se zrovna o nejpohodlnější houpací křeslo, ale pracuje se u něj s mnoha daty.
V posledním kroku obrátíme směr žlábkovaných členů. V předchozím kroku jsme použili transpozici, tady uděláme něco podobného.
Vzhledem k tomu, že hierarchie má ještě další vrstvu, je třeba pomocí uzlu List.Map a funkce List.Tranpose změnit směr křivek nurbs.
Mohli bychom chtít zvýšit počet vzorků běhounu, což provedeme změnou bloku kódu na
0..1..#20;
0..1..#30;
.
První verze houpacího křesla byla štíhlá, čili druhý model nabízí robustní off-roadovou verzi usazení.
Do hierarchie bude nyní přidána další vrstva. Pokud vezmeme sadu karet z původního příkladu a vytvoříme krabici, která obsahuje více sad, krabice nyní představuje seznam sad a každá sada představuje seznam karet. Tomuto se říká seznam seznamů. Podívejte se na obrázek níže, představující analogii pro tuto část: na obrázku vidíme seznam sloupečků mincí a každý sloupeček obsahuje seznam mincí.
Jaké dotazy můžeme provádět u seznamu seznamů? Tím získáte přístup k existujícím vlastnostem.
Počet typů mincí? 2.
Hodnoty typu mincí? 0,01 a 0,25 USD.
Materiál čtvrťáků? 75 % měď a 25 % nikl.
Materiál centů? 97,5 % zinek a 2,5 % měď.
Jaké akce můžeme provádět u seznamu seznamů? Tímto se změní seznam seznamů podle dané operace.
Výběr konkrétního sloupku čtvrťáků nebo centů.
Výběr konkrétního čtvrťáku nebo centu.
Přeuspořádání sloupků čtvrťáků a centů
Sloučení sloupků dohromady.
I zde aplikace Dynamo obsahuje analogický uzel pro každou z výše uvedených operací. Vzhledem k tomu, že pracujeme s abstraktními daty a ne s fyzickými objekty, potřebujeme sadu pravidel, která řídí pohyb nahoru a dolů v hierarchii dat.
Při práci se seznamy seznamů jsou data vrstvená a složitá, díky tomu však nastává příležitost provést skvělé parametrické operace. Níže uvedené lekce podrobně rozebírají základy a popisují několik dalších operací.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Základní koncepce této části: aplikace Dynamo zpracovává seznamy jako objekty samy o sobě. Tato hierarchie shora dolů se vyvíjí s ohledem na objektově orientované programování. Místo výběru dílčích prvků pomocí příkazu, jako je List.GetItemAtIndex, vybere aplikace Dynamo tento index v hlavním seznamu v datové struktuře. A tato položka může být i dalším seznamem. Následuje rozbor pomocí vzorového obrázku:
Pomocí bloku kódu jsme definovali dva rozsahy:
0..2; 0..3;
.Tyto rozsahy jsou připojeny k uzlu Point.ByCoordinates s vázáním nastaveným na hodnotu „Vektorový součin“. Tím se vytvoří osnova bodů a také se na výstupu vrátí seznam seznamů.
Všimněte si, že uzel Watch předává 3 seznamy se 4 položkami v každém seznamu.
Při použití funkce List.GetItemAtIndex s indexem 0 aplikace Dynamo vybere první seznam a veškerý jeho obsah. Jiné programy mohou vybrat první položku každého seznamu v datové struktuře, aplikace Dynamo však při práci s daty využívá hierarchii shora dolů.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Metoda Flatten odebere všechny vrstvy dat z datové struktury. Toto je užitečné, pokud hierarchie dat nejsou pro vaši operaci podstatné, může to však představovat riziko, protože dojde k odebrání informací. Následující příklad znázorňuje výsledek vyrovnání seznamu dat.
Zadáním jednoho řádku kódu definujte rozsah v bloku kódu:
-250..-150..#4;
Připojením bloku kódu ke vstupu x a y uzlu Point.ByCoordinates nastavíme vázání na hodnotu „Vektorový součin“, abychom získali osnovu bodů.
Uzel Watch zobrazuje, že je k dispozici seznam seznamů.
Uzel PolyCurve.ByPoints bude odkazovat na každý seznam a vytvoří příslušný objekt polycurve. Všimněte si, že v náhledu aplikace Dynamo se v osnově nachází čtyři objekty polycurve představující jednotlivé řádky.
Vložením vyrovnání před uzel objektu polycurve byl vytvořen jeden seznam pro všechny body. Uzel PolyCurve.ByPoints odkazuje na seznam k vytvoření jedné křivky a vzhledem k tomu, že všechny body jsou v jednom seznamu, vznikne jeden klikatý objekt polycurve, který prochází celým seznamem bodů.
K dispozici jsou také možnosti k vyrovnání izolovaných vrstev dat. Pomocí uzlu List.Flatten můžete definovat nastavený počet vrstev dat, které mají být vyrovnány z horní části hierarchie. Jedná se o skutečně užitečný nástroj, pokud máte potíže se složitými datovými strukturami, které nejsou nezbytně důležité pro váš pracovní postup. Další možností je použít uzel vyrovnání jako funkci v uzlu List.Map. Další informace o uzlu List.Map naleznete níže.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Při parametrickém modelování se také někdy stane, že budete chtít upravit datovou strukturu existujícího seznamu. K tomuto účelu existuje také mnoho uzlů a Chop je tou nejzákladnější verzí. Pomocí uzlu Chop je možné rozdělit seznam na podseznamy s nastaveným počtem položek.
Příkaz Rozdělit rozdělí seznamy podle dané délky seznamu. V některých případech je příkaz Rozdělit opak příkazu Vyrovnat: místo odebrání datové struktury se přidají nové vrstvy. Toto je užitečný nástroj u geometrických operací, viz příklad níže.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Metoda List.Map/Combine použije funkci sady na vstupní seznam, ale o jeden krok níže v hierarchii. Kombinace jsou stejné jako u map, kromě toho, že mohou mít více vstupů odpovídajících zadání dané funkce.
V rámci rychlého úvodu si zopakujme uzel List.Count z předchozí části.
Uzel List.Count spočítá všechny položky v seznamu. Pomocí tohoto nástroje znázorníme, jak funguje metoda List.Map.
Vložte dva řádky kódu do bloku kódu:
-50..50..#Nx; -50..50..#Ny;
Blok kódu vytvoří po provedení zadání do tohoto kódu dva vstupy pro proměnné Nx a Ny.
Pomocí dvou celočíselných posuvníků definujte hodnoty Nx a Ny jejich připojením k bloku kódu.
Připojte každý řádek bloku kódu do příslušných vstupů X a Y uzlu Point.ByCoordinates. Klikněte pravým tlačítkem na uzel, vyberte položku „Vázání“ a vyberte položku „Vektorový součin“. Tím se vytvoří osnova bodů. Vzhledem k tomu, že jsme definovali rozsah od -50 do 50, bude se rozsah pohybovat ve výchozí osnově aplikace Dynamo.
Uzel Watch zobrazí vytvořené body. Všimněte si datové struktury. Vytvořili jsme seznam seznamů. Každý seznam představuje řádek bodů v osnově.
Připojte uzel List.Count k výstupu uzlu Watch z předchozího kroku.
Připojte uzel Watch k výstupu uzlu List.Count.
Všimněte si, že uzel List.Count vrací hodnotu 5. Jedná se o hodnotu rovnou proměnné "Nx", jak je definována v bloku kódu. Jak je to možné?
Nejprve uzel Point.ByCoordinates použije jako primární vstup pro tvorbu seznamů vstup „x“. Pokud má proměnná Nx hodnotu 5 a proměnná Ny hodnotu 3, vznikne seznam 5 seznamů a každý z těch seznamů bude mít 3 položky.
Vzhledem k tomu, že aplikace Dynamo zpracovává seznamy jako objekty samy o sobě, na hlavní seznam v hierarchii se použije uzel List.Count. Výsledkem je hodnota 5, nebo počet seznamů v hlavním seznamu.
Pomocí uzlu List.Map bude proveden krok dolů v hierarchii a na této úrovni se provede „funkce“.
Všimněte si, že uzel List.Count nemá žádný vstup. Používá se jako funkce, takže uzel List.Count se použije na každý jednotlivý seznam, o jeden krok níže v hierarchii. Prázdný vstup uzlu List.Count odpovídá zadání seznamu uzlu List.Map.
Výsledky metody List.Count nyní obsahují 5 položek, z nichž každá má hodnotu 3. Toto představuje délku každého dílčího seznamu.
V tomto cvičení použijeme funkci List.Combine a ukážeme si, jak ji lze použít k aplikaci funkce na samostatné seznamy objektů.
Začněte nastavením dvou seznamů bodů.
Pomocí uzlu Sequence vygenerujte 10 hodnot, každou s přírůstkem 10 kroků.
Výsledek připojte ke vstupu x uzlu Point.ByCoordinates. Tím se v aplikaci Dynamo vytvoří seznam bodů.
Přidejte do pracovního prostoru druhý uzel Point.ByCoordinates, použijte stejný výstup Sequence jako jeho vstup x, ale jako vstup y použijte uzel Integer Slider, který nastavte na hodnotu 31 (může to být libovolná hodnota, pokud se nepřekrývá s první sadou bodů), aby se obě sady bodů navzájem nepřekrývaly.
Dále pomocí uzlu List.Combine použijeme funkci na objekty ve 2 samostatných seznamech. V tomto případě se bude jednat o jednoduchou funkci kreslení čar.
Přidejte do pracovního prostoru uzel List.Combine a připojte 2 sady bodů jako jeho vstupy list0 a list1.
Jako vstupní funkci uzlu List.Combine použijte uzel Line.ByStartPointEndPoint.
Po dokončení jsou 2 sady bodů komprimovány/spárovány dohromady pomocí funkce Line.ByStartPointEndPoint a vrátí 10 řádků v aplikaci Dynamo.
Další příklad použití uzlu List.Combine naleznete ve cvičení v části N-rozměrné seznamy.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Funkce List@Level, která má přednost před funkcí List.Map, umožňuje přímo na vstupním portu uzlu vybrat úroveň seznamu, se kterou chcete pracovat. Tuto funkci je možné použít na libovolný příchozí vstup uzlu a umožní přístup k úrovním seznamů rychleji a snadněji než jiné metody. Stačí jen uzlu určit úroveň seznamu, kterou chcete použít jako vstup, a uzel pak provede vše ostatní.
V tomto cvičení použijeme funkci List@Level k vyčlenění určité úrovně dat.
Začneme jednoduchou 3D osnovou bodů.
Vzhledem k tomu, že je osnova vytvořena pomocí rozsahu hodnot X, Y a Z, víme, že data jsou strukturována do tří vrstev: seznam X, seznam Y a seznam Z.
Tyto vrstvy existují v různých úrovních. Úrovně jsou značeny v dolní části bubliny náhledu. Sloupce úrovní seznamu odpovídají výše uvedeným datům seznamu, aby se snadněji rozpoznalo, na které úrovni se pracuje.
Úrovně seznamu jsou uspořádány v obráceném pořadí, čili data nejnižší úrovně jsou vždy v úrovni „L1“. Toto vám pomůže zajistit, aby grafy fungovaly podle plánu, i když se něco v předcházejícím dění změní.
Chcete-li použít funkci List@Level, klikněte na tlačítko „>“. V této nabídce se zobrazí dvě zaškrtávací políčka.
Použít úrovně – Povolí funkci List@Level. Po kliknutí na tuto možnost budete moci kliknout na požadovanou úroveň seznamu a vybrat vstupní úrovně seznamu, které má uzel použít. Pomocí této nabídky můžete rychle vyzkoušet různé možnosti úrovně kliknutím nahoru nebo dolů.
Zachovat strukturu seznamu – pokud je tato možnost povolena, bude možné zachovat strukturu úrovně tohoto vstupu. Někdy můžete mít data záměrně uspořádaná do dílčích seznamů. Zaškrtnutím této možnosti můžete organizaci seznamu ponechat nedotčenou a neztratit žádné informace.
Pomocí naší jednoduché 3D osnovy je možné získat přístup a vizualizovat strukturu seznamu přepnutím mezi úrovněmi seznamu. Každá kombinace úrovně seznamu a indexu vrátí jinou sadu bodů z naší původní 3D sady.
Možnost „@L2“ v aplikaci DesignScript umožňuje vybrat pouze seznam na úrovni 2. Seznam na úrovni 2 s indexem 0 obsahuje pouze první sadu bodů Y, které vracejí pouze osnovu XZ.
Pokud se filtr úrovně změní na možnost „L1“, je možné zobrazit vše v první úrovni seznamu. Seznam na úrovni 1 s indexem 0 obsahuje všechny 3D body ve vyrovnaném seznamu.
Pokud se pokusíte o totéž u možnosti „L3“, zobrazí se pouze body třetí úrovně seznamu. Seznam na úrovni 2 s indexem 0 obsahuje pouze první sadu bodů Z, které vracejí pouze osnovu XY.
Pokud se pokusíte o totéž u možnosti „L4“, zobrazí se pouze body třetí úrovně seznamu. Seznam na úrovni 4 s indexem 0 obsahuje pouze první sadu bodů X, které vracejí pouze osnovu YZ.
Ačkoliv tento konkrétní příklad je také možné vytvořit pomocí metody List.Map, metoda List@Level výrazně zjednodušuje interakci a usnadňuje přístup k datům uzlu. Níže naleznete porovnání metod List.Map a List@Level:
Ačkoliv obě metody nabízí přístup ke stejným bodům, metoda List@Level umožňuje snadné přepínání mezi hladinami dat v rámci jednoho uzlu.
K získání přístupu k osnově bodů pomocí metody List.Map je kromě uzlu List.Map potřeba i uzel List.GetItemAtIndex. Pro každou úroveň seznamu, u které pokročíme na nižší úroveň, je třeba použít další uzel List.Map. Podle složitosti seznamů může být vyžadováno přidání značného množství uzlů List.Map do grafu, abyste získali přístup ke správné úrovni informací.
V tomto příkladu uzel List.GetItemAtIndex s uzlem List.Map vrátí stejnou sadu bodů se stejnou strukturou seznamu, jako když je v uzlu List.GetItemAtIndex vybrána možnost „@L3“.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Transpozice je základní funkcí při práci se seznamy seznamů. Stejně jako v tabulkových programech i zde transpozice převrátí sloupce a řádky datové struktury. Níže je znázorněn příklad se základní maticí a v následující části je znázorněno, jak je možné pomocí transpozice tvořit geometrické vztahy.
Nyní odstraňte uzly List.Count z předchozího cvičení, přesuňte se ke geometrii a prohlédněte si, jak jsou data strukturována.
Připojte uzel PolyCurve.ByPoints k výstupu uzlu Watch z uzlu Point.ByCoordinates.
Výstup zobrazí 5 objektů polycurve a v náhledu aplikace Dynamo se zobrazí tyto objekty křivek. Uzel aplikace Dynamo hledá seznam bodů (nebo seznam seznamů bodů v tomto případě) a vytvoří z nich jeden objekt PolyCurve. Každý seznam byl v podstatě převeden na křivku v datové struktuře.
Uzel List.Transpose zamění všechny položky se všemi seznamy v seznamu seznamů. Zní to složitě, ale je to stejná logika jako transpozice v aplikaci Microsoft Excel: záměna sloupců a řádků v datové struktuře.
Všimněte si abstraktního výsledku: transpozice změnila strukturu seznamu z 5 seznamů o 3 položkách na 3 seznamy o 5 položkách.
Všimněte si geometrického výsledku: pomocí uzlu PolyCurve.ByPoints získáte 3 objekty polycurve v kolmém směru od původních křivek.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Toto cvičení využívá část logiky stanovené v předchozím cvičení k úpravě povrchu. Cíl je intuitivní, nyní se však více zapojí navigace v datové struktuře. Chceme rozdělit povrch přesunem řídicího bodu.
Začněte s výše uvedeným řetězcem uzlů. Vytváříme základní povrch, který pokrývá výchozí osnovu aplikace Dynamo.
Pomocí bloku kódu vložte tyto dva řádky kódu a připojte je ke vstupům u a v uzlu Surface.PointAtParameter:
-50..50..#3;
-50..50..#5;
Zkontrolujte, zda je vázání uzlu Surface.PointAtParameter nastaveno na možnost „Vektorový součin“.
Uzel Watch zobrazuje, že byl vrácen seznam 3 seznamů, z nichž každý obsahuje 5 položek.
V tomto kroku je třeba dotazovat středový bod v osnově, kterou jste vytvořili. Chcete-li to provést, vyberte prostřední bod prostředního seznamu. To dává smysl, že?
Chcete-li potvrdit, že se jedná o správný bod, můžete toho dosáhnout kliknutím na položky uzlu Watch.
Pomocí bloku kódu zapište základní řádek kódu k dotazování se na seznam seznamů:
points[1][2];
Pomocí funkce Geometry.Translate přesuňte vybraný bod nahoru ve směru osy Z o 20 jednotek.
Nyní vybereme také prostřední řádek bodů u uzlu List.GetItemAtIndex. Poznámka: Podobně jako v předchozím kroku můžete také zadat dotaz na seznam pomocí bloku kódu s řádkem
points[1];
.
Zatím jsme se úspěšně dotázali na střed a posunuli jej nahoru. Nyní je potřeba vložit tento přesunutý bod zpět do původní datové struktury.
Nejprve je třeba nahradit položku seznamu, kterou jsme izolovali v předchozím kroku.
Pomocí metody List.ReplaceItemAtIndex nahraďte prostřední položku a použijte index 2 s náhradní položkou připojenou k přesunutému bodu (Geometry.Translate).
Výstup zobrazí, že přesunutý bod byl vložen přes vstup do prostřední položky seznamu.
Nyní, když byl seznam upraven, je třeba vložit tento seznam zpět do původní datové struktury: seznamu seznamů.
Podle stejné logiky nahraďte pomocí metody List.ReplaceItemAtIndex prostřední seznam upraveným seznamem.
Všimněte si, že bloky kódu definující index těchto dvou uzlů jsou 1 a 2, což odpovídá původnímu dotazu z bloku kódu (points[1][2]).
Po výběru seznamu na indexu 1 se v náhledu aplikace Dynamo zvýrazní datová struktura. Přesunutý bod tak byl úspěšně sloučen s původní datovou strukturou.
Z této sady bodů je možné vytvořit povrch mnoha způsoby. V tomto případě se vytvoří povrch šablonováním křivek dohromady.
Vytvořte uzel NurbsCurve.ByPoints a připojením nové datové struktury vytvořte tři křivky nurbs.
Připojte uzel Surface.ByLoft k výstupu uzlu NurbsCurve.ByPoints. Nyní máme upravený povrch. Je možné změnit původní hodnotu Z geometrie. Proveďte posun a sledujte, jak se geometrie aktualizuje!
Fotografii pořídil uživatel .
Poznámka: Toto cvičení bylo vytvořeno pomocí předchozí verze aplikace Dynamo. Většina funkčnosti metody List.Map byla vyřešena přidáním funkce List@Level . Další informace naleznete v části níže.
Poznámka: Toto cvičení bylo vytvořeno pomocí předchozí verze aplikace Dynamo. Většina funkčnosti metody List.Combine byla vyřešena přidáním funkce List@Level. Další informace naleznete v části níže.
Blok kódu využívá znaky „[]“ jako zkratku k definování seznamu. Jedná se o mnohem rychlejší a plynulejší způsob tvorby seznamů než uzel List.Create. Blok kódu je podrobněji popsán v části . V níže uvedeném obrázku můžete vidět, jak je možné definovat seznam s více výrazy pomocí bloku kódu.
Blok kódu používá znaky „[]“ jako rychlý a snadný způsob výběru konkrétních položek ze složité datové struktury. Bloky kódu jsou podrobněji popsány v části . V níže uvedeném obrázku můžete vidět, jak je možné dotazovat seznam s více datovými typy pomocí bloku kódu.