Support Forum

Auflösen von SmartParts mittels Python / Lesen geometrischer Informationen des SmartPart mittels pythonAPI


Guten Morgen,

die letzten Tage habe ich versucht die geometrischen Informationen eines SmartParts über die PythonAPI zu lesen. Das ist leider alles gescheitert. Wenn ich jedoch das SmartPart mittels des Makro "Makro Auflösen" und der Auflösungseinstellung "Total" auflösen lasse dann kann ich über die PythonAPI alle geometrischen Elemente des SmartParts abgreifen (also die polyhedren u.s.w. sind dann alle über die Schleife ...

self.allplanElements = AllplanBaseElements.ElementsSelectService.SelectAllElements(
self.coord_input.GetInputViewDocument())
for element in self.allplanElements:
(finde geometrische Repräsentation des element)

abrufbar, was vor dem auflösen nicht der Fall war. Das Ding ist nur dass ich nach dem abrufen der Geometrien mittels der API ja in Allplan doch gerne die SmartParts behalten würde. Das heißt ich muss dann in einem zweiten Schritt das Auflösen der Geometrien wieder rückgängig machen.

Daher meine Fragen:
1. Ist es möglich das Makro, das das Auflösen der Elemente durchführt, in den python code zu integrieren aber die Elemente in Allplan selber als SmartPart zu behalten?

oder 2. gibt es eine andere Möglichkeit an die Polyhedren u.s.w. eines SmartParts zu kommen ohne dieses mit dem Makro aufzulösen? Habe ich dazu eine Funktion übersehen?

Beste Grüße

Theoretisch ist es möglich!
Dazu gibt es in Python das MacroElement. Das stellt nichts anderes dar, als die Makro-Definition!
Dort kan man mit GetSlideList alle Makrofolien auslesen.
Was dort zurückgegeben wird, kann ich nicht genau sagen, ich vermute aber, es ist eine Liste von AllplanElementen.
(Typisches Python-Problem: Man weiss nie, was man in eine Funktion reinreichen muss, und was man zurück bekommt ohne eine wirklich gute Dokumentation)

Das Problem dabei sind 2 Dinge:
Aus der Liste der Folien müßtest Du zuerst herausfinden, ob und welche Folien derzeit sichtbar sind.
Die Sichtbarkeit der Folien hängt u.a. von der Projektionsart (2D/3D) ab, und zudem noch vom Maßstab.
Zweites Problem: Die Elemente auf den Folien sind relativ zum Einfügepunkt des Makros, und haben nicht die globale Lage.
Diese erhält man erst, wenn man die Folien-Elemente mit der Transformationsmatrix des MacroPlacementElements "multzipliziert".
Dabei spielen aber auch noch diverse Eigenschaften der Folie eine Rolle, z.B. die beiden Referenzpunkte und die Verzerrungseigenschaften.

Wie Du siehts, schon theoretisch ist es kompliziert, und für diese "Auflösung" gibt es meines wissens auch keine Python-Funktion.

Deshalb nochmal die Frage: Warum macht ihr euch es derart schwer, und versucht das "Unmögliche":
Alle 3D-Elemente wird man mit der Python-API ohne weiteres nicht auslesen können!

Ich würde mir ein Format aussuchen, wo dieser Export aller 3D-Elemente von Allplan schon gemacht wird (z.B. IFC), und aus diesem Format würde ich mir die Informationen beschaffen ("parsen").
Dabei wird die Frage aufkommen, warum man überhaupt noch eine andere Representation der Daten braucht. Noch einen anderen Viewer von Allplan-Daten kann man sicher programmieren, aber braucht den jemand? Oder wofür sollen eure mit Python erzeugten Daten dienen?

Hallo Chris111,

die Allplan-Elemente haben die allgemeine Funktion "GetModelGeometry", mit der man die 3D-Geometrie eines Elements lesen kann. Bei Elementen mit Folien wird dabei die Geometrie der verlegten 3D-Elemente von allen Folien gelesen.

Aktuell ist das nur für die Makros und PythonParts implementiert, ab der Version 2021-1-5 kann das auch für SmartParts verwendet werden.

Viele Grüße
Horst