Support Forum

[Frage] Facestyle lässt sich nicht ins PythonPart einbinden


Hallo zusammen,
ich bekomme es leider nicht hin, eine Silfläche in mein PythonPart einzubinden. Ich habe bisher ein Polygonzug bzw. Kreis setzten können, aber es scheitert leider jetzt an der Stilfläche. Im Anhang ist meine Datei .pyp.

Die Py kann ich hier leider nicht hochladen, daher hier der Code:

from CreateElementResult import CreateElementResult
import NemAll_Python_Geometry as AllplanGeo
import NemAll_Python_AllplanSettings as AllplanSettings
import NemAll_Python_BaseElements as AllplanBaseElements
import NemAll_Python_BasisElements as AllplanBasisElements
import NemAll_Python_IFW_ElementAdapter as AllplanElementAdapter

from PythonPartUtil import PythonPartUtil
from BuildingElement import BuildingElement
from BuildingElementAttributeList import BuildingElementAttributeList

# Print some information
print('Load Elementstützen ABABABABABABAB.py')

def check_allplan_version(_build_ele: BuildingElement,
_version : str):
"""
Check the current Allplan version

Args:
build_ele: the building element.
version: the current Allplan version

Returns:
True/False if version is supported by this script
"""

# Support all versions
return True

def create_element(build_ele, doc):
"""
Creation of element

Args:
build_ele: the building element.
doc: input document

"""

# Define common style properties
common_props = AllplanSettings.AllplanGlobalSettings.GetCurrentCommonProperties()
common_props.GetGlobalProperties()

# Access the parameter property from *.pyp file
xl = build_ele.xlange.value
yl = build_ele.ylange.value
durchmesser = build_ele.durchmesser.value

form = build_ele.form.value

# Create a 2d Polygon
polygon = AllplanGeo.Polygon2D()
facestyle_prop = AllplanBasisElements.FaceStyleProperties()
facestyle_prop.FaceStyleID = 935

if form == "Eckig":
polygon += AllplanGeo.Point2D(0 - xl / 2,0 - yl / 2)
polygon += AllplanGeo.Point2D(0 + xl / 2,0 - yl / 2)
polygon += AllplanGeo.Point2D(0 + xl / 2,0 + yl / 2)
polygon += AllplanGeo.Point2D(0 - xl / 2,0 + yl / 2)
polygon += AllplanGeo.Point2D(0 - xl / 2,0 - yl / 2)

flache = AllplanBasisElements.FaceStyleElement(common_props,facestyle_prop,polygon)

else:
center = AllplanGeo.Point2D(0,0)
polygon = AllplanGeo.Arc2D(center, durchmesser / 2)

#----------------- create the PythonPart
pyp_util = PythonPartUtil()
pyp_util.add_pythonpart_view_2d(AllplanBasisElements.ModelElement2D(common_props, polygon, flache))

model_elem_list = pyp_util.create_pythonpart(build_ele)
handle_list = []
prev_ele = []
plac_po = None
multi_placement = True

create_ele_res = CreateElementResult(model_elem_list, handle_list, prev_ele, plac_po, multi_placement)

# Return a tuple with elements list and handles list
return create_ele_res

Der Fehler liegt in Zeile 96 mit der Meldung:
pyp_util.add_pythonpart_view_2d(AllplanBasisElements.ModelElement2D(common_props, polygon, flache))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Boost.Python.ArgumentError: Python argument types in
ModelElement2D.__init__(ModelElement2D, CommonProperties, Polygon2D, FaceStyleElement)
did not match C++ signature:

Also passt irgenwas nicht, wenn ich die die Stilfläche zum PP hinzufügen möchte.

Und die Frage wird dann auch noch auftreten, kann ich statt den 2D Polylinien auch den Kreis, falls in der IF Klausel der Arc ausegegeben wird, als geometry einsetzten?

Ich hoffe jemand kann mir helfen.

Gruss Sebastian

Anhänge (1)

Typ: text/xml
235-mal heruntergeladen
Größe: 15,62 KiB

Zitiert von: TheSocialPotwal
Hallo zusammen,
ich bekomme es leider nicht hin, eine Silfläche in mein PythonPart einzubinden. Ich habe bisher ein Polygonzug bzw. Kreis setzten können, aber es scheitert leider jetzt an der Stilfläche. Im Anhang ist meine Datei .pyp.
Die Py kann ich hier leider nicht hochladen, daher hier der Code:
...
Ich hoffe jemand kann mir helfen.
Gruss Sebastian

Hallo Sebastian,

Ein PythonPart View benötigt eine Liste von Allplan Elementen. Der aüßere Polygon wäre der erste Element:

polygon_element = AllplanBasisElements.ModelElement2D(common_props, polygon)
Die Stilfläche wäre der zweite element:
flache_element = AllplanBasisElements.FaceStyleElement(common_props, facestyle_prop, polygon)
Und jetzt beide in den View:
pyp_util.add_pythonpart_view_2d([polygon_element,flache_element])

Das wär's. Das Problem war: Du hast versucht eine ModelElement2D (was ein Allplan Element ist) aus einem Polygon und anderem Allplan Element (nämlich Stilfläche) zu erzeugen. Das geht nicht. ModelElement2D repräsentiert eine Kurve in Teilbild (Linie, Polylinie, Bogen, etc...). Es benötigt die Geometrie der Kurve und Formateigenschaften um erzeugt zu werden. Nur die zwei Sachen, mehr nicht. Daher der Signaturfehler.

Zweites Problem: um eine Stilfläche zu erzeugen, brauchst Du ein Polygon. Du hast aber ein Kreis erstellt:

polygon = AllplanGeo.Arc2D(center, durchmesser / 2)

Kreis geht nicht. Es muss zu polygoniziert werden:
polyline = AllplanGeo.Polygonize(AllplanGeo.Arc2D(center, durchmesser / 2), 36)
polygon = AllplanGeo.Polygon2D(polyline.Points)

Und noch ein Hinweis: vermeide bitte Sonderzeichen in den Namen von py dateien. PYP ist egal.

Das geänderte Skript findest Du im Anhang.

Grüße,
Bart

Anhänge (1)

Typ: text/plain
172-mal heruntergeladen
Größe: 2,89 KiB

Hallo Bartlomiej,

vielen Dank für die Antwort, ich werde heute noch das Script anpassen nach deiner Lösung