abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python
GELÖST!

Variable mit IF-Then kombinieren

Laura S
Booster

Hallo,

 

für ein Etikett würde ich gerne eine Variable mit if-then bzw. if-then-else-endif kombinieren.

 

if "<PROPERTY-747DF3A6-2247-624C-A276-21F6998EF2EC>" = "Farbe" then WO="F"
...
text2 a/2,c*1.35,WO
 
Hierbei soll aus "Farbe" des Optionen-Sets der Eigenschaft Wandoberfläche im Etikett nur F dargestellt werden.
 
So kommt allerdings die Fehlermeldung, dass WO nicht initialisiert ist.
Kennt sich jemand damit aus?
 
Vielen Dank
Laura
1 AKZEPTIERTE LÖSUNG

Akzeptierte Lösungen
Lösung

Wenn du Werte erst in einer IF Schleife deklarierst, dann kann es sein, dass der Wert nicht existiert, wenn man ihn dann final mit "text2" abruft.

Daher sollte man Werte immer erst mal initialisieren – also das, was dir das System schon versucht hat mitzuteilen.

Dabei muss man noch wissen, dass Variablen im GDL grundsätzlich erstmal vom Typ integer sind, wenn man sie nicht vorher initialisiert.

Aus diesem Grund sollte man unbedingt sämtliche Strings vor der ersten Verwendung als Leerstring anlegen: test = ""

Machst du das nicht, schimpft Archicad, denn: Typenwechsel sind nur deklarativ möglich, nicht imperativ. Ausnahme: Integer werden durch arithmetische Methoden mit Floats ad-hoc auch zu Floats. Beispiel: test = 3/2 ! ergibt 1.5

test = "Kartoffel" + 5 wird nicht funktionieren. (Dafür braucht man dann str())

 

Davon mal abgesehen wird dein Ansinnen nicht im GDL funktionieren. Das liegt daran, dass GDL die Eigenschaften nicht "sehen" kann. "<PROPERTY-747DF3A6-2247-624C-A276-21F6998EF2EC>" = "Farbe" wird nie zu WAHR auflösen!

Lucas Becker | AC 27 on Mac | Author of Runxel's Archicad Wiki | Editor at SelfGDL | Developer of the GDL plugin for Sublime Text | My List of AC shortcomings & bugs | I Will Piledrive You If You Mention AI Again |

«Furthermore, I consider that Carth... yearly releases must be destroyed»

Lösung in ursprünglichem Beitrag anzeigen

10 ANTWORTEN 10
snow
Rockstar

Ich bin in dem Bereich auch nicht besonders sicher...
.... meine aber, mich zu erinnern, dass IF für Optionen-Sets funktsjoniert, wenn Mehrfachauswahl ausgeschlossen ist.

Archicad For Future
______________________________________

archicad versions 8-27 | mac os 13 | win 10

Vielen Dank, ich bin mir nicht ganz sicher was du damit meinst.

 

Ich habe die Raumoberflächen für Boden, Decke und Wände jeweils als Eigenschaft angelegt. Hier sind in den Optionen-Sets jeweils ganze Wörter hinterlegt (Teppich, Parkett, Farbe etc.). Für mein Etikett möchte ich aber jeweils nur eine Abkürzung davon darstellen (TP für Teppich, P für Parkett etc.). Mit jeweils einer weiteren Eigenschaft (z. B. Bodenbelag kurz) schaffe ich die Übersetzung problemlos und könnte mich in meinem Etikett auf diese beziehen. Nun wollte ich aus unterschiedlichen Gründen nicht so viele neue Eigenschaften erstellen und diese "Übersetzung" direkt im script meines Etiketts vornehmen. Hier weiß ich aber leider nicht wie ich den if Befehl so schreiben kann, dass ich ihn für meinen text2 benutzen kann.

 

Macht das Sinn?

Ah... dass du im GDL bist, hätte ich an text2 erkennen können.
Da bin ich nicht so ganz richtige Ansprechpartner... 😉

 

Ich war in den Eigenschaften... und da gilt halt dieses, hab' ich festgestellt...

 

Der Haken hier darf nicht gesetzt sein.

 

snow_0-1708689099650.png

kommt sonst 'ne Fehlermeldung, die ähnlich klingt wie deine...

 

NACHTRAG
Vielleicht aber doch so viel:
Dein Script weiß halt nicht, was 'WO' ist.

... wird offenbar für eine Variable gehalten... und damit diese funktsjoniert, muss die in der Regel im Parameter-Script vorhanden sein.

