Ein Skript in 5 Minuten

Wenn ich das jetzt richtig sehe, dann dauert es ab jetzt nicht mehr lange und
ein neues Skript wird geboren :-)
Viel Spaß

Ich gehe mal davon aus, daß, wer auch immer dies jetzt liest schon mal ein Skript mit Monzoom verwendet hat.
Daher kann ich mir es wohl sparen, zu erzählen, daß man doch einiges damit anstellen kann.Objekte erstellen,
Objekte vernichten, Objekte bearbeiten, Szenen laden, Szenen speichern, Szenen wieder schließen,
Animationen erstellen, neue Funktionen und Effekte schreiben.Wenn einer von euch mal
ein bisschen Zeit hat, dann kann er diese Liste ja weiterführen. Im Allgemeinen gilt:
Je mehr ihr euch ausdenken könnt, desto mehr ist realisierbar und desto
weiter entwickelt sich Monzoom - auch ohne Oberland.

Los geht's:

Ein Monzoom-Skript ist eine normale Textdatei. Nur hat sie nicht die Endung *.txt, sondern:
*.men, *.afx, *.tol, *.skr
"*.men"-Skripts werden in das Verzeichnis \monzoom\Skripts\ gespeichert.
Ich persönlich schreibe immer im Editor (notepad). Um die Datei mit der einer dieser Endungen zu
speichern muß man Dateinamen und Dateiendung in Anführungsstrichen schreiben. (z.B.: "hallowelt.men")

In diesem Tutorial werde ich, da es sich ja um einen Einstieg in die Monzoom-Skriptsprache handelt, nur auf
die Skripts mit der Endung men eingehen. Dies sind die Skripts, die normalerweise über das 'S' im Monzoom-
Fenster aufgerufen werden. (Oder über das Skript-Starter Plugin von Thomas Kunert)

Genug erzählt: Kommen wir nun zum ersten Skript mit Monzoom.

In den Quelltext-Beispielen in diesem Tutorial verwende ich verschieden Farben, um Veränderungen
deutlich zu machen. Die Farben bedeuten folgendes:

(schwarz) -alter Text (war auch schon vorher da)
(grün) -neuer Text (ist erst in diesem Schritt dazugekommen)
(rot) -veränderter Text (Die Zeile wurde in diesem Schritte verändert)

Monzoom erkennt eine Datei erst dann als Skript an, wenn es hinten eine der oben genannten Endungen hat, und
wenn in der ersten Zeile das Wort : REFSKRIPT steht. Daraufhin weiß Monzoom, daß es eine Skriptdatei vor
sich hat, die jetzt ausgeführt werden soll.

1
Wir schreiben also REFSKRIPT in die erste Zeile:
 
REFSKRIPT
Damit Monzoom weiß, daß das Skript beendet wurde gibt man mit RETURN 1 eine 1 an Monzoom zurück.
Weitere Informationen zu RETURN findet man in der Monzoom-Skriptdoku, die bei Monzoom dabei ist.
Für uns ist jetzt allerdings nur wichtig, daß wir das Skript mit RETURN 1 beenden können.

2
Wie schreiben also RETURN 1 ans Ende der Datei:
 
REFSKRIPT 

RETURN 1

Jetzt haben wir schon ein vollwertiges Skript fertig. Monzoom hat keinen Grund sich zu beschweren. Das einzige,
was uns an dem Skript noch stört ist möglicherweise die Tatsache, daß es nichts macht. Diese Anweisungen/Befehle
schreiben wir zwischen REFSKRIPT und RETURN 1

Ganz grob sieht ein Skript also folgendermaßen aus:
 
REFSKRIPT 

Anweisungen/Befehle

RETURN 1

Wir wollen nun ein ganz einfaches Skript schreiben. Oft ist das erste Programm, was man in einer neuen Programmiersprache
schreibt das berühmte: "Hallo Welt - Programm".
Dieses Programm soll nichts anderes machen, als ein einfaches "Hallo Welt" auf den Bildschirm zu zaubern.

  
REFSKRIPT 

print Hallo Welt

RETURN 1

Das war's auch schon. Der Befehl 'print' weist Monzoom an, einen Text oder eine Zahl in der Statuszeile von
Monzoom auszugeben.(ganz unten im Monzoomfenster)

