icon

Das Wissen aller Anwender nutzen

Im Allplan Connect Forum tauschen sich Anwender aus, geben wertvolle Tipps oder beraten sich bei ganz konkreten Aufgabenstellungen − auch international.
Und damit wirklich keine Frage unbeantwortet bleibt, unterstützen die Mitarbeiter des Technischen Supports ebenfalls aktiv das Forum.

Es erwarten Sie:

  • Foren-Vielfalt aus CAD Architektur, CAD Ingenieurbau uvm.
  • Tipps von User für User
  • international: Deutsch, Englisch, Italienisch, Französisch und Tschechisch

Melden Sie sich jetzt an und diskutieren Sie mit!

Zur Registrierung

[Frage] Surf oberläche eines bestehenden Objekt auslesen

Schlagworte:
  • Surface
  • SURF
  • Auslesen

Hallo Zusammen

ich suche nach einer Möglichkeit, in Allplan Visual Scripting die einem Objekt zugewiesene Oberfläche (also die .surf-Referenz) auszulesen. Ich möchte diese Oberfläche dann im Skript z.B. auf neue Objekte übertragen.

Hat jemand eine Idee oder einen Python-Code-Schnipsel, wie man zuverlässig an die Information kommt, welche .surf-Datei einem Objekt zugewiesen ist?

Ich arbeite mit Visual Scripting jedoch scheinen die Standard-Nodes diese Information nicht direkt zu liefern desahlb frage ich mal in der Pythonpart Kategorie.

Ich habe auch versucht ein Formelattribut mit dem Oberflächen-Pfad zu erstellen und das anzusteuern jedoch scheint dieses Attribut auch nicht zu funktionieren.

jegliche Ideen oder Vorschläge sind Willkommen

Danke und Grüße
Emanuel

In Visual-Scritping scheint das nicht direkt möglich zu sein. Ich habe jedenfalls kein entspr. Node gefunden.

In der Allplan-Python-API sollte das aber funktionieren:
Die Oberfläche eines 3D-Körpers (Polyhedron3D oder BRep3D) kann man aus dem ModelElement3D mit der Property TextureDefinition lesen und schreiben.

Demzufolge könnte man sich selbst ein solches Node "schreiben", welches aus einer Liste von 3D-Elementen (Eingang) die Oberflächen (List of strings) extrahiert (Ausgang).

Diese könnte man dann mittels dem Node NodeAssignSurface auf andere Objekte übertragen.

Das mit dem Attribut funktioniert nicht, da dieses nur bei einigen speziellen Objekten (z.B. Boden- Seiten- und Deckenflächenschicht) den Namen der .surf-Datei enthält.

Ich habe mal testweise ein NodeGetObjectTexture erstellt, um zu testen, ob das überhaupt funktionieren kann.
Grundsätzlich ist es schon möglich, aus dem ElementAdapter das ModelElement3D zu extrahieren, und von diesem die TextureDefintion zu "erfahren" (s. NodeGetObjectTexture.zip):

        def get_texture(element):
            if element.IsNull():
                return None

            model_ele = AllplanBaseElements.GetElement(element)
            
            if not model_ele:
                return None
            
            if not isinstance(model_ele, AllplanBasisElements.ModelElement3D):
                return None
                
            print(model_ele)

            return model_ele.GetTextureDefinition()

Das Problem dabei ist, dass Allplan hier niemals eine Textur zurückliefert!

Man kann das einfach mit dem von Allplan bereitgestellten Example
PythonPartsExamples/PythonPartsExampleScripts/ModelObjectExamples/General/ShowObjectInformation
testen (s.ShowObjectInformation.png):
Obwohl die Körper offensichtlich eine Textur (.surf-Oberfläche) haben, wird diese nicht angezeigt!

@Allplan
Dieser Fehler sollte analysiert und umgehend beseitigt werden!

Anhänge (2)

Typ: image/png
40-mal heruntergeladen
Größe: 250,71 KiB
Typ: application/zip
43-mal heruntergeladen
Größe: 2,04 KiB

Hi Emanuel,

die Herangehensweise gezeigt von Nemo ist richtig und richtig ist auch, dass der TextureDefinition Objekt nicht korrekt aus einem existierendem 3D-Element gelesen wird. Das Problem haben wir bereits in ALLPLAN 2026 (WIP-3) behoben. Wenn du also an unserem Work-In-Progress programm teilnimmst, kannst du es testen. Anwenden kannst du es leider erst, wenn ALLPLAN 2026 auf dem Markt ist.

Grüße,
Bart