Hallo,
eine exakte Lösung über Algorithmen gibt es anscheinend nur für konvexe Polyeder, also Körper die ausschließlich von ebenen Flächen begrenzt werden und bei denen die Verbindungsstrecke zwischen je zwei Punkte des Polyeders vollständig im Polyeder liegt.
Erklärungen finden sich hier:
Finding Minimal Enclosing Boxes
https://www.science.smith.edu/~jorourke/Papers/MinVolBox.pdf
Estimation of minimum volume of bounding box for geometrical metrology
https://www.metrology-journal.org/articles/ijmqe/pdf/2020/01/ijmqe200007.pdf
Diese Algorithmen basieren also auf Punktewolken (alle Eckpunkte des Körpers) und arbeiten in zwei Schritten:
1. Die konvexe Hüllkurve um diese Punktewolke erzeugen
Alle Punkte die nun innerhalb dieser Hülle liegen können ignoriert werden, da diese keinen Einfluss auf die min. Bounding Box haben
2. Mit der Methode Rotating Calipers (rotierender Messchieber) die kleinste Boundingbox ermitteln
Bei Körpern mit nach aussen gewölbten Teilflächen wäre die Boundingbox dann evtl. zu klein (nur falls diese Teilflächen in einem Bereich am Körper liegen, der Einfluss auf die min. Bounding Box hätte)
Man müsste also diese nach aussen gewölbten Teilflächen mit einer Punktewolke überziehen, deren Dichte wiederum Einfluss auf die Genauigkeit des Ergebnisses hat.
Mit Catia Script/VB denke ich schwer umsetzbar.
Alles sehr Zeitraubend: Eckpunkte finden, Punktewolke erzeugen und dann ist Script/VB ja auch nicht das schnellste für Berechnungen.
Eine andere Methode ist, wie von dir bereits vorgeschlagen, ein Makro das (sämtliche) Ausrichtungen testet und dann die Beste wählt:
- sämtliche wird nicht gehen, es gibt ja unendlich viele. Deshalb in einem vorgegebenem Raster.
- gesucht wird die minimal Volumen Bounding Box (es gäbe ja noch die min. Oberfläche, min. Länge aller Kanten, min. Seitenlänge, etc.)
- zu beachten ist, dass es nicht zwingend nur ein minimum Volumen gibt. Es können mehrere Ausrichtungen das gleiche Ergebnis liefern (bei einer Kugel sogar alle)
Was wir nun brauchen ist ein 3D Messschieber den wir um den Körper rotieren lassen.
Dieser 3D Messschieber ist die Bounding Box.
Die bauen wir ähnlich wie von Wolfi beschrieben (Beispiele gibt es bereits hier im Forum).
Basis ist ein Achsensystem. Um dieses erzeugen wir nun mit der Funktion Extrema und etwas Hilfsgeometrie die Box.
Extrema und Hilfsgeometrie sind referenziert auf das Achsensystem und den Körper. Die Box liefert uns X,Y,Z Maße. Volumen brauchen wir nicht messen, kann berechnet werden.
Wenn wir nun das Achsensystem drehen, dreht sich nach einem Part Update auch die Box und liefert die Werte für die neue Ausrichtung.
Jetzt Werte vergleichen und die Ausrichtung mit kleinerem Volumen merken.
Das ganze in eine Schleife und um die Achsen rotieren lassen.
Der gewählte Winkelschritt definiert die Anzahl der getesteten Ausrichtungen.
Stellt sich die Frage wie rotieren, um mit möglichst wenigen Schritten zu einem akzeptablen Ergebnis zu kommen.
Mein erster Versuch war mit einer verschachtelten Schleife die Längen- und Breitengrade auf einer Kugel abzufahren.
Erzeugt immens viele Schritte und dauert.
Dann hab ich dieses Dokument gefunden (siehe Seite 167):
A minimum bounding box algorithm and its application to rapid prototyping
https://utw10945.utweb.utexas.edu/Manuscripts/1999/1999-019-Chan.pdf
Ob diese Methode nach 3 Drehungen wirklich die kleinste Box ermittelt?
Jede Drehung um die nächste Achse hat ja auch Einfluss auf das Ergebnis der vorherigen Drehung.
Davon abgeleitet eine Version ohne Projektion, sondern mit Ermittlung des kleinsten Volumens für jede Achse:
- Drehen um die 1. Achse und kleinstes Volumen für diese Drehung ermitteln
Drehung um 90 Grad reicht aus, da der 3D Messchieber ja 3 Richtungen gleichzeitig misst
- Ausgehend von der Ausrichtung des kleinsten Volumens der 1. Achse um die 2. Achse drehen
- Ausgehend von der Ausrichtung des kleinsten Volumens der 2. Achse um die 3. Achse drehen
Das Ergebnis war schon ganz gut, aber Versuche haben dann gezeigt das ein weiteres Drehen in der Reihenfolge 2.Achse, 1.Achse, 3. Achse ein besseres Resultat erzielt.
Die Resultate mit mehr Drehungen waren besser als mit nur drei Drehungen und deutlich engerem Raster.
Im Anhang findet sich ein VBA Makro welches auf diese Weise arbeitet.
Gleich vorweg:
Der zeitliche Begrenzer ist die Funktion Extremum.
Es dauert eben so lange wie es dauert, abhängig von Modellgröße, gewähltem Raster/Winkelschritt und Rechenleistung.
Vorteil der Funktion Extremum ist, dass die Bounding Box nie zu klein ist.
Die Abweichung bei der Methode des Testens der Ausrichtung besteht ja nur in der Differenz des ermittelten Volumens zum optimalsten zu erreichenden Volumen, sprich: es wäre noch kleiner gegangen.
Hier noch einige Anmerkungen zur Verwendung des Makros:
- Die Benutzung des Makros geschieht auf eigene Verantwortung und Gefahr
- Keine Zusicherung von unterbrechungs- und fehlerfreier Funktion des Makros
- Zum Starten Sub CATMain() im Modul ModBoundingBox aufrufen.
- Für die Boundingbox auf jeden Fall ein eigenes (nicht isoliertes) Achsensystem verwenden (muss sich im Knoten Achsensysteme befinden)
- Als erstes Achsensystem und Körper selektieren und Boundingbox erzeugen lassen
- Im zweiten Schritt die Boundingbox optimieren. Folgende Funktionen gibt es:
- manuell im Winkelschritt drehen
- An Trägheitsachsen ausrichten
- Minimal Volumen Bounding Box anggenähert ermitteln
- Wenn die Box an einer Körperkante oder Teilfläche ausgerichtet sein soll kann auch eine Achse gesperrt werden
- Eine Achse des Achsensystem vor Start des Makros an Körperkante oder senkrecht zur Teilfläche ausrichten
- Diese Achse im makro sperren
- Wenn eine Achse gesperrt ist kann auch der Abtastwinkel eingestellt werden
- Die Rotation startet immer ausgehend von der aktuellen Ausrichtung des Achsensystems
- Wenn bereits eine BoundingBox existiert kann diese auch im nachhinein optimiert werden.
Dazu vor Makrostart die BoundingBox selektieren.
- Die BoundingBox nicht umbenennen. Ansonsten kann diese im nachhinein nicht optimiert werden.
- Das Makro erzeugt nur den Körper Boundingbox.xx und evtl. ein Achsensystem wenn es noch gar keines im Knoten Achsensysteme gibt.
Alle Geometrie befindet sich in diesem Körper. Es werden keine Parameter, Folmeln, etc. erzeugt
Wird die Box nicht mehr gewünscht oder benötigt einfach diesen Körper + Achsensystem löschen und alles ist weg
- Es können auch mehrere BoundingBoxen in einem Part erzeugt werden. Dann aber ein Achsesystem für jede erstellen.
- Am besten nicht gleich zu viele Schritte auswählen.
Mit der Funktion manuell im Winkelschritt drehen kann noch optimiert werden.
Im Frame rechts unten wird angezeigt ob sich das Ergebnis verglichen mit der letzten Ausrichtung verbessert oder verschlechtert
- Das Formular wird modeless angezeigt, lässt also währen der Ausführung den Zugriff auf Catia zu
Dies ist konfortabler weil man das Modell drehen und zoomen kann
Der Anwender kann allerdings auch Fenster schließen, wechseln oder was auch immer machen. Hier kann es zum Abbruch mit Fehlermeldung kommen.
Manipuliert der Anwender das Achsensystem manuell während der Makroausführung wird das Resultat im Frame Ergebnis nicht automatisch aktualisiert.
- Alle mit schnellen Fingern an Maustaste: Bei manuell im Winkelschritt drehen bei großen Modellen nicht zu viele Klicks auf einmal auf die Buttons.
Die Version mit Längen- und Breitengrade könnt ihr Testen wenn ihr den CommandButton CmdTest auf dem Formular auf visible true setzt.
Weiter Infos in den Kommentaren im Programmcode.
Vielleicht hat ja jemand eine Idee wie man die Anzahl der zu testenden Ausrichtungen noch reduzieren könnte.
Getestet mit V5 R19/R32/R34 und den Modulen MD2/HD2/CAC-MCE
Gruß
Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP