Forum Allplan

[Domanda] Lesen Geometrischer Informationen des Polyhedron bzw. ExtrudedAreaSolid3D [Risolto]

Tags:
  • Polyhedron

Hey Leute,

ich bin recht neu in der Allplan_API zu Gange daher bitte ich um Entschuldigung sollte die Frage hier falsch platziert sein.

Ich habe alle geometrischen Elemente eines Dokuments zusammengesammelt.
In der for-Schleife kann ich dann alle Elemente heraussuchen und deren Geometrie zurück bekommen.

for element in AllplanBaseElements.ElementsSelectService.SelectAllElements(coord_input.GetInputViewDocument()):
----geomElem = element.GetModelGeometry()
----if isinstance(geomElem, AllplanGeo.Polyhedron3D):
--------# ????

Wenn die Instanz ein Polyhedron3D ist kann man recht einfach die Punkte usw. der Flächen, Kanten und Ecken herausbekommen.

Was ich jedoch suche ist eine Möglichkeit den Container für die Erzeugungsparameter dieses Polyhedron zu finden. Das wurde hier (https://connect.allplan.com/at/forum/themen/topic/topics/pythonparts/extrudedareasolid3d.html) von Jörg angesprochen dass dies über einen Container erzeugt wird. Also ob es zum Beispiel ein Polyhedron ist der über eine Extrusion oder ähnliches erzeugt wurde und davon dann die Extrusionslinie und die 3D Fläche.

Hat das schonmal jemand gemacht oder eine Idee? Oder ist mein Ansatz hierfür sogar falsch und ich bekomme diese Daten auf einem Anderen weg einfacher?

Show solution Hide solution

Die Polyhedren (3D-Köprer) sind ja nur die 3D-Representation der Architekturbauteile, z.B. der Wandschicht.
Wenn man Parameter, z.B. Dicke der Wandschicht haben möchte, muss man diese halt auslesen.

Und da kommt dann die schlechte Nachricht:
Die PythonAPI und das darauf aufbauende Visual-Scripting unterstützt ein einziges Architekturbauteil: die Wand!
Stütze, Decke, Öffnungen usw. gibt's dort nicht.

Das bedeutet, man kann ein Wand einmalig mit der API erzeugen, oder ihre Eigenschaften auslesen. Das war's auch schon.
Eine "aktualisierbare Komponente aus Wänden" (PythonPart/VisualScripting), z.B. eine "gescriptete Fertignasszelle" lässt sich so nicht herstellen, da die Wände dazu in ein Makro "verpackt" werden, und so nur eingeschränkte "Interaktionen" mit anderen Bauteilen oder den Ebenen möglich sind!

Das ändert sich erst, wenn man für die PythonPart-Komponente einen anderen Container benutzt, z.B. eine Elementgruppe, oder eine noch lockere Referenzierung. Da funktionieren dann wenigstens die Interaktionen mit den Ebenen.

Aber meines Wissens nach, läßt sich ein PythonPart nicht als Elementgruppe erzeugen.

PythonParts und Visual-Scripting mit Makros sind eine Sackgasse!
...zumindest für "modifizierbare Objekte" wie es die SmartParts sind.

(Einmal-)Funktionen (Fire-And-Forget) lassen sich damit aber scheinbar gut umsetzen.

Ein Polyhedron in Allplan ist erst mal ein ebenflächiger Flächenverbund.
Es gibt auch Polyhedren, die keine Flächen haben. Das sind dann die bekannten Kanten-Netze.

Was ein Polyhedron ist, bekommt man über den Typ mit phdn.GetType() heraus:
PolyhedronType.tVolume => Volumenkörper
PolyhedronType.tFaces => Flächenverbund (hat kein Volumen!)
PolyhedronType.tEdges => Kanten-Netz (hat keine Flächen!)

Dann kann man noch die Punkte, Kanten und Flächen erfahren, woraus das Polyhedron besteht.

Darüberhinaus "weiss" das Polyhedron nicht's mehr über seine Entstehung!
Es kennt demzufolge auch nicht seine Form!
Es ist nach der Erzeugung einfach eine Ansammlung von Punkten, Kanten und Flächen!
Wie es erzeugt wurde, weiss das Polyhedron nicht (mehr)!

Um herauszufinden, was für eine Form ein Polyhedron hat, und wie es demzufolge erzeugt wurde, kann man nur mit
schwierigsten Formfindungs-Algorithmen bewerkstelligen. Ich habe das schon mal beim SmartPad und beim ElementConverter realisiert.
Viel Spass damit, das in Python zu machen. Das wird nicht lustig.

Kleiner Tipp:
Als erstes sollte man herausfinden, welche Kanten parallel sind.
Damit kan man dann die "Mantelflächen" eines Prismas oder Sweep-Körpers herausbekommen.
Wenn diese Flächen dann auch noch rechtwinklig sind, könnte man auf ein gerades Prisma schliessen.
Wenn auch noch die Grund- und Deckfläche rechtwinklig ist, ist es ein Cuboid (Quader).
Wenn die Grund- und Deckflächenpunkte mehr als 4 sind, und denselben Abstand zu ihrme Schwerpunkt haben, könnte es ein Zylinder sein.
Wenn alle Kanten-Punkte denselben Abstand zu Zentrum des Körpers haben, könnte es eine Kugel sein.
usw.

Vielen vielen vielen Dank für die ausführliche Erklärung!!!

Ich würde noch einen zweiten Versuch wagen mein Problem zu schildern und weiter vorne beginnen, da ich nur ungern aufgrund fehlender Funktionalität der API einen Formfindungs-Algorithmus entwickeln will der mich nicht nur Entwicklungsaufwand sondern auch immens Rechenzeit kostet...

Angenommen ich würde eine Allplan-Wand die mittels der GUI in Allplan erzeugt wurde mittels der Python-API auslesen wollen. Also die beiden Punkte die ich angeklickt habe (die in der GUI ja auch verfügbar sind um daran zu ziehen und die Position zu verändern) welche dann zu einer Linie werden auf der die Wand dann nach oben extrudiert wird, die Länge und der Schichtaufbau sowie die Schichtdicken und die Abhängigkeiten zu der oberen und unteren Ebene.

Leider bin ich nicht in der Lage all diese Informationen mittels der Python-API auszulesen. Hierfür verstehe ich vermutlich auch die Objekthierarchie der API aktuell noch zu wenig! Hat jemand etwas ähnliches schonmal gemacht? Ist das überhaupt möglich?

Beste Grüße und danke schon im voraus!

Die Polyhedren (3D-Köprer) sind ja nur die 3D-Representation der Architekturbauteile, z.B. der Wandschicht.
Wenn man Parameter, z.B. Dicke der Wandschicht haben möchte, muss man diese halt auslesen.

Und da kommt dann die schlechte Nachricht:
Die PythonAPI und das darauf aufbauende Visual-Scripting unterstützt ein einziges Architekturbauteil: die Wand!
Stütze, Decke, Öffnungen usw. gibt's dort nicht.

Das bedeutet, man kann ein Wand einmalig mit der API erzeugen, oder ihre Eigenschaften auslesen. Das war's auch schon.
Eine "aktualisierbare Komponente aus Wänden" (PythonPart/VisualScripting), z.B. eine "gescriptete Fertignasszelle" lässt sich so nicht herstellen, da die Wände dazu in ein Makro "verpackt" werden, und so nur eingeschränkte "Interaktionen" mit anderen Bauteilen oder den Ebenen möglich sind!

Das ändert sich erst, wenn man für die PythonPart-Komponente einen anderen Container benutzt, z.B. eine Elementgruppe, oder eine noch lockere Referenzierung. Da funktionieren dann wenigstens die Interaktionen mit den Ebenen.

Aber meines Wissens nach, läßt sich ein PythonPart nicht als Elementgruppe erzeugen.

PythonParts und Visual-Scripting mit Makros sind eine Sackgasse!
...zumindest für "modifizierbare Objekte" wie es die SmartParts sind.

(Einmal-)Funktionen (Fire-And-Forget) lassen sich damit aber scheinbar gut umsetzen.