# Funkce

Funkce lze vytvořit v bloku kódu a lze je znovu načíst jinde v definici aplikace Dynamo. Tím se vytvoří další hladina ovládacího prvku v parametrickém souboru a lze ji zobrazit jako textovou verzi vlastního uzlu. V tomto případě je „nadřazený“ blok kódu snadno dostupný a může být umístěn kdekoli na grafu. Nepotřebuje žádné dráty!

### Nadřazený blok kódu

První řádek obsahuje klíčové slovo „def“, pak název funkce a názvy vstupů v závorkách. Závorky definují tělo funkce. Vrátí hodnotu s „return =“. Uzly bloku kódu, které definují funkci, nemají vstupní nebo výstupní porty, protože se volají z jiných uzlů bloku kódu.

!

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

### Podřazené bloky kódu

Volejte funkci s jiným uzlem bloku kódu ve stejném souboru, a to poskytnutím stejného názvu a stejného počtu argumentů. Funguje stejně uzly v knihovně.

!

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

## Cvičení: Koule podle Z

> Kliknutím na odkaz níže si stáhněte vzorový soubor.
>
> Úplný seznam vzorových souborů najdete v dodatku.

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

V tomto cvičení vytvoříme obecnou definici, která vytvoří koule ze vstupního seznamu bodů. Poloměr těchto koulí je řízen vlastností Z každého bodu.

Začneme řadou deseti hodnot v rozsahu od 0 do 100. Tyto položky můžete vložit do uzlů **Point.ByCoordinates** za účelem vytvoření diagonální úsečky.

!

Vytvořte **blok kódu** a vložte naši definici.

!

> 1. Použijte tyto řádky kódu:
>
>    ```
>    def sphereByZ(inputPt)
>    {
>
>    };
>    ```
>
> *InputPt* je název, který jsme zadali k reprezentaci bodů, které budou řídit funkci. Zatím funkce nic nedělá, ale v následujících krocích ji rozšíříme.

!

> 1. Přidáme-li funkci **bloku kódu**, umístíme komentář a proměnnou *sphereRadius*, která dotazuje pozici *Z* každého bodu. Nezapomeňte, že metoda *inputPt.Z* nevyžaduje jako metoda závorky. Toto je *dotaz* vlastností existujícího prvku, takže nejsou nutné žádné vstupy:
>
> ```
> def sphereByZ(inputPt,radiusRatio)
> {
> //get Z Value, ise ot to drive radius of sphere
> sphereRadius=inputPt.Z;
> };
> ```

!

> 1. Nyní si připomeňme funkci, kterou jsme vytvořili v jiném **bloku kódu**. Pokud dvakrát klikneme na kreslicí plochu a vytvoříme nový *blok kódu* a zadáme jej do položky *sphereB*, všimneme si, že aplikace Dynamo navrhne funkci *sphereByZ*, kterou jsme definovali. Vaše funkce byla přidána do knihovny intellisense. Působivé.

!

> 1. Nyní zavoláme funkci a vytvoříme proměnnou s názvem *Pt*, která bude zahrnovat body vytvořené v dřívějších krocích:
>
>    ```
>    sphereByZ(Pt)
>    ```
> 2. Ve výstupu si všimneme, že máme všechny hodnoty null. Jak je to možné? Když jsme definovali funkci, vypočítali jsme proměnnou *sphereRadius*, ale nedefinovali jsme, co by měla funkce *vrátit* jako *výstup*. To můžeme opravit v dalším kroku.

!

> 1. Důležitý krok je, abychom definovali výstup funkce přidáním řádku `return = sphereRadius;` do funkce *sphereByZ*.
> 2. Nyní vidíme, že výstupem bloku kódu jsou souřadnice Z každého bodu.

Nyní vytvoříme skutečné koule úpravou *nadřazené* funkce.

!

> 1. Nejprve definujeme kouli pomocí řádku kódu: `sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);`
> 2. Dále změníme návratovou hodnotu na *sphere* místo *sphereRadius*: `return = sphere;`. Díky tomu uvidíme v náhledu aplikace Dynamo obří koule!

!

> 1\. Chcete-li zmírnit velikost těchto koulí, aktualizujte hodnotu sphereRadius přidáním oddělovače: `sphereRadius = inputPt.Z/20;`. Nyní můžeme vidět jednotlivé koule a začít chápat vztah mezi poloměrem a hodnotou Z.

!

> 1. V uzlu **Point.ByCoordinates** změnou vázání z možnosti Nejkratší seznam na Kartézský součin vytvoříme osnovu bodů. Funkce *sphereByZ* je stále plně funkční, takže všechny body vytvářejí koule s poloměry na základě hodnot Z.

!

> 1. A jen tak na zkoušku připojíme původní seznam čísel do vstupu X uzlu **Point.ByCoordinates**. Teď máme krychli koulí.
> 2. Poznámka: Pokud výpočet trvá na vašem počítači dlouhou dobu, zkuste změnit číslo *#10* na hodnotu *#5*.

Pamatujte, že funkce *sphereByZ*, kterou jsme vytvořili, je obecná funkce, takže můžeme vyvolat šroubovici z předchozí lekce a použít na ni tuto funkci.

!

Jeden poslední krok: Pojďme řídit poměr poloměru s uživatelem definovaným parametrem. Chcete-li to udělat, je nutné vytvořit nový vstup pro funkci a také nahradit rozdělovač *20* parametrem.

!

> 1. Aktualizujte definici *sphereByZ* na:
>
>    ```
>    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. Aktualizujte podřazené **bloky kódu** přidáním proměnné ratio ke vstupu: `sphereByZ(Pt,ratio);`. Připojte posuvník k nově vytvořenému vstupu **bloku kódu** a změňte velikost poloměrů podle poměru poloměrů.


---

# 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/cs/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.
