Allplan Fórum

[Otázka] Node Intersection Point - Schnittpunktnummerierung nicht richtig

Tagy:
  • Allplan
  • 2021-1-4
  • Schnittpunkte
  • Nummerierung

Hallo,

ich arbeite gerade an einem Script bei dem eine bereits vorhandene, aus verbundenen Dreiecken bestehende 3D-Fläche (DGM-artig) durch Selektion übernommen und dann in weiterer Folge durch eine variable Anzahl, vertikaler Ebenen zerschnitten und neu aufgeteilt werden soll.

Die Ebenen werden dabei normal auf die X und Y Richtung angeordnet und schneiden die übernommene 3D-Fläche wodurch ein neuer Raster in Flucht der Ebenen entstehen soll. (siehe Screenshots im Anhang)

Um dies zu erreichen habe ich mir mit dem Node IntersectionPoint die Schnittpunkte zwischen den Ebenen und der 3D-Fläche erstellt.
Nun möchte ich die so erhaltenen Schnittpunkte, in Flucht der Schnittebene mit einer 3D-Polylinie neu Verbinden, sozusagen eine über die ganze 3D-Fläche verlaufende Schnittlinie erzeugen.

Das Problem dabei:
Die entstehenden Schnittpunkte zwischen Ebene und 3D-Fläche werden nicht der Reihe nach (von -X nach +X) durchnummeriert, (siehe Anhang "Punktnummern") was dazu führt, dass auch die 3D-Polylinie welche sich an den aufsteigenden Punktnummern orientiert, wild zwischen den Schnittpunkten hin und her springt (siehe Anhang Punktnummern und 3DPolylinie).

Meiner Vermutung nach liegt es am Note IntersectionPoint welcher anscheinend in Flucht der Schnittebene, keine der Reihe nach, vom Anfang bis zum Ende der 3D-Fläche aufsteigende Schnittpunkt-Nummerierungen erstellt.
Wenn man sich die Punktnummerierung ansieht merkt man, dass zuerst die Diagonalen von +X nach -X und anschließend erst die in Y-Richtung verlaufenden 3D-Flächen-Kanten (wieder von +X nach -X) durchnummeriert werden.

Nach welcher Logik werden hier die Punktnummern vergeben?

Grüße,
Mario

Přílohy (2)

Type: image/jpeg
Staženo 38
Size: 176,72 KiB
Type: image/jpeg
Staženo 26
Size: 216,75 KiB

Show most helpful answer Hide most helpful answer

Hallo Mario,

ich habe mal ein neues Node gemacht, welches aus einem Polyhedron ein BRep macht. (s. NodeBRepFromPolyhedron.zip)
Diese Dateien bitte ablegen unter: D:\Allplan2021\Std\VisualScripts\Geometry\Conversion

VS_DGM_Intersection enthält das VS-Script.

Damit funktioniert das mit der Boolschen Operation Intersection schon mal.

Die Kanten des Schnittkurven-BReps extrahiert man mit NodeGetEdges und vebindet Sie mit NodeBSpline3DJoined.
Dann hast Du Deine Schnittkurve...

Přílohy (3)

Type: application/zip
Staženo 1088
Size: 1,60 KiB
Type: application/zip
Staženo 1152
Size: 1,40 KiB
Type: image/png
Staženo 31
Size: 17,06 KiB
1 - 10 (14)

Ich würde einen anderen Ansatz wählen:

Statt die Schnittpunkte zu berechnen, solltest Du gleich den Schnittkörper berechnen.
Wenn eines der beteiligten Polyhedren kein Volumenkörper ist, kommen als Ergebnis ein Polygonzug oder mehrere Polygonzüge raus.
Die "Schnitt-Kurve" eben. Und diese ist schon korrekt entspr. der Topologie verbunden.
Das kann man mit dem IntersectionNode für Polyhedren machen. Wichtig: Die Schnittebene muss auch ein Polyhedron sein.

Um Sachen mit Boolschen Operationen auszuprobieren, sollte man zunächst immer versuchen, das Gewünschte mit den Funktionen des 3D-Modellierers in Allplan zu erzeugen. Die Funktionen in den Nodes benutzen dieselben Geometrie-Funktionen.
Wenn es "zu Fuss" im 3D-Modellierer nicht funktioniert, wird es auch im Visual-Script scheitern!

Přílohy (1)

Type: image/png
Staženo 49
Size: 114,93 KiB

Hallo Nemo,

wie immer danke für die Hilfe!

Wie erzeuge ich ein Polyhedron als Schnittebene?
Mit einem Polygon3D als Schnittebene hat es bei mir nicht funktioniert, wurde vom Node "Intersection" ignoriert.

Finde hier nur die Möglichkeit eine Brep Fläche zu erstellen.
Mit dem Brep als Schnittfläche werden auch die Schnittkurven erzeugt, jedoch habe ich dann das Problem,
dass am Outputport vom Node "Intersection" die Schnittkurven als Brep ausgegeben werden. Für die weitere Bearbeitung benötige ich
aber zwingend die Schnittkurven als 3D-Polylinien.

Habe dann noch versucht mir die Eckpunkte der Schnittkurven zu holen über den Node "GetVertices", welches auch funktioniert,
aber dann habe ich wieder das ursprüngliche Problem, dass die Punktnummer entlang der Schnittkurve springen.

Hab das Script mal angehängt.

Grüße,
Mario