Nun speichern wir die Datei unter dem Namen "meinskript.men" in das Verzeichnis "...\monzoom\Skripts\" und
starten Monzoom. Wenn wir das Skript ausführen, dann erscheint unten der Text "Hallo Welt". Dieser Befehl
macht zwar nichts weltbewegendes, aber man kann ihn gut gebrauchen, um Informationen (z.B. über den
Fortschritt bei komplizierteren Berechnungen) auszugeben.

Nun wollen wir aber dazu kommen, uns ein 'wirklich sinnvolles' Skript zu schreiben. ;-)
Das Skript soll einen Quader erstellen - und zwar anhand der Angaben des Benutzers.

Dazu brauchen wir als erstes die Angaben des Benutzers.Wir müssen Monzoom also dazu bringen, den Benutzer
nach den Werten zu fragen, die wir später brauchen.
Als erstes wollen wir einen Namen für den Quader erfragen. Wir könnten im Skript auch selber einen Namen für das
neue Objekt wählen, aber dieser könnte dem Benutzer nicht gefallen, und wir wollen ja benutzerfreundlich bleiben ;-))

Um diese Abfrage zu starten benutzen wir den Befehl: GET_STRING
Dieser Befehl, der ja soviel heißt, wie "Hole einen String", läßt ein Fenster erscheinen, in das der Benutzer einen String eingeben
kann. Ein String ist in Programmiersprachen ein Text (Also bei uns das Wort, das als Name dienen soll - ein String kann
natürlich auch Zahlen enthalten).
Für das Fenster können wir uns auch noch eine Frage überlegen, damit der Benutzer überhaupt weiß, was er eintragen soll.

Das ganze sieht dann z.B.: so aus:
 
REFSKRIPT 

GET_STRING Wie soll der Quader heißen ?

RETURN 1

Um an die Eingabe des Benutzers heranzukommen brauchen wir den Befehl GET_RESULT
Monzoom gibt das, was der Benutzer eingegeben hat an das Skript zurück. Wir müssen es uns mit GET_RESULT nur nehmen.
Da wir den Wert hinterher ja verwenden wollen, müssen wir den Wert in eine Variable speichern. Eine Variable ist eine Art
'virtueller Behälter' für Daten. Wir müssen uns an dieser Stelle einen Namen für die Variable ausdenken. Hinterher können wir den
Wert, den wir in dieser Variable gespeichert (oder: dieser Variable zugewiesen haben)haben unter ihrem Namen immer wieder
ansprechen. Es ist daher ratsam einen Namen zu wählen, der Sinn macht. Wir (oder zumindest ich) entscheiden uns hier für 'quadername'.
Natürlich würde es auch mit 'jkhhlkh' funktionieren, aber da weiß man hinterher nicht mehr unbedingt, wofür diese Variable nun
gut war. Die Variable müssen wir hinter dem Befehl GET_RESULT angeben.

Wir speichern also den Wert, den wir zurückerhalten haben, mit GET_RESULT in die Variable: quadername
 
REFSKRIPT 

GET_STRING Wie soll der Quader heißen ? 
GET_RESULT quadername

RETURN 1

Da wir den Quader ja gemäß der Angaben des Benutzers erstellen wollen, wäre es nun gut den Benutzer zu fragen, welche Seiten-
längen der Quader denn haben soll. Da der Benutzer hier möglicherweise eine Zahl mit 'Komma' eingeben wird, verwenden wir
den Befehl: GET_REAL. Vom Prinzip funktioniert das genauso, wie GET_STRING. Nur heißt das diesmal nicht:
"Hole einen String', sondern 'Hole einen Real-Wert', also eine Zahl, die auch ein Komma enthalten darf.
(Wenn man sich ganz sicher ist, daß der Benutzer keine Komma-Zahl angeben wird, dann kann man auch den Befehl GET_INT
verwenden, was dann soviel heißt, wie: 'Hole einen Integer-Wert' - aber dazu später mehr.)

Hinter GET_REAL kann man dann noch eine Frage angeben. In der Monzoom-Skriptdokumentation sieht die Beschreibung der
Art, wie der Befehl geschrieben wird dann so aus: GET_REAL <frage> .
Wir nehmen also den neuen Befehl GET_REAL und verwenden ihn, um den Benutzer nach dem Wert für die x-Ausdehnung des
Quaders (den das Skript ja erstellen soll) zu fragen. Als Frage sollte "Welche x-Ausdehnung?" wohl ausreichen. :-)
So verwenden wir den Befehl dann im Skript:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?

RETURN 1

Genau, wie bei GET_STRING, müssen wir uns den Wert, der vom Benutzer eingegeben wurde nun erst mit GET_RESULT abholen:
Auch jetzt benötigen wir wieder eine Variable, in der der Wert gespeichert wird. Ich nenne diese Variable in diesem Fall einfach
mal 'x'
Um den neuen Wert verwenden zu können, holen wir ihn uns mit GET_RESULT ab:
(hinter GET_RESULT wird wieder der Name den Variablen angegeben)
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

RETURN 1

Der Wert für die Ausdehnung des Quaders an der x-Achse ist uns jetzt also bekannt. Jetzt brauchen wir noch die Ausdehnung an der y-
und an der z-Achse.
Zum Glück können wir hier genauso vorgehen, wie bei der x-Achse. Wir denken uns also kurz die Variablen y und z aus und kopieren
den Block, der nach der x-Ausdehnung fragt und sie in die Variable x speichert, zweimal. Dann müssen wir nur noch die Fragen und die
Variablen so verändern, daß nicht mehr x verwendet wird, sondern y und z. Das sollte dann so aussehen:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

RETURN 1

Bisher haben wir immer Befehle verwendet, die dafür sorgen, daß wir irgendwelche Informationen bekommen. In unserem Fall waren dies:
ein String (der Name für den Quader) und drei Real-Werte (die Ausdehnung des Quaders an x-,y- und z-Achse.
Da wir immer Informationen geholt haben haben diese Befehle alle ein 'GET' im ersten Teil. Wenn man sich später die Liste der Befehle
in der Skriptdokumentation ansieht, dann findet man eine Große Anzahl von GET-Befehlen. Immer, wenn man etwas holen will, dann
wird der Befehl, der das macht mit GET anfangen. - Das kann die Suche nach dem Richtigen Befehl vereinfachen, ist jetzt aber nicht
weiter wichtig.

Jetzt wird es Zeit, etwas mit den Daten anzustellen, die wir erhalten haben. Da wir einen Quader erstellen wollen, verwenden wir folgenden
Befehl: DREI_QUADER
Dieser Befehl erstellt ein neues Dreiecksobjekt in der Form eines Quaders. In der Skriptdokumentation von Monzoom, wird der Befehl
 folgendermaßen Beschrieben:
 
DREI_QUADER <name> <dx> <dy> <dz>

Beschreibung: Erzeugt einen Quader aus Dreiecken. 
Parameter:     <name> Name des Quaders 
                     <dx> <dy> <dz> Ausmaße des Quaders 
Ergebnis: -

Das heißt dann folgendes: Der Befehl benötigt vier Angaben (<name> <dx> <dy> <dz>)
Unter dem Punkt Beschreibung wird die Funktion des Befehls beschrieben.
Unter Parameter werden die vier Angaben erklärt.
Ein Ergebnis gibt es nicht - das heißt, daß kein Wert zurückgeliefert wird, den wir mit
GET_RESULT abfragen könnten.

Zum Glück haben wir den Benutzer nach allen Angaben gefragt, die wir brauchen. Das, was er eingetippt hat, haben wir in verschiedenen
Variablen (quadername,x,y,z) gespeichert - Jetzt können wir das endlich gebrauchen !!! :-)
Wenn wir die Variablen in den DREI_QUADER - Befehl einsetzen, dann sieht das so aus:
DREI_QUADER quadername x y z
Das schreiben wir jetzt auch genau so in das Skript:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

DREI_QUADER quadername x y z

RETURN 1

Das Skript ist jetzt fertig. War doch gar nicht so wild, oder ?
Wir speichern das Skript jetzt wieder (wie schon am Anfang :"skriptname.men") und testen es in Monzoom :-)

Wir klicken also auf das S-Symbol im Hauptfenster und wählen das Skript aus (oder starten das Skript mit dem Skriptstarter-Plugin).
Dann geben wir den Namen und die anderen Werte ein. Wenn wir fertig sind, dann: - sehen wir nichts ! - das macht aber nichts.
Das neue Objekt ist nur nicht in der aktuellen PKL (Plotkörperliste). Wenn man das Objekt in der PKL aufnimmt, dann sieht man
sofort den fertigen Quader. - unglaublich - es hat geklappt.

