icon

Forum de la communauté Allplan

Attribut für Kostengruppen - PythonPart [Résolu]


Hallo,

ich habe das Video gefunden und war total begeistert, dass man das Attribut der Kostengruppen automatisch an das Bauteil dranschreiben kann (0:55-1:40 min).

https://www.youtube.com/watch?v=zfHkuLeHOfU

Daraufhin habe ich das Python-Part-Paket installiert.

Da ich das Attribut nicht in den Standard-Attibuten von Allplan gefunden habe, habe ich das Attribut "KG_DIN276" selber angelegt.

Die Formel
p:assignKG(@IFC Entity@;@IFC PredefinedType@;@Tragendes Bauteil@;@Außenliegend@) habe ich händisch abgetippt. Nach dem Ausführen ist leider eine Fehlermeldung, wie im Screenshot, erschienen.

Kann es vielleicht damit zusammenhängen, dass das Attribut @618@ - "Außenbauteil" bei uns die Bezeichnung "Außenliegend" hat?
Was habe ich falsch gemacht und wie kann ich es zum Funktionieren bringen?

Ich feue mich auf Eure hilfreichen Tipps!

Pièces-jointes (1)

Type: image/jpeg
Téléchargé 99 fois
Size: 35,23 KiB

Show solution Hide solution

wichtig ist eine (am besten csv) Datenbank, in der die möglichen Kombinationen aufgelistet sind. An sich kann dafür die Excel-Datei, die mit dem PythonPart mitgeliefert wird als Grundlage dienen.

Aus meiner Sicht ist es ziemlich unsinnig, für das Ermitteln der Kostengruppe aus 4 Attributwerten eine Datenbank oder Excel-Datei zu bemühen!

Eine 4 stufige if-elif-else-Bedingung reicht völlig aus. Hier mal der Code für die Funktion assignKG:

def assignKG(IfcEntity,IfcType,LoadBearing,IsExternal):
    
    costGroup = "KG 000"
    
    if IfcEntity == "IfcFooting":
        if IfcType == "PILE_CAP":
            costGroup = "KG 323"
        else:
            costGroup = "KG 322"
    
    elif IfcEntity == "IfcWall":
        if LoadBearing != 0:
            if IsExternal == "ja":
                costGroup = "KG 331"
            else:
                costGroup = "KG 341"
        else:
            if IsExternal == "ja":
                costGroup = "KG 332"
            else:
                costGroup = "KG 342"
                
    elif IfcEntity == "IfcColumn":
        if LoadBearing != 0:
            if IsExternal == "ja":
                costGroup="KG 333"
            else:
                costGroup = "KG 343"
    
    elif IfcEntity == "IfcSlab":
        if LoadBearing != 0:
            if IsExternal == "ja":
                if IfcType == "BASESLAB":
                    costGroup = "KG 322"
                elif IfcType == "ROOF":
                    costGroup = "KG 361"
            else:
                costGroup = "KG 351"
                
    elif IfcEntity == "IfcRoof":
        costGroup = "KG 361"
      
    elif IfcEntity == "IfcBeam":
        if LoadBearing != 0:
            if IsExternal == "ja":
                if IfcType == "SPANDREL":
                    costGroup = "KG 331"
                else:
                    costGroup = "KG 361"
            else:
                if IfcType == "HOLLOWCORE" and LoadBearing == 0:
                    costGroup = "KG 355"
                else:
                    costGroup = "KG 351"

    elif IfcEntity == "IfcPile":
        costGroup="KG 323"
    
    elif IfcEntity == "IfcDoor":
        if IsExternal == "ja":
            if IfcType == "TRAPDOOR":
                costGroup="KG 362"
            else:
                costGroup="KG 334"
        else:
            if IfcType == "TRAPDOOR":
                costGroup="KG 352"
            else:
                costGroup="KG 344"
            
    elif IfcEntity == "IfcWindow":
        if IsExternal == "ja":
            if IfcType == "SKYLIGHT" or IfcType == "LIGHTDOME":
                costGroup="KG 362"
            else:
                costGroup="KG 334"
        else:
            costGroup="KG 344"
    
    elif IfcEntity == "IfcCovering":
        if IsExternal == "ja":
            if IfcType == "FLOORING":
                costGroup = "KG 324"
            elif IfcType == "CLADDING" or IfcType == "USERDEFINED" or IfcType == "NOTDEFINED":
                costGroup = "KG 335"
            elif IfcType == "INSULATION" or IfcType == "MEMBRANE":
                costGroup = "KG 325"
            elif IfcType == "ROOFING":
                costGroup = "KG 363"
        else:
            if IfcType == "FLOORING" or IfcType == "SKIRTINGBOARD":
                costGroup = "KG 353"
            elif IfcType == "CEILING":
                costGroup = "KG 354"
            else:
                costGroup = "KG 345"
                
    elif IfcEntity == "IfcCurtainWall":
        if IsExternal == "ja":
            costGroup = "KG 337"
        else:
            costGroup = "KG 346"
            
    elif IfcEntity == "IfcShadingDevice":
        if IsExternal == "ja":
            if IfcType == "AWNING":
                costGroup = "KG 361"
            else:
                costGroup = "KG 338"
        else:
            costGroup = "KG 347"
            
    elif IfcEntity == "IfcMember":
        if IfcType == "COLLAR" or IfcType == "POST" or IfcType == "PURLIN" or IfcType == "RAFTER":
            costGroup = "KG 361"
            
    elif IfcEntity == "IfcRailing":
        if IsExternal == "ja":
            costGroup = "KG 339"
        else:
            costGroup = "KG 349"
            
    elif IfcEntity == "IfcStair":
        costGroup = "KG 351"
        
    elif IfcEntity == "IfcRamp":
        costGroup = "KG 351"
            
    elif IfcEntity == "IfcChimney":
        costGroup = "KG 399"
        
    elif IfcEntity == "IfcFurniture":
        costGroup = "KG 610"
        
    return costGroup

