Nacházíte se zde: Rhino3D.cz > Články > Rhinoceros > RhinoScript 2. díl: Skripty


RhinoScript 2. díl: Skripty

Publikováno: 22.6.2005 | Autor: David Rutten | Rubrika: Rhinoceros | Komentáře: 2 - Doporučit

Rhino Script - úvodOmezení maker, která jsme probrali v předchozím dílu, vedla k vývoji skriptovacích jazyků. Na rozdíl od skriptů mohou makra provádět matematické operace, reagovat na různé podmínky a umožňují interakci s uživatelem. Skripty navíc mají schopnost řídit svůj ’tok’. Makra oproti tomu pouze „přehrávají“ jeden řádek po druhém. Proto se skripty chovají dynamicky. Protože však nemusí být nutně dynamické, neexistuje nic, co byste mohli udělat s makrem a neudělali se skriptem.

2 Skripty

2.1 Skripty obecně

Omezení maker, která jsme probrali v předchozím dílu, vedla k vývoji skriptovacích jazyků. Na rozdíl od skriptů mohou makra provádět matematické operace, reagovat na různé podmínky a umožňují interakci s uživatelem. Skripty navíc mají schopnost řídit svůj 'tok'. Makra oproti tomu pouze „přehrávají" jeden řádek po druhém. Proto se skripty chovají dynamicky. Skripty jsou roboti. Ale protože skripty nemusí být nutně dynamické, neexistuje nic, co byste mohli udělat s makrem a přitom nemohli udělat se skriptem.

Samozřejmě je zde více přídavných funkcí, které dělají skript složitějším. Během let spatřilo světlo světa množství skriptovacích jazyků. Python, vbScript, Java, ActionScript, Perl a Lisp jsou jenom některé z nich. Naštěstí pro nás budeme pracovat s Rhinocerem, 3D modelářem pro Windows, který využívá verzi skriptovacího jazyka Basic z názvem vbScript (visual-basic script). Je to jeden z nejsnadnějších a nejtolerantnějších jazyků.

Každý skriptovací jazyk musí řešit následující zadání:

  • řízení toku (přeskakování a opakování řádků)
  • řízení proměnných (logické a matematické operace - ukládání dat)
  • vstup a výstup (interakce s uživatelem)

Způsob, jakým jazyky s tímto zadáním zachází, nazýváme syntaxe. Syntaxe je soustava pravidel, která definují co je a co není platné:

"Es gibt hier keine Apfelstrudel" - platné
"Es gibt hier keine apfelstrudel" - neplatné
"Keine Apfelstrudel gibt es hier" - platné
"Apfelstudel gibt es keine hier" - neplatné
"Es gibt here keine Apfelstrudel" - neplatné

Výše vidíte kontrolu platnosti z hlediska pravidel syntaxe německého jazyka. První a třetí věta je napsána platnou němčinou, zbývající nikoliv. Ve větách jsou však chyby různé závažnosti...
Každý porozumí druhému řádku, i když na začátku slova "Apfel" není velké písmeno. Čtvrtý a pátý řádek obsahují mnohem větší chyby, chybné pořadí slov a dokonce slovo z jiného jazyka.

Ačkoliv většina z nás je dostatečně zkušená na to abychom porozuměli všem pěti řádkům, počítač tak chytrý není. Již dříve jsem zmínil, že vbScript je tolerantní jazyk. To znamená, že dokáže zachytit malé chyby ve své syntaxi. vbScript nebude mít problémy při čtení druhé věty. Naproti tomu Java by vygenerovala chybu a ukončila by provádění skriptu.

Je tedy nutné, abychom se naučili syntaxi vbScriptu. Pouze pokud se naučíme přesně psát a číst jazyk vbScript, můžeme se pustit do logických problémů v našich skriptech.

2.2 Syntaxe vbScriptu

vbScript má podobně jako některé jiné programovací jazyky pevné kořeny v angličtině. To znamená, že při čtení je velice snadné pochopit kód vbScriptu, ale také to znamená, že je velice těžké tento kód optimalizovat. Proto bude vbScript vždy pomalejší než C(++) nebo Java script.

Jak už bylo zmíněno, musí syntaxe podporovat tři věci:

  • řízení toku
  • použití proměnných
  • vstup/výstup

2.3 Řízení toku

Řízení toku ve vbScriptu používáme k přeskakování určitých řádků kódu nebo k vykonání jiných řádků více než jednou. Řízení toku lze také využít ke skoku na jiné řádky ve skriptu a poté zase zpět. V makru nemáte jinou volbu než vykonat postupně všechny řádky. Ve vbScriptu můžete do svého kódu přidat podmíněné příkazy, které vám umožní odstínit určité části kódu. Struktury If..Then..Else a Select..Case jsou příklady takových podmíněných příkazů:

Musíte být vysocí alespoň 1.6 m abyste mohli jet na horské dráze.

Řádek 'kódu' používá podmínku (vysocí alespoň 1.6 m) k vyhodnocení, zda můžete projít.
Místo přeskakování můžete řádky také opakovat. Lze to provádět pevným počtem opakování:

Přidejte 5 čajových lžiček skořice.

Nebo můžeme opět použít vyhodnocení podmínky:

Přidávejte mléko, dokud není těsto vláčné.

Opakování řádků říkáme v programovacím slangu také cyklus (looping). K dispozici je několik typů cyklů, ale všechny pracují zhruba podobně. Později si jich všimneme podrobněji.

2.4.1 Proměnné

Když chceme aby byl kód dynamický, musíme zajistit, aby uměl řešit všechny druhy různých situací. Abychom to mohli provést, potřebujeme ukládat proměnné. Chceme například uložit výběrovou množinu křivek v našem 3D modelu, abychom později tyto křivky mohli opět vybrat. Nebo můžeme chtít, aby skript nakreslil úsečku, která propojí pozici ukazatele myši s počátkem 3D scény. A nebo můžeme chtít zkontrolovat aktuální datum a zjistit, zda nevypršelo zkušební období našeho programu. Žádné z těchto informací samozřejmě v době psaní skriptu k dispozici nemáme.
Vždy, když potřebujeme uložit data nebo provést výpočty nebo logické operace, potřebujeme proměnné, které si „zapamatují" výsledky. Protože jsou tyto operace dynamické, nemůžeme je do skriptu přidat před jejich vykonáním.

Existuje několik typů proměnných, ale my budeme nyní pracovat pouze se čtyřmi z nich:

  • long (celá čísla, anglicky také integer)
  • double (reálná čísla)
  • booleovská (logické hodnoty)
  • řetězec (řetězec)

2.4.2 Proměnné typu long a double

Long a double jsou numerické proměnné. To znamená, že uchovávají čísla. Nemohou uchovávat text, obrázky ani nic jiného - pouze čísla. Proměnné typu long a double se používají hlavně při výpočtech, ale mohou také reprezentovat geometrii. Například souřadnice 3.6,4,0 obsahuje 3 numerické proměnné pro x, y a z.
Protože jsou proměnné uchovávány jako bity a bajty, mají všechny určitý rozsah. Například jeden bit může nabývat pouze hodnot 0 nebo 1. Bajt se skládá z 8 bitů a můžete mu přiřadit 256 různých hodnot.

Proměnná typu long je 32-bitová a může uchovávat jakékoliv celé číslo z intervalu:

[-2,147,483,648 +2,147,483,647]

Nemůže uchovávat desetinná čísla jako 3.2 nebo 2.1316556. Proměnné typu long obvykle používáme pro počítání množství a pro hrubé výpočty.

Proměnná typu double je také 32-bitová, ale protože uchovává čísla jiným způsobem, může nabývat mnohem většího rozsahu:

[-1.79769313486232 × 10308 až -4.94065645841247 × 10-324]
[+4.94065645841247 × 10-324 až +1.79769313486232 × 10308]
0 (nula)

To vypadá velice složitě, ale vy potřebujete vědět pouze to, že v proměnné typu double může uchovat jakékoliv číslo. Důvodem proč stále používáme proměnné typu long je, že někdy nemá použití desetinných hodnot smysl.

