Verwendung von ARexx-Skripten in monzoom®
ARexx: (Amiga) - Inhalt:
1) Allgemeines
2) Adressierung von monzoom® durch ARexx
ARexx-Kenntnisse werden vorausgesetzt.
1) Allgemeines
Durch die ARexx-Schnittstelle wird monzoom® in seinen Möglichkeiten erheblich erweitert. Dadurch ist es nun möglich, monzoom® von außen zu programmieren.
Durch die programmiersprachlichen Eigenschaften von ARexx kann man nun ganze Folgen von Menükommandos zusammenfassen, kombinieren und beliebig wiederholen.
Sie können per ARexx-Befehl beispielsweise Körper erzeugen, bewegen, verändern, zusammenfassen, löschen; Sie können mit mathematischen Funktionen Polygone erzeugen und daraus einen Schlauch oder ein Band formen. Sie können einzelne Punkte erzeugen und verändern, eigene Dreiecke und Kugeln erzeugen und daraus Körper machen u.v.a.
Die Arexx-Programme können direkt aus monzoom® heraus aufgerufen werden, sie können ins Hauptmenü von monzoom® eingebunden werden. Letztlich merkt der Benutzer keinen Unterschied mehr, ob er per Menü eine interne Funktion von monzoom® aufruft, oder ein ARexx-Programm.
Die Möglichkeiten sind nahezu unbegrenzt. Jedermann hat nun die Möglichkeit, monzoom® seinen Bedürfnissen entsprechend zu erweitern.
Anmerkung:
Wer selbst eigene ARexx-Programme für monzoom® schreiben will, sollte sich mit ARexx schon einigermaßen auskennen. Falls Sie also noch keine Erfahrungen mit ARexx besitzen, sollten Sie sich dementsprechend einarbeiten.
2) Adressierung von monzoom® durch ARexx
monzoom® öffnet beim Start einen MessagePort mit Namen "REFSKRIPT".
Dies ist für ARexx seine Adresse. Mit dem ARexx-Befehl ADDRESS REFSKRIPT teilen Sie ARexx mit, daß Befehle an monzoom® geschickt werden sollen.
Achtung: In Reflections 2.5 hieß der MessagePort CONSTRUCT
Beispiel:
ADDRESS REFSKRIPT
DREI_KUGEL kugel 5.0 20 20
Mit dem ersten Befehl wird ARexx angewiesen, die nächsten Befehle, (sofern sie keine ARexx-spezifischen Kommandos sind) an monzoom® zu schicken.
Deswegen wird in der zweiten Zeile einfach der String "DREI_KUGEL kugel 5.0 20 20"
an monzoom® geschickt. Was monzoom® damit anfängt, ist seine Sache. In diesem Fall interpretiert monzoom® den String dahingehend, daß er eine Kugel aus Dreiecken erzeugen soll, die den Namen "kugel" bekommt, den Radius 5 hat und aus 20*20 Segmenten aufgebaut ist.
3) Interne und externe ARexx-Programme
monzoom® kennt zwei Arten von ARexx-Programmen:
- Interne Programme
Solche Programme werden von monzoom® selbst aufgerufen. Sie werden eingesetzt, um monzoom® zu erweitern, um ihm neue Funktionalität zu geben.
monzoom® schickt eine Nachricht an den RexxMaster, ein bestimmtes ARexx-Programm auszuführen und macht sich bereit, ankommende Nachrichten mit Kommandos zu interpretieren und auszuführen.
Damit das Skript unter dem Menüpunkt ARexx erscheint, muß sich im Verzeichnis ARexx eine Datei mit der Endung .ref_rexx befinden.
- Externe Programme
Solche Programme werden außerhalb von monzoom® folgendermaßen gestartet: RX <Arexx-Programm>
(RX ist der ARexx-Interpreter und liegt in der Regel im Ordner SYS:Rexxc/).Externe Programme sind in gewisser Hinsicht problematischer als interne. Bei internen Programmen weiß monzoom®, daß nun ein ARexx-Programm gestartet wird und er stellt jede weitere Tätigkeit ein, bis das ARexx-Programm fertig ist.
Ein externes Programm kann jedoch zu jeder Zeit völlig unverhofft kommen, auch wenn monzoom® gerade mit anderen Dingen beschäftigt ist.
Daher empfiehlt es sich, externe Programme nur zu starten, wenn man weiß, daß monzoom® zur Zeit ruht.
4) Beispiel-Makros
Hier werden einige Beispielmakros dargestellt und erklärt.
Kommentare in ein Arexx-Programm sind wie in C durch /* und */ eingefaßt: /* <kommentar> */
Makro kp_auf_kp.
Dieses Arexx-Makro setzt einen
Körper auf einen anderen.
Beispielaufruf: RX kp_auf_kp Kugel Quader
Damit wird die Kugel auf den Quader gesetzt.
/***************************************************/
/* die erste Programmzeile muß eine Kommentarzeile sein */
/* Aufruf kp_auf_kp <kp1> <kp2> */
/***************************************************/
options results
/* Der options results-Befehl bewirkt, daß aufgerufene Funktionen ihr */
/* Resultat in die Variable result liefern. */
/* Dieser Befehl muß unbedingt am Anfang des Programms stehen, damit */
/* die Resultat, die monzoom® liefert, gelesen werden können */
SIGNAL ON ERROR
/* Der SIGNAL ON ERROR-Befehl ist ein ARexx-Befehl, der bewirkt, daß */
/* bei einem auftretenden Fehler zur Marke error: gesprungen wird */
/* Dieser Befehl ist zwar nicht unbedingt nötig, aber doch sehr */
/* empfehlenswert, denn Fehler können immer auftreten. z. B. durch */
/* bloßes Vertippen */
PARSE ARG eingabe
kp1=WORD(eingabe,1)
kp2=WORD(eingabe,2)
/* mit dem PARSE ARG-Befehl wird die Eingabezeile in die Variable */
/* eingabe gespeichert. */
/* Daraufhin werden mit dem WORD-Befehl die beiden Körpernamen gespeichert. */
ADDRESS "REFSKRIPT"
/* mit dem ADDRESS-Befehl wird ARexx mitgeteilt, daß unbekannte Befehle */
/* an monzoom® geschickt werden sollen */
GET_KP_MIN kp1
x1=WORD(result,1)
y1=WORD(result,2)
z1=WORD(result,3)
GET_KP_MAX kp1
x2=WORD(result,1)
y2=WORD(result,2)
z2=WORD(result,3)
/* Mit GET_KP_MIN und GET_KP_MAX werden die Koordinaten der */
/* Bounding-Boxen des 1.Körpers abgefragt. */
/* Das Ergebnis wird jeweils in result geliefert und wird mithilfe */
/* des WORD-Befehls in x,y- und z-Komponente aufgeteilt. */
x = (x1+x2)/2.0
y = (y1+y2)/2.0
z = z1
/* x ist der x-Mittelpunkt von kp1*/
/* y ist der y-Mittelpunkt von kp1*/
/* z ist die minimale z-Koordinate von kp1*/
GET_KP_MIN kp2
x1=WORD(result,1)
y1=WORD(result,2)
z1=WORD(result,3)
GET_KP_MAX kp2
x2=WORD(result,1)
y2=WORD(result,2)
z2=WORD(result,3)
/* Die Bounding-Box-Koordinaten von kp2 werden abgefragt */
xx = (x1+x2)/2.0
yy = (y1+y2)/2.0
zz = z2
/* xx, und yy sind die x- und y-Mittelpunkte von kp2 */
/* z ist die maximale z-Koordinate von kp2 */
xx = xx-x
yy = yy-y
zz = zz-z
/* in xx, yy und zz wird der Differenzvektor abgespeichert; */
/* nun wird kp1 um diesen Differenzvektor bewegt.*/
KP_BEWEGE kp1 xx yy zz
/* fertig: */
exit 0
error:
/* Dies ist der Fehlerausgang */
exit 20
5) Wiederverwendung alter ARexx-Skripte von Reflections 2.5
Die Verwendung von ARexx-Makros, die für Reflections 2.5 geschrieben wurden, ist auch mit Reflections 3 und 4 bzw. nun mit monzoom® möglich, wenn einige Dinge beachtet werden:
Der MessagePort heißt nun REFSKRIPT statt CONSTRUCT.
Die Anweisung ADDRESS CONSTRUCT muß also in ADDRESS REFSKRIPT geändert werden.
ARexx-Makros, die explizit mit Kugeln in Körpern arbeiten, müssen dementsprechend geändert werden.
In Ref 2.5 gab es nur ein globales Dreiecksobjekt mit allen Körpern. Jetzt gibt es viele Dreiecksobjekte, von denen jedes sein eigenes Körpersystem hat.
Bevor Körper-Befehle verwendet werden, muß also mit AKT_KP_DREI das Dreiecksobjekt bestimmt werden, dessen Körper bearbeitet werden.
Bei folgenden Beispiel müßte der KP_OBJ_VONBIS - Befehl geändert werden.
GET_NOBJEKTE
nobj=result
/* Dreiecke erzeugen */
....
GET_NOBJEKTE
nobj1=result
KP_NEU test
KP_OBJ_VONBIS nobj+1 nobj1
KP_FERTIG
Der KP_OBJ_VONBIS muß jetzt lauten:
KP_OBJ_VONBIS nobj nobj1-1
| Oberland Computer In der Schneithohl 5 61476 Kronberg |
Website: http://www.monzoom.de/ EMail: monzoom@oberland.com Tel.: 06173 - 608-0 Fax: 06173 - 63385 |