[Question] StringToValueConverter:Value type line2d doesn't exist!!! [Solved]


Hallo zusammen,

ich teste derzeit verschiedene Anwendungsmöglichkeiten von Excel in Kombination mit Allplan aus und komme an einem gewissen Punkt nicht weiter.
Kurz zu meinem Vorhaben: In einer Zelle in Excel steht der Inhalt "Line2D(0,1840,0,0)","Line2D(0,0,1270,0)","Line2D(1270,0,1270,1840)","Line2D(0,1840,1270,1840)". Mit der openpyxl Bibliothek greif ich auf diese Zelle zu und importiere ihn in mein Skript. Ziel ist es mit GeometryStringValueConverter und den Linien einen Quader in Allplan zu erstellen.

In meinem Skript wird der importierte String in eine Liste mit einzelnen Elementen (immer eine Line2D) zerlegt und diese Liste dann an die get_elements Methode übergeben. An diesem Punkt bekomm ich jedoch in Allplan immer die Meldung "StringToValueConverter:Value type line2d doesn't exist!!!".

Wenn ich die Liste mit den Stringelementen jedoch im Skript definiere, dann klappt alles wie gewohnt und ich kann mit CreateSweptBrep3D meinen 3D Körper erstellen. Kann mir jemand die Fehlermeldung genauer erläutern? Den Code in StringToValueCOnverter.py versteh ich mit meinen jetzigen Kenntnissen nur sehr schwer...

Grüße
Niklas

Attachments (1)

Type: image/png
Downloaded 6 times
Size: 4,65 KiB

Show solution Hide solution

Hallo ihr beide,

@Bart: Ich teste es gerade in der 2023-1-7 Version. Übergebe ich mein String wie du direkt oder über eine definierte Variable, dann funktioniert auch alles ohne Probleme. Das mit der interaktiven Console habe ich noch nicht ausprobiert, danke für den Tipp!

@Nemo: Das habe ich mir auch schon überlegt und geprüft, bei print() wird die korrekte Schreibweise des Strings wiedergegeben.

Ich habe eben zufällig eine Lösung gefunden. Wieso meine ursprüngliche Variante nicht funktioniert hat, weiß ich jedoch nicht. Hier meine Lösung, vielleicht hilft es ja dem ein oder anderen. Trotzdem danke für euren Input!

Mit diesem Code greife ich auf die Excelzelle zu und übernehme deren Inhalt, anschließend wird der String unterteilt und die einzelnen Linien in eine Liste gepackt und an get_elements() übergeben. Mit geometrie_elemente und CreateSwprBRep3D erstelle ich mir dann ein Brep.

