Das Konzept einer Bounding Box ist in der CAD-Welt geläufig. Es stellt einen virtuellen umschließenden Rahmen um ein 3D-Modell dar, dessen Werte Aufschluss über dessen Größe geben und bspw. bei der Planung von etwaigen Lagerplatz hilfreich sein kann.
Die Inventor API nutzt zur Bestimmung ein sogenanntes Box Objekt. Dieses definiert die Bounding Box über zwei Werte (Max/Min) pro Achse und kann über das ComponentDefinition Objekt auf zweierlei Weisen benutzt werden:
RangeBox vs. PreciseRangeBox
Neben der RangeBox: stellt Inventor seit Version 2023 eine PreciseRangeBox zur Ermittlung der Bounding Box bereit.
Autodesk definiert sie in ihrer Funktionsweise folgendermaßen:
- RangeBox:
Property that returns a Box object which contains the opposing points of a rectangular box that is guaranteed to enclose this object.
- PreciseRangeBox:
Gets a bounding box that tightly encloses all the solid and surface bodies under the ComponentDefinition.
Der elementare Unterschied besteht darin, dass die PreciseRangeBox auch dann ein korrektes minimal umgebendes Rechteck liefert, wenn Teile schief im Raum und nicht entlang der Achsen modelliert wurden. Nachteil ist, dass die PreciseRangeBox in großen Baugruppen spürbar rechenintensiver ist. Auch exkludiert sie Work Features, wie Ebenen, Achsen und Punkte.
Code
Der folgende Code ermittelt die Werte der Bounding Box in Abhängigkeit des Dokumententyps. Siehe dazu: iLogic: Dokumententypen.
Für Bauteile wird die PreciseRangeBox verwendet, für Baugruppen die RangeBox. Die ermittelten Werte werden anschließend, wie bereit im Post iLogic: Units of Measurement erläutert, von Inventors interner Längeneinheit Zentimeter in Millimeter konvertiert und mit der Ceil()-Methode auf den nächst höheren Ganzzahlwert gerundet. Der ermittelte Wert wird anschließend in ein Custom Property namens Dimensionen geschrieben.
Sub Main()
Dim oDoc As Document = ThisDoc.Document
Dim UOM As UnitsOfMeasure = oDoc.UnitsOfMeasure
Dim oRangeBox As Box
Select Case oDoc.DocumentType
Case DocumentTypeEnum.kPartDocumentObject
oRangeBox = oDoc.ComponentDefinition.PreciseRangeBox
Case DocumentTypeEnum.kAssemblyDocumentObject
oRangeBox = oDoc.ComponentDefinition.RangeBox
Case Else
Exit Sub
End Select
' Max Werte
Dim Xmax As Double = oRangeBox.MaxPoint.X
Dim Ymax As Double = oRangeBox.MaxPoint.Y
Dim Zmax As Double = oRangeBox.MaxPoint.Z
' Min Werte
Dim Xmin As Double = oRangeBox.MinPoint.X
Dim Ymin As Double = oRangeBox.MinPoint.Y
Dim Zmin As Double = oRangeBox.MinPoint.Z
' Konvertiere in 'mm' und runde auf nächsten Ganzzahlwert
Dim X As Double = Ceil(UOM.ConvertUnits(Xmax - Xmin, UnitsTypeEnum.kDatabaseLengthUnits, UnitsTypeEnum.kMillimeterLengthUnits))
Dim Y As Double = Ceil(UOM.ConvertUnits(Ymax - Ymin, UnitsTypeEnum.kDatabaseLengthUnits, UnitsTypeEnum.kMillimeterLengthUnits))
Dim Z As Double = Ceil(UOM.ConvertUnits(Zmax - Zmin, UnitsTypeEnum.kDatabaseLengthUnits, UnitsTypeEnum.kMillimeterLengthUnits))
' Erzeuge String im Format 'X x Y x Z [mm]'
Dim Dimensions As String = String.Format("{0} x {1} x {2} [mm]", X, Y, Z)
' Schreibe Abmaße in Property und Logger
iProperties.Value("Custom", "Dimensionen") = Dimensions
Logger.Info("Dimensionen: {0}", Dimensions)
End Sub
Ergebnis