Nun wollen wir dem Benutzer des Skripts aber nicht zumuten, daß er das neue Objekt immer persönlich in der PKL aufnehmen muß.
Deshalb sorgen wir dafür, daß das Skript auch dies übernimmt.
Dazu verwenden wir den Befehl PKL_ADD, was ja soviel heißt, wie 'zur PKL hinzufügen'. Hinter dem Befehl geben wir das Objekt an,
welches hinzugefügt werden soll. Das sollte im Skript dann so aussehen:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

DREI_QUADER quadername x y z

PKL_ADD quadername

RETURN 1

Nun speichern wir das Skript wieder ab, wechseln ins Monzoomfenster, löschen das alte Objekt und starten das Skript erneut.
Wenn die Fenster das nächste mal geplottet werden, dann ist das Objekt zu sehen - das Skript hat es in die PKL aufgenommen !!!

Das Skript funktioniert jetzt - man darf sich hier also getrost auf die Schulter klopfen.Nun folgt der zweite Teil des Tutorials. Hier wird
noch einiges an dem Skript verändert. Ein paar Dinge, die noch ausgelassen wurden, werden hier richtiggestellt und manches wird ausgedehnt.
Desweiteren gibt es noch eine kurze Hilfe, zum Auffinden der richtigen Befehle in der offiziellen Monzoom-Skript-Doku..
 

TEIL ZWEI
Und es geht weiter....

Oben haben wir gelesen, daß der Befehl DREI_QUADER keinen Wert zurückliefert - das ist nicht ganz korrekt. In Wirklichkeit liefert
der Befehl sogar einen sehr wichtigen Wert zurück.
Wenn wir das Skript zweimal ausführen und in beiden Fällen den gleichen Namen für den Quader eingeben, (z.B. 'klotz'), dann funktioniert
beim ersten Mal alles ganz normal. Das Objekt wird erstellt und und unter dem Namen 'klotz' in die PKL aufgenommen. Wenn wir das Skript
zum zweitem Mal aufrufen und wieder den Namen 'klotz' angeben, dann wird das Objekt nicht in die PKL aufgenommen und heißt auch nicht
'klotz' sondern 'klotz1'. Das liegt daran, daß zwei Objekte in Monzoom nicht den gleichen Namen haben dürfen. In der Skriptzeile:
PKL_ADD quadername
soll nun das Objekt mit dem Namen, der in der Variable quadername gespeichert ist in die PKL aufgenommen werden. In der Variable ist der
Wert 'klotz' gespeichert. Das Objekt hat allerdings den Namen 'klotz1' (weil es 'klotz' ja schon gibt).

Das Problem wird durch dem Wert(String) gelöst, den DREI_QUADER zurückliefert. Dieser String enthält den Namen, den das
Objekt wirklich bekommen hat - in unserem Fall wäre dies 'klotz1'. Den String können wir (wie immer) mit GET_RESULT abfragen.
Hinter GET_RESULT müssen wir natürlich auch wieder eine Variable angeben, in der der Rückgabewert (in diesem Fall der 'echte' Name
der Objekts= 'klotz1') gespeichert wird. Als Variable verwende ich hier einfach mal 'echter_name'.

Wir sollten dieses neue Wissen sofort anwenden. Wir ändern das Skript also folgendermaßen:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

DREI_QUADER quadername x y z
GET_RESULT echter_name

PKL_ADD quadername

RETURN 1

Damit das Objekt mit dem Namen, der in der Variablen echter_name , auch in die PKL aufgenommen wird, müssen wir auch noch die Zeile:

PKL_ADD quadername

verändern. Wir ersetzten die Variable 'quadername' einfach durch die Variable 'echter_name'. Das sollte dann so aussehen:

 
  
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

DREI_QUADER quadername x y z
GET_RESULT echter_name

PKL_ADD echter_name

RETURN 1

Das Skript hat jetzt kein Problem mehr damit, daß ein Anwender möglicherweise den gleichen Namen zweimal angibt.
Wunderbar - das Problem ist gelöst ! :-)

Besonders aufmerksamen Lesern dieses Tutorials ist es möglicherweise schon aufgefallen:
Das was das Skript macht, kann Monzoom schon vorher.

