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:
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:
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:
- eine leere Liste
listMaterialsdeklarieren - über alle
MaterialAssetsiterieren und jeden Anzeigenamen des jeweiligen Materials in die Liste einfügen - diese Liste an die InputListBox übergeben und die Auswahl als Return Value in eine Variable speichern
- im finalen Schritt den iLogic Shortcut
iProperties.Materialbenutzen. 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:
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: