/* Sie lernen in diesem Beispiel

- das Arbeiten mit imperativen XL-Befehlen zum Aktualisieren 
  von Eigenschaften eines Objektes in Aktualisierungsregeln.
  
Betrachten Sie auch die Eigenschaften der Objekte im Attribute Editor 
und die dortigen Moeglichkeiten, diese zu aendern.
Es kann dort auch direkt auf Eigenschaften der Oberklasse zugegriffen
werden!
*/


// Definition eine KONSTANTE: Konstanten werden oft mit GROSSBUCHSTABEN 
// benannt.

const float MAXWINKEL = 90.0;


// Definition eines eigenen Rotationsbefehls als Erweiterung von RU:
// Geerbt wird die Eigenschaft "angle" der Oberklasse RU, die mit 
// super.angle als Parameter fuer den Konstruktor uebernommen wird.

module Rotation(super.angle) extends RU(angle);

protected void init()
[
   // Anlegen der Verzeigung unter Verwendung des selbst definierten 
   // Rotationsmoduls
   Axiom ==> L(10) F0
                   [ MRel(0.7) Rotation(-30) F(6) ]
                   [ MRel(0.5) Rotation(40)  F(6) ];
]


public void aendereWinkel()
[
   // Verwendung einer Aktualisierungsregel ( ::> )
   r:Rotation, (r[angle] < MAXWINKEL && r[angle] > -MAXWINKEL) ::> 
      { // imperativer Code-Block
      if (r[angle] < 0)
         r[angle] -= 3;  /* Kurzschreibweise fuer: r[angle] = r[angle] - 3; */
      else
         r[angle] += 3;  /* analog */
      }
]	

// Eine Aktualisierungsregel wird verwendet, um Eigenschaften von 
// Objekten (Knoten) ueber Regeln zu veraendern.
// Mit dieser Regel werde keine Objekte selbst ersetzt. Die Struktur des Graphen
// wird nicht veraendert.
// Nur die Eigenschaften existierender Objekte (Knoten) koennen aktualisiert werden.
// Regeln dieses Typs werden durch ::> angegeben.