Přílohy (2)

Type: text/xml
Staženo 1050
Size: 10,92 KiB
Type: text/xml
Staženo 1156
Size: 881,00 B

..mehrere Möglichkeiten:

1. Du kannst die BRep-Fläche in ein Polyhedron umwandeln
2. Du kannst eine 3D-Fläche als Polyhedron erzeugen (kein Polygon3D!)

3. aus dem BRep kann man sich die Kurven "extrahieren". Dafür gibt es in Python einige Funktionen, z.B.:

GetEdgeGeometry( (BRep3D)arg1, (int)edge) -> object :
    Get (trimmed) edge geometry
    
    Parameter: edge  egde index
    
    Return:  handle to geometry curve

Ich kann Dir allerdings nicht sagen, ob es ein Node im VS dafür gibt. Aber zur Not erstellst Du Dir einfach eines selbst,
und benutzt die o.g. Python-Funktion.

Es gibt auch noch ein Node "ProjectCurveOntoBRep". s. hier

Damit sollte man vegleichbare Ergebnisse erzielen können, wenn man die Dreicksflächen in ein BRep umwandelt.

Kannst du mir zu den von dir genannten Möglichkeiten 1 oder 2 noch einen Tip geben wie das im VS funktioniert,
bzw. welche Nodes man dafür verwenden kann?

Hmm, da war ich offensichtlich zu optimistisch, und hatte die Existenz solcher Nodes im Visualscriptig vorausgesetzt.
Leider scheint es für die Punkte 1. und 2. noch keine Nodes zu geben :-(

Möglicherwiese solltest Du überlegen, das Projekt in einem PythonPart zu machen.
Dort gibt es all diese Funktionen, und noch einige mehr.

Man kann zb. aus einem 3D-Polygon ein Polyhedron erstellen, oder ein BRep in ein Polyhedron umwandeln usw.

Vielleicht kann Xinling oder Horst Hohmann was dazu sagen, ob diese Nodes noch irgendwann geplant sind...

Hallo Nemo,

na dann bin ich ja "beruhigt", dacht schon ich hab irgendwelche Nodes diesbezüglich übersehen.

Sieht so aus als würde ich mit den aktuell in Allplan VS zu Verfügung stehenden Nodes hier nicht weiterkommen...

Trotzdem danke für deine Hilfe!

Grüße,
Mario

Hallo Mario,

ich habe mal ein neues Node gemacht, welches aus einem Polyhedron ein BRep macht. (s. NodeBRepFromPolyhedron.zip)
Diese Dateien bitte ablegen unter: D:\Allplan2021\Std\VisualScripts\Geometry\Conversion

VS_DGM_Intersection enthält das VS-Script.

Damit funktioniert das mit der Boolschen Operation Intersection schon mal.

Die Kanten des Schnittkurven-BReps extrahiert man mit NodeGetEdges und vebindet Sie mit NodeBSpline3DJoined.
Dann hast Du Deine Schnittkurve...

Přílohy (3)

Type: application/zip
Staženo 1088
Size: 1,60 KiB
Type: application/zip
Staženo 1152
Size: 1,40 KiB
Type: image/png
Staženo 31
Size: 17,06 KiB

Hallo Nemo,

danke für deinen Einsatz mir hier bei einer Lösung zu helfen und danke für den Node "BRepFromPolyhedron" echt klasse!

Aber ich befürchte das ging etwas am Ziel vorbei.

Wie weiter oben beschrieben gibt es ja eine Möglichkeit ein BRep als Schnittfläche zu erstellen. (Node 4PointSurface)

Intersection hat auch mit der Kombination eines Polyhedron (DGM) und einem Brep (Schnittfläche) eine Schnitt Kurve- bzw. genauer Schnitt-Polylinie ausgegeben, nur eben mit einem BRep als Ergebnis.

Ich würde ums sie weiter bearbeiten zu können, als Ergebnis eine 3DPolylinie benötigen.

Wie du selber geschrieben hast müssten dafür beide Körper ein Polyhedron sein.
Dementsprechend würde ich einen Node zum wandeln von "BRep in Polyhedron" benötigen.

Wenn es dann noch eine Node gäbe der die einzelnen 3D-Linien bzw. Kanten vom nachgeschalteten GetEdges innerhalb eines Schnittbereiches zu einer 3DPolyline vereinigt...hätte ich wahrscheinlich was ich brauche.

(Wenn nur die Schnittpunktenummerierung von Haus aus, aufsteigend in der richtigen Reihenfolge erfolgen würde, wär das alles überflüssig...habs in ner anderen VS-Software getestet, dort hat es auf anhieb ohne Probleme funktioniert)

Grüße,
Mario

Hallo Mario,

Du kannst das alles mit BReps machen. Vergiss die Polyhedren.
Wie im Screenshot zu sehen ist, generiert die Intersection von 2 BRep-Flächen einen Ergebnis-BRep, der nur aus Kurven besteht.
Die Kanten kann man sich mit NodeGetEdges holen, und diese Kanten(-Kurven) verbindet man sich mit dem
Node NodeBSpline3DJoined. Das hatte ich oben schon beschrieben.
Die BSpline3D kann auch eine Polylinie "darstellen".

Wenn man tatsächlich eine Polyline braucht, kann man sich die Punkte aus der BSpline extrahieren,
und zu einer neuen Polylinie verbinden.

1 - 10 (14)