Wie man das alles zusammenbringen kann... das weiß ich jetzt nicht.... bin mit solchen Dingen auch immer wieder am kämpfen...

 

Archicad For Future
______________________________________

archicad versions 8-27 | mac os 13 | win 10
Lösung

Wenn du Werte erst in einer IF Schleife deklarierst, dann kann es sein, dass der Wert nicht existiert, wenn man ihn dann final mit "text2" abruft.

Daher sollte man Werte immer erst mal initialisieren – also das, was dir das System schon versucht hat mitzuteilen.

Dabei muss man noch wissen, dass Variablen im GDL grundsätzlich erstmal vom Typ integer sind, wenn man sie nicht vorher initialisiert.

Aus diesem Grund sollte man unbedingt sämtliche Strings vor der ersten Verwendung als Leerstring anlegen: test = ""

Machst du das nicht, schimpft Archicad, denn: Typenwechsel sind nur deklarativ möglich, nicht imperativ. Ausnahme: Integer werden durch arithmetische Methoden mit Floats ad-hoc auch zu Floats. Beispiel: test = 3/2 ! ergibt 1.5

test = "Kartoffel" + 5 wird nicht funktionieren. (Dafür braucht man dann str())

 

Davon mal abgesehen wird dein Ansinnen nicht im GDL funktionieren. Das liegt daran, dass GDL die Eigenschaften nicht "sehen" kann. "<PROPERTY-747DF3A6-2247-624C-A276-21F6998EF2EC>" = "Farbe" wird nie zu WAHR auflösen!

Lucas Becker | AC 27 on Mac | Author of Runxel's Archicad Wiki | Editor at SelfGDL | Developer of the GDL plugin for Sublime Text | My List of AC shortcomings & bugs | I Will Piledrive You If You Mention AI Again |

«Furthermore, I consider that Carth... yearly releases must be destroyed»

Vielen Dank!

 

Schade, dass das nicht funktioniert. Dann muss ich die Übersetzung wohl doch als Eigenschaft machen 🙁

Xandros
Expert

Na, man kann schon Eigenschaften eines Elements in einem Etikett auslesen. Da gibt es im Graphisoft GDL Center eine Anleitung für.

Zugegebenermaßen nicht die einfachste aller möglichen Übungen im GDL, aber eben nicht unmöglich.

 

_valueString = "Value: "
dim _propertyValues[][]
_dim1 = 0
_dim2 = 0
n = REQUEST ("Property_Value_Of_Parent", myProperty, _type, _dim1, _dim2, _propertyValues)

if n then
	! change zeros to ones
	! it is easier to handle all possible arrays in a double loop
	if _dim1  = 0 then _dim1 = 1	
	if _dim2  = 0 then _dim2 = 1

	for ii = 1 to _dim1
		for jj = 1 to _dim2
			if (ii + jj) > 2 then _valueString = _valueString + "; "

			if _type = 4 then ! Type is string - no conversion needed
				_stringPropValue = _propertyValues[jj][ii]
			else	! bool, real, integer types - conversion needed to string
				_valueToConvert = _propertyValues[jj][ii]
				gosub "convertToString"
			endif
			_valueString = _valueString + _stringPropValue
		next jj
	next ii
endif

 

Die Schwierigkeit ist, die Variable myProperty mit der richtigen ID zu füttern, dass er dir als Ergebnis den gewünschten Wert der Eigenschaft in _propertyValues abzulegen.

ArchiCAD 26 GER / Win10
Intel i9-9900K / 64GB RAM / nVidia GeForce RTX 2080 Ti

Vielen Dank! Das gucke ich mir noch mal genauer an.

Hallo runxel,

 

leider lässt mich das Thema nicht los.

Gibt es denn wirklich keine Möglichkeit den "Wert" der Eigenschaft im script über print oder ähnliches sichtbar zu machen?

Frank Beister
Advisor

Was meinst du mit "im Skript". Du kannst in einem Etikett von dem assoziierten Bauteil (Wand, Morph, Objekt,...) dessen Attribute auslesen. Diese kannst du dann in 2D oder 3D verwenden. Sei es durch direkte Ausgabe TEXT(2) oder indirekt als Bedingung oder Werte-abhängige Zuordnung.

Du hast diesen Zugriff aber (ich hoffe, ich bin jetzt für AC27 nicht falsch) NICHT im Parameter-Skript, um z.B. den Wert per PARAMETERS-Befehl in einem GDL-Parameter des Etiketts abzulegen.

Da das Master-Skript IMMER durchlaufen wird sollte man auf die Verwendung der entsprechenden Befehle dort verzichten, weil das zu Fehlermeldungen führen kann.

bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm