[Frage] Änderung des PythonParts über Attribute in den Eigenschaften [Gelöst]

Schlagworte:
  • Pythonpart
  • Eigenschaftenpalette
  • Attribute
  • Palette
  • Änderung
  • [AIDP-211092]

Hallo zusammen,

in der Vergangenheit hab ich mich genauer mit den SmartParts auseinandergesetzt, nun sind die PythonParts an der Reihe. Bei den SmartParts fand ich es toll, dass man über Änderungen von Attribute direkt die SmartParts steuern konnte. Hat man zum Beispiel eine 3D Linie als Part und ein Attribut „Länge der Linie“ welches man mit dem jeweiligen Parameter im Skript verknüpft, kann man die Länge der Linie über die Änderung des Attributes steuern. Man spart sich somit den Doppelklick auf das SmartPart (toll bei Änderung vieler SmartParts auf einmal).

Lassen die PythonParts solche Workarounds auch zu?

Grüße
Niklas

Lösung anzeigen Lösung verbergen

Hallo Niklas,

in einem Standard PythonPart, wenn du bei dem Parameter den ValueType auf Attribute stellst und ein zusätzlicher Tag mit Attribute ID hinzufügst, wird der Parameterwert mit dem Attribut verknüpft, und zwar in beiden Richtungen. Wie man das macht, das erklären wir hier. Modifikation des Parameterwertes ändert das Attribut, und Modifikation des Attributes ändert das Parameterwert. Allerdings, in dem zweiten Fall erfolgt das Zurückschreiben erst beim Modifizieren des PythonPart (also nach dem Doppelclick). Ich habe einen Beispielskript angehängt, in dem ein Cube generiert wird, bei dem die Länge mit dem Attribut @1953@ verknüpft ist. Wird das Attribut außerhalb von PythonPart modifiziert, wird sich die Länge des PythonPart bei der nächsten Modifikation anpassen.

Wir arbeiten daran, eine Funktionalität in Allplan zur Verfügung zu stellen, mit der man, ähnlich der Funktion SmartParts aktualisieren, alle PythonParts aktualisieren kann. Dies wird wahrscheinlich in der Version 2025 möglich sein. Somit könnte man die Attribute von mehreren PythonParts z.B. mit Attribut Import modifizieren und dessen Geometrie auf einmal updaten. Stand jetzt lässt sich das nur mit Doppelcklick machen.

Anhänge (1)

Typ: application/zip
627-mal heruntergeladen
Größe: 1,40 KiB

Hallo Niklas,

in einem Standard PythonPart, wenn du bei dem Parameter den ValueType auf Attribute stellst und ein zusätzlicher Tag mit Attribute ID hinzufügst, wird der Parameterwert mit dem Attribut verknüpft, und zwar in beiden Richtungen. Wie man das macht, das erklären wir hier. Modifikation des Parameterwertes ändert das Attribut, und Modifikation des Attributes ändert das Parameterwert. Allerdings, in dem zweiten Fall erfolgt das Zurückschreiben erst beim Modifizieren des PythonPart (also nach dem Doppelclick). Ich habe einen Beispielskript angehängt, in dem ein Cube generiert wird, bei dem die Länge mit dem Attribut @1953@ verknüpft ist. Wird das Attribut außerhalb von PythonPart modifiziert, wird sich die Länge des PythonPart bei der nächsten Modifikation anpassen.

Wir arbeiten daran, eine Funktionalität in Allplan zur Verfügung zu stellen, mit der man, ähnlich der Funktion SmartParts aktualisieren, alle PythonParts aktualisieren kann. Dies wird wahrscheinlich in der Version 2025 möglich sein. Somit könnte man die Attribute von mehreren PythonParts z.B. mit Attribut Import modifizieren und dessen Geometrie auf einmal updaten. Stand jetzt lässt sich das nur mit Doppelcklick machen.

Anhänge (1)

Typ: application/zip
627-mal heruntergeladen
Größe: 1,40 KiB

Danke dir für die ausführliche Antwort und natürlich den weiteren Ausblick!

Zitiert von: bmarciniec
Wir arbeiten daran, eine Funktionalität in Allplan zur Verfügung zu stellen, mit der man, ähnlich der Funktion SmartParts aktualisieren, alle PythonParts aktualisieren kann. Dies wird wahrscheinlich in der Version 2025 möglich sein.

Hi Bartlomiej,

Good news!
Great.


Ist es möglich einem Attribut Inhalte aus einer in der pyp.-Datei definierten Liste zuzuweisen, ohne dass in der .XML-Datei für dieses Attribut Listeninhalte definiert sind?

Konkretes Beispiel wäre das Attribut der Betonfestigkeitsklasse. In der Pyp.-Datei kann ich über <ValueList>C20/25|C25/30|…</ValueList> den Inhalt der Liste steuern und so dem Parameter den Wert zuweisen. Sobald ich jedoch den ValueType auf Attribute stelle verschwindet diese Liste (liegt wahrscheinlich daran, dass für das Attribut diese Liste in der XML.Datei nicht hinterlegt ist).