wb = load_workbook('Dateipfad einfügen = True)
ws = wb['Tabelle 1']

zelle = ws.cell(row=3, column=6)       
zelleninhalt = zelle.value             
print(zelleninhalt)                    

geo_elements = ast.literal_eval("["+zelleninhalt+"]")
for element in geo_elements:
    print(element)


geometrie_elemente = GeometryStringValueConverter.get_elements(geo_elements, True)

Bei meiner ursprünglichen Variante habe ich den String nicht mit dem ast-Modul zerlegt und in eine Liste mit Elementen gewandelt, sondern mit dem re-Modul und findall(). Die findall Methode macht also irgendwas womit get_elements nicht zurecht kommt.

Quote by Nyglas
Hallo zusammen,
ich teste derzeit verschiedene Anwendungsmöglichkeiten von Excel in Kombination mit Allplan aus und komme an einem gewissen Punkt nicht weiter.

Kurz zu meinem Vorhaben: In einer Zelle in Excel steht der Inhalt "Line2D(0,1840,0,0)","Line2D(0,0,1270,0)","Line2D(1270,0,1270,1840)","Line2D(0,1840,1270,1840)". Mit der openpyxl Bibliothek greif ich auf diese Zelle zu und importiere ihn in mein Skript. Ziel ist es mit GeometryStringValueConverter und den Linien einen Quader in Allplan zu erstellen.
In meinem Skript wird der importierte String in eine Liste mit einzelnen Elementen (immer eine Line2D) zerlegt und diese Liste dann an die get_elements Methode übergeben. An diesem Punkt bekomm ich jedoch in Allplan immer die Meldung "StringToValueConverter:Value type line2d doesn't exist!!!".
Wenn ich die Liste mit den Stringelementen jedoch im Skript definiere, dann klappt alles wie gewohnt und ich kann mit CreateSweptBrep3D meinen 3D Körper erstellen. Kann mir jemand die Fehlermeldung genauer erläutern? Den Code in StringToValueCOnverter.py versteh ich mit meinen jetzigen Kenntnissen nur sehr schwer...
Grüße

Niklas

Hallo Niklas,

ohne die volle Implementation zu sehen ist es schwierig zu helfen. Vielleicht macht der openpyxl was mit dem Zelleninhalt, was dem GeometryStringValueConverter erschwert, den String zu interpretieren.
In welcher Version hast du es ausprobiert? In meinem 2024 funktioniert folgendes:

>>> line = GeometryStringValueConverter.get_element("Line2D(0,1840,0,0)")
>>> AllplanGeo.CalcLength(line)
1840.0

Hast du probiert, den Fehler vielleicht mit Hilfe einer interaktiven Console zu gebuggen? Z.B. Jupyter Interactive Notebook? Du kannst alle module in so einem Tool verwenden, auch die API module (NemAll...). Du musst im voraus einfach die Pfade

  • ...etc\PythonPartsFramework
  • ...etc\PythonPartsFramework\GeneralScripts
  • ...prg
mit sys.path.append(...) hinzufügen. Interaktion mit Allplan ist damit jedoch nicht möglich. In deinem Fall brauchst du sie aber nicht, um den Fehler zu finden.

Grüß,
Bart

Die Meldung "StringToValueConverter:Value type line2d doesn't exist!" enthält möglicherweise die Lösung!
Python ist eine Case-Sensitive Programmiersprache. "line2d" ist in Python nicht dasselbe wie "Line2D" !
Ich vermute mal, daß Deine openpyxl-Bibliothek das Zeug in Kleinschreibung umwandelt, oder die Codierung ändert!

Man müßte jedoch den Code sehen, um dort vielleicht mal ein print() einzubauen, um zu sehen, was wirklich in die Funktion
GeometryStringValueConverter.get_element() reingereicht wird. Nicht entfernte Zeilenumbrüche (\r\n) könnten ebenfalls zum Problem werden.

Hallo ihr beide,

@Bart: Ich teste es gerade in der 2023-1-7 Version. Übergebe ich mein String wie du direkt oder über eine definierte Variable, dann funktioniert auch alles ohne Probleme. Das mit der interaktiven Console habe ich noch nicht ausprobiert, danke für den Tipp!

@Nemo: Das habe ich mir auch schon überlegt und geprüft, bei print() wird die korrekte Schreibweise des Strings wiedergegeben.

Ich habe eben zufällig eine Lösung gefunden. Wieso meine ursprüngliche Variante nicht funktioniert hat, weiß ich jedoch nicht. Hier meine Lösung, vielleicht hilft es ja dem ein oder anderen. Trotzdem danke für euren Input!

Mit diesem Code greife ich auf die Excelzelle zu und übernehme deren Inhalt, anschließend wird der String unterteilt und die einzelnen Linien in eine Liste gepackt und an get_elements() übergeben. Mit geometrie_elemente und CreateSwprBRep3D erstelle ich mir dann ein Brep.

wb = load_workbook('Dateipfad einfügen = True)
ws = wb['Tabelle 1']

zelle = ws.cell(row=3, column=6)       
zelleninhalt = zelle.value             
print(zelleninhalt)                    

geo_elements = ast.literal_eval("["+zelleninhalt+"]")
for element in geo_elements:
    print(element)


geometrie_elemente = GeometryStringValueConverter.get_elements(geo_elements, True)

Bei meiner ursprünglichen Variante habe ich den String nicht mit dem ast-Modul zerlegt und in eine Liste mit Elementen gewandelt, sondern mit dem re-Modul und findall(). Die findall Methode macht also irgendwas womit get_elements nicht zurecht kommt.

Ich vermute mal, es hat was mit den Anführungszeichen zu tun!
In Excel kann man einen String durch ein führendes Anführungszeichen kennzeichnen, z.B.:
'Line2D(0,1840,0,0),Line2D(0,0,1270,0),Line2D(1270,0,1270,1840)

Wenn man das als "zelleninhalt" zuweist, kommt als Fehler:
SyntaxError: unterminated string literal

Sind die Anführungszeichen alle entfernt, und zelle.value ist ein String, dann entspricht das:
>>>zelleninhalt="Line2D(0,1840,0,0),Line2D(0,0,1270,0),Line2D(1270,0,1270,1840)"
>>>print(zelleninhalt)
Line2D(0,1840,0,0),Line2D(0,0,1270,0),Line2D(1270,0,1270,1840) #string

Sollten Anführungszeichen bei zelleninhalt = zelle.value noch dabei sein, dann entspricht das:
>>>zelleninhalt="Line2D(0,1840,0,0)","Line2D(0,0,1270,0)","Line2D(1270,0,1270,1840)"
>>>print(zelleninhalt)
('Line2D(0,1840,0,0)','Line2D(0,0,1270,0)','Line2D(1270,0,1270,1840)') #tupel of strings

Also was wird ausgegeben bei print(zelleninhalt)??

Man braucht aber für ast.literal_eval("["+zelleninhalt+"]") folgenden string für zelleninhalt:
>>>zelleninhalt='"Line2D(0,1840,0,0)","Line2D(0,0,1270,0)","Line2D(1270,0,1270,1840)"'
D.h. die Anführungszeichen um jede "Line2D(...)" müssen im string enthalten sein!
Dann kommt die gewünschte Liste von Strings raus:
>>>geo_elements = ast.literal_eval("["+zelleninhalt+"]")
>>>print(geo_elements)
['Line2D(0,1840,0,0)','Line2D(0,0,1270,0)','Line2D(1270,0,1270,1840)'] #list of strings