Data jsou součástí našich programů. Prochází dráty a zadávají vstupy pro uzly, kde se zpracují do nové formy výstupních dat. Pojďme si prohlédnout definici dat, jak jsou strukturována a začít je používat v aplikaci Dynamo.
Data jsou souborem hodnot kvalitativních nebo kvantitativních proměnných. Nejjednodušší forma dat jsou například čísla jako 0
, 3.14
nebo 17
. Data však mohou být také různých typů: proměnná představující měnící se čísla (height
), znaky (myName
); geometrii (Circle
) nebo seznam datových položek (1,2,3,5,8,13,...
).
V aplikaci Dynamo přidáváme data do vstupních portů uzlů – můžeme mít data bez akcí, ale potřebujeme data ke zpracování akcí, které reprezentují uzly. Pokud do pracovního prostoru přidáme uzel, pokud nebude mít k dispozici žádný vstup, bude výsledkem funkce, nikoli výsledek akce.
Jednoduchá data
Data a akce (Uzel A) se úspěšně spustí
Akce (Uzel A) bez zadání dat vrátí obecnou funkci
Dávejte pozor na nulové hodnoty. Typ 'null'
představuje nedostatek dat. I když je to abstraktní koncept, pravděpodobně se k němu dostanete při práci s vizuálním programováním. Pokud akce nevytvoří platný výsledek, uzel vrátí hodnotu null.
Testování nulových hodnot a odstraňování nulových hodnot z datové struktury je klíčovou součástí vytváření robustních programů.
Při vizuálním programování můžeme velmi rychle vygenerovat velké množství dat a vyžadovat způsob správy jejich hierarchie. Jedná se o úlohu datových struktur, organizačních schémat, ve kterých ukládáme data. Specifika datových struktur a způsob jejich použití se liší mezi jednotlivými programovacími jazyky.
V aplikaci Dynamo přidáme hierarchii k datům prostřednictvím seznamů. To prozkoumáme v pozdějších kapitolách, ale začneme jednoduše:
Seznam představuje kolekci položek umístěných do jedné struktury dat:
Mám pět prstů (položek) na ruce (seznam).
Deset domů (položek) je na mojí ulici (seznam).
Uzel Number Sequence definuje seznam čísel pomocí vstupů start, amount a step. Pomocí těchto uzlů jsme vytvořili dva samostatné seznamy deseti čísel, z nichž jeden se pohybuje v rozsahu 100–109 a druhý se pohybuje v rozsahu 0–9.
Uzel List.GetItemAtIndex slouží k výběru položky v seznamu na určitém indexu. Při výběru hodnoty 0 se první položka zobrazí v seznamu (v tomto případě 100).
Pokud použijeme stejný postup na druhý seznam, získáme hodnotu 0, první položku v seznamu.
Nyní sloučíme dva seznamy do jednoho pomocí uzlu List.Create. Uzel vytvoří seznam seznamů. Tím se změní struktura dat.
Pokud použijete znovu parametr List.GetItemAtIndex, s indexem nastaveným na hodnotu 0, získáme první řádek seznamu seznamů. To znamená, že se seznam považuje za položku, což se poněkud liší od ostatních skriptovacích jazyků. V pozdějších kapitolách se dostaneme k pokročilejší manipulaci se seznamy a datovými strukturami.
Základní koncept pro pochopení hierarchie dat v aplikaci Dynamo: S ohledem na datovou strukturu jsou seznamy považovány za položky. Jinými slovy, aplikace Dynamo funguje s postupem shora dolů pro pochopení datových struktur. Co to znamená? Pojďme to projít s příkladem.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
V tomto prvním příkladu sestavíme válec se skořepinou, který prochází hierarchií geometrie, o níž se v této části pojednává.
1. Přidejte uzel Point.ByCoordinates – po přidání uzlu na pracovní plochu vidíme bod v počátku osnovy náhledu aplikace Dynamo. Výchozí hodnoty vstupů x,y a z jsou 0.0, což nám dává bod v tomto umístění.
2. Plane.ByOriginNormal – Dalším krokem v hierarchii geometrie je rovina. Existuje několik způsobů, jak vytvořit rovinu, my pro vstup použijeme počátek a normálu. Počátek je uzel bodu vytvořený v předchozím kroku.
Vector.ZAxis – Toto je sjednocený vektor ve směru Z. Všimněte si, že nejsou k dispozici vstupy, pouze vektor o hodnotě [0,0,1]. Toto je vstupní hodnota normal pro uzel Plane.ByOriginNormal. Tím se v náhledu aplikace Dynamo zobrazí obdélníková rovina.
3. Circle.ByPlaneRadius – Rozšiřujeme hierarchii. Nyní vytvoříme oblouk z roviny v předchozím kroku. Po zapojení do uzlu se v počátku zobrazí kružnice. Výchozí poloměr v uzlu je hodnota 1.
4. Curve.Extrude – Teď provedeme vylepšení přidáním hloubky a přechodem do třetího rozměru. Tento uzel vytvoří povrch z křivky jejím vysunutím. Výchozí vzdálenost v uzlu je 1 a měli bychom ve výřezu vidět válec.
5. Surface.Thicken – Tento uzel nám umožňuje vytvořit uzavřené těleso odsazením povrchu o danou vzdálenost a uzavřením tvaru. Výchozí hodnota tloušťky je 1 a válec se skořepinou je ve výřezu zobrazen v souladu s těmito hodnotami.
6. Number Slider – Místo použití výchozích hodnot pro všechny tyto vstupy přidejte do modelu parametrický ovládací prvek.
Domain Edit – po přidání posuvníku čísla na pracovní plochu klikněte na stříšku v levé horní části a zobrazte možnosti domény.
Min/Max/Step - Změňte hodnoty min, max a step na 0,2 a 0.01. Toto provedeme, abychom mohli řídit velikost celkové geometrie.
7. Number Sliders – Ve všech výchozích vstupech zkopírujte a vložte tento posuvník čísla (vyberte posuvník, stiskněte Ctrl+C a pak Ctrl+V) několikrát, dokud nebudou mít všechny vstupy s výchozími hodnotami posuvník. Aby definice fungovala, některé hodnoty posuvníku musí být větší než nula (například k zesílení plochy je potřeba hloubka vysunutí).
8. Nyní jsme vytvořili parametrický válec se skořepinou s těmito posuvníky. Zkuste některé z těchto parametrů změnit a sledujte, jak se geometrie dynamicky aktualizuje ve výřezu aplikace Dynamo.
Number Sliders – Přidali jsme na plochu hodně posuvníků a je potřeba vyčistit rozhraní nástroje, který jsme právě vytvořili. Klikněte pravým tlačítkem na jeden posuvník, vyberte položku Přejmenovat a změňte název každého posuvníku na název odpovídající jeho parametru (Thickness (Tloušťka), Radius (Poloměr), Height (Výška) atd.).
9. V tomto okamžiku jsme vytvořili úžasnou věc s rozšiřujícím se válcem. Toto je aktuálně jeden objekt, podívejme se, jak vytvořit pole válců, které zůstávají dynamicky propojeny. Za tímto účelem vytvoříme seznam válců, místo práce s jednou položkou.
Addition (+) – Naším cílem je přidat řadu válců vedle válce, který jsme vytvořili. Pokud chceme přidat jeden válec vedle aktuálního válce, je nutné zvážit poloměr válce a tloušťku jeho skořepiny. Toto číslo získáme sečtením dvou hodnot posuvníků.
10. Tento krok je mnohem náročnější, takže ho projdeme pomalu: cílem je vytvořit seznam čísel, která definují umístění každého válce v řadě.
a. Multiplication – Nejprve chceme vynásobit hodnotu z předchozího kroku hodnotou 2. Hodnota z předchozího kroku představuje poloměr a chceme válec posunout o plný průměr.
b. Number Sequence – Pomocí tohoto uzlu vytvoříme pole čísel. První vstup je uzel multiplication z předchozího kroku do hodnoty step. Hodnotu start lze nastavit na 0.0 pomocí uzlu number.
c. Integer Slider – Pro hodnotu amount připojíme posuvník celého čísla. Tím se definuje počet vytvořených válců.
d. Output – Tento seznam zobrazuje vzdálenost přesunutou pro každý válec v poli a je parametricky řízen původními posuvníky.
11. Tento krok je dostatečně jednoduchý – zadejte posloupnost definovanou v předchozím kroku do vstupu x původního uzlu Point.ByCoordinates. Tím nahradíte posuvník pointX, který lze odstranit. Nyní se ve výřezu zobrazuje pole válců (zkontrolujte, zda je číslo posuvníku větší než 0).
12. Řetěz válců je stále dynamicky spojen se všemi posuvníky. Upravte každý posuvník, abyste viděli aktualizaci definice.
Ikona | Název/Syntaxe | Vstupy | Výstupy |
---|---|---|---|
Object.IsNull
obj
booleovský
Pro hlubší ponoření do vývoje vizuálních programů je potřeba lépe pochopit stavební bloky programu. Tato kapitola pokrývá základní koncepty týkající se dat, která jsou přenášena dráty v programu aplikace Dynamo.
Barva je skvělý datový typ k tvorbě působivých vizuálních prvků a k rozlišení částí výstupu ve vizuálním programu. Při práci s abstraktními daty a proměnlivými čísly je někdy obtížné zjistit, co se do jaké míry mění. Toto je skvělé využití pro barvy.
Barvy v aplikaci Dynamo jsou tvořeny pomocí vstupů ARGB. To odpovídá kanálům Alfa, Červená, Zelená a Modrá. Alfa představuje průhlednost barvy, zatímco ostatní tři se používají jako primární barvy k tvorbě celého spektra barev.
Ikona | Název (Syntaxe) | Vstupy | Výstupy |
---|---|---|---|
Barvy v níže uvedené tabulce se dotazují na vlastnosti, které se používají k definování barvy: Alfa, Červená, Zelená a Modrá. Všimněte si, že uzel Color.Components nám předá všechny čtyři kanály v samostatných výstupech, což je lepší k dotazování vlastností barvy.
Ikona | Název (Syntaxe) | Vstupy | Výstupy |
---|---|---|---|
Barvy v tabulce níže odpovídají barevnému prostoru HSB. Rozdělení barvy na odstín, sytost a jas je pravděpodobně intuitivnější pro interpretaci barvy: Jaká barva by to měla být? Jak moc sytá má být? A jak moc světlá, či tmavá má být? Toto je rozbor odstínu, respektive sytosti, respektive jasu.
Ikona | Název (Syntaxe) | Vstupy | Výstupy |
---|---|---|---|
Rozsah barev je podobný uzlu Remap Range ve cvičení #part-ii-from-logic-to-geometry: Přemapuje seznam čísel do jiné domény. Místo mapování do číselné domény však mapuje barevný gradient podle vstupních čísel v rozsahu od 0 do 1.
Aktuální uzel funguje dobře, pokud však všechno začne fungovat napoprvé, něco je zřejmě špatně. Nejlepší způsob, jak se s barevným gradientem seznámit, je provést interaktivní test. Nyní provedeme rychlé cvičení a probereme, jak nastavit gradient s výstupními barvami odpovídajícími číslům.
Definujte tři barvy: Pomocí bloku kódu definujte červenou, zelenou a modrou zadáním příslušných kombinací hodnot 0 a 255.
Vytvořte seznam: Slučte tři barvy do jednoho seznamu.
Definujte indexy: Vytvořte seznam k definování umístění uzlů jednotlivých barev (v rozsahu od 0 do 1). Všimněte si, že u zelené barvy je hodnota 0.75. Tímto se zelená barva umístí do 3/4 přes vodorovný gradient na posuvníku rozsahu barev.
Blok kódu: Zadejte hodnoty (mezi 0 a 1), které chcete převést na barvy.
Uzel Display.ByGeometry umožňuje vybarvit geometrii ve výřezu aplikace Dynamo. Toto je užitečné při oddělení různých typů geometrie, předvedení parametrické koncepce nebo definování legendy analýzy pro simulaci. Vstupy jsou jednoduché: geometrie a barva. Vstup color je za účelem vytvoření gradientu jako na obrázku výše připojen k uzlu Color Range.
Uzel Display.BySurfaceColor umožňuje mapovat data po celém povrchu pomocí barvy. Tato funkce nabízí určité zajímavé možnosti vizualizace dat obdržených přes diskrétní analýzu, jako je analýza slunečného světla, energetická analýza a analýza blízkosti. Použití barvy na povrch v aplikaci Dynamo je podobné jako použití textury na materiál v jiných prostředích CAD. Krátké cvičení níže znázorňuje použití tohoto nástroje.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Toto cvičení je zaměřeno na parametrické řízení barvy rovnoběžně s geometrií. Geometrie je základní šroubovice, kterou níže definujeme pomocí bloku kódu. Jedná se o rychlý a snadný způsob tvorby parametrické funkce; vzhledem k tomu, že se soustředíme na barvu (místo geometrie), můžeme efektivně vytvořit šroubovici pomocí bloku kódu, aniž by došlo k zaplnění kreslicí plochy. K čím složitějším materiálům se příručka Primer dostane, tím častěji se bude používat blok kódu.
Blok kódu: Definujte dva bloky kódu s výše uvedenými vzorci. Toto je rychlá parametrická metoda tvorby spirály.
Point.ByCoordinates: Připojte tři výstupy z bloku kódu k souřadnicím uzlu.
Nyní je vidět pole bodů tvořících šroubovici. Dalším krokem je tvorba křivky procházející body, aby bylo možné vizualizovat šroubovici.
PolyCurve.ByPoints: Připojte výstup Point.ByCoordinates ke vstupu points u uzlu. Vznikne šroubovitá křivka.
Curve.PointAtParameter: Připojte výstup PolyCurve.ByPoints ke vstupu curve. Účelem tohoto kroku je vytvořit parametrický bod atraktoru, který se posouvá podél křivky. Vzhledem k tomu, že křivka vyhodnocuje bod v parametru, bude nutné zadat hodnotu param v rozmezí od 0 do 1.
Posuvník čísel: Po přidání na kreslicí plochu změňte hodnotu min na 0.0, hodnotu max na 1.0 a hodnotu step na 0.01. Připojte výstup posuvníku ke vstupu param u uzlu Curve.PointAtParameter. Nyní je vidět bod podél délky šroubovice, který je vyjádřen procentem posuvníku (0 v počátečním bodě, 1 v koncovém bodě).
Po vytvoření referenčního bodu nyní porovnáme vzdálenost od referenčního bodu k původním bodům, čímž se definuje šroubovice. Tato hodnota vzdálenosti bude řídit geometrii i barvu.
Geometry.DistanceTo: Připojte výstup Curve.PointAtParameter ke vstupu. Připojte uzel Point.ByCoordinates ke vstupu geometrie.
Watch: Výsledný výstup zobrazuje seznam vzdáleností od každého bodu šroubovice k referenčnímu bodu podél křivky.
Dalším krokem je řízení parametrů pomocí seznamu vzdáleností od bodů šroubovice k referenčnímu bodu. Pomocí těchto hodnot vzdáleností se definují poloměry řady koulí podél křivky. Aby se koule udržely ve vhodné velikosti, je nutné přemapovat hodnoty vzdálenosti.
Math.RemapRange: Připojte výstup Geometry.DistanceTo ke vstupu čísel.
Blok kódu: připojte blok kódu s hodnotou 0.01 ke vstupu newMin a blok kódu s hodnotou 1 ke vstupu newMax.
Watch: Připojte výstup Math.RemapRange k jednomu uzlu a výstup Geometry.DistanceTo k jinému. Porovnejte výsledky.
V tomto kroku došlo k přemapování seznamu vzdáleností do menšího rozsahu. Hodnoty newMin a newMax je možné upravit podle libosti. Hodnoty se přemapují a budou mít stejný poměr rozložení v rámci celé domény.
Sphere.ByCenterPointRadius: Připojte výstup Math.RemapRange ke vstupu radius a původní výstup Point.ByCoordinates připojte ke vstupu centerPoint.
Změňte hodnotu posuvníku čísel a sledujte, jak se aktualizuje velikost koulí. Vytvořili jsme parametrický objekt.
Velikost koulí ukazuje parametrické pole definované referenčním bodem podél křivky. Použijeme stejnou koncepci u poloměru koule, abychom mohli řídit jejich barvu.
Color Range: Přidejte horní část kreslicí plochy. Při přejetí kurzoru nad vstupem value si všimněte, že požadovaná čísla jsou v rozsahu 0 až 1. Čísla z výstupu Geometry.DistanceTo je nutné přemapovat, aby byla kompatibilní s touto doménou.
Sphere.ByCenterPointRadius: V tuto chvíli vypněte náhled u tohoto uzlu. (Klikněte pravým tlačítkem myši > Náhled.)
Math.RemapRange: Tento proces by vám měl být známý. Připojte výstup Geometry.DistanceTo ke vstupu čísel.
Blok kódu: Podobně jako v předchozím kroku vytvořte hodnotu 0 pro vstup newMin a hodnotu 1 pro zadání newMax. Všimněte si, že v tomto případě je možné definovat dva výstupy z jednoho bloku kódu.
Color Range: Připojte výstup Math.RemapRange ke vstupu value.
Color.ByARGB: Toto je akce, pomocí které se vytvoří dvě barvy. I přesto, že tento proces může vypadat neobvykle, je stejný jako u barev RGB v jiném softwaru, jen se přitom využije vizuální programování.
Blok kódu: Vytvořte dvě hodnoty 0 a 255. Připojte dva výstupy ke dvěma vstupům Color.ByARGB podle výše uvedeného obrázku (případně vytvořte jakékoli dvě požadované barvy).
Color Range: Vstup colors vyžaduje seznam barev. Tento seznam je potřeba vytvořit ze dvou barev vytvořených v předchozím kroku.
List.Create: Slučte dvě barvy do jednoho seznamu. Připojte výstup ke vstupu colors u uzlu Color Range.
Display.ByGeometryColor: Připojte položku Sphere.ByCenterPointRadius ke vstupu geometry a uzel Color Range připojte ke vstupu color. Nyní máme hladký gradient v celé doméně křivky.
Pokud změníme hodnotu posuvníku čísel z dřívější definice, barvy a velikosti se aktualizují. V tomto případě spolu barvy a velikost poloměru přímo souvisí: nyní existuje vizuální propojení mezi dvěma parametry.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Nejprve je třeba vytvořit (nebo odkázat) povrch, který se použije jako vstup pro uzel Display.BySurfaceColor. V tomto příkladu šablonujeme mezi sinusovou a kosinusovou křivkou.
Tato skupina uzlů vytváří body podél osy Z a poté je posunuje podle sinových a kosinových funkcí. Pomocí dvou seznamů bodů se poté vygenerují křivky NURBS.
Surface.ByLoft: Vygenerujte interpolovaný povrch mezi křivkami NURBS v seznamu.
File Path: Vyberte soubor obrázku, který se bude vzorkovat pro následná data pixelů.
Pomocí uzlu File.FromPath převeďte cestu k souboru na soubor a poté jej předejte do uzlu Image.ReadFromFile. Tím vytvoříte obrázek pro vzorkování.
Image.Pixels: Zadejte obrázek a zadejte hodnotu vzorku, která se má použít ve směru rozměrů X a Y obrázku.
Posuvník: Zadejte hodnoty vzorků pro uzel Image.Pixels
Display.BySurfaceColor: Namapujte pole hodnot barev přes celý povrch podél směru X, respektive Y.
Podrobný náhled výstupního povrchu s rozlišením 400x300 vzorků.
Formálně je řetězec posloupnost znaků představujících písmennou konstantu nebo určitý typ proměnné. Neformálně je řetězec označení pro text. Pracovali jsme s celými i desetinnými čísly, abychom mohli řídit parametry, a stejně můžeme pracovat s textem.
Řetězce lze použít pro širokou řadu aplikací, včetně definování uživatelských parametrů, opatření sady dokumentace poznámkami a analýzy textových datasetů. Uzel řetězce se nachází v kategorii Core>Input.
Výše uvedené vzorové uzly jsou řetězce. Číslo může být reprezentováno jako řetězec, jako písmeno nebo celé pole textu.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Pomocí dotazů na řetězce můžete rychle analyzovat velké množství dat. O některých základních operacích, které mohou urychlit pracovní postup a pomoci při interoperabilitě softwaru, se budeme bavit.
Následující obrázek vychází z řetězce dat pocházejících z externí tabulky. Řetězec představuje vrcholy obdélníku v rovině XY. V miniaturním cvičení projdeme některé operace rozdělení řetězce:
Oddělovač „;“ rozdělí každý vrchol obdélníku. Tím se vytvoří seznam se třemi položkami pro každý vrchol.
Kliknutím na tlačítko + uprostřed uzlu vytvoříte nový oddělovač.
Na kreslicí plochu přidejte řetězec „,“ a zadejte jej do nového vstupu oddělovače.
Výsledkem je nyní seznam deseti položek. Uzel se nejprve rozdělí podle položky separator0 a potom podle položky separator1.
Zatímco výše uvedený seznam položek může vypadat jako čísla, jsou stále považovány za samostatné řetězce v aplikaci Dynamo. Aby bylo možné vytvořit body, je nutné jejich datový typ převést z řetězce na číslo. To se provádí pomocí uzlu String.ToNumber.
Tento uzel je přímočarý. Připojte výsledky uzlu String.Split ke vstupu. Výstup nevypadá jinak, ale datový typ je nyní number místo string.
Po několika základních doplňkových operacích je nyní v počátku nakreslen trojúhelník na základě původního vstupu řetězce.
Protože řetězec je obecným textovým objektem, jsou použity v široké škále aplikací. Podívejme se na některé hlavní akce v aplikaci Dynamo v části Core>String Category:
Tato metoda spojí dva řetězce v zadaném pořadí. Vezme všechny řetězcové literály v seznamu a vytvoří z nich jeden sloučený řetězec.
Následující obrázek představuje zřetězení tří řetězců:
Řetězce přidejte nebo odeberte ze zřetězení kliknutím na tlačítka +/- uprostřed uzlu.
Výstup obsahuje jeden zřetězený řetězec, včetně mezer a interpunkcí.
Metoda spojení je velmi podobný zřetězení, s výjimkou toho, že má přidanou hladinu interpunkcí.
Pokud jste pracovali v aplikaci Excel, mohli jste potkat soubor CSV. To znamená hodnoty oddělené čárkou. K vytvoření podobné datové struktury lze jako oddělovač s uzlem String.Join použít čárku (nebo v tomto případě dvě pomlčky).
Následující obrázek představuje spojení dvou řetězců:
Vstup oddělovače umožňuje vytvořit řetězec, který rozdělí spojené řetězce.
V tomto cvičení použijeme metody dotazování a manipulace s řetězci, abychom dekonstruovali poslední sloku díla Roberta Frosta Stopping By Woods on a Snowy Evening. Není to právě použití z praxe, ale pomůže nám to pochopit koncept akcí řetězců, když je použijeme na čitelné řádky básně.
Začneme základním rozdělením řetězce sloky. Nejprve si všimneme, že zápis je formátován na základě čárek. Tento formát použijeme k rozdělení každého řádku do jednotlivých položek.
Základní řetězec je vložen do uzlu String.
K označení oddělovače se používá další uzel String. V tomto případě používáme čárku.
Na kreslicí plochu je přidán uzel String.Split a je připojen ke dvěma řetězcům.
Výstup ukazuje, že jsme nyní rozdělili čáry do jednotlivých prvků.
Teď se pojďme dostat k dobré části básně: poslední dva řádky. Původní sloka byla jedna datová položka. Tato data jsme rozdělili na jednotlivé položky v prvním kroku. Teď musíme najít text, který hledáme. I když to můžeme provést výběrem posledních dvou položek seznamu, pokud by se jednalo o celou knihu, nechtěli bychom si vše pročítat a ručně izolovat jednotlivé prvky.
Místo ručního vyhledávání použijeme uzel String.Contains k vyhledání sady znaků. To je podobné jako příkaz Najít v textovém procesoru. V tomto případě získáme výsledek true nebo false, pokud je tento podřetězec nalezen v položce.
Ve vstupu searchFor definujeme podřetězec, který hledáme v rámci sloky. Použijeme uzel String s textem „And miles“.
Výstup nám dává seznam hodnot false a true. Pomocí této booleovské logiky filtrujeme prvky v dalším kroku.
List.FilterByBoolMask je uzel, který chceme použít k procházení hodnot false a true. Výstup „in“ vrátí výrazy s hodnotou „mask“ vstupu true, zatímco výstup „out“ vrací příkazy, které jsou false.
Náš výstup z „in“ je podle očekávání a dává nám poslední dva řádky sloky.
Teď chceme tyto dva řádky sloučit dohromady. Při zobrazení výstupu předchozího kroku si všimneme, že jsou v seznamu dvě položky:
Pomocí dvou uzlů List.GetItemAtIndex lze izolovat položky pomocí hodnot 0 a 1 jako vstupu index.
Výstup každého uzlu nám poskytne v pořadí poslední dva řádky.
Ke sloučení těchto dvou položek do jedné použijte uzel String.Join:
Po přidání uzlu String.Join si všimneme, že potřebujeme oddělovač.
K vytvoření oddělovače přidáme na kreslicí plochu uzel String a zadáme do něj čárku.
Poslední výstup sloučil poslední dvě položky do jedné.
Může se zdát, že je to hodně práce pro izolování posledních dvou řádků, a je to pravda, řetězcové operace často vyžadují nějakou přípravnou práci. Jsou však škálovatelné a lze je relativně snadno použít u velkých datasetů. Pokud parametricky pracujete s tabulkami a interoperabilitou, nezapomeňte na řetězcové operace.
Pokud jsou nejjednodušší formou dat čísla, nejjednodušším způsobem, jak se tato čísla mohou odlišit, je použití funkce Mathematics. Od jednoduchých operátorů, jako je dělení, až k trigonometrickým funkcím, možnost Math je skvělým způsobem, jak začít zkoumat číselné vztahy a vzory.
Operátory jsou sada komponent, které používají algebraické funkce se dvěma číselnými vstupními hodnotami, které vrací jednu výstupní hodnotu (součet, rozdíl, násobení, dělení atd.). Najdete je pod položkou Operátory > Akce.
Ikona | Název (Syntaxe) | Vstupy | Výstupy |
---|---|---|---|
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Kombinací operátorů a proměnných vytvořte složitější vztah prostřednictvím vzorců. Pomocí posuvníků vytvořte vzorec, který lze řídit pomocí vstupních parametrů.
1. Vytvořte posloupnost čísel, která představuje „t“ v parametrické rovnici. Chceme tedy použít seznam, který je dostatečně velký k definici spirály.
Number Sequence: Definuje posloupnost čísel na základě tří vstupů: start, amount a step.
2. Výše uvedený krok vytvořil seznam čísel definujících parametrickou doménu. Dále vytvořte skupinu uzlů představující rovnici zlaté spirály.
Zlatá spirála je definována jako následující rovnice:
Obrázek níže znázorňuje zlatou spirálu ve vizuální programové podobě. Při procházení skupiny uzlů se snažte věnovat pozornost souvislosti mezi vizuálním programem a psanou rovnicí.
a. Number Slider: Přidejte na kreslicí plochu dva posuvníky. Tyto posuvníky budou představovat proměnné a a b parametrické rovnice. Představují konstantu, která je flexibilní, nebo parametry, které lze upravit podle požadovaného výsledku.
b. Násobení (*): Uzel násobení je reprezentován hvězdičkou. Toto použijeme opakovaně k připojení násobných proměnných
c. Math.RadiansToDegree: Hodnoty 't' je nutné převést na stupně pro jejich vyhodnocení v trigonometrických funkcích. Nezapomeňte, že aplikace Dynamo pro vyhodnocení těchto funkcí ve výchozím stavu používá stupně.
d. Math.Pow: jako funkce 't' a čísla 'e' vytvoří Finobacciho posloupnost.
e. Math.Cos a Math.Sin: Tyto dvě trigonometrické funkce odliší souřadnice X a souřadnice Y každého parametrického bodu.
f. Watch: Nyní vidíte, že náš výstup jsou dva seznamy, které budou tvořit souřadnice x a y bodů použitých k vytvoření spirály.
Většina uzlů z předchozího kroku bude fungovat dobře, ale jedná se o pracný postup. Chcete-li vytvořit efektivnější pracovní postup, přečtěte si v části DesignScript jak definovat řetězec výrazů aplikace Dynamo do jednoho uzlu. V následující řadě kroků se podíváme, jak použít parametrickou rovnici k nakreslení Fibonacciho spirály.
Point.ByCoordinates: Spojte horní uzel násobení se vstupem x a dolní část se vstupem y. Nyní vidíte parametrickou spirálu bodů na obrazovce.
Polycurve.ByPoints: Spojte uzel Point.ByCoordinates z předchozího kroku se vstupem points. Možnost connectLastToFirst můžeme nechat bez vstupu, protože neděláme uzavřený oblouk. Tím se vytvoří spirála, která prochází každým bodem definovaným v předchozím kroku.
Nyní jsme dokončili Fibonacciho spirálu. Pokračujme dvěma různými cvičeními, které pojmenujeme Loděnka a Slunečnice. Jedná se o abstrakce přírodních systémů, ale dvě různá použití Fibonacciho spirály budou dobře zastoupena.
Circle.ByCenterPointRadius: Zde použijeme kruhový uzel se stejnými vstupy jako v předchozím kroku. Výchozí hodnota poloměru je 1.0, takže je vidět okamžitý výstup kružnic. Je okamžitě vidět, jak se body dále vzdalují od počátku.
Number Sequence: Toto je původní pole 't'. Jeho připojením k hodnotě poloměru v uzlu Circle.ByCenterPointRadius se středy kružnic stále vzdalují od počátku, ale poloměry kružnic se zvětšují, což vytváří zábavný Fibonacciho kruhový graf.
Bonusové body, pokud to vytvoříte ve 3D.
Nyní, když jsme vytvořili kruhovou ulitu loděnky, přejděme k parametrickým osnovám. Použijeme základní otočení Fibonacciho spirály k vytvoření Fibonacciho rastru a výsledek bude modelován po růstu slunečnicových semen.
Jako výchozí bod použijeme stejný krok z předchozího cvičení: Vytvoření spirálového pole bodů pomocí uzlu Point.ByCoordinates.
![](../images/5-3/2/math-part IV-01.jpg)
Dále postupujte podle těchto krátkých kroků a vygenerujte řadu spirál s různým natočením.
a. Geometry.Rotate: Existuje několik možností Geometry.Rotate. Ujistěte se, že jste vybrali uzel se vstupy geometry, basePlane a degrees. Připojte položku Point.ByCoordinates ke vstupu geometrie. Klikněte pravým tlačítkem na tento uzel a ujistěte se, že je vázání nastaveno na možnost Kartézský součin.
b. Plane.XY: Připojte se ke vstupu basePlane. Budeme se otáčet kolem počátku, což je stejné umístění jako základna spirály.
c. Number Range: Pro náš vstup stupně chceme vytvořit více otočení. To můžeme rychle provést pomocí komponenty Number Range. Připojte jej ke vstupu degrees.
d. Number: A k definování rozsahu čísel přidejte na kreslicí plochu ve vertikálním pořadí tři uzly čísel. Shora dolů přiřaďte hodnoty 0.0,360.0 a 120.0 v uvedeném pořadí. Tato čísla řídí otáčení spirály. Po připojení tří uzlů čísel k uzlu si všimněte výstupních výsledků z uzlu Number Range.
Náš výstup se začíná podobat víru. Upravíme některé parametry položky Number Range a podíváme se, jak se změní výsledky.
Změňte velikost kroku uzlu Number Range z 120.0 na 36.0. Všimněte si, že tím vznikají další otáčení, a proto získáváme hustší osnovu.
Změňte velikost kroku uzlu Number Range z 36.0 na 3.6. Tím získáme mnohem hustší osnovu a směr spirály je nejasný. Dámy a pánové, vytvořili jsme slunečnici.
Modul Logic nebo konkrétněji Conditional Logic umožňuje určit akci nebo sadu akcí na základě testu. Po vyhodnocení testu budeme mít booleovskou hodnotu představující True
nebo False
, kterou můžeme použít k řízení toku programu.
Číselné proměnné mohou ukládat celou řadu různých čísel. Booleovské proměnné mohou ukládat pouze dvě hodnoty, které se označují jako True nebo False, Yes nebo No, 1 nebo 0. Pomocí booleovských hodnot lze výpočty provádět jen zřídka, protože jsou omezené.
Výraz „If“ je klíčovou koncepcí programování: „Pokud je tato hodnota pravdivá, toto se stane, jinak se stane něco jiného. Výsledná akce výrazu je řízena booleovskou hodnotou. Příkaz „If“ lze v aplikaci Dynamo definovat několika způsoby:
Ikona | Název (Syntaxe) | Vstupy | Výstupy |
---|---|---|---|
Pojďme si projít stručný příklad každého z těchto tří uzlů v akci pomocí podmíněného výrazu „If“.
Na tomto obrázku je hodnota boolean nastavena na hodnotu true, což znamená, že výsledkem je řetězec: „toto je výsledek, pokud je hodnota true“. Tři uzly vytvářející výraz If zde fungují identicky.
Uzly opět fungují identicky. Pokud je hodnota boolean změněna na false, výsledkem je číslo Pi, jak je definováno v původním výrazu If.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Pomocí logiky rozdělíme seznam čísel do seznamu sudých čísel a seznamu lichých čísel.
a. Number Range – Přidejte na kreslicí plochu číselný rozsah.
b. Numbers – Přidejte na kreslicí plochu tři uzly čísel. Hodnoty pro jednotlivé uzly čísel by měly být: 0.0 pro start, 10.0 pro end a 1.0 pro step.
c. Output – Náš výstup je seznam 11 čísel v rozsahu od 0 do 10.
d. Modulo (%)– Number Range do x a 2.0 do y. Tím se vypočítá zbytek po dělení 2 pro každé číslo v seznamu. Výstup z tohoto seznamu nám poskytne seznam hodnot, které se mění v rozmezí 0 až 1.
e. Test rovnosti (==) – Přidá na kreslicí plochu test rovnosti. Výstup modulo připojte ke vstupu x a 0.0 ke vstupu y.
f. Watch – Výstupem testu rovnosti je seznam hodnot, které se mění na hodnotu true a false. Jedná se o hodnoty použité k oddělení položek v seznamu. 0 (nebo true) představuje sudá čísla a (1 nebo false) představuje lichá čísla.
g. List.FilterByBoolMask – Tento uzel filtruje hodnoty do dvou různých seznamů na základě vstupní booleovské hodnoty. Původní uzel number range připojte ke vstupu list a výstup testu rovnosti připojte ke vstupu mask. Výstup in představuje hodnoty true, zatímco výstup out představuje hodnoty false.
h. Watch – Výsledkem je seznam sudých čísel a seznam lichých čísel. Použili jsme logické operátory k oddělení seznamů do vzorů.
Budeme vycházet z logiky stanovené v prvním cvičení a použijeme toto nastavení na operaci modelování.
2. Vyjdeme z předchozího cvičení se stejnými uzly. Jediné výjimky (kromě změny formátu jsou):
a. Použijte uzel Sequence s těmito vstupními hodnotami.
b. Seznam in jsme odpojili od uzlu List.FilterByBoolMask. Tyto uzly zatím necháme stranou, ale později se nám v tomto cvičení budou hodit.
3. Začneme vytvořením samostatné skupiny grafů, jak je znázorněno na obrázku výše. Tato skupina uzlů představuje parametrickou rovnici k definování oblouku úsečky. Několik poznámek:
a. První uzel Number Slider představuje frekvenci vlny, měl by mít min. hodnotu 1, max. hodnotu 4 a krok 0.01.
b. Druhý uzel Number Slider představuje amplitudu vlny, měl by mít min. hodnotu 0, max. hodnotu 1 a krok 0.01.
c. PolyCurve.ByPoints – Pokud je zkopírováno výše uvedené schéma uzlu, výsledkem je sinusoida ve výřezu náhledu aplikace Dynamo.
Zde je metoda pro vstupy: použijte uzly čísel pro statické vlastnosti a posuvníky pro flexibilnější hodnoty. Chceme zachovat původní číselný rozsah, který definujeme na začátku tohoto kroku. Křivka sinu, kterou zde vytvoříme, by však měla mít určitou flexibilitu. Posunutím těchto posuvníků můžeme sledovat, jak oblouk aktualizuje svou frekvenci a amplitudu.
4. Trochu přeskočíme v definici, takže se podíváme na konec, abychom mohli odkazovat na to, k čemu míříme. První dva kroky jsou provedeny samostatně, nyní je chceme spojit. Pomocí základní sinusové křivky budeme řídit umístění komponent zipu a pomocí logiky true/false budeme přepínat mezi malými a většími poli.
a. Math.RemapRange – Pomocí číselné sekvence vytvořené v kroku 02 vytvoříme novou řadu čísel přemapováním rozsahu. Původní čísla z kroku 01 jsou v rozsahu 0-100. Tato čísla se pohybují v rozsahu od 0 do 1 podle hodnot newMin a newMax.
5. Vytvořte uzel Curve.PointAtParameter a potom připojte výstup Math.RemapRange z kroku 04 ke vstupu param.
Tento krok vytvoří body podél křivky. Čísla byla přemapována na 0 až 1, protože vstup param hledá hodnoty v tomto rozsahu. Hodnota 0 představuje počáteční bod, hodnota 1 představuje koncové body. Všechna čísla mezi hodnotami jsou vyhodnocena v rozsahu [0,1].
6. Připojte výstup z uzlu Curve.PointAtParameter k uzlu List.FilterByBoolMask, abyste oddělili seznam lichých a sudých indexů.
a. List.FilterByBoolMask – Připojte uzel Curve.PointAtParameter z předchozího kroku ke vstupu list.
b. Watch – Uzel Watch pro in a uzel Watch pro out zobrazuje, že máme dva seznamy představující sudé a liché indexy. Tyto body jsou seřazeny stejným způsobem na křivce, kterou ukážeme v dalším kroku.
7. Dále použijeme výsledek výstupu z uzlu List.FilterByBoolMask v kroku 05 k vygenerování geometrií s velikostmi podle jejich indexů.
Cuboid.ByLength – Znovu vytvořte spojení uvedená na obrázku výše, abyste získali zip podél sinusové křivky. Kvádr je pouze kvádr a definujeme jeho velikost na základě bodu křivky ve středu kvádru. Logika sudého nebo lichého rozdělení by nyní měla být v modelu jasná.
a. Seznam kvádrů v sudých indexech.
b. Seznam kvádrů v lichých indexech.
Voila! Právě jste naprogramovali proces definování rozměrů geometrie podle logické operace, kterou jsme si předvedli v tomto cvičení.
Barva ARGB (Color.ByARGB)
A,R,G,B
barva
Alfa (Colour.Alpha)
barva
A
Červená (Colour.Red)
barva
R
Zelená (Color.Green)
barva
G
Modrá (Color.Blue)
barva
B
Komponenty (Colour.Components)
barva
A,R,G,B
Odstín (Colour.Hue)
barva
Odstín
Sytost (Colour.Saturation)
barva
Sytost
Jas (Colour.Brightness)
barva
Jas
Součet (+)
var[]...[], var[]...[]
var[]...[]
Rozdíl (-)
var[]...[], var[]...[]
var[]...[]
Násobení (*)
var[]...[], var[]...[]
var[]...[]
Dělení (/)
var[]...[], var[]...[]
var[]...[]
If (If)
test, true, false
výsledek
Formula (IF(x,y,z))
x, y, z
výsledek
Code Block ((x?y:z);)
x? y, z
výsledek