Im vorherigen Post iLogic: Der Editor wurde der grundsätzliche Aufbau des Editors erläutert. Nun gilt es den ersten Code zu schreiben. iLogic-Code kann prinzipiell ohne eine explizite Hauptroutine Sub Main() laufen. Aller Code wird dann einfach im Editor Line by Line ausgeführt. Während dies bei einfachen Programmen kein Problem darstellt, kann dies bei komplexer aufgebauten iLogics zur Unübersichtlichkeit und Problemen beim Lesen des Codes führen.

iLogic ohne Main- und Subroutines

Ein einfaches Beispiel für eine iLogic ohne Unterroutinen könnte so aussehen:

Dim oDoc As Document = ThisDoc.Document

If oDoc.DocumentType = kAssemblyDocumentObject Then
    MsgBox("Das geöffnete Dokument ist eine Baugruppe.")
Else
    MsgBox("Das geöffnete Dokument ist keine Baugruppe.")
End If

Der Code im Detail:

  1. Zuerst wird ein Objekt oDoc deklariert und direkt in der gleichen Zeile wird diesem das Dokument zugewiesen, in dem der Code ausgeführt werden soll.
  2. Es folgt eine If-Bedingung, die prüft ob es sich bei dem geöffneten Dokument um eine Baugruppe handelt. Ist dies der Fall, wird eine Messagebox auf dem Bildschirm erscheinen und den Text Das geöffnete Dokument ist eine Baugruppe. ausgeben.
  3. Handelt es sich bei dem geöffneten Dokument um keine Baugruppe, erscheint ebenfalls eine Messagebox, die den Text “Das geöffnete Dokument ist keine Baugruppe.” ausgibt.

Funktionen und Subroutinen

Wie bereits zuvor erwähnt, können Funktionen und Unterroutinen die Lesbarkeit des Codes stark erhöhen. Dies ist besonders hilfreich, wenn man eine iLogic studiert, die nicht aus eigener Feder stammt. Funktionen und Routinen sollten daher immer kurze und prägnante Benennungen erhalten, die eindeutig aufzeigen welchen Zweck sie haben.

Unterscheiden tun sich Funktionen von Subroutinen in einem Punkt: Sie liefern einen Wert zurück und brauchen auch korrekterweise direkt einen Datentyp bei der Deklaration, der beschreibt was da zurückgeliefert wird, bspw. ob es sich um einen String, einen Ganzzahlwert int oder einen bool’schen Wert true oder false handelt.

Funktionen

Übertragen auf das erste Beispiel einer iLogic, kann die Prüfung ob es sich beim geöffneten Dokument um eine Baugruppe handelt, auch einfach durch eine Funktion übernommen werden, die für diesen Fall den Wert true zurückliefert. Dazu muss der eigentliche Programmcode und der Code der Funktion voneinander getrennt werden:

Sub Main()
    If IsDocumentAssembly() Then
        MsgBox("Das geöffnete Dokument ist eine Baugruppe.")
    Else
        MsgBox("Das geöffnete Dokument ist keine Baugruppe.")
    End If
End Sub


Private Function IsDocumentAssembly() As Boolean
    Dim oDoc As Document = ThisDoc.Document

    If oDoc.DocumentType = kAssemblyDocumentObject Then
        Return True
    Else
        Return False
    End If
End Function

Der Code im Detail:

  1. Der eigentliche Programmcode läuft nun in einer Hauptroutine Main()
  2. Die Prüfung, ob es sich um eine Baugruppe handelt ist in eine eigene Funktion ausgelagert. Die Funktion ist vom Typ Private, steht damit nur in der iLogic selber zur Verfügung und liefert einen bool’schen Wert zurück und
  3. Das zu prüfende Dokument oDoc wird direkt in der Funktion zugewiesen.

Speziell Punkt 3 sollte genauer betrachtet werden: Angenommen es gäbe noch eine weitere Funktion, die zusätzlich prüft ob es sich bei dem geöffneten Dokument um eine Zeichnung handelt, müsste man bei gleicher Programmierung zweimal ein Objekt oDoc deklarieren und abfragen:

Private Function IsDocumentDrawing() As Boolean
    Dim oDoc As Document = ThisDoc.Document

    If oDoc.DocumentType = kDrawingDocumentObject Then
        Return True
    Else
        Return False
    End If
End Function