Über ein Workaround, dass ich den Parameter mit der Liste dann an einen Parameter mit dem Typ Attribut verkette könnte das ja dann funktionieren dass ich in der Palette die Auswahlliste hab und das Attribut am Part richtig ausgefüllt wird. Nur dann funktioniert das mit der Änderung über die Eigenschaften-Palette nicht mehr, da das Attribut den Wert ja eigentlich von einem anderen Parameter bekommt und das Attribut den neuen geänderten Wert nicht an den Ursprungsparameter zurückgibt. Ich hoffe meine Frage ist einigermaßen klar formuliert.

Hallo Niklas,

Das ist deswegen so, weil ValueType von Attribute übernimmt die Art des Kontrolelementes (Combo box, Eingabefeld...) aus der Attributdefinition. In der Definition vom Attribut @1905@ ist es als TextBox festgelegt, also ein normales Eingabefeld. Das ist bewusst so gemacht, damit die Datenkonsistenz beim Zurückschreiben vom PythonPart ins Attribut und in die andere Richtung erhalten bleibt.

Um dein Ziel zu erreichen, definiere ein ComboBox attribut in der .pyp Datei und mach zwei Sachen:

1. Füge den Tag <AttributeId> zusätzlich in das Attribut. Somit wird das Attributwert ins Parameterwert des PythonParts beim Doppelcklick auf das PyP durchgeführt.

        <Parameter>
            <Name>ConcreateGrade</Name>
            <Text>Concrete grade</Text>
            <Value>C20/25</Value>
            <ValueList>C20/25|C25/30</ValueList>
            <ValueType>StringComboBox</ValueType>
            <AttributeId>1905</AttributeId>
        </Parameter>

2. In deinem Skript sorge dafür, dass das Parameterwert ins Attribut geschrieben wird. Z.B. so:

    pyp_util = PythonPartUtil()

    attribute_list = BuildingElementAttributeList()
    attribute_list.add_attribute(1905, build_ele.ConcreteGrade.value)
    pyp_util.add_attribute_list(attribute_list)

Nun, dieser Workaround hat seine Schwachstelle. Nämlich: was passiert, wenn du außerhalb des PythonParts dem Attribut ein Wert zuweißt, der nicht in der <ValueList> enthalten ist? Am besten wäre es, dein eigenes Attribut Betonfestigkeitsklasse zu definieren, wo die zulässigen Werte in der Attributdefinition vorhanden sind und der ControlType auf Combobox eingestellt ist. Damit erreichst du 100% Datenkompatibilität. Das Allplan interne Attribut @1905@ kann das nicht sein, weil er international ausgerichtet ist.

Ich hoffe dir weitergeholfen zu haben

Anhänge (1)

Typ: application/zip
535-mal heruntergeladen
Größe: 1,60 KiB

Zitiert von: bmarciniec
Ich hoffe dir weitergeholfen zu haben

Mit dieser ausführlichen Antwort und dem Beispiel konntest du mir wieder sehr helfen, vielen Dank!

Hallo Bart,

zu dem Thema habe ich noch eine weitere Frage.

Zitiert von: bmarciniec
Hallo Niklas,
in einem Standard PythonPart, wenn du bei dem Parameter den ValueType auf Attribute stellst und ein zusätzlicher Tag mit Attribute ID hinzufügst, wird der Parameterwert mit dem Attribut verknüpft, und zwar in beiden Richtungen.

Sehe ich das richtig, dass wenn ich einzelne PythonParts zu einer PythonPart-Gruppe zusammenfasse, diese Variante dann nicht mehr funktioniert? Da es nun kein Standard PythonPart mehr ist, sondern eine Gruppe. Gibt es da vielleicht Workarounds auf die ich noch nicht gekommen bin und ausprobieren kann?

Ich teste nämlich gerade verschiedenste Workflows aus und wollte Informationen/ Attribute einer PythonPart-Gruppe mithilfe "Mengen-Daten exportieren.." exportieren, dann die Attribute abändern und die Daten über "Mengen-Daten importieren..." wieder in Allplan einlesen. Ziel ist es so auch die Geometrie des Parts über die Verbindung von Attribut und Parameter anzupassen.

Grüße
Niklas

Hi Niklas,

Ich glaube, dass die Tatsache, dass deine PythonPart Gruppe sich nach Anderung der Attribute nicht anpasst hat folgende Ursache: Pythonpart Framework geht beim reaktivieren des PyP die Parameter eins nach dem anderen durch. Hat ein Parameter ein <AttributeID>, versucht er aus dem PythonPart den Attributwert zu holen und überschreibt den Wert, der im Parameter war. In einer PythonPart gruppe, macht er das gleiche, aber schaut in die Attribute der PythonPartGruppe. Da gibt es vermutlich keine und somit kann er nichts aktualisieren.

Auf der anderen Seite kann ich dir keine andere Lösung anbieten. Elementgruppe wäre hier vielleicht die Lösung. Allerding diese Art von Gruppierung der PythonParts kommt nicht in Frage, weil eine PythonPart nicht das Child-Objekt von irgendwas sein kann. Das wird sich vielleicht in der Zukunft ändern. Wir sind am untersuchen.

VG,
Bart