> For the complete documentation index, see [llms.txt](https://primer2.dynamobim.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://primer2.dynamobim.org/pl/8_coding_in_dynamo/8-1_code-blocks-and-design-script/3-shorthand.md).

# 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:

!

> 1. 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;`
> 2. Warto zauważyć, że składnia `0..10..1;` odpowiada `0..10;` Wielkość kroku równa 1 jest domyślną wartością w krótkiej składni. Dlatego `0..10;` daje sekwencję od 0 do 10 o kroku 1.
> 3. 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 to `0..#15..2`
> 4. Uż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.

{% file src="/files/aGLkHE1ayxfnB5qpw75r" %}

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.

!

!

> 1. Zdefiniuj zakres od 0 do 1 z 50 podziałami, wpisując `0..1..#50` w węźle **Code Block**.
> 2. 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

!

> 1. 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.

!

> 1. 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.

!

!

> 1. Transponując zakres liczb, odwrócimy kierunek fali kurtynowej: `transposeList = List.Transpose(sineList);`

!

> 1. 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.

!

!

> 1. 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**.
