Kolor to doskonały typ danych do tworzenia atrakcyjnych wizualizacji, a także do przedstawiania różnic w danych wyjściowych programu wizualnego. Podczas pracy z abstrakcyjnymi danymi i różnymi liczbami czasami trudno jest dostrzec, co się zmienia i w jakim stopniu. To doskonała sytuacja do zastosowania kolorów.
Kolory w dodatku Dynamo są tworzone przy użyciu danych wejściowych ARGB. Odpowiadają one kanałom alfa, czerwonemu, zielonemu i niebieskiemu. Alfa określa przezroczystość koloru, natomiast pozostałe trzy kanały są używane jako kolory podstawowe, łączone w celu generowania całego spektrum barw.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|---|---|---|
Kolory w poniższej tabeli umożliwiają wykonywanie zapytań o właściwości użyte do zdefiniowania koloru: alfa, czerwony, zielony i niebieski. Należy zauważyć, że węzeł Color.Components zawiera wszystkie cztery elementy wyjściowe, a więc jest zalecany do wykonywania zapytań o właściwości koloru.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|---|---|---|
Kolory w poniższej tabeli odpowiadają przestrzeni kolorów HSB. Podział koloru na barwę, nasycenie i jasność jest bardziej intuicyjny pod względem interpretacji kolorów: jaki to kolor? Jak bardzo jest intensywny? Jak bardzo jest jasny lub ciemny? To właśnie podział na barwę, nasycenie i jasność.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|---|---|---|
Węzeł Color Range jest podobny do węzła Remap Range z #part-ii-from-logic-to-geometryćwiczenia: ponownie odwzorowuje listę liczb w innej dziedzinie. Zamiast jednak odwzorowywać je w dziedzinie liczb, odwzorowuje je jako gradient kolorów na podstawie liczb wejściowych z zakresu od 0 do 1.
Ten węzeł działa dobrze, ale osiągnięcie właściwego efektu za pierwszym razem może być trudne. Najlepszym sposobem na poznanie gradientu kolorów jest przetestowanie go przez interakcję. Wykonamy szybkie ćwiczenie, aby poznać sposób konfigurowania gradientu, w którym kolory wyjściowe odpowiadają liczbom.
Zdefiniuj trzy kolory: za pomocą węzła Code Block zdefiniuj kolory red, green i blue (czerwony, zielony i niebieski), podłączając odpowiednie kombinacje wartości 0 i 255.
Utwórz listę: scal trzy kolory w jedną listę.
Zdefiniuj indeksy: utwórz listę, aby zdefiniować położenie uchwytów każdego koloru (w zakresie od 0 do 1). Zwróć uwagę na wartość 0,75 dla koloru zielonego. Spowoduje to umieszczenie koloru zielonego w 3/4 linii poziomej gradientu na suwaku zakresu kolorów.
Węzeł Code Block: wartości wejściowe (z zakresu od 0 do 1) do przekształcenia na kolory.
Węzeł Display.ByGeometry umożliwia pokolorowanie geometrii w rzutni dodatku Dynamo. To umożliwia rozdzielanie różnych typów geometrii, przedstawianie koncepcji parametrycznych, czy definiowanie legendy analizy na potrzeby symulacji. Elementy wejściowe są proste: „geometry” i „color”. Aby utworzyć gradient taki, jak na powyższym rysunku, należy połączyć element wejściowy „color” z węzłem Color Range.
Węzeł Display.BySurfaceColors umożliwia odwzorowywanie danych na powierzchni za pomocą koloru. Ta funkcja wprowadza wiele ciekawych możliwości wizualizacji danych uzyskanych metodą analizy dyskretnej, na przykład światła słonecznego, energii i bliskości. Stosowanie koloru do powierzchni w dodatku Dynamo przebiega podobnie do stosowania tekstury do materiału w innych środowiskach CAD. W krótkim ćwiczeniu poniżej pokazano, jak używać tego narzędzia.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
W tym ćwiczeniu skupiono się na parametrycznym sterowaniu kolorem równolegle do geometrii. Geometria to podstawowa helisa, zdefiniowana poniżej przy użyciu węzła Code Block. To szybki i łatwy sposób tworzenia funkcji parametrycznej. Ponieważ skupiamy się na kolorze (a nie na geometrii), używamy bloku kodu, aby sprawnie utworzyć helisę bez nadmiernego zajmowania obszaru rysunku. Będziemy używać bloków kodu częściej, gdy przejdziemy do bardziej zaawansowanych zagadnień.
Węzeł Code Block: zdefiniuj dwa węzły Code Block, używając powyższych formuł. To szybka metoda parametrycznego tworzenia spirali.
Węzeł Point.ByCoordinates: połącz trzy elementy wyjściowe z węzła Code Block ze współrzędnymi tego węzła.
Teraz widzimy szyk punktów tworzących helisę. Kolejnym etapem jest utworzenie krzywej przechodzącej przez te punkty, aby można było zwizualizować helisę.
Węzeł PolyCurve.ByPoints: połącz element wyjściowy węzła Point.ByCoordinates z elementem wejściowym points tego węzła. Otrzymujemy krzywą o kształcie helisy.
Węzeł Curve.PointAtParameter: połącz element wyjściowy węzła PolyCurve.ByPoints z elementem wejściowym curve. Celem tego kroku jest utworzenie parametrycznego punktu przyciągania, który przesuwa się wzdłuż krzywej. Ponieważ punkt na krzywej jest obliczany na podstawie parametru, należy wprowadzić wartość param z zakresu od 0 do 1.
Węzeł Number Slider: po dodaniu do obszaru rysunku zmień wartość min na 0,0, wartość max na 1,0, a wartość step na 0,01. Połącz element wyjściowy suwaka z elementem wejściowym param węzła Curve.PointAtParameter. Teraz widzimy punkt na helisie, któremu odpowiada wartość procentowa na suwaku (0 w punkcie początkowym, 1 w punkcie końcowym).
Po utworzeniu punktu odniesienia możemy porównać odległość punktu odniesienia od punktów pierwotnie definiujących helisę. Wartość odległości będzie określać zarówno geometrię, jak i kolor.
Węzeł Geometry.DistanceTo: połącz element wyjściowy węzła Curve.PointAtParameter z elementem input. Połącz węzeł Point.ByCoordinates z wejściem geometry.
Węzeł Watch: wynik pokazuje listę odległości każdego punktu na helisie od punktu odniesienia na krzywej.
Kolejnym etapem jest sterowanie parametrami za pomocą listy odległości punktów na helisie od punktu odniesienia. Tych wartości odległości użyjemy do zdefiniowania promieni szeregu sfer wzdłuż krzywej. Aby zachować odpowiednie rozmiary sfer, należy ponownie odwzorować wartości odległości.
Węzeł Math.RemapRange: połącz element wyjściowy węzła Geometry.DistanceTo z elementem wejściowym „numbers”.
Węzeł Code Block: połącz blok kodu zawierający wartość 0,01 z elementem wejściowym newMin, a blok kodu zawierający wartość 1 z elementem wejściowym newMax.
Węzeł Watch: połącz element wyjściowy węzła Math.RemapRange z jednym węzłem, a element wyjściowy węzła Geometry.DistanceTo z drugim. Porównaj wyniki.
W tym kroku ponownie odwzorowano listę odległości w mniejszym zakresie. Wartości newMin i newMax można dowolnie edytować. Wartości zostaną ponownie odwzorowane i będą miały ten sam współczynnik rozkładu w całej dziedzinie.
Węzeł Sphere.ByCenterPointRadius: połącz element wyjściowy węzła Math.RemapRange z elementem wejściowym radius, a pierwotny element wyjściowy węzła Point.ByCoordinates z elementem wejściowym centerPoint.
Zmień wartość na suwaku i obserwuj, jak zmienia się rozmiar sfer. Otrzymaliśmy uchwyt parametryczny
Rozmiar sfer przedstawia szyk parametryczny zdefiniowany przez punkt odniesienia na krzywej. Użyjemy teraz tej samej koncepcji, której użyliśmy do określenia promienia sfer, aby sterować ich kolorem.
Węzeł Color Range: dodaj do obszaru rysunku. Po ustawieniu kursora na elemencie wejściowym value zobaczymy, że wymagane są liczby z zakresu od 0 do 1. Należy ponownie odwzorować liczby wyjściowe z węzła Geometry.DistanceTo, aby były zgodne z tą dziedziną.
Węzeł Sphere.ByCenterPointRadius: tymczasowo wyłączymy podgląd tego węzła (kliknij prawym przyciskiem myszy > Podgląd)
Węzeł Math.RemapRange: ten proces powinien być już znajomy. Połącz element wyjściowy węzła Geometry.DistanceTo z elementem wejściowym „numbers”.
Węzeł Code Block: podobnie jak wcześniej utwórz wartość 0 dla elementu wejściowego newMin i wartość 1 dla elementu wejściowego newMax. W tym przypadku możemy zdefiniować dwie wartości wyjściowe z jednego bloku kodu.
Węzeł Color Range: połącz element wyjściowy węzła Math.RemapRange z elementem wejściowym value.
Węzeł Color.ByARGB: to za jego pomocą utworzymy dwa kolory. Choć to rozwiązanie może wydawać się nieporęczne, jest identyczne z używaniem kolorów RGB w innym programie, z tym że po prostu stosujemy tu programowanie wizualne.
Węzeł Code Block: utwórz dwie wartości, 0 i 255. Połącz te dwie wartości wyjściowe z dwoma elementami wejściowymi węzła Color.ByARGB zgodnie z powyższą ilustracją (lub wybierz swoje dwa ulubione kolory).
Węzeł Color Range: element wejściowy colors wymaga listy kolorów. Musimy utworzyć tę listę z dwóch kolorów utworzonych w poprzednim kroku.
Węzeł List.Create: scal dwa kolory w jedną listę. Połącz wynik z elementem wejściowym colors węzła Color Range.
Węzeł Display.ByGeometryColor: połącz węzeł Sphere.ByCenterPointRadius z elementem wejściowym geometry, a węzeł Color Range z elementem wejściowym color. Otrzymaliśmy płynny gradient w całej dziedzinie krzywej.
Jeśli zmienimy wcześniej zdefiniowaną wartość za pomocą węzła Number Slider, kolory i rozmiary zostaną zaktualizowane. W tym przypadku kolor i promień są bezpośrednio powiązane: otrzymaliśmy wizualne połączenie między dwoma parametrami.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Najpierw należy utworzyć powierzchnię (lub odniesienie do niej), która będzie używana jako dane wejściowe dla węzła Display.BySurfaceColors. W tym przykładzie wyciągamy powierzchnię między krzywą sinusoidalną a krzywą cosinusoidalną.
Ta grupa węzłów służy do utworzenia punktów wzdłuż osi Z, a następnie przesunięcia ich na podstawie funkcji sinus i cosinus. Następnie dwie listy punktów zostaną użyte do wygenerowania krzywych NURBS.
Węzeł Surface.ByLoft: wygeneruj interpolowaną powierzchnię między listą krzywych NURBS.
Węzeł File Path: wybierz plik obrazu, z którego na dalszym etapie będą próbkowane dane pikseli.
Użyj węzła File.FromPath, aby przekonwertować ścieżkę pliku na plik, a następnie przekaż go do węzła Image.ReadFromFile, aby utworzyć obraz wyjściowy na potrzeby próbkowania.
Węzeł Image.Pixels: wprowadź obraz i podaj liczbę próbek, która będzie używana w wymiarach x i y obrazu.
Węzeł Slider: podaj wartości liczby próbek dla węzła Image.Pixels.
Węzeł Display.BySurfaceColors: odwzoruj szyk wartości kolorów na powierzchni, odpowiednio wzdłuż osi X i Y.
Podgląd powierzchni wyjściowej w powiększeniu, z rozdzielczością 400x300 próbek.
Dane są niezbędnym elementem programów. Podróżują przez przewody, trafiając na wejścia węzłów, w których są przetwarzane i przekształcane do nowej postaci — danych wyjściowych. Przeanalizujmy definicję danych, ich strukturę i rozpocznijmy korzystanie z nich w dodatku Dynamo.
Dane to zestaw wartości zmiennych jakościowych lub ilościowych. Najprostszą formą danych są liczby, takie jak 0
, 3.14
lub 17
. Jednak dane mogą być wielu innych typów, jak na przykład zmienna reprezentująca zmieniające się liczby (height
), znaki (myName
), geometria (Circle
) lub lista elementów danych (1,2,3,5,8,13,...
).
W dodatku Dynamo dodaje się/przekazuje się dane do portów wejściowych węzłów — można mieć dane bez operacji, ale aby przetworzyć operacje reprezentowane przez węzły, dane są niezbędne. Po dodaniu węzła do obszaru roboczego, jeśli nie ma on żadnych wejść, wynik będzie funkcją, a nie wynikiem samej operacji.
Proste dane
Pomyślne wykonanie danych i operacji (węzeł A)
Operacja (węzeł A) bez danych wejściowych zwraca funkcję ogólną
Uwaga: typ 'null'
„null” reprezentuje brak danych. Chociaż jest to pojęcie abstrakcyjne, często można się z nim spotkać podczas pracy z programowaniem wizualnym. Jeśli operacja nie utworzy poprawnego wyniku, węzeł zwróci wartość null.
Testowanie pod kątem wartości null i usuwanie ich ze struktury danych jest kluczową częścią tworzenia skutecznych programów.
Programowanie wizualne umożliwia bardzo szybkie generowanie dużej ilości danych, co może wymagać metod zarządzania ich hierarchią. Taka właśnie jest rola struktur danych, schematów organizacyjnych, w których przechowujemy dane. Specyfika struktur danych i sposób ich używania zależą od konkretnego języka programowania.
W dodatku Dynamo dodajemy hierarchię do danych za pomocą list. Przeanalizujemy to szczegółowo w kolejnych rozdziałach, ale na początek możemy po prostu stwierdzić, że:
Lista reprezentuje kolekcję elementów umieszczonych w jednej strukturze danych:
Mam pięć palców (elementy) dłoni (lista).
Na mojej ulicy (lista) jest dziesięć domów (elementy).
Węzeł Number Sequence definiuje listę liczb za pomocą wejść start, amount i step. Za pomocą tych węzłów utworzyliśmy dwie oddzielne listy dziesięciu liczb, jedna z nich obejmuje liczby 100–109, a druga — 0–9.
Węzeł List.GetItemAtIndex wybiera element z listy o określonym indeksie. W przypadku wybrania indeksu 0 pobieramy pierwszy element z listy (w tym przypadku 100).
Stosując ten sam proces do drugiej listy, otrzymujemy wartość 0, czyli pierwszy element na liście.
Teraz scalamy dwie listy w jedną, używając węzła List.Create. Warto zauważyć, że węzeł tworzy listę list. Powoduje to zmianę struktury danych.
Teraz gdy ponownie użyjemy węzła List.GetItemAtIndex z indeksem 0, pobierzemy pierwszą listę na liście list. Oznacza to, że lista jest traktowana jak element — stanowi to pewną różnicę w porównaniu z innymi językami skryptowymi. W kolejnych rozdziałach bardziej szczegółowo zajmiemy się manipulowaniem listami i strukturami danych.
Kluczowe pojęcie hierarchii danych w dodatku Dynamo, które należy zrozumieć: w odniesieniu do struktury danych listy są traktowane jak elementy. Innymi słowy, analizując strukturę danych, dodatek Dynamo stosuje proces „od góry do dołu”. Co to oznacza? Przeanalizujmy to na przykładzie.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
W pierwszym przykładzie złożymy walec z powłoką, stosując hierarchię geometrii opisaną w tej sekcji.
1. Dodaj węzeł Point.ByCoordinates. Po dodaniu węzła do obszaru rysunku widać punkt w początku siatki podglądu dodatku Dynamo. Domyślne wartości wejść x, y i z to 0,0, co daje punkt w tym położeniu.
2. Plane.ByOriginNormal — następny krok w hierarchii geometrii to płaszczyzna. Istnieje kilka sposobów skonstruowania płaszczyzny — użyjemy dla wejścia pozycji origin i normal. Origin (początek) to węzeł punktu utworzony w poprzednim kroku.
Vector.ZAxis — jest to wektor jednostkowy w kierunku z. Warto zwrócić uwagę, że nie ma wejść, tylko wektor o wartości [0,0,1]. Użyjemy go jako wejścia normal dla węzła Plane.ByOriginNormal. Pozwala to uzyskać prostokątną płaszczyznę w podglądzie dodatku Dynamo.
3. Circle.ByPlaneRadius — dodając następny etap w hierarchii, tworzymy teraz krzywą z płaszczyzny w poprzednim kroku. Po utworzeniu podłączenia do węzła uzyskujemy okrąg w początku. Domyślna wartość promienia (radius) węzła wynosi 1.
4. Curve.Extrude — teraz dodamy temu elementowi wyrazu, nadając mu głębię i dodając trzeci wymiar. Ten węzeł tworzy powierzchnię z krzywej poprzez jej wyciągnięcie. Domyślna odległość w węźle wynosi 1, a w rzutni powinien być widoczny walec.
5. Surface.Thicken — ten węzeł umożliwia uzyskanie zamkniętej bryły przez odsunięcie powierzchni o określoną odległość i zamknięcie formy. Domyślna wartość grubości wynosi 1, a w rzutni widoczny jest walec z powłoką, zgodny z tymi wartościami.
6. Number Slider — zamiast używać domyślnych wartości dla wszystkich tych wejść, dodajmy do modelu kontrolę parametryczną.
Domain Edit — po dodaniu do obszaru rysunku węzła Number Slider kliknij daszek w lewym górnym rogu, aby wyświetlić opcje domeny.
Min/Max/Step — zmień wartości min, max i step na odpowiednio 0, 2 i 0,01. Umożliwia to sterowanie wielkością całkowitej geometrii.
7. Węzły Number Slider — we wszystkich domyślnych wejściach skopiujmy i wklejmy kilka razy ten suwak liczby (wybierz suwak, naciśnij klawisze Ctrl+C, a następnie klawisze Ctrl+V), tak aby wszystkie wejścia z domyślnymi wartościami miały zamiast nich suwaki. Niektóre z wartości suwaka muszą być większe od zera, aby definicja działała (na przykład potrzebna jest głębokość wyciągnięcia w celu pogrubienia powierzchni).
8. Za pomocą tych suwaków utworzyliśmy teraz parametryczny walec z powłoką. Spróbuj zmieniać niektóre z tych parametrów i obserwuj, jak geometria jest aktualizowana dynamicznie w rzutni dodatku Dynamo.
Węzły Number Slider — w ramach kontynuacji dodaliśmy wiele suwaków do obszaru rysunku i musimy oczyścić interfejs właśnie utworzonego narzędzia. Kliknij prawym przyciskiem myszy jeden suwak, wybierz polecenie „Zmień nazwę” i zmień nazwę każdego suwaka na odpowiednią dla danego parametru (thickness — „grubość”, Radius — „promień”, Height — „wysokość” itp.).
9. W tym momencie mamy już utworzony wspaniały walec z pogrubieniem. Obecnie jest to jeden obiekt. Przyjrzyjmy się temu, jak utworzyć szyk walców pozostających dynamicznie połączonych. W tym celu utworzymy listę walców, zamiast pracować z pojedynczym elementem.
Dodawanie (+) — naszym celem jest dodanie wiersza walców obok utworzonego walca. Aby dodać jeden walec przylegający do bieżącego, musimy uwzględnić zarówno promień walca, jak i grubość jego powłoki. Uzyskamy tę liczbę przez dodanie dwóch wartości suwaków.
10. Ten krok jest trudniejszy, więc przeanalizujmy go powoli: celem końcowym jest utworzenie listy liczb definiujących położenie każdego walca w wierszu.
a. Mnożenie — najpierw pomnożymy wartość z poprzedniego kroku przez 2. Wartość z poprzedniego kroku reprezentuje promień. Chcemy przesunąć walec o pełną średnicę.
b. Number Sequence — za pomocą tego węzła tworzymy szyk liczb. Pierwsze wejście to węzeł mnożenia (multiplication) z poprzedniego kroku skierowany do wartości step. Wartość start można ustawić na 0,0 za pomocą węzła number.
c. Integer Slider — w przypadku wartości amount połączymy suwak liczby całkowitej. Określi to liczbę utworzonych walców.
d. Output — na tej liście znajduje się przesunięcie każdego walca w szyku i jest ona parametrycznie sterowana przez oryginalne suwaki.
11. Ten krok jest prosty — podłącz sekwencję zdefiniowaną w poprzednim kroku do wejścia x oryginalnego węzła Point.ByCoordinates. Spowoduje to zastąpienie suwaka pointX, który można usunąć. Teraz widzimy szyk walców w rzutni (upewnij się, że suwak liczby całkowitej ma wartość większą niż 0).
12. Łańcuch cylindrów jest nadal dynamicznie połączony ze wszystkimi suwakami. Zmieniaj wartości poszczególnych suwaków i obserwuj aktualizację definicji.
Formalnie ciąg jest sekwencją znaków reprezentujących stałą literową lub pewnego typu zmienną. Nieformalnie ciąg (string) to programistyczne określenie tekstu. Pracowaliśmy już z liczbami, zarówno z liczbami całkowitymi, jak i z liczbami dziesiętnymi, aby sterować parametrami. Tak samo możemy pracować z tekstem.
Ciągi mogą być używane w wielu zastosowaniach, w tym do definiowania parametrów niestandardowych, opisywania zestawów dokumentacji i analizowania zestawów danych tekstowych. Węzeł string (ciąg) znajduje się w kategorii Podstawowe > Kategoria wejściowa.
Przykładowe węzły powyżej są ciągami. Liczba może być przedstawiona jako ciąg, podobnie jak litera lub cały szyk tekstu.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Można szybko analizować duże ilości danych, stosując zapytania do ciągów. Omówimy niektóre podstawowe operacje, które przyspieszają proces roboczy i ułatwiają współdziałanie oprogramowania.
Na poniższej ilustracji przedstawiono ciąg danych pochodzących z zewnętrznego arkusza kalkulacyjnego. Ciąg reprezentuje wierzchołki prostokąta na płaszczyźnie XY. Przeanalizujmy niektóre operacje dzielenia ciągów w miniaturowym ćwiczeniu:
Separator „;” oddziela każdy wierzchołek prostokąta. Powoduje to utworzenie listy z 3 elementami dla każdego wierzchołka.
Naciśnięcie klawisza „+” w środku węzła powoduje utworzenie nowego separatora.
Dodaj ciąg „,” do obszaru rysunku i utwórz podłączenie do nowego wejścia separatora.
Wynik stanowi teraz listę dziesięciu elementów. Węzeł wykonuje dzielenie najpierw na podstawie separatora separator0, a następnie na podstawie separatora separator1.
Powyższa lista elementów może wyglądać jak liczby, ale nadal są one traktowane w dodatku Dynamo jak pojedyncze ciągi. Aby można było utworzyć punkty, ich typ danych musi zostać przekształcony z ciągu w liczbę. Jest to wykonywane za pomocą węzła String.ToNumber
Ten węzeł jest prosty. Podłącz wyniki węzła String.Split do wejścia. Wynik nie wygląda inaczej, ale typ danych to teraz number (liczba), a nie string (ciąg).
Po wykonaniu pewnych dodatkowych podstawowych operacji mamy teraz trójkąt narysowany w punkcie początkowym na podstawie oryginalnego wejścia string.
Ponieważ ciąg jest ogólnym obiektem tekstowym, zakres jego zastosowań jest szeroki. Przyjrzyjmy się niektórym istotnym operacjom w obszarze Podstawowe > Kategoria ciągu w dodatku Dynamo:
Jest to metoda łączenia dwóch ciągów w kolejności. Powoduje pobranie każdego ciągu literalnego z listy i utworzenie jednego scalonego ciągu.
Poniżej przedstawiono scalanie trzech ciągów:
Aby dodać lub odjąć ciągi w scaleniu, można kliknąć przyciski +/- w środku węzła.
Wynikiem jest jeden scalony ciąg ze spacjami i interpunkcją.
Metoda łączenia jest bardzo podobna do scalania, ale zawiera dodatkową warstwę interpunkcji.
Osoby pracujące w programie Excel prawdopodobnie miały już do czynienia z plikami CSV. Są to pliki z wartościami rozdzielonymi przecinkami. Można użyć przecinka (lub, jak w tym przypadku, dwóch kresek) jako separatora z węzłem String.Join, aby utworzyć podobną strukturę danych.
Poniższa ilustracja przedstawia łączenie dwóch ciągów:
Wejście separatora umożliwia utworzenie ciągu rozdzielającego łączone ciągi.
W tym ćwiczeniu użyjemy metod wykonywania zapytań i manipulowania ciągami w celu zdekonstruowania ostatniej zwrotki wiersza Stopping By Woods on a Snowy Evening (Przystając pod lasem w śnieżny wieczór) autorstwa Roberta Frosta. Nie jest to najpraktyczniejsze zastosowanie, ale pomoże nam zrozumieć koncepcje operacji na ciągach podczas stosowania ich do czytelnych wierszy z rytmem i rymem.
Zacznijmy od podstawowego podziału ciągu zwrotki. Na początku należy zauważyć, że zapis jest sformatowany za pomocą przecinków. Użyjemy tego formatu, aby rozdzielić wiersze na poszczególne elementy.
Ciąg podstawowy zostaje wklejony do węzła String.
Do oznaczenia separatora używany jest inny węzeł String. W tym przypadku używamy przecinka.
Do obszaru rysunku zostaje dodany węzeł String.Split. Zostaje on połączony z tymi dwoma ciągami.
Wynik na wyjściu to wiersze będące osobnymi elementami.
Przejdźmy teraz do interesującej części wiersza: ostatnich dwóch wierszy. Oryginalna zwrotka była jednym elementem danych. Dane te zostały rozdzielone na poszczególne elementy w pierwszym kroku. Teraz musimy wyszukać tekst, który próbujemy znaleźć. Mimo że możemy to zrobić, wybierając dwa ostatnie elementy listy, to jednak jeśli byłaby to cała książka, nie chcielibyśmy czytać wszystkiego i ręcznie wyodrębniać elementów.
Zamiast ręcznego wyszukiwania używamy węzła String.Contains, aby wyszukać zestaw znaków. Jest to podobne do wykonywania polecenia „Znajdź” w edytorze tekstu. W tym przypadku zostanie zwrócona wartość „true” lub „false”, jeśli ten ciąg podrzędny zostanie znaleziony w elemencie.
W wejściu searchFor definiujemy ciąg podrzędny, którego szukamy w zwrotce. Użyjmy węzła String z tekstem „And miles”.
Zwrócony wynik zawiera listę pozycji false i true. Użyjemy tych wartości logicznych, aby przefiltrować elementy w następnym kroku.
List.FilterByBoolMask jest węzłem, za pomocą którego wyodrębnimy pozycje odpowiadające wartościom false i true. Wyjście „in” zwraca frazy z wejściem „mask” równym „true”, a wyjście „out” — te odpowiadające wartości „false”.
Wyniki na wyjściu „in” są zgodne z oczekiwaniami, czyli zwracają dwa ostatnie wiersze zwrotki.
Chcemy teraz podkreślić powtórzenie w tej zwrotce, scalając te dwa wiersze. Przeglądając wyniki na wyjściu w poprzednim kroku, łatwo zauważyć, że na liście znajdują się dwa elementy:
Za pomocą dwóch węzłów List.GetItemAtIndex można wyodrębnić te elementy, używając wartości 0 i 1 jako wejścia indeksu.
Na wyjściu każdego z tych węzłów pojawiają się dwa ostatnie wiersze — w kolejności.
Aby scalić te dwa elementy w jeden, użyjemy węzła String.Join:
Po dodaniu węzła String.Join widać, że potrzebny jest separator.
Aby utworzyć separator, dodamy węzeł String do obszaru rysunku i wpiszemy przecinek.
Ostatnie wyjście scala dwa ostatnie elementy w jeden.
Może to wydawać się dużą ilością pracy w celu wyodrębnienia dwóch ostatnich wierszy i to prawda — operacje na ciągach często wymagają pewnych początkowych nakładów pracy na. Ale są one skalowalne i mogą być względnie łatwo stosowane do dużych zestawów danych. Podczas pracy z zastosowaniem parametrów z arkuszami kalkulacyjnymi i funkcjami współdziałania należy pamiętać o operacjach na ciągach.
Logika, a w szczególności logika warunkowa, pozwala określić operację lub zestaw operacji na podstawie testu. Przez oszacowanie testu uzyskamy wartość logiczną reprezentującą prawdę (True
) lub fałsz (False
), za pomocą której można sterować przepływem programu.
Zmienne liczbowe mogą przechowywać liczby z szerokiego zakresu. Zmienne logiczne mogą przechowywać tylko dwie wartości, nazywane Prawda lub Fałsz, Tak lub Nie albo 1 lub 0. Rzadko stosuje się operacje logiczne do wykonywania obliczeń z powodu ich ograniczonego zakresu.
Instrukcja „If” (jeśli) stanowi kluczowe pojęcie w programowaniu: „Jeśli to jest prawdą, wtedy tak się stanie, w przeciwnym razie stanie się coś innego”. Wynikowa operacja tej instrukcji zależy od wartości logicznej. Istnieje wiele sposobów definiowania instrukcji „If” w dodatku Dynamo:
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|
Przeanalizujmy krótki przykład dotyczący działania każdego z tych trzech węzłów z użyciem instrukcji warunkowej „If”.
Na tej ilustracji wartość logiczna jest ustawiona na true, co oznacza, że wynik jest ciągiem: „this is the result if true” (to jest wynik, jeśli prawda). Trzy węzły tworzące instrukcję If działają tu w ten sam sposób.
Węzły działają identycznie. Jeśli wartość logiczna zostanie zmieniona na false, wynik będzie liczbą Pi, jak to zdefiniowano w oryginalnej instrukcji If.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Użyjmy logiki, aby rozdzielić listę liczb na listę liczb parzystych i listę liczb nieparzystych.
a. Number Range — dodaj zakres liczb do obszaru rysunku.
b. Number — dodaj trzy number liczb do obszaru rysunku. Wartość dla każdego węzła number powinna wynosić: 0,0 dla start, 10,0 dla end i 1,0 dla step.
c. Wyjście — wynik wyjściowy to lista 11 liczb w zakresie od 0 do 10.
d. Modulo (%) — węzeł Number Range do x i 2,0 do y. Spowoduje to obliczenie reszty z dzielenia przez 2 dla każdej liczby na liście. Wynik z tej listy to lista wartości 0 i 1.
e. Test równości (==) — dodaj test równości do obszaru rysunku. Podłącz wyjście modulo do wejścia x i wartość 0,0 do wejścia y.
f. Watch — wynik testu równości jest listą wartości logicznych true i false. Są to wartości używane do oddzielenia elementów na liście. 0 (lub true) reprezentuje liczby parzyste, a 1 (lub false) reprezentuje liczby nieparzyste.
g. List.FilterByBoolMask — ten węzeł filtruje wartości na dwie różne listy w oparciu o wejściową wartość logiczną. Podłącz oryginalny węzeł Number Range do wejścia list oraz wyjście equality test do wejścia mask. Wyjście in reprezentuje wartości true, podczas gdy wyjście out reprezentuje wartości false.
h. Watch — w wyniku tego mamy teraz listę liczb parzystych i listę liczb nieparzystych. Użyliśmy operatorów logicznych do rozdzielenia list na wzory.
Bazując na logice ustanowionej w pierwszym ćwiczeniu, zastosujmy tę konfigurację do operacji modelowania.
2. Oprzemy się na poprzednim ćwiczeniu z tymi samymi węzłami. Jedyne wyjątki to (oprócz zmiany formatu):
a. Użyj węzła Sequence z tymi wartościami wejściowymi.
b. Odłączyliśmy wejście list in od węzła List.FilterByBoolMask. Na razie odłożymy te węzły na bok, ale później w tym ćwiczeniu się przydadzą.
3. Zacznijmy od utworzenia oddzielnej grupy wykresu, jak pokazano na ilustracji powyżej. Ta grupa węzłów reprezentuje równanie parametryczne definiujące krzywą liniową. Kilka uwag:
a. Pierwszy suwak Number Slider reprezentuje częstotliwość fali. Powinien mieć wartość min. 1, maks. 4 i krok 0,01.
b. Drugi Number Slider reprezentuje amplitudę fali. Powinien mieć wartość min. 0, maks. 1 i krok równy 0,01.
c. PolyCurve.ByPoints — jeśli zostanie skopiowany powyższy wykres węzłów, wynikiem będzie krzywa sinusoidalna w rzutni podglądu Dynamo.
Metoda stosowana tutaj dla wejść: użyj węzłów number dla bardziej statycznych właściwości i węzłów Number Slider dla właściwości bardziej elastycznych. Chcemy zachować oryginalny węzeł Number Range definiowany na początku tego kroku. Jednak tworzona tutaj krzywa sinusoidalna powinna mieć pewną elastyczność. Możemy przesunąć te suwaki, aby obserwować, jak aktualizowane są częstotliwość i amplituda krzywej.
4. Będziemy analizować definicję nie po kolei, więc spójrzmy na wynik końcowy, aby móc się odwoływać do tego, do czego dążymy. Pierwsze dwa kroki są wykonywane oddzielnie, chcemy je teraz połączyć. Użyjemy bazowej krzywej sinusoidalnej do sterowania położeniem komponentów zamka, a za pomocą logiki prawdy/fałszu będziemy przełączać się między małymi i większymi kostkami.
a. Math.RemapRange — za pomocą sekwencji liczb utworzonej w kroku 02 utwórzmy nową serię liczb poprzez ponowne odwzorowanie zakresu. Oryginalne liczby z zakresu od 0 do 100 z kroku 01. Te liczby mieszczą się w zakresie od 0 do 1 dla odpowiednio wejść newMin i newMax.
5. Utwórz węzeł Curve.PointAtParameter, a następnie połącz wyjście Math.RemapRange z kroku 04 jako wejście param.
W tym kroku tworzone są punkty wzdłuż krzywej. Ponownie odwzorowaliśmy liczby na wartości od 0 do 1, ponieważ wejście param szuka wartości w tym zakresie. Wartość 0 reprezentuje punkt początkowy, a wartość 1 reprezentuje punkty końcowe. Wszystkie liczby między nimi są odwzorowane na wartości z zakresu [0,1].
6. Połącz wyjście z węzła Curve.PointAtParameter z węzłem List.FilterByBoolMask, aby rozdzielić listę indeksów nieparzystych i nieparzystych.
a. List.FilterByBoolMask — podłącz węzeł Curve.PointAtParameter z poprzedniego kroku do wejścia list.
b. Watch — węzeł obserwacyjny dla in i węzeł obserwacyjny dla out pokazują, że mamy dwie listy reprezentujące indeksy parzyste i nieparzyste. Punkty te są uporządkowane w ten sam sposób na krzywej, co przedstawimy w następnym kroku.
7. Następnie użyjemy wyjścia z węzła List.FilterByBoolMask w kroku 05, aby wygenerować geometrie o rozmiarach zgodnych z indeksami.
Cuboid.ByLengths — ponownie utwórz połączenia widoczne na ilustracji powyżej, aby uzyskać zamek wzdłuż krzywej sinusoidalnej. Prostopadłościan jest tutaj tylko kostką. Definiujemy jego rozmiar na podstawie punktu krzywej w środku kostki. Logika podziału na wartości parzyste/nieparzyste powinna być teraz czytelna w modelu.
a. Lista prostopadłościanów przy indeksach parzystych.
b. Lista prostopadłościanów przy indeksach nieparzystych.
Gotowe! Właśnie zaprogramowano proces definiowania wymiarów geometrii zgodnie z operacją logiczną przedstawioną w tym ćwiczeniu.
Jeśli najprostszą formą danych są liczby, najprostszym sposobem powiązywania tych liczb jest matematyka. Od prostych operatorów, takich jak dzielenie czy funkcje trygonometryczne, po bardziej złożone formuły — matematyka stanowi doskonały sposób na rozpoczęcie badania zależności i wzorców między liczbami.
Operatory to zestaw komponentów, w których używane są funkcje algebraiczne z dwiema wejściowymi wartościami liczbowymi dającymi jedną wartość wyjściową (dodawanie, odejmowanie, mnożenie, dzielenie itp.). Można je znaleźć w obszarze Operatory > Operacje.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Połącz operatory i zmienne, aby utworzyć bardziej złożone zależności za pomocą formuł. Użyj suwaków, aby utworzyć formułę, którą można sterować za pomocą parametrów wejściowych.
1. Utwórz sekwencję liczb reprezentującą „t” w równaniu parametrycznym. Lista powinna być wystarczająco duża, aby można było zdefiniować spiralę.
Number Sequence: zdefiniuj sekwencję liczb w oparciu o trzy wejścia: start, amount i step.
2. W powyższym kroku utworzono listę liczb definiujących dziedzinę parametryczną. Następnie utwórz grupę węzłów reprezentujących równanie złotej spirali.
Złota spirala jest zdefiniowana jako równanie:
Poniższa ilustracja przedstawia złotą spiralę w postaci programowania wizualnego. Podczas przechodzenia przez grupę węzłów należy zwrócić uwagę na analogię pomiędzy programem wizualnym a równaniem pisemnym.
a. Number Slider: dodaj dwa suwaki liczb do obszaru rysunku. Suwaki te reprezentują zmienne a i b równania parametrycznego. Te elementy reprezentują stałą, która jest elastyczna, lub parametry, które można dostosować do żądanego wyniku.
b. Multiplication (*): węzeł mnożenia jest reprezentowany przez gwiazdkę. Użyjemy tego wielokrotnie, aby połączyć zmienne mnożenia.
c. Math.RadiansToDegrees: wartości „t” muszą zostać przekształcone w stopnie w celu ich oszacowania w funkcjach trygonometrycznych. Należy pamiętać, że podczas szacowania tych funkcji dodatek Dynamo domyślnie obsługuje wartości w stopniach.
d. Math.Pow: jako funkcja wartości „t” i liczby „e” tworzy to ciąg Fibonacciego.
e. Math.Cos i Math.Sin: te dwie funkcje trygonometryczne będą różnicować współrzędną x i współrzędną y każdego punktu parametrycznego.
f. Watch: teraz widzimy, że wynik to dwie listy — współrzędne x i y punktów użytych do wygenerowania spirali.
Point.ByCoordinates: połącz górny węzeł multiplication z wejściem „x”, a dolny — z wejściem „y”. Na ekranie pojawi się spirala parametryczna punktów.
Polycurve.ByPoints: połącz węzeł Point.ByCoordinates z poprzedniego kroku z węzłem points. Węzeł connectLastToFirst możemy pozostawić bez wejścia, ponieważ nie tworzymy krzywej zamkniętej. Spowoduje to utworzenie spirali przechodzącej przez każdy punkt zdefiniowany w poprzednim kroku.
Mamy gotową spiralę Fibonacciego. Przekształcimy to jeszcze bardziej w dwóch osobnych ćwiczeniach, tworząc kształty nautilusa i słonecznika. Są to abstrakcje systemów naturalnych, ale zapewni to dobrą reprezentację tych dwóch różnych zastosowań spirali Fibonacciego.
Circle.ByCenterPointRadius: użyjemy tutaj węzła circle z tymi samymi wejściami co w poprzednim kroku. Domyślną wartością promienia jest 1,0, dlatego natychmiast widoczne będą wyniki okręgów. Od razu staje się jasne, w jaki sposób te punkty odbiegają dalej od początku.
Number Sequence: jest to oryginalny szyk „t”. Przez połączenie tej pozycji z wartością Circle.ByCenterPointRadius środki okręgów wciąż odbiegają dalej od początku, ale promień okręgów rośnie, tworząc interesujący wykres okręgów Fibonacciego.
Jeszcze lepiej, jeśli uda Ci się przekształcić go w wykres 3D.
Punktem wyjścia będzie ten sam krok co w poprzednim ćwiczeniu: utworzenie szyku spirali punktów za pomocą węzła Point.ByCoordinates.
![](../images/5-3/2/math-part IV-01.jpg)
Następnie wykonaj te minikroki, aby wygenerować serię spiral o różnych obrotach.
a. Geometry.Rotate: dostępnych jest kilka opcji Geometry.Rotate. Należy pamiętać, aby wybrać węzeł z wejściami geometry, basePlane i degrees. Połącz węzeł Point.ByCoordinates z wejściem geometry. Kliknij prawym przyciskiem myszy ten węzeł i upewnij się, że skratowanie jest ustawione na Iloczyn wektorowy
b. Plane.XY: połącz z wejściem basePlane. Wykonamy obrót wokół początku, który ma to samo położenie co podstawa spirali.
c. Number Range: na potrzeby wartości wejściowej w stopniach utworzymy wiele obrotów. Można to zrobić szybko za pomocą węzła Number Range. Połącz to z wejściem degrees.
d. Number: aby zdefiniować zakres liczb, dodaj trzy węzły number do obszaru rysunku w kolejności pionowej. Od góry do dołu przypisz odpowiednio wartości 0,0, 360,0 i 120,0. Sterują one obrotem spirali. Zwróć uwagę na wyniki z wyjścia węzła Number Range po połączeniu trzech węzłów number z tym węzłem.
Nasz wynik zaczyna przypominać wir. Dostosuj niektóre parametry węzła Number Range i obserwuj, jak zmieniają się wyniki.
Zmień rozmiar kroku (step) węzła Number Range z 120,0 na 36,0. Zwróć uwagę, że w ten sposób powstaje więcej obrotów, co zapewnia gęstszą siatkę.
Zmień rozmiar kroku (step) węzła Number Range z 36,0 na 3,6. Daje to teraz dużo gęstszą siatkę, a kierunkowość spirali jest niejasna. W ten sposób utworzyliśmy słonecznik.
Gdy będziemy już gotowi, aby bardziej szczegółowo zająć się tworzeniem programów wizualnych, będziemy potrzebować lepszego zrozumienia używanych składników. W tym rozdziale przedstawiono podstawowe pojęcia dotyczące danych — czyli tego, co przepływa przez przewody programu dodatku Dynamo.
Ikona | Nazwa/składnia | Dane wejściowe | Dane wyjściowe |
---|---|---|---|
Teraz zestaw węzłów z poprzedniego kroku będzie działać poprawnie, ale to sporo pracy. Aby utworzyć wydajniejszy proces roboczy, zapoznaj się z częścią w celu definiowania ciągu wyrażeń Dynamo w jednym węźle. W następnej serii kroków przeanalizujemy używanie równania parametrycznego do rysowania spirali Fibonacciego.
Mamy już powłokę nautilusa — przejdźmy do siatek parametrycznych. Użyjemy podstawowego obrotu na spirali Fibonacciego, aby utworzyć siatkę Fibonacciego, a wynik zostanie wymodelowany na wzór .
Kolor ARGB (Color.ByARGB)
A, R, G, B
color
Alpha (Color.Alpha)
color
A
Red (Color.Red)
color
R
Green (Color.Green)
color
G
Blue (Color.Blue)
color
B
Components (Color.Components)
color
A, R, G, B
Hue (Color.Hue)
color
Hue
Saturation (Color.Saturation)
color
Saturation
Brightness (Color.Brightness)
color
Brightness
Object.IsNull
obj
bool
Jeśli (If) | test, prawda, fałsz | wynik |
Formuła (IF(x,y,z)) | x, y, z | wynik |
Code Block ((x?y:z);) | x? y, z | wynik |
Dodawanie (+) | var[]...[], var[]...[] | var[]...[] |
Odejmowanie (-) | var[]...[], var[]...[] | var[]...[] |
Mnożenie (*) | var[]...[], var[]...[] | var[]...[] |
Dzielenie (/) | var[]...[], var[]...[] | var[]...[] |