Support Forum

[Frage] Textlänge von Strings in Meter [Gelöst]

Schlagworte:
  • PythonParts
  • PythonAPI
  • String
  • GetDimensions

Hallo.

Ich habe einen String und möchte dessen Länge in Meter berechnen (Ähnlich wie beim SmartPart-Befehl STW).
Ich habe gesehen, dass die TextElement Klasse über die Methode GetDimensions verfügt. Ich denke mal, dass man mit dieser Methode das bewerkstelligen kann, was ich will. Laut Syntax braucht diese Methode ein TextElement und einen DocumentAdapter. Ich hab das mal so probiert:

text = "Hello World!"
test_text = AllplanBasisElements.TextElement(com_prop, text_prop, text, AllplanGeo.Point2D(0,0))
test_dimensions = AllplanBasisElements.TextElement.GetDimensions(test_text, ElmentAdapter.DocumentAdapter())
print (test_dimensions)

(PS ich habe das Modul NemAll_Python_IFW_ElementAdapter als ElmentAdapter importiert)
Wenn ich dieses Skript jedoch ausführe stürzt Allplan ab. Was hab ich hier falsch gemacht? Bzw. gibt es einen anderen Weg um die Länge eines Strings in Metern zu erhalten?

Lösung anzeigen Lösung verbergen

Das Problem hängt damit zusammen, dass die Größe des ModelElements Text von der "Umgebung" der Zeichnungsdatenbank abhängt, in der er sich befindet. Konkret ist ein Text meist vom eingestellten Bezugsmaßstab des Teilbilds abhängig. Das "geometrische" Element Text hat keine Größe, das ermitteln der MinMax-Box scheitert, da das Element noch nicht in der Datenbak (auf einem Teilbild) ist. Deshalb braucht die Methode GetDimensions das Document als Eingangsparameter, und zwar das aktuelle Dokument (Teilbild)!
Du reichts dort jedoch einen "leeren" Dokument-Adapter rein, und das produziert den Absturz.

Nimm den DokumentAdapter, der zum Erzeugen des PythonParts reingereicht wurde:
def create_element(build_ele, doc)
...
und dann sollte es gehen.

Was bei "GetDimensions" in der Dokumentation nicht ausgesagt wird, ist was genau zurückgegeben wird?
Ein Vector2D solls sein, ok. Scheinbar die Höhe / Breite , könnte aber auch der Vector der MinMax-Box (bei gedrehtem Text) sein?
Fragen über Fragen...

Zumindest die Frage nach dem Rückgabewert habe ich mal empirisch ermittelt:
Es wird tatsächlich die Höhe,Breite das Textes als Vector2D zurückgegeben. Allerdings muss die Breite noch mit der eingestellten Text-Breite multipliziert werden. Aber nur, wenn der Text "Scale-Dependent" ist!

Alles sehr mysteriös... und wieder mal schlecht dokumentiert!

Und dass man im Text-Control in der Palette links 2-zeiligen Text (wie er im gezeigten Example sogar drin ist) nicht vollständig anzeigt bekommt, weder mit Scrollbar, noch durch Vergrößerung des Controls, ist ebenfalls zumindestens peinlich, da es dieses Example nun schon so lange gibt, wie es PythonParts gibt!

Anhänge (1)

Typ: image/png
70-mal heruntergeladen
Größe: 62,14 KiB

Das Problem hängt damit zusammen, dass die Größe des ModelElements Text von der "Umgebung" der Zeichnungsdatenbank abhängt, in der er sich befindet. Konkret ist ein Text meist vom eingestellten Bezugsmaßstab des Teilbilds abhängig. Das "geometrische" Element Text hat keine Größe, das ermitteln der MinMax-Box scheitert, da das Element noch nicht in der Datenbak (auf einem Teilbild) ist. Deshalb braucht die Methode GetDimensions das Document als Eingangsparameter, und zwar das aktuelle Dokument (Teilbild)!
Du reichts dort jedoch einen "leeren" Dokument-Adapter rein, und das produziert den Absturz.

Nimm den DokumentAdapter, der zum Erzeugen des PythonParts reingereicht wurde:
def create_element(build_ele, doc)
...
und dann sollte es gehen.

Was bei "GetDimensions" in der Dokumentation nicht ausgesagt wird, ist was genau zurückgegeben wird?
Ein Vector2D solls sein, ok. Scheinbar die Höhe / Breite , könnte aber auch der Vector der MinMax-Box (bei gedrehtem Text) sein?
Fragen über Fragen...

Zumindest die Frage nach dem Rückgabewert habe ich mal empirisch ermittelt:
Es wird tatsächlich die Höhe,Breite das Textes als Vector2D zurückgegeben. Allerdings muss die Breite noch mit der eingestellten Text-Breite multipliziert werden. Aber nur, wenn der Text "Scale-Dependent" ist!

Alles sehr mysteriös... und wieder mal schlecht dokumentiert!

Und dass man im Text-Control in der Palette links 2-zeiligen Text (wie er im gezeigten Example sogar drin ist) nicht vollständig anzeigt bekommt, weder mit Scrollbar, noch durch Vergrößerung des Controls, ist ebenfalls zumindestens peinlich, da es dieses Example nun schon so lange gibt, wie es PythonParts gibt!

Anhänge (1)

Typ: image/png
70-mal heruntergeladen
Größe: 62,14 KiB

Hallo.

Danke für die Antwort und das Testen! Jetzt funktioniert es so wie ich das haben möchte.