[Question] Python list mit Bildern


Hallo zusammen,

Ich würde gerne eine dynamische Liste erstellen, die Elemente auflistet. Jedes Element durchläuft einen Check. Je nach Ergebnis soll in der Liste ein Icon angezeigt werden. Die Liste besteht dann aus Elementname, Nachricht und eben das Icon.
Nun habe ich aber zwei Probleme:
1. Wenn ich eine Liste direkt in der .pyp Datei erstelle, funktioniert alles gut. Verlagere ich es aber in eine .incpyp, bekomme ich die Fehlermeldung, dass es die Variable $list_row nicht kennt. Wie kann ich das vermeiden? Ich würde ungern alles in meiner .pyp Datei haben zwecks Readability
2. Wenn ich eine Liste von Bildern hinzufügen will, füge ich (zum testen mal hardgecoded) die Picture Ids ein. Leider wirft das aber immer Fehler. Habe es mal mit verschiedenen Werten für den Parameter "Value" probiert, etwa int statt str, statt [] Trenner (|), etc. Leider hat nichts geklappt.
Die Fehlermeldung:

 Python argument types in
    None.AddPicture(PythonWpfPaletteBuilder, str, str, str, str, float, int, str, str)
did not match C++ signature:.....

Nach etwas debuggen bin ich draufgekommen, dass in der BuildingElementPalette.py Zeile 381 ein data Element erzeugt wird. Als default value wird der Wert von __selected_value auf 0.0 gesetzt. Die Funktion von AddPicture erwartet sich aber ein int, nicht ein float.
Wie kann ich das umgehen? Oder liegt der Ursprung meines Problems komplett wo anders?

Das ist die Liste, die ich erzeuge (Elementname und Nachricht werden im Code erstellt, Anzahl der Values passt aber):

      <Parameter>
        <Name>AttributeListGroup1</Name>
        <ValueType>ListGroup</ValueType>

        <Parameter>
            <Name>GroupRow</Name>
            <Text>"Field " + str($list_row + 1)</Text>
            <ValueType>Row</ValueType>
            <Value>1</Value>

            <Parameter>
                <Name>ECList_Name</Name>
                <Text>Section name</Text>
                <Value>[]</Value>
                <ValueType>Text</ValueType>
                <Dimensions>ECList_Dimension</Dimensions>
            </Parameter>

            <Parameter>
                <Name>ECList_Result_Text</Name>
                <Text>Section name</Text>
                <Value>[]</Value>
                <ValueType>Text</ValueType>
                <Dimensions>ECList_Dimension</Dimensions>
            </Parameter>

            <Parameter>
                <Name>ECList_Result_Icon</Name>
                <Value>["10529","10529","10529","10529","10529"]</Value>
                <ValueType>Picture</ValueType>
                <WidthInRow>10</WidthInRow>
            </Parameter>

        </Parameter>
    </Parameter>

Liebe Grüße
Melanie

Ich habe gerade zufällig gesehen, dass man auch die Orientation hinzufügen kann:
<Orientation>Right</Orientation>

Bekomme aber nun eine andere Fehlermeldung:

 File "C:\Program Files\Allplan\Allplan 2024\Prg\Python\Lib\pathlib.py", line 493, in _parse_args
    a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not int

Habs dann wieder mit str probiert, aber dann passt die C++ Signatur wieder nicht...

Hallo Melanie

Hast Du es vielleicht mit namedtuple probiert? Z.B. so

        <Parameter>
            <Name>AttributeTuples</Name>
            <TextDyn>"Field " + str($list_row + 1)</TextDyn>
            <Value>[Foo|Fuu|10529;Bar|Bat|10527;Baz|Bay|10529]
            </Value>
            <ValueType>namedtuple(Text,Text,Picture)</ValueType>
            <NamedTuple>
                <TypeName>AttributeType</TypeName>
                <FieldNames>ECList_Name,ECList_Result_Text,Pic</FieldNames>
            </NamedTuple>
        </Parameter>

So werden die Picture IDs richtig interpretiert. Man kann sie auch im code manipulieren (wie mit namedtuple umgehen). Nachteil: Orientation Tag funktioniert ggfs. nicht.

Bzgl. Verlagern in .incpyp: wier haben ziemlich viele erneuerungen in 2025 eingeführt (#include wird mit Include Parameter ersetzt). Es kann sein, dass dein Problem mit $list_row erst dort gelöst wird.

Grüße,
Bart

Hallo Bart,

danke für die Antwort!
Mit dem NamedTuple sieht man die Bilder, aber ich habe nicht herausfinden können, wie ich dann die ganze "Reihe" verwenden kann (so wie bei der Liste, wo man "Value" auf 1 setzen muss) und die Breite ("WidthInRow") definieren kann. Wäre das mit dem NamedTuple überhaupt möglich?

und zum zweiten Punkt:
Kann ich mein PythonPart dann auch ohne Probleme für Allplan 2025 verwenden? Oder gibt es da Probleme, wenn ich #include verwende?

Liebe Grüße
Melanie

Hi Melanie,

in meinem Beispiel handelt es sich weiterhin um eine Liste, allerdings nur eine, in der mehrere Namedtuples drin sind. Wenn du also das erste ECList_Result_Text lesen willst, callst du:

build_ele.AttributeTuples.value[0].ECList_Result_Text

Das WidthInRow habe ich nicht ausführlich getested.

#include ist soft-deprecated, d.h. es bleibt bestehend aber es kommen keine weiteren Features dazu. Es sollte also auch in 2025 funktionieren.

Viele Grüße,
Bart

Hallo Bart,

Danke - habe es dann auch in eine Liste konvertiert. Das WidthInRow wird leider ignoriert...
Habe jetzt einfach als "Workaround" ein PictureResourceButton verwendet (also kein NamedTuple)

Liebe Grüße
Melanie