Zum Hauptinhalt springen

iLogic: Units of Measurement

·954 Wörter·5 min·
Autodesk Inventor CAD
Inhaltsverzeichnis
Inventor iLogic - Dieser Artikel ist Teil einer Serie.
Teil 5: Dieser Artikel

Jedes Dokument hat in Autodesk Inventor in seinen Dokumenteneinstellungen ein benutzerdefiniertes Set an Maßeinheiten (Units of Measure, kurz UOM), sowie Angaben zu deren Präzision. Werden bspw. Inch oder Millimeter für Längenangaben genutzt, werden der Radiant oder das Gradmaß verwendet oder Gewichtsangaben in Gramm oder Kilogramm angegeben. Diese Angaben dienen aber nur dem Nutzer, der die grafische Oberfläche von Inventor verwendet. Nutzt man bspw. die API um eine Länge von einem Bauteil zu berechnen, rechnet Inventor immer mit der internen Maßeinheit Zentimeter. Dies gilt es zu berücksichtigen, wenn man diese Werte ausliest und ggf. weiterverarbeitet. Die internet Bezeichnung für den Satz an Maßeinheiten der API lautet DatabaseUnits.

Internal DatabaseUnits

Inventor nutzt zur internen Berechnung die folgenden Maßeinheiten. Sie werden Internal Database Units (IDU) genannt:

Messtyp IDU
Masse kg Kilogramm
Länge / Distanz cm Zentimeter
Zeit s Sekunden
Temperatur K Kelvin
Winkel rad Radiant
Kraft N Newton
Moment / Drehmoment Ncm Newton-Zentimeter
Druck / Spannung N/cm² Newton pro Quadratzentimeter
Energie J Joule
Leistung W Watt
Dichte g/cm³ Gramm pro Kubikzentimeter
Volumen cm³ Kubikzentimeter
Fläche cm² Quadratzentimeter
Geschwindigkeit cm/s Zentimeter pro Sekunde
Beschleunigung cm/s² Zentimeter pro Quadratsekunde

Problematisch im Konstruktionswesen sind an dieser Stelle die Längenangaben in Zentimeter, da der Millimeter für Konstruktionsdaten als Goldstandard gilt, sowie das Winkelmaß als Radiant, das für den menschlichen Verstand nicht so gut greifbar ist, wie das Winkelmaß.

Maßeinheiten und die API

Die API stellt für das Arbeiten mit Maßeinheiten zwei wichtige Werkzeuge bereit:

  1. Das Objekt UnitsOfMeasure:

    Dieses Objekt hat die zugehöriger Methode zur Konvertierung von Einheiten und gleichzeitig die in den Dokumenteneinstellungen gesetzten Einheiten zum Auslesen und Manipulieren verfügbar.

  2. Den Enum UnitTypeEnum:

    Mit diesem Enum kann bestimmt werden, um was für eine Einheitenangabe es sich handelt, bspw. um eine generelle Längenangabe, aber auch präziser um eine Längenangabe mit der Einheit Millimeter.

Beispiel zur Veranschaulichung

Als praktisches Beispiel dient ein Zylinder mit einem Durchmesser Ø25mm und einer extrudierten Länge von 80mm:

Das Zylinderbauteil hat in den Dokumenteneigenschaften die Maßeinheit mm für Längenangaben gesetzt:

Eine Extrusion ist ein sogenanntes Feature. Features sind in der API unter dem Objekt ComponentDefinition.Features zu finden. Dort gibt es den Endpunkt ExtrudeFeatures, in dem alle Dimensionsparameter zu finden sind, die den Beispielzylinder beschreiben:

Unterhalb der ExtrudeFeatures gibt es den Abschnitt Parameters, der eine Liste mit allen geometriebeschreibenden Parametern vorhält. Der Durchmesser des Zylinder ist in dieser Liste Item 1 und die ausgetragene Länge Item 3.

Als Value erkennt man auf dem Screenshot, dass die Werte 2,5 und 8 angegeben werden, obwohl 25mm und 80mm definiert wurden. Dies muss immer berücksichtigt werden, wenn ein solcher Wert ausgelesen und bspw. in einer Variable gespeichert und weiterverwendet wird.

Konvertierung von Maßeinheiten

Als Beispiel für eine Maßeinheitenkonvertierung wird der Durchmesser des Zylinders gewählt. Dieser hat, wie bereits angemerkt, die Nummer Item 1 in der Parameterliste der ExtrudeFeatures. Um den internen Wert cm nun in mm zu konvertieren wird zum einen der UnitsTypeEnum benötigt und das UnitsOfMeasure-Objekt des Dokuments, dass die Methode ConvertUnits() bereitstellt.

Die Methode ConvertUnits() benötigt 3 Parameter:

  1. Einen Eingabewert, der konvertiert werden soll.
  2. Ein Ausgangsmaßeinheit, von dem aus konvertiert werden soll. In diesem Fall ist es die interne DatabaseUnit für Längenangaben.
  3. Ein Maßeinheit, in die konvertiert werden soll, also mm.
Dim oDoc As Document = ThisDoc.Document
Dim UOM As UnitsOfMeasure = oDoc.UnitsOfMeasure

' Auslesen des Zylinderdurchmessers
Dim DiameterCylinder As Double = oDoc.ComponentDefinition.Features.ExtrudeFeatures.Item(1).Parameters.Item(1).Value

' Konvertierung in Millimeter
Dim DiameterCylinderMillimeters As Double = UOM.ConvertUnits(DiameterCylinder, UnitsTypeEnum.kDatabaseLengthUnits, UnitsTypeEnum.kMillimeterLengthUnits)

