Krótka składnia
Krótka składnia
W węźle Code Block dostępnych jest kilka podstawowych metod o krótkiej składni, które znacznie ułatwiają zarządzanie danymi. Podstawy zostały szczegółowo omówione poniżej. Wyjaśniamy też, jak za pomocą tej krótkiej składni można tworzyć dane i stosować do nich zapytania.
Typ danych
Standard dodatku Dynamo
Odpowiednik w węźle Code Block
Liczby
!
!
Ciągi
!
!
Sekwencje
!
!
Zakresy (przedziały)
!
!
Pobierz element o indeksie
!
!
Tworzenie listy
!
!
Scalanie ciągów
!
!
Instrukcje warunkowe
!
!
Dodatkowa składnia
Węzły
Odpowiednik w węźle Code Block
Uwaga
Dowolny operator (+, &&, >=, Not itp.)
+, &&, >=, ! itp.
Uwaga: „Not” staje się „!”, ale węzeł nazywa się „Not”, aby odróżnić go od „Factorial”
Wartość logiczna True
true;
Uwaga: małe litera
Wartość logiczna False
false;
Uwaga: małe litera
Zakresy i sekwencje
Metoda definiowania zakresów i sekwencji może zostać zredukowana do krótkiej składni. Poniższa ilustracja przedstawia składnię „..”, która umożliwia definiowanie listy danych liczbowych za pomocą bloku kodu. Po zaznajomieniu się z tą notacją tworzenie danych liczbowych jest bardzo wydajnym procesem:
!
W tym przykładzie zakres liczb zostaje zastąpiony podstawową składnią węzła Code Block definiującą
beginning..end..step-size;. Liczbowo będzie to:0..10..1;Warto zauważyć, że składnia
0..10..1;odpowiada0..10;Wielkość kroku równa 1 jest domyślną wartością w krótkiej składni. Dlatego0..10;daje sekwencję od 0 do 10 o kroku 1.Przykład Sequence jest podobny, ale do ustawienia 15 wartości na liście używamy znaku „#” zamiast listy do 15. W tym przypadku definiujemy:
beginning..#ofSteps..step-size:Rzeczywista składnia dla tej sekwencji to0..#15..2Używając znaku „#” z poprzedniego kroku, umieścimy go teraz w części „rozmiar-kroku” składni. Teraz mamy zakres liczb (Number Range) od początku „beginning” do końca „end” z ustalonym rozmiarem kroku „step-size”, co powoduje równomierne rozmieszczenie wartości między dwoma punktami:
beginning..end..#ofSteps
Zakresy zaawansowane
Tworzenie zakresów zaawansowanych pozwala na łatwe korzystanie z listy list. W poniższych przykładach wyodrębniamy zmienną z notacji zakresu głównego i tworzymy inny zakres tej listy.
!
1. Tworząc zakresy zagnieżdżone, porównaj notację z „#” z notacją bez tego znaku. Zastosowanie ma ta sama logika co w zakresach podstawowych, choć rozwiązanie jest nieco bardziej złożone.
2. Możemy zdefiniować zakres podrzędny w dowolnym miejscu w zakresie głównym i możemy też używać dwóch zakresów podrzędnych.
3. Sterując wartością „końca” w zakresie, tworzymy więcej zakresów o różnych długościach.
W ramach ćwiczenia logicznego porównaj dwie wersje krótkiej składni i spróbuj przeanalizować, w jaki sposób zakresy podrzędne i notacja # wpływają na wynik na wyjściu.
!
Tworzenie list i pobieranie elementów z listy
Poza tworzeniem list za pomocą krótkiej składni możemy również tworzyć listy na bieżąco. Te listy mogą zawierać szeroki zakres typów elementów i można stosować do nich zapytania (należy pamiętać, że listy to także obiekty). Podsumowując: blok kodu pozwala tworzyć listy i stosować zapytania o elementy z listy za pomocą nawiasów kwadratowych:
!
1. Szybko twórz listy za pomocą ciągów i stosuj do nich zapytania, korzystając z indeksu elementu.
2. Twórz listy ze zmiennymi i stosuj do nich zapytania za pomocą notacji krótkiej składni zakresu.
Zarządzanie z listami zagnieżdżonymi jest podobnym procesem. Pamiętaj o kolejności listy i o korzystaniu z wielu zestawów nawiasów kwadratowych:
!
1. Zdefiniuj listę list.
2. Zastosuj zapytanie do listy za pomocą notacji z jedną parą nawiasów kwadratowych.
3. Zastosuj zapytanie do elementu za pomocą notacji z dwiema parami nawiasów kwadratowych.
Ćwiczenie: powierzchnia sinusoidalna
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
W tym ćwiczeniu przećwiczymy nowe umiejętności dotyczące krótkiej składni, aby utworzyć „jajowatą” powierzchnię zdefiniowaną przez zakresy i formuły. W trakcie ćwiczenia zwróć uwagę na to, w jaki sposób używane są blok kodu i istniejące węzły Dynamo: blok kodu jest używany do złożonej obsługi danych, natomiast węzły Dynamo są rozmieszczone wizualnie w celu zapewnienia czytelności definicji.
Rozpocznij od utworzenia powierzchni przez połączenie powyższych węzłów. Zamiast używać węzła number do zdefiniowania szerokości i długości, kliknij dwukrotnie obszar rysunku i wpisz 100; w bloku kodu.
!
!
Zdefiniuj zakres od 0 do 1 z 50 podziałami, wpisując
0..1..#50w węźle Code Block.Połącz ten zakres z węzłem Surface.PointAtParameter, który pobiera wartości u i v z zakresu od 0 do 1 na powierzchni. Pamiętaj, aby zmienić skratowanie na Iloczyn wektorowy, klikając prawym przyciskiem myszy węzeł Surface.PointAtParameter.
W tym kroku użyjemy pierwszej funkcji do przesunięcia siatki punktów w górę na osi Z. Ta siatka będzie sterować generowaną powierzchnią na podstawie funkcji źródłowej. Dodaj nowe węzły, jak pokazano na ilustracji poniżej
!
Używamy węzła Code Block z wierszem:
(0..Math.Sin(x*360)..#50)*5;. Krótkie objaśnienie: definiujemy zakres z formułą w jego wnętrzu. Ta formuła jest funkcją sinus. Funkcja sinus przyjmuje w dodatku Dynamo dane wejściowe w stopniach, więc aby uzyskać pełny kształt funkcji sinus, należy przemnożyć wartości x (jest to wejście zakresu od 0 do 1) przez 360. Następnie chcemy uzyskać taką samą liczbę podziałów, ile jest punktów siatki sterującej dla każdego wiersza, dlatego zdefiniujemy pięćdziesiąt podziałów podrzędnych za pomocą instrukcji #50. Na koniec: mnożnik 5 po prostu zwiększa amplitudę przekształcenia, dzięki czemu możemy zobaczyć efekt w podglądzie Dynamo.
!
Mimo że poprzedni węzeł Code Block działał dobrze, nie był całkowicie parametryczny. Chcemy dynamicznie sterować jego parametrami, dlatego zastąpimy wiersz z poprzedniego kroku wierszem
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;. Daje to możliwość zdefiniowania tych wartości na podstawie wejść.
Zmieniając suwaki (w zakresie od 0 do 10), otrzymujemy interesujące wyniki.
!
!
Transponując zakres liczb, odwrócimy kierunek fali kurtynowej:
transposeList = List.Transpose(sineList);
!
Po dodaniu wartości sineList i transposeList uzyskujemy zniekształconą „jajowatą” powierzchnię:
eggShellList = sineList+transposeList;
Zmienimy wartości suwaków określone poniżej, aby zmniejszyć zniekształcenia tworzone przez ten algorytm.
!
Na koniec zastosujmy zapytania do wyodrębnionych części danych za pomocą węzła Code Block. Aby ponownie wygenerować powierzchnię za pomocą określonego zakresu punktów, dodaj węzeł Code Block powyżej między węzłami Geometry.Translate i NurbsSurface.ByPoints. Będzie on zawierać wiersz tekstu: sineStrips[0..15..1];. Spowoduje to wybranie pierwszych 16 wierszy punktów (spośród 50). Po ponownym utworzeniu powierzchni widać, że wygenerowaliśmy wyodrębnioną część siatki punktów.
!
!
W ostatnim kroku, aby uczynić ten węzeł Code Block bardziej parametrycznym, będziemy sterować zapytaniem za pomocą suwaka o zakresie od 0 do 1. W tym celu dodamy ten wiersz kodu:
sineStrips[0..((List.Count(sineStrips)-1)*u)];. Może to wydawać się skomplikowane, ale ten wiersz kodu pozwala szybko przeskalować długość listy do mnożnika z zakresu od 0 do 1.
Wartość 0.53 na suwaku powoduje utworzenie powierzchni tuż za punktem środkowym siatki.
!
Zgodnie z oczekiwaniami wartość 1 na suwaku tworzy powierzchnię z pełnej siatki punktów.
!
Przyglądając się wykresowi wizualnemu, możemy wyróżnić bloki kodu i przejrzeć ich poszczególne funkcje.
!
1. Pierwszy węzeł Code Block zastępuje węzeł Numer.
2. Drugi węzeł Code Block zastępuje węzeł Number Range.
3. Trzeci węzeł Code Block zastępuje węzły List.Transpose, List.Count i Number Range.
4. Czwarty węzeł Code Block stosuje zapytania do listy list, zastępując węzeł List.GetItemAtIndex.
Last updated