# Funkcje

W bloku kodu można tworzyć funkcje, a następnie można je ponownie wywoływać w innym miejscu w definicji dodatku Dynamo. Powoduje to utworzenie innej warstwy sterującej w pliku parametrycznym. Można to postrzegać jako wersję tekstową węzła niestandardowego. W tym przypadku „nadrzędny” blok kodu jest łatwo dostępny i może być umieszczony w dowolnym miejscu na wykresie. Nie są potrzebne żadne przewody.

### Parent

Pierwszy wiersz zawiera słowo kluczowe „def”, następnie nazwę funkcji, a następnie nazwy danych wejściowych w nawiasach. Klamry definiują treść funkcji. Wartość jest zwracana za pomocą instrukcji „return =”. Bloki kodu, które definiują funkcję, nie mają portów wejściowych ani wyjściowych, ponieważ są wywoływane z innych bloków kodu.

!

```
/*This is a multi-line comment,
which continues for
multiple lines*/
def FunctionName(in1,in2)
{
//This is a comment
sum = in1+in2;
return sum;
};
```

### Podrzędne

Wywołaj funkcję w innym bloku kodu w tym samym pliku przez podanie nazwy i takiej samej liczby argumentów. Działa to tak jak w przypadku gotowych węzłów w bibliotece.

!

```
FunctionName(in1,in2);
```

## Ćwiczenie: kula według osi Z

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

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

W tym ćwiczeniu zostanie utworzona ogólna definicja, która utworzy sfery z wejściowej listy punktów. Promień tych sfer zależy od właściwości Z każdego punktu.

Zacznijmy od przedziału liczbowego dziesięciu wartości z zakresu od 0 do 100. Podłącz je do węzłów **Point.ByCoordinates**, aby utworzyć linię przekątną.

!

Utwórz węzeł **Code Block** i wprowadź naszą definicję.

!

> 1. Użyj następujących wierszy kodu:
>
>    ```
>    def sphereByZ(inputPt)
>    {
>
>    };
>    ```
>
> *inputPt* to nazwa, którą nadaliśmy reprezentacji punktów sterujących funkcją. Na razie funkcja niczego nie robi, ale w kolejnych krokach ją skonstruujemy.

!

> 1. Dodając elementy do funkcji **Code Block**, umieścimy komentarz i zmienną *sphereRadius*, która wysyła zapytanie o położenie *Z* każdego punktu. Pamiętaj, że *inputPt.Z* nie wymaga nawiasów jak metoda. Jest to *zapytanie* o właściwości istniejącego elementu, dlatego żadne dane wejściowe nie są konieczne:
>
> ```
> def sphereByZ(inputPt,radiusRatio)
> {
> //get Z Value, ise ot to drive radius of sphere
> sphereRadius=inputPt.Z;
> };
> ```

!

> 1. Teraz przypomnijmy sobie funkcję, którą utworzyliśmy w innym węźle **Code Block**. Jeśli dwukrotnie klikniemy obszar roboczy, aby utworzyć nowy węzeł *Code Block*, i wpiszemy *sphereB*, dodatek Dynamo zasugeruje zdefiniowaną przez nas wcześniej funkcję *sphereByZ*. Funkcja została dodana do biblioteki intellisense. To przydatne.

!

> 1. Teraz wywołamy tę funkcję i utworzymy zmienną o nazwie *Pt*, aby podłączyć punkty utworzone w poprzednich krokach:
>
>    ```
>    sphereByZ(Pt)
>    ```
> 2. Wszystkie wyjścia mają wartości null. Dlaczego tak jest? W definicji funkcji obliczamy zmienną *sphereRadius*, ale nie zdefiniowaliśmy, co funkcja powinna *zwracać* na *wyjściu*. Możemy to naprawić w następnym kroku.

!

> 1. Ważnym krokiem jest zdefiniowanie wyjścia funkcji przez dodanie wiersza `return = sphereRadius;` do funkcji *sphereByZ*.
> 2. Teraz na wyjściu węzła Code Block pojawiają się współrzędne Z każdego punktu.

Teraz utworzymy właściwe sfery, edytując funkcję *nadrzędną*.

!

> 1. Najpierw zdefiniujemy sferę za pomocą wiersza kodu: `sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);`
> 2. Następnie zmienimy zwracaną wartość na *sphere* zamiast *sphereRadius*: `return = sphere;` To pozwoli nam uzyskać kilka gigantycznych sfer w podglądzie Dynamo.

!

> 1\. Aby zwiększyć rozmiar tych sfer, zaktualizuj wartość sphereRadius dodając dzielnik: `sphereRadius = inputPt.Z/20;` Teraz możemy dostrzec osobne sfery i zrozumieć związek między wartością promienia a wartością Z.

!

> 1. W węźle **Point.ByCoordinates** tworzymy siatkę punktów, zmieniając skratowanie z Shortest List na Cross Product. Funkcja *sphereByZ* nadal w pełni działa, dlatego wszystkie punkty tworzą sfery z promieniami na podstawie wartości Z.

!

> 1. Aby przetestować rozwiązanie, podłączymy oryginalną listę liczb do wejść X węzła **Point.ByCoordinates**. Mamy teraz sześcian sfer.
> 2. Uwaga: jeśli obliczenia na komputerze trwają długo, spróbuj zmienić *#10* na wartość typu *#5*.

Pamiętaj, że utworzona przez nas funkcja *sphereByZ* to funkcja ogólna, więc możemy przywołać helisę z wcześniejszej lekcji i zastosować do niej tę funkcję.

!

Ostatni krok: sterowanie współczynnikiem promienia za pomocą parametru zdefiniowanego przez użytkownika. Aby to zrobić, należy utworzyć nowe wejście dla tej funkcji, a także zastąpić dzielnik *20* parametrem.

!

> 1. Zaktualizuj definicję funkcji *sphereByZ* do postaci:
>
>    ```
>    def sphereByZ(inputPt,radiusRatio)
>    {
>    //get Z Value, use it to drive radius of sphere
>    sphereRadius=inputPt.Z/radiusRatio;
>    //Define Sphere Geometry
>    sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
>    //Define output for function
>    return sphere;
>    };
>    ```
> 2. Zaktualizuj podrzędne węzły **Code Block**, dodając do wejścia zmienną ratio: `sphereByZ(Pt,ratio);`. Podłącz suwak do nowo utworzonego wejścia węzła **Code Block** i zmieniaj rozmiar promieni na podstawie współczynnika promienia.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/pl/8_coding_in_dynamo/8-1_code-blocks-and-design-script/4-functions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