Syntaxe vbScriptu pro práci s numerickými proměnnými by vám měla být známá:

x = 15 + 26
x = 15 + 26 * 2.33
x = Sin(15 + 26) + Sqr(2.33)
x = Tan(15 + 26) / Log(55)

Numerické proměnné lze samozřejmě použít také na pravé straně rovince:

x = x+1

Tento řádek kódu zvýší aktuální hodnotu proměnné x o jedničku.

2.4.3 Booleovské proměnné

Numerické proměnné mohou uchovávat celý rozsah různých čísel. Booleovské proměnné mohou uchovávat pouze dvě hodnoty, nejčastěji označované jako ano nebo ne, pravda (true) nebo nepravda (false).

Booleovské proměnné samozřejmě nikdy nepoužíváme k provádění výpočtů, na to mají příliš omezený rozsah. Používáme je k vyhodnocení podmínek ....... vzpomínáte?

Musíte být vysocí alespoň 1.6 m abyste mohli jet.

V této větě je podmínka "vysocí alespoň 1.6 m". Tato podmínka je buď pravda nebo nepravda. Buď jste nižší než 1.6m nebo vyšší.

Protože většina kódu, který řídí tok skriptu, vychází z podmíněných příkazů, hrají booleovské proměnné velice důležitou roli. Podívejme se na ukázku cyklu:

Přidávejte mléko, dokud není těsto vláčné.

Podmínkou zde je, aby bylo těsto vláčné. Předpokládejme na chvíli, že jsme do našeho skriptu přidali něco (algoritmus), co vyhodnotí aktuální konzistenci těsta. Prvním krokem by tedy bylo použití tohoto algoritmu, abychom věděli, zda máme nebo nemáme přidat mléko. Pokud náš algoritmus vrátí hlášení "těsto není vláčné" (nepravda - false), budeme muset přidat trochu mléka. Po přidání mléka se budeme muset znovu zeptat a tyto kroky opakovat do té doby, než algoritmus odpoví, že je těsto vláčné (pravda - true). Tak budeme vědět, že již není potřeba přidávat mléko a můžeme přejít na další krok výroby našeho Apfelstrudelu :-)

Ve vbScriptu nikdy nepíšeme "0" nebo "1", vždy používáme "vbTrue" (pravda) a "vbFalse" (nepravda). Předpona 'vb' znamená, že toto slovo je součástí systému vbScriptu a není definováno námi. O konvencích názvů si povíme později.

2.4.4 Řetězce

Řetězce se používají k uchování alfanumerických proměnných. Ty také známe jako text. Řetězce vždy začínají a končí uvozovkami. Vše uvnitř uvozovek je vždy bráno jako text. Pokud tedy uzavřeme číslo do uvozovek, stane se textem. Řetězce nemají žádné omezení délky. Do jediné řetězcové proměnné byste mohli vměstnat třeba celou Bibli... S řetězci nelze provádět výpočty. Používáme je většinou pro ukládání vstupně/výstupních informací a názvů (objektů). Syntaxe řetězců je zcela jednoduchá:

a = "Apfelstrudel"
a = "Apfel" & "strudel"

Oba výše uvedené řádky přiřadí proměnné a identický obsah.

a = "4"
a = "4" & " " & "Apfelstrudel"
a = "Hodnota, kterou jste chtěli znát, je: " & 46.112

(všimněte si, že ve vbScriptu můžeme řetězci přiřadit číselnou hodnotu, ale nikdy ne naopak! Znak ampersand '&' se používá pro spojení několika proměnných do jednoho řetězce).

Přeložil Jan Slanina

Nahoru ↑

Diskuse k článku

  • [2] Jan Slanina29. 01. 2007, 14:17 – reakce na [1]

    reagovat

    Ta němčina je tam záměrně, originální text byl totiž anglicky a ta němčina byla zvolena proto, aby byla ukázána syntaxe na jiném jazyku než angličtině.

  • [1] JJJ – 29. 01. 2007, 12:54

    Reaguje: [2] - reagovat

    Lokalizované? Zrovna ty příklady chybné syntaxe by nemusely být v němčině.