Support Forum

Probleme beim erstellen von ArchElements


Ich kann problemlos mit BReps arbeiten, aber ich bekomme es einfach nicht hin eine einfache Decke mit der PythonAPI zu erstellen. Bei den Beispielen habe ich nur das Raumbeispiel gefunden, da komme ich auch nicht weiter. Das ModelElement3D wird erstellt, beinhaltet jedoch keine Geometrie.
Evtl. kann jemand mal ein Blick auf meinen code werfen. Ich habe es sehr simpel gehalten.

# tested on Allplan 2024.1.x
print("Let's go!")


import NemAll_Python_Geometry as AllplanGeo
import NemAll_Python_BaseElements as AllplanBaseElements
import NemAll_Python_BasisElements as AllplanBasisElements
import NemAll_Python_ArchElements as AllplanArchElements
from CreateElementResult import CreateElementResult as EleRes


def check_allplan_version(build_ele, version):

    # Delete unused arguments
    del build_ele
    del version

    # Support all versions
    return True


def create_element(build_ele, doc):

    # Delete unused arguments
    del build_ele
    del doc

    print("\nRun script and have fun ... :-)\n")

    model_ele_list = []

    com_props = AllplanBaseElements.CommonProperties()
    com_props.GetGlobalProperties()

    # *****************************************
    # simple geometry
    origin = AllplanGeo.AxisPlacement3D(
        AllplanGeo.Point3D(0, 0, 0),
        AllplanGeo.Vector3D(0, 1, 0),
        AllplanGeo.Vector3D(0, 0, 1)
    )
    abrep = AllplanGeo.BRep3D.CreateCylinder(origin, 5, 10)
    print(type(abrep))
    print(abrep)

    model_ele_list.append(AllplanBasisElements.ModelElement3D(com_props, abrep))
    print(type(model_ele_list[0]))
    print(model_ele_list[0])

    # *****************************************
    # arch geometry
    polygon2D = AllplanGeo.Polygon2D()
    polygon2D += AllplanGeo.Point2D(0, 0) 
    polygon2D += AllplanGeo.Point2D(100, 0) 
    polygon2D += AllplanGeo.Point2D(100, 50) 
    polygon2D += AllplanGeo.Point2D(0, 50) 
    polygon2D += polygon2D.Points[0] 
    # print(polygon2D)

    slab_props = AllplanArchElements.SlabProperties()
    aslab_ele = AllplanArchElements.SlabElement(slab_props, polygon2D)
    print(type(aslab_ele))
    print(aslab_ele)

    model_ele_list.append(AllplanBasisElements.ModelElement3D(com_props, aslab_ele))
    print(model_ele_list[1])
    print(type(model_ele_list[1]))

    # *****************************************
    # End
    return EleRes(elements = model_ele_list)

BIM, BAM, BOOM
BIM-Modelle Tragwerksplaner --> http://www.bimstatik.ch/
My Allplan PythonParts --> https://github.com/BIMStatik/AllplanPythonParts
LinkedIN --> https://ch.linkedin.com/in/bernd-hahnebach-269b855a

Hi,

Hier mal das korrekte code:

import NemAll_Python_AllplanSettings as AllplanSettings
import NemAll_Python_ArchElements as AllplanArchElements
import NemAll_Python_Geometry as AllplanGeo
import NemAll_Python_IFW_ElementAdapter as AllplanElementAdapter

from CreateElementResult import CreateElementResult as EleRes


def check_allplan_version(build_ele, version):
    return True

def create_preview(_build_ele, _doc) -> EleRes:

    return EleRes()


def create_element(_build_ele, doc: AllplanElementAdapter.DocumentAdapter):

    # arch geometry
    polygon2D = AllplanGeo.Polygon2D.CreateRectangle(AllplanGeo.Point2D(),
                                                     AllplanGeo.Point2D(100, 50))

    slab_props = AllplanArchElements.SlabProperties()
    slab_props.PlaneReferences = AllplanArchElements.PlaneReferences(doc, AllplanElementAdapter.BaseElementAdapter())

    slab_ele = AllplanArchElements.SlabElement(slab_props, polygon2D)
    slab_ele.CommonProperties = AllplanSettings.AllplanGlobalSettings.GetCurrentCommonProperties()

    return EleRes([slab_ele], placement_point= AllplanGeo.Point3D())

Und hier das Wichtigste in Kurze:

  • SlabElement soll nicht ins ModelElement3D gepackt werden. Beide sind model elemente. Der erste repreäsentiert eine Decke. Der zweite repräsentiert ein 3D Körper.
  • Man muss PlaneReferences definieren. Tut man das nicht, Allplan wird abstürzen
  • Man muss die create_preview funktion definieren. Sonst würde die Funktion create_element verwendet, um den preview in der Bibliothek zu erzeugen und das kann Probleme machen.

Viele Grüße,
Bart

Super vielen Dank und vor allem auch für die Erläuterungen. Da wäre ich ja selber nie drauf gekommen. gruss bernd

BIM, BAM, BOOM
BIM-Modelle Tragwerksplaner --> http://www.bimstatik.ch/
My Allplan PythonParts --> https://github.com/BIMStatik/AllplanPythonParts
LinkedIN --> https://ch.linkedin.com/in/bernd-hahnebach-269b855a

nächstes problem mit Architekturbauteilen. An ein brep ModelElement3D kann ich problemlos Formatierungs- und Attributsproperties anhängen und ändern. Bei einem Architekturbauteil mache es es nur teilweise, meckert aber auch nicht, dass die Methoden falsch sind. Bsp. Layer setzt er, aber die xxxByLayer nicht. Attribut Objektname setzt er, andere nicht und neue hängt er nicht an. Beim ModelElement3D macht er das problemlos. gruss bernd

# tested on Allplan 2024.1.x
print("Bernds module has been loaded .. YEAH ... let's go!")


import NemAll_Python_Geometry as AllplanGeo
import NemAll_Python_BaseElements as AllplanBaseElements
import NemAll_Python_BasisElements as AllplanBasisElements
import NemAll_Python_ArchElements as AllplanArchElements
import NemAll_Python_IFW_ElementAdapter as AllplanElementAdapter

from CreateElementResult import CreateElementResult as EleRes


def check_allplan_version(build_ele, version):
    return True


def create_preview(_build_ele, _doc) -> EleRes:
    return EleRes()


def create_element(build_ele, doc: AllplanElementAdapter.DocumentAdapter):

    print("\nRun script and have fun ... :-)\n")

    model_ele_list = []

    com_props = get_formatting()
    all_attributes = get_attributes()

    # brep geometry
    origin = AllplanGeo.AxisPlacement3D(
        AllplanGeo.Point3D(0, 0, 0),
        AllplanGeo.Vector3D(0, 1, 0),
        AllplanGeo.Vector3D(0, 0, 1)
    )
    azyl = AllplanGeo.BRep3D.CreateCylinder(origin, 150, 200)
    brep_ele = AllplanBasisElements.ModelElement3D(com_props, azyl)
    brep_ele.SetAttributes(all_attributes)
    model_ele_list.append(brep_ele)

    # slab geometry
    polygon2D = AllplanGeo.Polygon2D.CreateRectangle(
        AllplanGeo.Point2D(),
        AllplanGeo.Point2D(1000, 500)
    )
    slab_props = AllplanArchElements.SlabProperties()
    slab_props.PlaneReferences = AllplanArchElements.PlaneReferences(
        doc,
        AllplanElementAdapter.BaseElementAdapter()
    )
    slab_ele = AllplanArchElements.SlabElement(slab_props, polygon2D)
    slab_ele.SetCommonProperties(com_props)
    slab_ele.SetAttributes(all_attributes)
    model_ele_list.append(slab_ele)

    return EleRes(model_ele_list, placement_point = AllplanGeo.Point3D())


def get_formatting():

    com_props = AllplanBaseElements.CommonProperties()
    com_props.GetGlobalProperties()
    # print(com_props)  # see names to access props
    # print(com_props.Layer)
    # com_props.Pen = 2
    # com_props.Stroke = 1
    # com_props.Color = 7
    # wenn xxxByLayer True, dann xxx nicht explizit setzen
    com_props.Layer = 7405  # std allplan beton decke
    com_props.PenByLayer = True
    com_props.StrokeByLayer = True
    com_props.ColorByLayer = True

    return com_props


def get_attributes():

    # Define attributes for elements
    attr_list = []
    # ToDo: vorhandene Attribs evtl. nur setzen nicht versuchen anzuhaengen, geht das ???
    attr_list.append(AllplanBaseElements.AttributeString(684, "IfcSlab"))  # IFC Entity, ist schon dran
    attr_list.append(AllplanBaseElements.AttributeString(1444, "FLOOR"))  # IFC Predefined Type, neu
    attr_list.append(AllplanBaseElements.AttributeString(498, "Decke"))  # Objektname, ist schon dran
    attr_list.append(AllplanBaseElements.AttributeString(507, "Decke"))  # Bezeichnung, neu
    attr_list.append(AllplanBaseElements.AttributeString(1448, "keine"))  # Beschreibung, neu

    # add to attribute set
    attr_set_list = []
    attr_set_list.append(AllplanBaseElements.AttributeSet(attr_list))
    # add to attributes
    all_attributes = AllplanBaseElements.Attributes(attr_set_list)
    print(all_attributes)

    return all_attributes

BIM, BAM, BOOM
BIM-Modelle Tragwerksplaner --> http://www.bimstatik.ch/
My Allplan PythonParts --> https://github.com/BIMStatik/AllplanPythonParts
LinkedIN --> https://ch.linkedin.com/in/bernd-hahnebach-269b855a

noch eine Frage zu Architekturbauteilen ... die Höhenanbindung ...

Den Zahlenwert der Höhe kann man problemlos mit SetTopElevation(Float) setzen, nur ist der Höhenbezug auf die obere Standardebene gesetzt.

PlaneReferenceDependency aus https://pythonparts.allplan.com/2024/api_reference/InterfaceStubs/NemAll_Python_ArchElements/PlaneReferences/?h=planereferencedependency#NemAll_Python_ArchElements.PlaneReferences.PlaneReferenceDependency

Was muss der methode SetBottomPlaneDependency(dependency) übergeben werden um den Höhenbezug auf "Absolutwert" umzustellen? Es funktioniert nicht mit einem int wert, es braucht wohl den "worlaut" dafür. Nur den finde ich nicht ...

gruss bernd

BIM, BAM, BOOM
BIM-Modelle Tragwerksplaner --> http://www.bimstatik.ch/
My Allplan PythonParts --> https://github.com/BIMStatik/AllplanPythonParts
LinkedIN --> https://ch.linkedin.com/in/bernd-hahnebach-269b855a