Ich muß zugeben, daß das stimmt. Aber eigentlich ist das ja auch nicht wirklich wichtig. Wenn man das kann, was bisher für
dieses Skript benötigt wurde, dann kann man sich den Rest der Skriptsprache sehr schnell erarbeiten.
Wir werden das Skript jetzt jetzt noch ein wenig verändern und uns dann dem generellen Umgang mit der Skriptsprache
zuwenden. Damit das Skript wenigstens etwas kann, was im Monzoom nicht schon standardmäßig möglich ist, werden wir
jetzt versuchen, das Skript so zu verändern, daß es mehrere Quader mit einem Mal erstellt. Natürlich könnte man den
folgenden Block
 
DREI_QUADER quadername x y z
GET_RESULT echter_name
PKL_ADD echter_name
mehrfach hintereinander schreiben. Das Skript würde dann mehrere Quader erstellen (z.B. 'klotz','klotz1','klotz2','klotz.....').
So etwas macht man aber nicht! Was würde man zum Beispiel machen, wenn der Benutzer vorher angeben soll, wieviele Quader
er erstellen möchte? Das wäre so nicht lösbar.
Die Lösung für dieses Problem sind Schleifen. Es gibt in Monzoom (soweit ich das weiß) keine 'echten' Schleifen. Man kann sich
aber selbst welche zusammenbauen. Dazu benötigen wir allerdings einige neue Befehle und andere Bestandteile der Monzoom-
Skriptsprache. Auch wenn es am Anfang vielleicht etwas verwirrend erscheinen mag, so lohnt es sich doch, den folgenden Teil des Tutorials
mit Sinn und Verstand durchzuarbeiten, da man mit den aufgeführten Mitteln einiges bewerkstelligen kann.


GOTO
GOTO ist ein Sprungbefehl. Wenn man einen Teil des Quelltextes überspringen will, dann kann man das mit GOTO erreichen.
Das Prinzip kann man am durch das folgende Beispiel gut verstehen:
 
REFSKRIPT 

GOTO dahinter

print Hallo Welt

>dahinter:

RETURN 1

Bei dem folgenden Skript passiert überhauptnichts. Die Zeile GOTO dahinter weist Monzoom an
erst nach der Zeile >dahinter: mit dem Skript fortzufahren. Alles, was dazwischen steht, wird einfach
ignoriert. Fürs Erste reicht es aber wohl zu wissen, daß man mit GOTO an eine Marke, die man selber
festgelegt hat, springen kann. Diese Marke bekommt einen Namen und wird in > und : eingefaßt. Hinter
GOTO steht allerdings nur der Name (ohne > und : ).

IF.........GOTO - Vergleichen mit Monzoom
In der Monzoomskriptsprache gibt's es einige 'IF-Konstruktionen'. Es reicht aber wohl hier eine zu erklären, da die anderen
nach dem gleichen Prinzip funktionieren. Hier eine Liste der IF-Konstruktionen:
 

IF_EQUAL_GOTO

IF_GREATER_GOTO

IF_LESS_GOTO

IF_NOT_EQUAL_GOTO

IF_STR_EQUAL_GOTO

IF_STR_NOT_EQUAL_GOTO

(IF_ABBRUCH_GOTO)

Diese Liste enthält alle Vergleichsmöglichkeiten, die Monzoom bietet.

Um herauszufinden, was die jeweilige 'IF-Konstruktionen' genau macht, sollte man sie am besten übersetzen - oder man sieht
einfach in der Skriptdokumentation nach ;-)

Als kurzer Tipp: Ich habe die obere Liste nach Funktion eingefärbt.
(blau) Vergleich von Zahlen
(gelb) Vergleich von Strings
(grün) Abbruch Ja oder Nein

Alle diese Vergleichsoperationen funktionieren nach dem gleichen Prinzip. IF_ABBRUCH_GOTO ist eine Ausnahme, die ich hier jetzt
weglasse. Hier geht es jetzt nur um den Vergleich von Zahlen und Strings.
Die IF-Vergleiche sind eine besondere Art von GOTO. Hinter der IF-Anweisung gibt man zwei Werte und eine Sprungmarke an.
Wenn die Anweisung WAHR wird, dann springt Monzoom an die angegebene Stelle im Skript.
Das folgende Beispiel verwendet IF_EQUAL_GOTO um dieses Prinzip zu verdeutlichen.
 
REFSKRIPT 

GET_REAL Bitte geben Sie eine 5 ein ? 
GET_RESULT zahl 

IF_EQUAL_GOTO zahl 5 ok 
meldung Sie haben keine 5 eingegeben !!! Das war nicht nett. 
goto ende 

