Support Forum

Ist dynamisches Generieren von Eingabefeldern möglich mit .pyp [Gelöst]

Schlagworte:
  • PythonParts

Hallo,

ich arbeite aktuell an einem PythonPart, welches eine dynamische Anzahl von geometrischen Objekten generieren soll. Für jedes Objekt möchte ich, dass der Nutzer Parameter, die zur Generierung des Objekts benötigt werden, eingeben kann.

Ist dies möglich innerhalb von .pyp Dateien? Prinzipiell könnte man eine .pyp Datei dynamisch erzeugen, aber dies finde ich eher unelegant.

Lösung anzeigen Lösung verbergen

Hallo rabl_,

eine Beispiel für

- eine dynamischen Liste findest Du in dem Example ValueList (siehe PaletteExamples)
- die Verwendung von include findest Du in IncludeControls (siehe PaletteExamples)
- für die dynamische Erzeugung von GUI-Elementen fehlt leider noch

Viele Grüße
Horst

11 - 16 (16)

Hi Bertrand,

with pythonnet you connect Python with e. g. a C#/WPF assembly. This assembly can use the Allplan assemblies with the Allplan WPF controls, which are exist for your mentioned value types.

We also plan to improve PythonParts interface (*.pyp) to have at least the same possibilities as with the SmartParts. But we also need to know what's currently missing. Please inform me about this.

Best regards
Horst

Ok,

ich habe mir die Beispiele angeschaut und damit kann ich mein PythonPart definitiv umsetzen.
Ich hoffe nur, das in Zukunft die Dokumentation noch ergänzt und überarbeitet wird. Aktuell muss man in vielen Hinsichten raten und ausprobieren, bis man triviale Funktionen gefunden hat.

Zitiert von: Horst_Hohmann
Hi Bertrand,
with pythonnet you connect Python with e. g. a C#/WPF assembly. This assembly can use the Allplan assemblies with the Allplan WPF controls, which are exist for your mentioned value types.
We also plan to improve PythonParts interface (*.pyp) to have at least the same possibilities as with the SmartParts. But we also need to know what's currently missing. Please inform me about this.
Best regards

Horst


Ok, thank you for the information. I will try...
And I will contact you directly about the improvements.


Großartig, das man mit pythonnet WPF-Componenten benutzen kann, wußte ich nicht! Sorry!

Kann man diese WPF-Dialoge auch mit eine PythonPart (ohne den Interactor) benutzen?
Oder wenn das nicht geht, wie erzeuge ich ein modifizierbares PythonPart mit einer benutzerdefinierten Eingabefunktion
(Interactor=True)?

Zu den "dynamischen" (gescripteten) Controls in der Palette: Sicher braucht man das nicht immer, deshalb wäre eine
zusätzliche optionale gescriptete UI sicher hilfreich.
Bei den statischen Controls wäre es aber eine enorme Hilfe, wenn Multi-Edit funktionieren würde.
(Da haben wir bei den SmartParts leider zu spät dran gedacht!)
Mit statischen Controls ist das nicht schwer zu implementieren (s. py_multi_edit.mp4)

Dass sich zukünftig gleiche PythonParts auf Nachfrage aktualisieren ist schon mal ein Schritt, mit diesem Manko umzugehen.
Da würde ich mir wünschen, das je PythonPart einstellen zu können. Manche PythonParts brauchen diese Art der
Gleichheitsüberprüfung nicht!

Eine weitere Erleichterung (für den Vertrieb der PythonParts) wären noch 2 Dinge:

-Autarkheit: Das PythonPart auf dem Teilbiild muss autark funktionieren, ohne zusätzliche py-Dateien installieren zu müssen
Sprich: das Script muss dann sicherlich am PythonPart gespeichert werden.

