Support Forum

[Frage] Verwendung von Python String-Funktionen in Formeln [Gelöst]


Es wissen vielleicht manche, manche vielleicht noch nicht:
ab V2022 ist es möglich, im Formel-Editor auch Excel und Python-Funktionen anzuwenden. Die Funktion soll am besten mit entsprechendem "Präfix" versehen werden, damit der Allplan Formelinterpreter sich bei Fehlererkennung leichter tut. Die Präfixe sehen folgendermaßen aus (korrigiere mich bitte, wenn ich hier falsch liege):
A: Allplan Funktion
X: Excel Funktion
P: Python Funktion
V: VBS Funktion aus functions.vbs

Jetzt meine erste Frage:
Ich mache bestimmt was falsch bei der Verwendung von den Python Funktionen im Formel-Editor. Angenommen, dass ich einen String in Python modifizieren will, gehe ich so vor:

my_string = "Hello World!"

my_new_string = my_string.lower()

So bekomme ich als Ergebnis den my_new_string = "hello world!"

Übertragen wir das auf den Allplan-Formel-Editor: Wie soll dort die Formel aussehen, um z.B. mit dem Attribut "Bezeichnung" das gleiche zu erreichen? Folgende Formel funktioniert nicht:

p:@507@.lower()

Zweite Frage:
kann ich mir eine Datei mit selbst definierten Python-Funktionen erstellen, wie das der Fall bei functions.vbs ist? VBS wollen wir nicht verwenden, denn es funktioniert leider nicht zuverlässig auf allen Rechnern.

Hinweis vorab:
Das o.g. ist ganz leicht mit Excel Funktion zu erledigen

X:KLEIN(@507@)

Die Vorgehensweise scheitert aber, wenn ich das Beschriftungsbild/Legende/Formelattribut einer meinen Partner-Büros zur Verfügung stellen will, die vielleicht nicht die deutsche Version von Office-Paket verwenden. Hier wäre die Möglichkeit der Verwendung von englischen Excel-Bibliotheken ganz sinnvoll.

Vielen Dank!

Lösung anzeigen Lösung verbergen

In /STD/Scripts/functions.py hinzufügen:

def to_lower(txt):
    return txt.lower()

Aufruf in der Formel:

""+p:to_lower(@507@)
11 - 12 (12)

Könntest Du uns nicht verraten, welche Fehlermeldung gekommen ist, wenn man den Mauszeiger über das "!"-Icon hält?

Ich glaube nämlich nicht, dass es ein Problem mit dem Datentyp ist!

Wenn man schon in der Formel sicherstellen möchte, daß @507@ als String übergeben wird, dann sollte man das so schreiben:

p:RemoveAllplanControlSymbols(""+@507@)

Hintergrund:
Die Attributwerte sind als Variant implementiert. D.h. die haben erst mal keinen festen Datentyp, sondern können in alles mögliche konvertiert werden, z.B. Bool, Integer, Double, String usw.
Diese Konvertierung findet erst bei einer konkreten Aktion statt, z.B. bei einer Zuweiseung oder einem Operator!
Bei der Zuweisung zu einem klassichen Datentyp wird der Variant in diesen Typ konvertiert. Bei einem Operator wird ebenefalls
der andere Operator angeschaut, und dann mit diesem Datentyp die Operation ausgeführt.
Bei obigem Beispiel (""+@507@) heisst das, Operator 1 ist "" (ein String), daher wird Operator 2 in einen String konvertiert, und
dann diese beiden String verkettet.

Dasselbe sollte man mit dem Ergebnis machen:

""+p:RemoveAllplanControlSymbols(""+@507@)

stellt sicher, dass das Ergebnis aus RemoveAllplanControlSymbols() in einen String konvertiert wird.

Die Fehlermeldung hinter dem Ausrufezeichen lautete:

Syntax fehler im Python Script

'float' object has no attribute 'replace'

Und der Code sah bei mir total einfach aus:

def RemoveAllplanControlSymbols(string):
    string = string.replace("%EA","")
    string = string.replace("%EE","")
    string = string.replace("%ET","-")
    return string

Und wie gesagt, es reicht den Argument string gleich am Anfang in String umzuwandeln, um den Ausrufezeichen wegzubekommen.

string = str(string)

Die Attributformel in Allplan als ""+p:RemoveAllplanControlSymbols(""+@507@) anzugeben hilft auch - danke für den Hinweis!

11 - 12 (12)