>ok: 
meldung Eine 5 !!! Sie sind ein guter Mensch. Danke :-) 

>ende: 
RETURN 1

Einfach unter "if.men" speichern und Monzoom (neu)-starten. - Viel Spaß :-)

Dieses Skript bittet den Benutzer eine 5 einzugeben. (Zeile 2)
Das, was der Benutzer eingibt wird in die Variable 'zahl' gespeichert. (Zeile 3)

Jetzt wird der Vergleich mit IF_EQUAL_GOTO durchgeführt. Es wird geprüft, ob
zahl gleich 5 ist - wenn dies zutrifft, dann springt das Skript an die Sprungmarke >ok:.
Das bedeutet, daß die Meldung*:

"Eine 5 !!! Sie sind ein guter Mensch. Danke :-)"

ausgegeben wird.Dann wird das Skript durch RETURN 1 beendet.
Wenn zahl nicht gleich 5 ist, dann wird das Skript hinter IF_EQUAL_GOTO zahl 5 ok
normal weiterausgeführt. Das bedeutet, daß die Meldung :

"Sie haben keine 5 eingegeben !!! Das war nicht nett."

ausgegeben wird. Dann springt das Skript wegen der Zeile goto ende an die Sprungmarke
>ende: und das Skript wird durch RETURN 1 beendet.

Dieses Skript zeigt deutlich, daß das Skript bei verschiedenen Benutzereingaben verschieden abläuft.
Alle IF-Vergleiche funktionieren nach diesem Prinzip. Wer Skrips, wie das obrige lustig findet, kann
jetzt gerne ein bisschen experimentieren. :-)

*Meldung: Meldung ist ein Befehl, der ein Fenster erscheinen läßt in dem ein Text eine Zahl oder eine
Variable angezeigt wird. Erst wenn der Benutzer das Meldungs-Fenster schließt, wird mit der Ausführung des
Skripts fortgefahren. Wenn das Skript während des Anzeigens einer Meldung weiter ablaufen soll, dann sollte
man anstelle von MELDUNG den Befehl PRINT verwenden. Er gibt den Text allerdings nur in der Monzoom-
Statuszeile aus. (siehe auch (weiter oben): "HalloWelt.men")



FUNCTION
FUNCTION ist ein wirklich interessanter Befehl. Er ermöglicht es einem Skript Berechnungen anzustellen. Dabei
hat man eine relativ große Palette von mathematischen Operatoren zur Auswahl. Genaues dazu findet man in der Skript-
Dokumentation unter FUNCTION. Eine kleine Anleitung kann ich hier aber wohl doch einbauen.
Vom Prinzip her sieht FUNCTION immer so aus:
 
REFSKRIPT 

FUNCTION 1+1
GET_RESULT ergebnis
meldung ergebnis

RETURN 1

Wenn wir dieses Skript speichern (z.B. "mathe.men") und es in Monzoom ausführen, dann erscheint ein
Fenster, das uns anzeigt, daß 1+1 = 2.0000 ist. Na ist das ein Ergebnis ? - Erstaunlich, oder ?
Natürlich kann man nicht nur addiere, sondern auch viel anderes - sogar Sinus, Tanges und Co sind dabei.

Und daraus kann man die eigene Funktion zusammensetzen:
 
- Zahlen
- numerische Variablen
- Winkelfunktionen: sin(), cos(), tan(), asin(), acos(), atan()
- Funktionsausdrücke: sqrt(), abs(), log(), log10(), exp()
- Operatoren: +, -, *, /, ^
- Klammern: (, )
Das ist schonmal eine ganz brauchbare Auswahl würde ich sagen.
Für die folgenden Erweiterungen des Quader-Skripts reicht uns allerdings ein einfaches ' - '.


... und weiter geht's !

Mit dem neuen Wissen über GOTO, IF und FUNCTION können wir nun das Quader-Skript so modifizieren, daß automatisch so viele
Quader erstellt werden, wie es der Benutzer wünscht.

Dazu ist zuerst eine neue Benutzerabfrage nötig: "Wieviele Quader ?" Der Benutzer wird hier definitiv keine Kommazahl
eingeben. Daher verwenden wir den Befehl GET_INT. Ansonsten gehen wir genauso vor, wie bei den GET_REAL-
Abfragen (weiter oben im Skript). Auch in diesem Fall brauchen wir wieder eine Variable. Nennen wir sie doch einfach
'anzahl' - ein klasse Name - kurz und aussagekräftig !
Wir erweitern das Quader-Skript also folgendermaßen:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

