Zum Hauptinhalt springen
Featured image for iLogic: Material über InputListBox zuweisen

iLogic: Material über InputListBox zuweisen

·466 Wörter·3 min·
Inhaltsverzeichnis
Inventor iLogic - Dieser Artikel ist Teil einer Serie.
Teil 20: Dieser Artikel

Der empfehlenswerte Youtube Kanal von Felix Rodermund wurde auf diesem Blog bereits im Post Inventor: Top-Down-Konstruktion empfohlen, da er eine schöne Serie zur Konstruktionsmethodik mit der Top-Down-Methode veröffentlicht hat.

Durch Zufall bin ich heute erneut über ein Video von ihm gestoßen, das ein augenscheinlich einfaches alltägliches Problem mit iLogic zu lösen versucht:

Die Problemstellung: Wie kann man mit einem InputListBox-Dialogfenster die verfügbaren Materialien der Standard Inventor Materialbibliothek auflisten und diese durch eine Listenauswahl zuweisen? Das InputListBox-Dialogfenster ist dem aufmerksamen Leser dieser Serie bereit bekannt aus dem Post iLogic: User Interaktion.

Felix versucht in seinem initialen Code alle verfügbaren Materialien über das MaterialAssets Object als Liste anzusprechen und diese an eine InputListBox zu übergeben. Das Problem über das er stolpert stellt sich in der Form dar, dass Materialien in Inventor auf programmatischer Ebene Objekte sind. Folgerichtig bekommt er auch eine Liste an Objekten in der InputListBox angezeigt, die jedoch dem Endanwender nichtssagende Informationen enthalten:

Screenshot InputListBox

Wie bereits angeschnitten, ist ein MaterialAsset in Inventor nicht nur lediglich ein Materialname, sondern besitzt zusätzlich viele Eigenschaften, bspw. einen Namen, einen Anzeigenamen, Texturangaben oder aber auch physische Eigenschaften, wie die Dichte:

Screenshot InputListBox

Felix umgeht das Problem mit einem gesunden Maß an Overengineering und nutzt letzten Endes eine flexible Wrapper Class, die er auf seiner Webseite dokumentiert hat.

Meine Lösung

Im Kern kann das Problem auch relativ einfach in iLogic gelöst werden. Man muss lediglich:

  1. eine leere Liste listMaterials deklarieren
  2. über alle MaterialAssets iterieren und jeden Anzeigenamen des jeweiligen Materials in die Liste einfügen
  3. diese Liste an die InputListBox übergeben und die Auswahl als Return Value in eine Variable speichern
  4. im finalen Schritt den iLogic Shortcut iProperties.Material benutzen. Dieser akzeptiert für eine Materialzuweisung den Anzeigenamen eines Materials.

Der Code:

Sub Main()
    Dim oMaterialAssets As AssetsEnumerator = ThisApplication.AssetLibraries.Item(3).MaterialAssets
    Dim listMaterials As New List(Of String)

    For Each oMaterialAsset As MaterialAsset In oMaterialAssets
        listMaterials.Add(oMaterialAsset.DisplayName)
    Next

    Dim selection As String = InputListBox(
        "Welches Material soll zugewiesen werden?",
        listMaterials,
        listMaterials(0),
        "Materialauswahl",
        "Material",
        480,
        0
    )

    If Not String.IsNullOrEmpty(selection) Then
        iProperties.Material = selection
    End If
End Sub

Das Ergebnis:

Materialzuweisung über InputListBox

Optimierte Lösung

Idealerweise prüft man vorangestellt, ob es sich beim aktiven Dokument um ein Bauteil (PartDocument) handelt, denn Baugruppen kann kein Material (abseits Material für Schweißwerkstoffe) zugewiesen werden. Wie dies funktioniert wurde bereits im Post iLogic: Dokumententypen erläutert:

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

    If oDoc.DocumentType <> DocumentTypeEnum.kPartDocumentObject Then
        MessageBox.Show(
            "Dieser Code funktioniert nur in Bauteilen.",
            "Falscher Dokumententyp",
            MessageBoxButtons.OK,
            MessageBoxIcon.Error,
            MessageBoxDefaultButton.Button1
        )
        Exit Sub
    End If

    Dim oMaterialAssets As AssetsEnumerator = ThisApplication.AssetLibraries.Item(3).MaterialAssets
    Dim listMaterials As New List(Of String)

    For Each oMaterialAsset As MaterialAsset In oMaterialAssets
        listMaterials.Add(oMaterialAsset.DisplayName)
    Next

    Dim selection As String = InputListBox(
        "Welches Material soll zugewiesen werden?",
        listMaterials,
        listMaterials(0),
        "Materialauswahl",
        "Material",
        480,
        0
    )

    If Not String.IsNullOrEmpty(selection) Then
        iProperties.Material = selection
    End If
End Sub

Wird der Code nun in einer Baugruppe oder Zeichnung ausgeführt, erscheint eine Warnmeldung:

Warnmeldung für einen falschen Dokumententyp
Inventor iLogic - Dieser Artikel ist Teil einer Serie.
Teil 20: Dieser Artikel