Diese Funktion ergibt dasselbe, wie ein Look-Up in der Excel oder Datenbank.

Aber: Aus meiner Sicht sind die Kriterien IfcEntity, IfcType, LoadBearing, IsExternal die Falschen.
Das Klassifizieren mit diesen Kriterien setzt voraus, dass diese korrekt an allen Objekten vorhanden sind bzw gesetzt wurden.
Ein Test mit dem Allplan Hello!-Projekt zeigt, dass diese Attribut-Werte von der Formel nicht korrekt erkannt werden.
Beispielsweise wurde die IfcEntity einer Wandschicht mit "IfcWall" angezeigt, in Script kam aber "undefiniert" an!
Dazu habe ich eine Testfunktion readAttr benutzt:

def readAttr(IfcEntity,IfcType,LoadBearing,IsExternal):
    return IfcEntity+IfcType+str(LoadBearing)+str(IsExternal)

Diese bringt folgendes Ergebnis für die Wand (s.attr_gesamtwand.png) und für die Wandschicht (s.attr_wandschicht.png)
Bei der Wandschicht kommt statt "IfcWall" "undefiniert" an!
Erst nach Wechseln zu "IfcBeam" und zurück zu "IfcWall" wurde diese auch in das Script "reingereicht".
@Allplan
Das ist ein gravierender Fehler, der behoben werden sollte.

Pièces-jointes (3)

Type: image/png
Téléchargé 19 fois
Size: 97,39 KiB
Type: image/png
Téléchargé 16 fois
Size: 109,09 KiB
Type: application/zip
Téléchargé 1 fois
Size: 914,00 B
1 - 10 (21)

Solange die Attributnummer stimmt ist es irrelevant wie das Attribut heisst. Hast du ggf eine nicht Deutschland-deutsche Installation?
Aber:
Das Formel Attribut wird für den Workflow mittels PythonPart aus meiner Sicht nicht benötigt.

Das Video ist da etwas verwirrend. Es wird zuerst der Weg mittels Formel-Attribut gezeigt und danach der mittels PythonPart und verknüpfter Excel Datei.
Das Formel-Attribut findet auch in der Anleitung von Allplan keine Erwähnung. Einfach mal direkt mit dem PythonPart versuchen. dafür wird das Standardattribut "Klassifikationsschlüssel" verwendet

die Daten sind hier zu beziehen

Viele Grüße
Florian

LinkedIn-Profil

www.vollack.de

In Diegnostics und Einstellungen wird angezeigt, dass das Standard-Land: DEU und die Sprache: DEU ist.

Bei den PythonParts sehe ich die Schwierigkeit bei änderungen an den Attibuten. Vor allem denkt vieleicht nicht jeder von dem IFC Export daran das Tool nochmal auszuführen und die Fehleranfälligkeit steigt bei jedem Attibut, welches sich nicht automatisch generiert-vor allem wenn auch Verkstudenten und Bauzeichner, die ggf. die Zusammenhänge nicht ganz verstehen oder am Anschlag ihrer Kapazität sind, aktiv am Projekt mitarbeiten.

Mit der Formel habe ich schon mal im anderen Büro gearbeitet und würde mich sehr freuen, die Vorteile dieses Attributs wieder genießen zu können.

Der PythonPart Workflow zeigt aus meiner Sicht gut was derzeit oft in der BIM Welt schief läuft:

Modelle werden mit (überflüssigen) Informationen zugeballert, nur weil es möglich ist. Der Mehrwert wird aber nicht betrachtet!
Dabei sage ich nicht (!!!) das es überflüssig ist die Information der Kostengruppen aus dem Modell ersehen zu können.

ABER

Es ist nicht Sinnvoll Daten "doppelt" abzulegen (--> Datenhygiene, SSoT --> Single Source of Truth)
Wie in dem Video und in der Anleitung ersichtlich, benötigt es für den Workflow die ifc Standard Attribute, die genau die Klassifizierung der DIN 277 beschreiben.
Modellersteller sind schon genug damit beschäftigt diese Informationen korrekt in den Modellen zu halten.
Das Klassifizieren muss anschließend dort satt finden wo es benötigt wird: Also beim Import der ifc Modelle in der Zielsoftware, und das über die angesprochenen Standardattribute.

Für Denjenigen, der Das ifc-Modell anschließend weiter verwendet bietet ein zusätzliches Attribut also keinen Mehrwert, sondern es birgt nur die Gefahr von Unstimmigkeiten.

Viele Grüße
Florian

LinkedIn-Profil

www.vollack.de

Ganz meine Meinung!

Ich teile diese Meinung nicht vollumfänglich.

Wenn man die Information "Kostengruppe" über ein Formel-Attribut generieren läßt,
kann es zu keinen "Unsitmmingkeiten" kommen. Wenn sich eines der "beteiligten" Attribute ändert,
wird automatisch die Kostengruppe neu "ausgewertet".

Insofern ist sogar die Methode, die "Kostengruppe" mit dem PythonPart einmalig statisch an die Objekte zu schreiben, nicht zielführend, da nicht "assoziativ"!

Es handelt sich auch nicht um "doppelt abgelegte Daten", selbst wenn eine direkte Abhängigkeit zu anderen Attributen besteht, da diese Abhängigkeit nicht trivial und auch nicht linear ist!
Wenn die abhängigen Attribute alle auch im IFC-Modell vorhanden sind, ist es möglicherweise egal, wann man dieses Datum "Kostengruppe" "übersetzt".

Möglicherweise braucht es aber noch zusätzliche Informationen, welche nur in Allplan-Attributen oder Element-Eigenschaften, nicht aber im IFC-Modell verfügbar sind, um eine genaue Zuordnung zu treffen. In diesem Fall wäre eine "Übersetzung" in Allplan alternativlos.

Hallo zusammen, kann uns bitte noch jemand helfen um die Python-Formel in der Script Datei zu erstellen und zu verstehen..
Ein Anfang wäre sehr hilfreich. Bei uns klappt es leider irgendwie nicht.
Gibt es so noch etwas zu beachten ? Danke Euch recht herzlich.

Jana

Würde mich auch über ein Learn now dazu freuen…

Gruß!
Jürgen

Allplan Ingenieurbau V10 bis V2025

Um nochmal auf den ursprünglichen Beitrag von Agi_M zurück zu kommen. Wir versuchen uns auch gerade an dieser Formel und bekommen auch dauernd genau den gleichen Fehler zurück, das die Funktion nicht gefunden wurde. Hat den irgendjemand eine Lösung dafür oder Tipps und Tricks was bei der Bearbeitung der functions.py zu beachten ist?

Viele Grüße
Andreas

Cité par Hoellriegl
Um nochmal auf den ursprünglichen Beitrag von Agi_M zurück zu kommen. Wir versuchen uns auch gerade an dieser Formel und bekommen auch dauernd genau den gleichen Fehler zurück, das die Funktion nicht gefunden wurde. Hat den irgendjemand eine Lösung dafür oder Tipps und Tricks was bei der Bearbeitung der functions.py zu beachten ist?
Viele Grüße

Andreas

wichtig ist eine (am besten csv) Datenbank, in der die möglichen Kombinationen aufgelistet sind. An sich kann dafür die Excel-Datei, die mit dem PythonPart mitgeliefert wird als Grundlage dienen.

Die Formel im Allplan-Attribut "p:assignKG(@IFC Entity@;@IFC PredefinedType@;@Tragendes Bauteil@;@Außenliegend@)" verweist auf ein script in der functions.py, was schon richtig erkannt wurde.

Die Funktion muss die Werte aus der csv abfragen, kombinieren und aus der Spalte der Kgr den Wert ausgeben. Nur wenn in der functions.py alle Werte definiert sind kann die Formel in Allplan funktionieren. ansonsten kommt diese Fehlermeldung.
ich an deiner Stelle, würde mir das von eine LLM KI deiner Wahl schreiben lassen. mit pythonscripting habe ich da gute Erfahrungen gemacht.

Viele Grüße
Florian

LinkedIn-Profil

www.vollack.de

1 - 10 (21)