GET_INT Anzahl der Quader ?
GET_RESULT anzahl

DREI_QUADER quadername x y z
GET_RESULT echter_name

PKL_ADD echter_name

RETURN 1

Das war doch ganz einfach, oder ? -
Gut, gut ich weiß, daß ich euch hier hoffnungslos unterfordere !
Dann werden wir uns jetzt den Schleifen zuwenden - Also los: Wir knüpfen Schleifen :-)

Die Schleife wird folgendermaßen funktionieren:
Der Benutzer wird gefragt, wie viele Quader er erstellen möchte (das haben wir eben schon in das Skript eingefügt).
Immer, wenn ein Quader erstellt wurde, dann springt das Skript wieder nach vorne und der nächste Quader wird
erstellt. Das wird solange wiederholt, bis die gewünschte Anzahl erreicht ist.

Das erreichen wir durch die folgenden Erweiterungen des Skripts:
 
REFSKRIPT

GET_STRING Wie soll der Quader heißen ?
GET_RESULT quadername

GET_REAL Welche x-Ausdehnung?
GET_RESULT x

GET_REAL Welche y-Ausdehnung?
GET_RESULT y

GET_REAL Welche z-Ausdehnung?
GET_RESULT z

GET_INT Anzahl der Quader ?
GET_RESULT anzahl

>erstelle:
DREI_QUADER quadername x y z
GET_RESULT echter_name
PKL_ADD echter_name

FUNCTION anzahl-1
GET_RESULT anzahl

IF_GREATER_GOTO anzahl 0 erstelle

RETURN 1

Das war's. Das Skript ist fertig. Speichern, ausführen, testen - Juhuiii :-)

Das Skript ist fertig. Es funktioniert.
Natürlich ist das Skript nicht wirklich genial, aber es kann als Beispiel und Grundstock für weitere
Skripts dienen. Im letzten Teil dieses Tutorials will ich nun darauf eingehen, wie man recht gut mit der
Skriptdokumentation arbeiten kann. Das wichtigste ist, die Möglichkeitenzu kennen.
Auch ich kenne kaum Befehle auswendig. Man muß nur wissen, was möglich ist, und wo man in der Doku
suchen muß. Und das ist gar nicht so schwer.



Die Skriptdokumentation

Erst muß man sich fragen: Was habe ich vor - was soll der Befehl können, den ich suche ?
Nehmen wir an, wir wollen wissen, in welchem Verzeichnis Monzoom auf dem aktuellen Rechner
installiert wurde.Wir wollen also einen Wert holen. Das weist darauf hin, daß wir einen Befehl suchen,
der mit GET_ beginnt. Nun suchen wir in der Skriptdokumentation unter INDEX bei den GET_-
Befehlen nach einem Befehl, der uns richtig erscheint: Nach kurzem Suchen finden wir:

GET_REFLECTIONS_DIR

Durch klicken auf den Befehl erhalten wir weitere Infos über die Funktionsweise und die Anwendung.

Wenn wir Informationen nicht abfragen, sondern setzen wollen, dann müssen wir unter der *_SET_*-Befehlen
suchen.
Jenachdem, was wir wo setzen wollen müssen wir hierzu wieder in der richtigen Kategorie suchen:

GEO_SET_ORIENT
Dieser Befehl ist ein Geometrieobjekt-Befehl, der die Orientierung eines Geometrieobjektes setzt (festlegt).

MAT_SET_COLOR
Dieser Befehl ist ein Materialobjekt-Befehl, der die Farbe (color) eines Materialobjektes setzt (festlegt).

PRT_SET_SIZE
Dieser Befehl ist ein Partikelobjekt-Befehl, der die Größe(size) und Dichte eines Partikelobjektes setzt (festlegt).

So kann man sich durch die Doku suchen. Das dauert zwar meist ein bisschen, aber man wird schon fündig,
keine Sorge :-)
Wenn man mal etwas Zeit hat, dann kann man sich die Liste der Befehle ja ansehen. Ein kurzer Überblick über
die Möglichkeiten kann schon viel wert sein. Wie gesagt: Wenn man weiß, was möglich ist, dann reicht das - wie
es geht, kann man schließlich immer noch nachsehen.

Kommentare

