> 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/5_essential_nodes_and_concepts/5-4_designing-with-lists/2-working-with-lists.md).

# Praca z listami

### Praca z listami

Ustaliliśmy już, czym jest lista. Omówmy teraz operacje, które możemy na niej wykonać. Wyobraź sobie listę jako talię kart do gry. Talia jest listą, a każda karta reprezentuje element.

> Autor zdjęcia: [Christian Gidlöf](https://commons.wikimedia.org/wiki/File:Playing_cards_modified.jpg)

### Zapytanie

Jakie **zapytania** możemy wykonać z poziomu listy? Umożliwia to dostęp do istniejących właściwości.

* Liczba kart w talii? 52.
* Liczba kolorów? 4.
* Materiał? Papier.
* Długość? 3,5" lub 89 mm.
* Szerokość? 2,5" lub 64 mm.

### Działanie

Jakie **działania** możemy wykonać na liście list? Umożliwia to zmianę listy w oparciu o daną operację.

* Możemy potasować talię.
* Możemy posortować talię według wartości.
* Możemy posortować talię według kolorów.
* Możemy podzielić talię.
* Możemy rozdać karty w talii.
* Możemy wybrać określoną kartę w talii.

Dla wszystkich operacji wymienionych powyżej istnieją analogiczne węzły Dynamo do pracy z listami danych ogólnych. W poniższych lekcjach przedstawiono niektóre z podstawowych operacji, które można wykonywać na listach.

## **Ćwiczenie**

### **Operacje na listach**

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Poniższy rysunek przedstawia wykres bazowy, na którym rysujemy linie między dwoma okręgami, aby przedstawić podstawowe operacje na listach. Przeanalizujemy sposób zarządzania danymi na liście i przedstawimy wyniki wizualne za pomocą poniższych operacji na liście.

!

> 1. Rozpocznij od węzła **Code Block** o wartości `500;`
> 2. Połącz wejście x z węzłem **Point.ByCoordinates**.
> 3. Podłącz węzeł z poprzedniego kroku do wejścia origin węzła **Plane.ByOriginNormal**.
> 4. Za pomocą węzła **Circle.ByPlaneRadius** podłącz węzeł z poprzedniego kroku do wejścia plane.
> 5. Używając węzła **Code Block**, oznacz wartość `50;` dla pozycji radius. To pierwszy okrąg, który utworzymy.
> 6. Za pomocą węzła **Geometry.Translate** przesuń okrąg w górę o 100 jednostek w kierunku Z.
> 7. Za pomocą węzła **Code Block** zdefiniuj zakres dziesięciu liczb z zakresu od 0 do 1 przy użyciu tego wiersza kodu: `0..1..#10;`
> 8. Wstaw blok kodu z poprzedniego kroku do wejścia *param* dwóch węzłów **Curve.PointAtParameter**. Podłącz węzeł **Circle.ByPlaneRadius** do wejścia curve górnego węzła i węzeł **Geometry.Translate** do wejścia curve węzła poniżej.
> 9. Za pomocą węzła **Line.ByStartPointEndPoint** połącz dwa węzły **Curve.PointAtParameter**.

### List.Count

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Węzeł *List.Count* jest prosty: zlicza wartości na liście i zwraca ich liczbę. Jego działanie jest nieco bardziej złożone podczas pracy z listami list, ale zilustrujemy to w późniejszych sekcjach.

\![Zliczanie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20list%20operation%20-%20list%20count.jpg)

> 1. Węzeł **List.Count** zwraca liczbę linii w węźle **Line.ByStartPointEndPoint**. W tym przypadku wynosi ona 10, co odpowiada liczbie punktów utworzonych z oryginalnego węzła **Code Block**.

### List.GetItemAtIndex

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

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

Węzeł **List.GetItemAtIndex** zapewnia podstawowy sposób stosowania zapytania dotyczącego elementu listy.

\![Ćwiczenie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20get%20item%20index%2001.jpg)

> 1. Najpierw kliknij prawym przyciskiem myszy węzeł **Line.ByStartPointEndPoint**, aby wyłączyć jego podgląd.
> 2. Za pomocą węzła **List.GetItemAtIndex** wybieramy indeks *„0”*, czyli pierwszy element na liście linii.

Zmień wartość suwaka na od 0 do 9, aby wybrać inny element za pomocą węzła **List.GetItemAtIndex**.

!

### List.Reverse

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Węzeł *List.Reverse* odwraca kolejność wszystkich elementów na liście.

\![Ćwiczenie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20list%20reverse.jpg)

> 1. Aby poprawnie zwizualizować odwróconą listę linii, utwórz więcej linii, zmieniając węzeł **Code Block** na `0..1..#50;`
> 2. Powiel węzeł **Line.ByStartPointEndPoint** oraz wstaw węzeł List.Reverse między węzłem **Curve.PointAtParameter** i drugim węzłem **Line.ByStartPointEndPoint**
> 3. Użyj węzłów **Watch3D**, aby wyświetlić podgląd dwóch różnych wyników. Pierwszy pokazuje wynik bez odwróconej listy. Linie łączą się pionowo z sąsiednimi punktami. Natomiast odwrócona lista powoduje połączenie wszystkich punktów w kolejności odwrotnej na drugiej liście.

### List.ShiftIndices <a href="#listshiftindices" id="listshiftindices"></a>

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Węzeł **List.ShiftIndices** jest dobrym narzędziem do tworzenia skrętów lub wzorców śrubowych albo do innych podobnych manipulacji danymi. Ten węzeł przesuwa elementy na liście o podaną wartość indeksu.

\![Ćwiczenie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20shiftIndices%2001.jpg)

> 1. W tym samym procesie, w którym występuje odwrócona lista, wstaw węzeł **List.ShiftIndices** do węzłów **Curve.PointAtParameter** i **Line.ByStartPointEndPoint**.
> 2. Używając węzła **Code Block**, określ wartość „1”, aby przesunąć listę o jeden indeks.
> 3. Zauważmy, że zmiana jest subtelna, ale wszystkie linie w dolnym węźle **Watch3D** przesunęły się o jeden indeks podczas łączenia się z drugim zestawem punktów.

Po zmianie wartości w węźle **Code Block** na większą, na przykład *„30”*, zauważamy znaczną różnicę w liniach ukośnych. W tym przypadku przesunięcie działa jak obiektyw aparatu, tworząc skręt w oryginalnej formie walcowej.

!

### List.FilterByBooleanMask <a href="#listfilterbybooleanmask" id="listfilterbybooleanmask"></a>

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

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

Węzeł **List.FilterByBooleanMask** usuwa niektóre elementy w oparciu o listę wartości logicznych lub wartości odczytywanych jako „true” lub „false”.

\![Ćwiczenie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20filter%20by%20bool%20mask.jpg)

Aby utworzyć listę wartości odczytywanych jako „true” lub „false”, musimy wykonać nieco więcej pracy.

> 1. Używając węzła **Code Block**, zdefiniuj wyrażenie ze składnią: `0..List.Count(list);`. Połącz węzeł **Curve.PointAtParameter** z wejściem *list*. Przeanalizujemy tę konfiguracje dokładniej w rozdziale dotyczącym węzła Code Block, ale wiersz kodu w tym przypadku tworzy listę reprezentującą każdy indeks węzła **Curve.PointAtParameter**.
> 2. Używając węzła ***%***\*\* (moduł)\*\*, połącz wyjście węzła *Code Block* z wejściem *x* oraz wartość *4* z wejściem *y*. Spowoduje to zwrócenie reszty z dzielenia listy indeksów przez 4. Węzeł modułu jest bardzo przydatny podczas tworzenia szyku. Wszystkie wartości będą odczytywane jako możliwe reszty z dzielenia przez 4, czyli 0, 1, 2 i 3.
> 3. Na podstawie węzła ***%***\*\* (moduł)\*\* wiemy, że wartość 0 oznacza, iż indeks jest podzielny przez 4 (0, 4, 8 itd...). Za pomocą węzła **==** możemy sprawdzić tę dzielność, testując tę pozycję pod kątem wartości *„0”*.
> 4. Węzeł **Watch** pokazuje tylko, że mamy wzorzec true/false, który wygląda następująco: *true,false,false,false...*.
> 5. Używając tego wzorca true/false, utwórz połączenie z wejściem mask dwóch węzłów **List.FilterByBooleanMask**.
> 6. Połącz węzeł **Curve.PointAtParameter** z każdym wejściem list węzła **List.FilterByBooleanMask**.
> 7. Wyjścia węzła **Filter.ByBooleanMask** to *„in”* oraz *„out”*. Wyjście *„in”* reprezentuje wartości, które miały wartość maski *„true”*, a wyjście *„out”* — wartość maski *„false”*. Podłączając wyjścia *„in”* do wejść *startPoint* i *endPoint* węzła **Line.ByStartPointEndPoint**, utworzyliśmy przefiltrowaną listę linii.
> 8. Węzeł **Watch3D** pokazuje, że mamy mniej linii niż punktów. Wybraliśmy tylko 25% węzłów, filtrując tylko wartości true.
