coord-transf.2d elements3d elementsnon geo scriptsfunctionscontrol statem.attributesvariousaddons
flow controlloopsext. connection
IF…THEN GOTO GOSUB…RETURN END/EXIT BREAKPOINT
Name
IF_THEN_ELSE_ENDIF
Syntax
IFcondition THENcommand
oder
IFcondition THENcommand1 ELSEcommand2
oder
IFcondition THEN
  command1 : command2 [...]
  commandn
  
ENDIF
oder
IFcondition THEN
  command1 : command2 [...]
  commandn
  
ELSE
  commandn+1 : commandn+2 [...]
  commandn+m
  
ENDIF
Aufklappen Range
condition numerischer Ausdruck, Typ binär (*)
commandi beliebiger GDL-Befehl

(*) tatsächlich geht es um die Prüfung einer Bedingung, die als Ergebnis FALSCH (=0) oder WAHR (≠0) liefert.
Aufklappen Description
Diese Befehlskonstruktion führt die in ihr enthaltenen Befehle nur bedingt aus.

Nach dem IF wird eine condition formuliert, nach der entschieden wird, ob oder welche Befehle ausgeführt werden. GDL ist da recht tolerant und interpretiert nicht nur 1 als logisch WAHR sondern jeden Wert ungleich 0.
Trifft die condition zu, ist also logisch WAHR, wird der Befehl nach THEN abgearbeitet, wenn nicht, wird er übersprungen und nicht ausgeführt.
Folgt dem bedingten Befehl unmittelbar ein ELSE wird der nun folgende Befehl nur abgearbeitet, wenn die condition logisch FALSCH ist, also nicht zutrifft. Ist die condition WAHR, wird dieser Befehl übersprungen. Die Verwendung von ELSE ist optional, kann also auch entfallen, wenn dies nicht notwendig ist.

Die Verwendung von ENDIF wird dann notwendig, wenn mehr als ein Befehl von der Bedingung abhängig sein sollen. Dann sind die Befehle nicht mehr in der gleichen Programmzeile wie IF...THEN zu schreiben, sondern in einer neuen. Das gleiche gilt für die Befehle nach ELSE. Mit und ohne Verwendung von ELSE muss dann das IF...THEN-Konstrukt mit ENDIF abgeschlossen werden. (Ist nach ELSE nur ein Befehl bedingt auszuführen und schreibt man diesen in der gleichen Zeile nach ELSE, ist ENDIF nicht nötig. Siehe auch "Besonderheiten".)

Bedingte Programmablaufverzweigungen mit GOTO und GOSUB sind zulässig.

Es können mehrere IF...THEN-Konstrukte ineinander verschachtelt werden. Dann ist aber zumindest für alle äußeren IF...THEN-Bedingungen die mehrzeilige Syntax unter Verwendung von ENDIF zwingend nötig.
Aufklappen Example
Beispiel 1a:
IF wert>5 THEN LINE2 0,0,1,0
IF wert<=5 THEN LINE2 0,1,0,1


Beispiel 1b:
IF wert>5 THEN
 LINE2 0,0,1,0
 ENDIF
IF wert<=5 THEN
 LINE2 0,1,0,1
 ENDIF


Beispiel 1c:
IF wert>5 THEN LINE2 0,0,1,0 ELSE LINE2 0,1,0,1

Beispiel 1d:
IF wert>5 THEN
 LINE2 0,0,1,0
 ELSE
 LINE2 0,1,0,1
 ENDIF


Beispiel 2:
IF NOT(wert=5) THEN LINE2 0,1,0,1
Umkehrung der Bedingungsentscheidung mit NOT().

Beispiel 3:
IF wert>5 THEN
 LINE2 0,0,1,0
 LINE2 0,1,1,1
 ELSE
 IF wert<=5 THEN
  LINE2 0,0,0,1 : LINE2 1,0,1,1
  ENDIF
 IF wert=5 THEN LINE2 0,0,1,1
 ENDIF

Aufklappen Specialities
Die Syntax lässt noch 2 Sonderfälle zu. Bei bedingten Verzweigungen im Programmablauf ist auch eine Kurzschreibweise zulässig:

So ist statt der Befehlszeile
IF bedingung THEN GOTO sprungziel
auch erlaubt
IF bedingung GOTO sprungziel
zu verwenden.

Ebenso gilt für den Aufruf von Unterprogrammen:
IF bedingung THEN GOSUB sprungziel
ist gleichbedeutend mit
IF bedingung GOSUB sprungziel

Siehe dazu auch GOTO und GOSUB. V.a. die Hinweise zur Verwendung der Sprungziele.

Mit ArchiCAD® 9 wurde die interne, automatische Verwendung von Integer-Variablen eingeführt. Das führt dazu, dass einige Bedingungen, die Variablen vom Typ real enthalten und die unter ArchiCAD® 8.1 und früher korrekte Entscheidungen liefern nun wegen Rundungsungenauigkeiten andere Ergebniss liefern können. So ist die Bedingung 5=5.0000001 eben FALSCH und nicht wie wahrscheinlicht beabsichtigt WAHR. Folgendes Beispiel erläutert die neue Vorgehensweise um diese "Fehler" sicher zu vermeiden:

! wert1 und wert2 sind numerische Variablen
! Schwellenwert für Rundungsfehler 1/100mm:
schwelle=0.00001
IF ABS(wert1-wert2) < schwelle THEN PRINT "identisch!"


Siehe dazu auch numerische Ausdrücke und den dortigen Links,
Aufklappen Tips and Tricks
Im GDL-Handbuch ist die Konstruktion
IF bedingung THEN
  befehl1 : befehl2 [...]
  befehln
  ELSE befehln+1

als zulässig angeführt. Ein ENDIF ist also nicht nötig, wenn nach dem ELSE nur 1 Befehl und dieser direkt danach in der gleichen Zeile folgt. Wir raten dennoch davon since auf ENDIF zu verzichten, da wir darin eine Fehleranfälligkeit sehen und die Übersichtlichkeit leidet.

Von Befehlszeilen wie
IF entscheidung THEN : a=2 : b=3 : ELSE : a=4 : b=5 : ENDIF
ist prinzipiell abzuraten, da in einigen ArichCAD Versionen damit andere als die erwarteten Befehle abgearbeitet werden oder es zu unerklärlichen "Fehlende ENDIF-Anweisung"-Fehlern kommt.

Doppelpunkte am Ende einer Befehlszeile sind (abgesehen von Sprungmarken) überflüssig und können diese Fehler verursachen. Siehe Link zu GDL-Talk.

Bei der Verwendung mehrerer bedingter Befehle sollten die Elemente des IF...THEN...ENDIF-Konstruktes in separaten Zeilen stehen und mit einem ENDIF abgeschlossen werden.
Aufklappen References
GDL-Handbuch 4.5 (DE) p. 107
GDL-Handbuch 5.0 (DE) p. 153
GDL-Handbuch 6.0 (DE) p. 186
GDL-Handbuch 6.5 (DE) p. 187
GDL-Handbuch 7.0 (DE) p. 187
GDL-Handbuch 8.0 (DE) p. 125
GDL-Handbuch 8.1 (DE) p. 127
GDL-Handbuch 9.0 (DE) p. 214
GDL-Handbuch 10.0 (DE) p. 214
GDL-Handbuch 11.0 (DE) p. 220
GDL Reference Guide 9.0 (INT) p. 206
GDL Reference Guide 10.0 (INT) p. 212
GDL Reference Guide 11.0 (INT) p. 212
GDL Cookbook 3.1 (EN/DE) p. 1.20