Support Forum

[Frage] ChangeAttribute(...) funktioniert nicht immer


Hallo zusammen,

Ich habe ein PythonPart erstellt, wo Attribute Elementen hinzugefügt werden. Jedoch funktioniert das nicht immer. Ich habe z.B ein Deckendurchbruch der die Attribute nie annimmt. Wenn ich es aber nicht über das PythonPart mache, sondern direkt in Allplan via UI, klappt es.

Hier ist der Code:

updated_elements = AllplanBaseElements.ElementsAttributeService.ChangeAttribute(attribute, default_value,
                                                                element_attribute_mapping.element)
for element in updated_elements:
    attributes_new = element.GetAttributes(AllplanBaseElements.eAttibuteReadState.ReadAll)
    # check if the attribute is actually in the new attributes list
    if any(k == attribute for k, v in attributes_new):
        self.log_handler.log(Severity.INFORMATION,
                "Bauteil " + element_attribute_mapping.name + ": Das Attribut mit der Id " + str(
                    attribute) + " wurde erfolgreich mit dem Bauteil verknüpft!")
    else:
        # if it is not found, log an erro
        self.log_handler.log(Severity.ERROR,
                "Bauteil " + element_attribute_mapping.name + ": Das Attribut mit der Id " + str(
                    attribute) + " konnte von Allplan nicht angehängt werden!")

Kann mir jemand weiterhelfen und sagen, wo das Problem liegt?
Leider gibt die ChangeAttribute methode nur das neue Element zurück, aber keine Information, ob ein Fehler aufgetreten ist, geschweige denn was für ein....

Liebe Grüße
Melanie

Bei welcher AttributID / Wert funktionert es denn nicht?
Selbst mit dem Python-Code sieht man ja nicht, bei welchem Attribut es scheitert.
Da wäre das log-File hilfreich gewesen.

Warum eine Attributzuweisung scheitert, kann viele Gründe haben. Hier einige:
1. Falscher Wert , z.B. String-Attribute soll mit Integer-Wert geschrieben werden
2. Bei Enum-Attributen soll ein Wert geschrieben werden, der in der Werte-Liste nicht vorhanden ist
3. Attribute mit der ID ist nicht definiert
4. Am entspr. Objekt gibt es noch gar kein Attribut-Set, welches Attribute "aufnehmen" kann
5. Es soll ein Attribut geschrieben werden, welches an dem ObjektTyp nicht zulässig ist
Bsp. Attribut 209-"Gewerk" ist bei Architekturbauteilen Bestandteil des CNOI_ArchitektureStyles
(wie 508-"Material" und 120-"Abrechnungsart" auch)
Wenn man das Attribut mit "Allplann-UI"-Mitteln zuweist, wird das intern dorthin gemappt, und auch
wieder von dort gelesen, und als "Attribut" angezeigt (obwohl es gar keins ist)
6. Allplan hat mit den projektspezifischen Attribut-Set-Vorlagen ein "chaotisches Eigenleben" bezüglich Attribut-Zuweisung entwickelt. Da werden Attribute "automatisch" hinzugefügt oder eben auch nicht bzw. sogar gelöscht! Nach welchen Kriterien dies geschieht, ist insbesondere bei der Änderung des Attributsets völlig unklar! Und in Allplan 2025 wird das Ganze noch schlimmer: Da kommen dann auch noch IDS-Regeldateien hinzu, die in die Attributvergabe "hineinpfuschen". Das alles geht an den Programmierwerkzeugen wie C++ (NOI-API) oder auch Python komplett vorbei und kann mit diesen nicht beeinflusst werden.
7. An einige Elemente, insbesondere Architektur-Elemente, lassen sich nicht alle Attribute anhängen.
Möglicherweise hat es damit zu tun, dass diese die Attribute des Parent-Elements einfach "wiederholen" bzw. erben sollen. Bei Öffnungselementen ist das scheinbar der Fall.

Hallo Nemo,

Zu 1.: Der Default Wert wird mit dieser Funktion abgefragt:

AllplanBaseElements.AttributeService.GetDefaultValue(doc, attribute)

Zu 2. und 3.: Die Attribute, die ich hinzufüge, erstelle ich selbst. In diesem Fall waren es ein Text Attribute. Von denen habe ich 7 erstellt, alle mit dem Namen TestAttribute1, TestAttribut2, etc. Dieses Attribut habe ich dann aber auch noch an Wände und Möbel angehängt, ohne Probleme.

Zu 4. und 5.: Das sollte eigentlich auch kein Problem sein, denn wenn ich es über die UI mache, direkt in Allplan, funktioniert es ja. Da kann ich das Element hernehmen und intern abfragen, welche Attribute es hat und meine erzeugten Attribute sind dann auch dabei.

Zu 6.: Wie kann man denn sowas verfolgen? Ich schreibe nämlich ein Plugin, damit alle am Projekt/Firma beteiligten Personen die notwendigen Attribute haben. Da ist ein so willkürliches Verhalten aber ganz und gar nicht gut?