Was man wirklich mal ausprobieren sollte, ist das durchsehen von Skripts, die andere geschrieben haben. Das
ist manchmal verwirrend (besonders bei meinen Skripts - da blicke ich dann oft selbst nicht mehr durch), doch
man kann da manchmal tatsächlich etwas lernen.
Zum Glück enthalten viele Skripts 'interne Anleitungen', die erklären, was an der betreffenden Stelle im Quelltext
gerade passiert. Diese Anmerkungen heißen Kommentare. Kommentare sind Zeilen im Quelltext, die von Mon-
zoom nicht beachtet werden. Diese Zeilen werden einfach überlesen. Man kann aus jeder Zeile einen Kommentar
machen. Das ist ganz besonders einfach. Man muß einfach nur ein ';' vor die Zeile schreiben.

Wie das funktioniert kann man ganz leicht an folgendem Beispiel sehen:
 
REFSKRIPT 

Meldung Zeile 1
Meldung Zeile 2

RETURN 1

Wenn dieses Skript ausgeführt wird, dann Erscheint die Meldung "Zeile 1". Wenn man das Fenster wegklickt,
dann erscheint das Fenster mit der Meldung "Zeile 2".

  
REFSKRIPT 

;Meldung Zeile 1
Meldung Zeile 2

RETURN 1

Bei der Ausführung dieses Skripts wird nur die Meldung "Zeile 2" angezeigt. Das ' ; ' macht aus der Skriptzeile
einen Kommentar. Wenn man Skript schreibt, dann kann man so Teile aus dem Skriptablauf ausschließen.

  
REFSKRIPT 

;Die nächste Zeile wurde auskommentiert. Nur das zweite 
;Fenster wird noch angezeigt
;Meldung Zeile 1
Meldung Zeile 2
;Ein Kommentar beschreibt den Quelltext. 
;Dadurch wird er leicht verständlich !

RETURN 1

Ein gut kommentierter Quelltext ist relativ leicht lesbar. Auch nach einigen Wochen, in denen man sich nicht mit dem
Skript beschäftigt hat, kann man sich schnell wieder in das Skript reindenken. So kann man auch leicht andere Skripts
lesen und verstehen. Als Beispiel hier noch einmal eine vollständig kommentierte Version der Quader-Skripts.

  
REFSKRIPT
;####################################################
;#  Dies ist das Demoskript, das im Skript-Tutorial (von mir) erstellt  #
;#  und erklärt wird. 26.August 2001 (Ich bin jetzt fast fertig :-)         #
;####################################################

; Frage nach dem Namen des zu erstellenden Quaders:
GET_STRING Wie soll der Quader heißen ?
;Speichern der Benutzereingabe in die Variable quadername
GET_RESULT quadername

;Ermitteln der Quaderausdehnungen (x,y,z)
GET_REAL Welche x-Ausdehnung?
GET_RESULT x
GET_REAL Welche y-Ausdehnung?
GET_RESULT y
GET_REAL Welche z-Ausdehnung?
GET_RESULT z

;Wie viele Quader sollen erstellt werden ?
;Wert ermitteln und in Variable speichern
GET_INT Anzahl der Quader ?
GET_RESULT anzahl

>erstelle:
;Hier wird der Quader erstellt :
DREI_QUADER quadername x y z
GET_RESULT echter_name
;Hinzufügen des Objektes in die Plotkörperliste:
PKL_ADD echter_name

;vermindern des Wertes von anzahl um 1
FUNCTION anzahl-1
;Ergebnis in die Variable anzahl speichern:
GET_RESULT anzahl

;Wenn anzahl größer ist, als 0, dann gehe zur Sprungmarke >erstelle:
IF_GREATER_GOTO anzahl 0 erstelle

;Beendet das Skript (und gibt die Zahl 1 zurück)
RETURN 1

Das Skript kann man genau so, wie es hier steht als *.men speichern und es wird genauso funktionieren,
wie das 'alte' Skript. Die Kommentare werden einfach überlesen. Es ist allerdings für andere einfacher,
zu verstehen, was genau das Skript an bestimmten stellen macht. Kommentare - Klasse Erfindung :-)

Das ist dann auch das Ende des Skript-Tutorials. Ich hoffe, daß es einen brauchbaren Einstieg in die Monzoom
Skriptsprache bietet. Viel Spaß beim Erstellen eigener Skripts.

Bis denn
Helge

e-mail: Helge@Grimhardt.de
homepage: www.ivory-3d.de.lv