am 2024-02-23 11:36 AM
Hallo,
für ein Etikett würde ich gerne eine Variable mit if-then bzw. if-then-else-endif kombinieren.
Gelöst! Gehe zu Lösung.
am 2024-02-23 01:45 PM
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!
am 2024-02-23 11:46 AM
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.
am 2024-02-23 11:58 AM
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?
2024-02-23 01:01 PM - bearbeitet 2024-02-23 01:48 PM
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.
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...
am 2024-02-23 01:45 PM
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!
am 2024-02-23 01:56 PM
Vielen Dank!
Schade, dass das nicht funktioniert. Dann muss ich die Übersetzung wohl doch als Eigenschaft machen 🙁
am 2024-02-23 02:51 PM
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.
am 2024-02-26 01:51 PM
Vielen Dank! Das gucke ich mir noch mal genauer an.
am 2024-02-29 09:23 AM
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?
2024-02-29 11:05 AM - bearbeitet 2024-02-29 11:07 AM
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.