Support Forum

[Frage] Python API - Arch Elemente in 3D Körper Wandeln


Hallo,

gibt es die Funktion vorgefertigt in der Python API? Eventuell um diese an SelectAllElements() anzuhängen?
Also unter Beibehaltung der Attribute und der Texturen, so wie sie exakt in Allplan unter Elemente TBübergreifend Kopieren und Wandeln funktioniert?

Du kannst alle Elemente mit SelectAllElements() selektieren. Bei Architektur Objekten kannst du dann die Geometrie bekommen indem du beim BaseElementAdapter Objekt diese Methode aufrufst: DeinElement.GetPureArchitectureElementGeometry()

Dann wird dir ein Polyhedron oder was auch immer zurückgegeben. Anschließend könntest du das Architektur Element löschen wenn du das möchtest: AllplanBaseElements.DeleteElements(*args)

In deinem Beispiel musst du beim Selektieren nur noch die Filter richtig setzten. Hoffe das konnte dir helfen.
PS: Attribute, Common properties etc. musst du vom Objekt speichern und dann auf dein Geometrieobjekt übertragen.

Vielen Dank, ich hatte das mit GetModelGeometry() gemacht, damit die Öffnungen abgezogen sind, aber so sehe ich mindestens, dass ich nicht ganz den falschen Weg eingeschlagen habe. Einige Probleme habe ich noch:
-> Ich kopiere mir die einzelnen Körper mit AllplanBasisElements.ModelElement3D(element.GetCommonProperties(), element.GetModelGeometry()), so habe ich zumindest die Layereigenschaften. Ist ModelElement3D hier richtig? Oder gibt es da was geeigneteres?
-> Die Attribute lese ich über element.GetAttributes(AllplanBaseElements.eAttibuteReadState.ReadAll), insofern das Richtig ist?
-> Aber bei der Zuweisung der Attribute komme ich nicht weiter: AllplanBaseElements.ElementsAttributeService.ChangeAttributes() funktioniert nicht mit ModelElement3D, da bin ich wahrscheinlich auf dem falschen Weg.

Oder kann man vielleicht den Allplan Befehl TB-übergreifend kopieren und Wandeln von Python aus starten, und aus einem teporären Teilbild dann die bereits gewandelten Daten einlesen? Es geht mir eigentlich nur darum, eine Kopie des Modells zu erhalten, welches von Bezugsebenen und Referenzebenen abgekoppelt ist, damit ich dann in Python damit weiterarbeiten kann.

ModelElement3D ist hier richtig. Die ModelElement3D methode ist jedoch overloaded. Falls du also noch die SurfaceProperties übergeben willst musst du das Objekt dementsprechend initialisieren:

__init__( (object)arg1, (CommonProperties)commonProp, (TextureDefinition)textureDefinition, (object)geometryObject) -> None

Die Attribute könntest du auch so einlesen:

AllplanBaseElements.ElementsAttributeService.GetAttributes(*args)

Wenn dir

element.GetAttributes(AllplanBaseElements.eAttibuteReadState.ReadAll)

aber alle Attribute zurückgibt passt das auch.

Der Grund warum AllplanBaseElements.ElementsAttributeService.ChangeAttributes() nicht funktioniert ist weil du dazu eine BaseElementAdaperList brauchts - in diesem Zustand hat dein PythonPart aber keinen Zugriff auf die BaseElementAdapeter Objekte da du sie ja noch nicht erzeugt hast. Du kannst aber einem ModelElement3D auch Attribute zuweisen mit der SetAttributes methode.

model_ele = AllplanBasisElements.ModelElement3D(common_props,
texture_def,
geo_obj)

model_ele.SetAttributes(attrs)

Damit müsstest du eigentlich alles abbilden können. Falls du Fragen zu den Attributen etc hast schau dir auch gern mal den Code der Nodes vom Visual Scripting an, die sind sehr leserlich und sagen oft mehr aus als jede Doku.

Nein du kannst den Befehl TB-übergreifend kopieren und Wandeln nicht von einem PP aus starten. Den Befehl müsstest du nachbauen was viel Arbeit ist. Warum änderst du nicht den Workflow? Alle Objekte mit dem Allplan Befehl wandeln und in ein anderes TB kopieren, dann in dieses TB wechseln und dann deinen PP starten und weiterarbeiten?

Hallo, danke, das hilft weiter, es ist wesentlich komplizierter als erwartet.
Ja ich werde das Wandeln und das Auflösen der Makros manuell durchführen und mal schauen, wie weit ich mit dem PP komme, sollte ich damit ans Ziel kommen, kann ich immer noch etwas Zeit in das automatische Wandeln investieren.
Und vielleicht wird in der Zwischenzeit ein entsprechendes Node im VS programmiert, dann kann man dort was abschauen.
Vielen Dank!