Robuste GDL-Objekte fangen ungültige Zustände ab, bevor sie zu Laufzeitfehlern führen. Die häufigsten Fehlerquellen und ihre Absicherung:
Stiftfarben (PEN)
Stiftnummern müssen in Archicad immer ≥ 1 sein (außer bei Hintergrundstiften). Werte von 0 oder negativen Zahlen führen zu Fehlern.
! --- PEN darf nicht kleiner als 1 sein
IF pen < 1 THEN pen = 1
! --- Gleiches gilt für alle abgeleiteten Stiftparameter
IF post_fill_pen < 1 THEN post_fill_pen = 1
IF post_fill_bg_pen < 1 THEN post_fill_bg_pen = 1
IF line_pen < 1 THEN line_pen = 1Fehlende Schraffur (FILL)
Referenziert ein Objekt eine Schraffur per Name, kann diese im Zielprojekt fehlen. Vor der Verwendung ist daher zu prüfen, ob sie existiert:
! --- Prüfe, ob "Misch-Schraffur 50 %" im Projekt vorhanden ist
fill50 = IND(FILL, "Misch-Schraffur 50 %")
IF fill50 > 0 THEN
framefill = fill50
ELSE
framefill = 1 ! Fallback auf erste verfügbare Schraffur
ENDIF
! Anschließend Abfrage des Namens
rrr = REQUEST("Name_of_Fill", framefill, fillName)
Hinweis: IND() gibt 0 zurück, wenn das Element nicht gefunden wurde – dieser Fall muss immer abgefangen werden.
Linienstärken (LINE_TYPE)
Analog zu Schraffuren können auch Linientypen im Zielprojekt fehlen:
! --- Prüfe, ob der Linientyp vorhanden ist
linType = IND(LINE_TYPE, "Strichlinie")
IF linType < 1 THEN linType = 1 ! Fallback auf Standardlinie
Divisions- und Modulo-Operationen
Division durch null ist ein klassischer Laufzeitfehler:
! --- Division absichern
eps = 0.0001
IF ABS(divisor) eps THEN
ergebnis = zaehler / divisor
ELSE
ergebnis = 0 ! oder sinnvollen Defaultwert setzen
ENDIF
! --- Gleiches gilt für MOD
IF anzahl > 0 THEN
rest = wert MOD anzahl
ELSE
rest = 0
ENDIF
Array-Grenzen
Zugriffe außerhalb eines Array-Index führen zu Laufzeitabbrüchen:
! --- Vor Array-Zugriff Indexgrenzen prüfen
IF idx >= 1 AND idx <= VARDIM1(myArray) THEN
wert = myArray[idx]
ELSE
wert = 0 ! Fallback
ENDIF
Geometrische Mindestwerte
Längen, Breiten und Höhen von null erzeugen degenerierte Geometrie:
! --- Mindestmaße sicherstellen IF A < 0.001 THEN A = 0.001 IF B < 0.001 THEN B = 0.001 IF ZZYZX < 0.001 THEN ZZYZX = 0.001 ! --- Winkel im gültigen Bereich halten IF winkel < 0 THEN winkel = 0IF winkel > 360 THEN winkel = 360
Materialien und Oberflächen
! --- Prüfe, ob das Material im Projekt vorhanden ist
matIdx = IND(MATERIAL, mat_name)
IF matIdx < 1 THEN
matIdx = 1 ! Fallback auf erstes verfügbares Material
ENDIF
MATERIAL matIdx
REQUEST-Abfragen
REQUEST() gibt 0 zurück, wenn die Abfrage fehlschlägt – das Ergebnis ist immer zu prüfen:
! --- REQUEST-Rückgabe absichern
rrr = REQUEST("Name_of_Fill", framefill, fillName)
IF rrr <> 1 THEN
fillName = "unbekannte Schraffur" ! Fallback-Text
ENDIF
Übersicht: Absicherungsregeln
| Typ | Fehlerquelle | Absicherung |
|---|---|---|
| PEN | Wert < 1 | IF pen < 1 THEN pen = 1 |
| FILL / LIN / MATERIAL | Name nicht im Projekt | IND() prüfen, Fallback auf Index 1 |
| Division / MOD | Divisor = 0 | IF divisor <> 0 THEN ... |
| Array | Index außerhalb Bounds | VARDIM1() / VARDIM2() prüfen |
| Geometrie | Wert = 0 oder negativ | Mindestwert erzwingen |
| REQUEST | Abfrage schlägt fehl | Rückgabewert rrr auf = 1 prüfen |
Grundsatz: Jeder Wert, der aus einem Benutzerparameter, einem
REQUESToder einemIND-Aufruf stammt, ist als potenziell ungültig zu behandeln und vor der Verwendung zu validieren.