MsgBox("Der Durchmesser beträgt intern: " & DiameterCylinder & vbLf & "Der Durchmesser beträgt konvertiert: " & DiameterCylinderMillimeters, MessageBoxButtons.OK, "Konvertierung")

Tipp: In einem späterem Post iLogic: User Interaktion wird ausführlich auf die Verwendung von MessageBoxes eingegangen.

Praxisbeispiel: Importierte CAD-Daten

Vor kurzem gab es in meinem Unternehmen folgende Situation:

  • Ein externer Zulieferer importierte eine größere native Inventor Baugruppe.
  • Sämtliche Bauteile hatten in den Dokumenteneigenschaften einen abweichenden Satz an Maßeinheiten, konkret wurde Meter, statt Millimeter als Längeneinheit definiert.

Korrekturoption 1: Dokumentenebene

Diese Subroutine kann einfach als Trigger vor dem Speichern gesetzt werden und kontrolliert, ob die gewünschten Einheiten und Präzisionswerte vorhanden sind. Ist dies nicht der Fall werden sie korrigiert. Sie prüft und korrigiert nur in Bauteilen und Baugruppen, da Zeichnungen auf die Werte der dargestellten Dokumente zugreifen.

Sub Main()
    Dim oDoc As Document = ThisDoc.Document

    If oDoc.DocumentType = kPartDocumentObject Or oDoc.DocumentType = kAssemblyDocumentObject Then
        CheckAndSetUnits(oDoc)
    End If
End Sub


Private Sub CheckAndSetUnits(oDoc As Document)
    If oDoc.UnitsOfMeasure.LengthUnits = UnitsTypeEnum.kMillimeterLengthUnits _
        And oDoc.UnitsOfMeasure.LengthDisplayPrecision = 3 _
        And oDoc.UnitsOfMeasure.AngleUnits = UnitsTypeEnum.kDegreeAngleUnits _
        And oDoc.UnitsOfMeasure.AngleDisplayPrecision = 2 _
        And oDoc.UnitsOfMeasure.MassUnits = UnitsTypeEnum.kKilogramMassUnits _
        And oDoc.UnitsOfMeasure.TimeUnits = UnitsTypeEnum.kSecondTimeUnits Then

        ' Subroutine beenden, da Einheiten korrekt sind
        Exit Sub
    Else
        oDoc.UnitsOfMeasure.LengthUnits = UnitsTypeEnum.kMillimeterLengthUnits
        oDoc.UnitsOfMeasure.LengthDisplayPrecision = 3
        oDoc.UnitsOfMeasure.AngleUnits = UnitsTypeEnum.kDegreeAngleUnits
        oDoc.UnitsOfMeasure.AngleDisplayPrecision = 2
        oDoc.UnitsOfMeasure.MassUnits = UnitsTypeEnum.kKilogramMassUnits
        oDoc.UnitsOfMeasure.TimeUnits = UnitsTypeEnum.kSecondTimeUnits
    End If
End Sub

Korrekturoption 2: Alle Unterkomponenten

Alternativ zu einer Trigger-basierten Korrektur, kann auch die oberste Baugruppe geöffnet und eine iLogic manuell ausgeführt werden, die über die gesamten Unterkomponenten der Bauteile iteriert und jedes Teil dabei prüft und ggf. korrigiert. Dafür muss in der API das Objekt ReferencedDocuments verwendet werden. ReferencedDocuments beinhaltet Verweise auf sämtliche Dokumente, die in einer Baugruppe verbaut sind und auch auf den Basiseinheitensatz jedes verbauten Dokuments:

Screenshot API Referenced Documents

Dies ist zugleich eine gute Möglichkeit eine nützliche Funktionalität kennenzulernen: Eine For Each-Schleife.

Sub Main()
    Dim oDoc As Document = ThisDoc.Document
    Dim oDocRefs As DocumentsEnumerator = oDoc.ReferencedDocuments

    For Each oDocRef In oDocRefs
        If oDoc.DocumentType = kPartDocumentObject Or oDoc.DocumentType = kAssemblyDocumentObject Then
            CheckAndSetUnits(oDocRef)
        End If
    Next
End Sub


Private Sub CheckAndSetUnits(oDoc As Document)
    If oDoc.UnitsOfMeasure.LengthUnits = UnitsTypeEnum.kMillimeterLengthUnits _
        And oDoc.UnitsOfMeasure.LengthDisplayPrecision = 3 _
        And oDoc.UnitsOfMeasure.AngleUnits = UnitsTypeEnum.kDegreeAngleUnits _
        And oDoc.UnitsOfMeasure.AngleDisplayPrecision = 2 _
        And oDoc.UnitsOfMeasure.MassUnits = UnitsTypeEnum.kKilogramMassUnits _
        And oDoc.UnitsOfMeasure.TimeUnits = UnitsTypeEnum.kSecondTimeUnits Then

        ' Subroutine beenden, da Einheiten korrekt sind
        Exit Sub
    Else
        oDoc.UnitsOfMeasure.LengthUnits = UnitsTypeEnum.kMillimeterLengthUnits
        oDoc.UnitsOfMeasure.LengthDisplayPrecision = 3
        oDoc.UnitsOfMeasure.AngleUnits = UnitsTypeEnum.kDegreeAngleUnits
        oDoc.UnitsOfMeasure.AngleDisplayPrecision = 2
        oDoc.UnitsOfMeasure.MassUnits = UnitsTypeEnum.kKilogramMassUnits
        oDoc.UnitsOfMeasure.TimeUnits = UnitsTypeEnum.kSecondTimeUnits
    End If
End Sub
Inventor iLogic - Dieser Artikel ist Teil einer Serie.
Teil 5: Dieser Artikel