6 Minuten
iLogic: Struktureller Aufbau

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:
- 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. - 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.
- 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:
- Der eigentliche Programmcode läuft nun in einer Hauptroutine
Main()
- 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 - 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:
- Das Objekt
oDoc
, das stellvertretend für das geöffnete Dokument steht, wir in der HauptroutineMain()
einmalig definiert und an die beiden Funktionen als Parameter übergeben. - Die If-Bedingung wurde um einen weiteren Prüfentscheid
Else If
erweitert der zusätzlich prüft, ob das geöffnete Dokuement eine Zeichnung ist. - 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