Diese Redundanz ist ineffizient und sollte vermieden werden. Die Lösung dazu sind Funktionsparameter. Derzeit arbeiten die beiden Funktionen IsDocumentAssembly() und IsDocumentDrawing() ohne einen einzigen Parameter, der an sie übergeben wird. Die Klammern () sind leer. Innerhalb dieser Klammern kann also Vorgegeben werden was für einen Parameter oder Datentyp an die Funktion übergeben wird:

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

    If IsDocumentAssembly(oDoc) Then
        MsgBox("Das geöffnete Dokument ist eine Baugruppe.")
    Else If IsDocumentDrawing(oDoc)
        MsgBox("Das geöffnete Dokument ist eine Zeichnung.")
    Else
        MsgBox("Das geöffnete Dokument ist weder eine Baugruppe, noch eine Zeichnung.")
    End If
End Sub


Private Function IsDocumentAssembly(oDoc As Document) As Boolean
    If oDoc.DocumentType = kAssemblyDocumentObject Then
        Return True
    Else
        Return False
    End If
End Function

Private Function IsDocumentDrawing(oDoc As Document) As Boolean
    If oDoc.DocumentType = kDrawingDocumentObject Then
        Return True
    Else
        Return False
    End If
End Function

Der Code im Detail:

  1. Das Objekt oDoc, das stellvertretend für das geöffnete Dokument steht, wir in der Hauptroutine Main() einmalig definiert und an die beiden Funktionen als Parameter übergeben.
  2. Die If-Bedingung wurde um einen weiteren Prüfentscheid Else If erweitert der zusätzlich prüft, ob das geöffnete Dokument eine Zeichnung ist.
  3. Die Funktionen liefern einen bool’schen Wert zurück, der in der Hauptroutine für Entscheidungen genutzt werden kann.

Subroutines

Wenn kein expliziter Rückgabewert gefordert ist, kann anstelle eine Funktion auch eine Subroutine genutzt werden. Sie sollten wie kleine Unterprogramme betrachtet werden, die spezifische Tasks ausführen, bspw. eine Stücklistenstruktur setzen, einen Anzeigenamen anpassen oder Bauteile unterdrücken. Sie werden explizit mit einem Befehl namens Call aufgerufen.

Ein fiktiver Fall für eine Subroutine: Basierend auf dem bisherigen Code soll für den Fall, dass das aktive Dokument eine Baugruppe ist, der Anzeigename im Modellbrowser mit der Bezeichnung Klappspaten überschrieben werden. Die API von Inventor stellt diese Information bereit, man muss nur die richtige Methodik finden an diesen Wert zu kommen. Zur Hilfe bei der Suche kommt wieder das VBA-Makro aus dem ersten Teil dieser Serie iLogic: Erste Schritte mit der Inventor API zum Einsatz.

Der Anzeigename ist Teil des Objekts oDoc und kann unter dem API-Endpunkt oDoc.DisplayName geschrieben werden. Des Weiteren kann der Typ entnommen werden, nämlich String - also eine Textfolge -, ebenso wie der aktuelle Wert (Value) des Anzeigenamens, nämlich "Assembly.iam".

Die Subroutine, um den Anzeigenamen zu überschreiben, könnte so aussehen:

Private Sub SetDisplayName(oDoc As Document)
    Dim newName As String = "Klappspaten"
    oDoc.DisplayName = newName
End Sub

Der gesamte Code, inkl. der neuen Subroutine:

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

    If IsDocumentAssembly(oDoc) Then
        Call SetDisplayName(oDoc)
        MsgBox("Das geöffnete Dokument ist eine Baugruppe.")
    Else If IsDocumentDrawing(oDoc)
        MsgBox("Das geöffnete Dokument ist eine Zeichnung.")
    Else
        MsgBox("Das geöffnete Dokument ist weder eine Baugruppe, noch eine Zeichnung.")
    End If
End Sub


Private Function IsDocumentAssembly(oDoc As Document) As Boolean
    If oDoc.DocumentType = kAssemblyDocumentObject Then
        Return True
    Else
        Return False
    End If
End Function

Private Function IsDocumentDrawing(oDoc As Document) As Boolean
    If oDoc.DocumentType = kDrawingDocumentObject Then
        Return True
    Else
        Return False
    End If
End Function

Private Sub SetDisplayName(oDoc As Document)
    oDoc.DisplayName = "Klappspaten"
End Sub

Und so sieht das Ergebnis nach dem Ausführen der iLogic im Modellbrowser in Inventor aus:

Wenn man den Anzeigenamen wieder auf den Default-Wert setzen möchte, kann man dies erreichen indem man ihn einfach erneut mit einem leeren String überschreibt:

Private Sub ResetDisplayName(oDoc As Document)
    oDoc.DisplayName = ""
End Sub