-Schutz: Gute PythonParts zu programmieren erfordert einigen Aufwand.
Den möchte man sich ggf. vergüten lassen, indem man die PythonParts verkauft/lizensiert.
Zumindest sollte das Python-Script mit einem Passwort geschützt werden können, damit man dort ggf. weitere Schutz- bzw. Lizensierungsfunktionen einbauen kann. (s. SmartParts von Bertrand/difraxis)

Der Hinweis auf die spärliche Dokumentation ist sicherlich auch berechtigt.
Das zitierte Beispiel ValueList.pyp ist leider alles andere als selbsterkärend.
Es hilft doch allen, wenn man leicht an die notwendigen Informationen kommt, ohne rumprobieren zu müssen.

Anhänge (1)

Typ: video/mp4
819-mal heruntergeladen
Größe: 1,95 MiB

Hallo Nemo,

sicherlich geht es auch ohne den Interactor, weil du prinzipiell ein beliebiges Programm aufrufen kannst. Wie es dann mit dem Python Skript kommuniziert, ist dir dann selbst überlassen. Meine vorherige Frage bezog sich jedoch darauf, ob man das WPF direkt in Allplan einbetten kann, ohne ein separates Fenster zu öffnen.

Zum Schutz der Python Dateien gäbe es mehrere Optionen. Mit CPython lässt sich ein Programm in Python Bytecode umwandeln. Aus einer solchen Datei kann man per Hand nur noch die String Literale auslesen, wobei es Werkzeuge gibt, z.B. python-decompile3, die einem das Lesen des Quellcodes ermöglichen. Dies ist natürlich auch bei herkömmlichen C oder C++ Programmen mit einem Disassembler möglich. Als zusätzliches Werkzeug zum Schutz des Quellcodes könnte man das Programm vorher durch einen Obfuscator laufen lassen. Um dann die Benutzung des Programms einzuschränken bräuchte man eine Verifizierung des Nutzers; die könnte man direkt im Programm integrieren, aber falls möglich auch über eine Schnittstelle in Allplan selbst.

..alles richtig! Trotzdem wird das Script doch durch das Allplan-Python-Framwork von einer bestimmten Stelle geladen und eine neuen Eingabefunktion (der Interactor) erst dann gestartet. Beim PythonPart genauso!
Beides funktioniert nicht, wenn nur die vorkompilierte .pyc-Datei vorhanden ist. (...falls Du das mit ByteCode gemeint hast)
"Danach", wenn das Script geladen ist, oder dem Python-Interpreter zu ausführung übergeben wurde, kann man sicher alles machen, was in Python erlaubt ist!

Das Laden der .py-Datei durch das Allplan-Python-Framwork müßte ja dann auch das Laden von Bytecode oder sogar verschlüsselter
Scripte erlauben! Es ist doch nicht so schwierig, die py-Datei beim Laden zu entschlüsseln, und dann erst zu starten.
Das könnte man performant im C++ machen, und hätte den Vorteil, das das dann schon mal etwas schwerer zu umgehen ist.

Mit diesem Schutz kann man dann im Python-Script eine komfortable Lizensierung aufbauen, ggf. sogar mit Echtzeit-lizensierung über
einen Lizenzserver.

Und zurück zur Frage mit WPF in Allplan:
Für C++ gibt es diverse Service-Klassen, um z.B. den WPF-Dialog als Allplan-Palette anzeigen zu können.
Die statische .pyp-Datei benutzt diese, um die Controls in der Palette anzuzeigen.
Sicher ist es möglich, auch das C++ CLI/CLR Dialog-Framwork mit Python-Bindings zu versehen.
Spätenstens wenn man z.B. im pythonnet-WPF-Dialgog Controls haben möchte, die auf Allplan-Ressourcen zugreifen müssen
(wie Schraffuren, Muster, Stilflächen, Layer usw.), braucht man diese Service-Klassen in Python dafür.
Diese Controls brauchen das Binding an ein sogenanntes CommonControlsInit-Objekt, damit sie funktionieren.
Das wird aber sicher als nächstes kommen...

11 - 16 (16)