Inventor hält an Bauteilen und Zeichnungen eine Historie zugewiesener Stile vor. Das können bspw. Materialien sein, die einem Bauteil zugewiesen und anschließend geändert, oder auch Zeichnungsstile, die im Verlauf der Konstruktion gewechselt wurden.
Es gehört zum guten Stil diese Altlasten vor Freigaben zu entfernen. Inventor stellt dafür unter dem Tab Manage eine Funktion namens Purge bereit:
Sind an einem Dokument alte Stile vorhanden, werden diese in einem neuen Fenster gelistet und können mit einem Klick auf OK gelöscht werden:
Was in Inventors grafischer Oberfläche augenscheinlich einfach erscheint, stellte sich programmatisch mittels iLogic als nicht so einfach heraus. Es gab zu diesem Anwendungsfall bereits ein Post iLogic to purge styles im Inventor Forum, der bereits mehrere Jahre alt war, aber zu keiner gescheiten Lösung geführt hat. Vier Jahre nach Erstellung des Posts stand ich vor selbigem Problem und konnte es lösen.
Alte Zeichnungsstile und Stile an 3D Bauteilen müssen grundsätzlich anders programmatisch mit iLogic bereinigt werden:
Zeichnungsstile bereinigen
Für Zeichnungsstile stellt die Inventor API den Styles Manager bereit. Dieser Verwaltet jeden Zeichnungsstil als Style Object und bietet auch die Methode Delete an, um Stile zu löschen.
Die Styles einer Zeichnung sind erreichbar unter oDoc.StylesManager.Styles:
Um alte Stile eindeutig erkennen und auslesen zu können, müssen zwei Bedingungen erfüllt sein:
-
Das Property
InUsemuss den WertFalsebesitzen. Damit ist sichergestellt, dass der Stil nicht aktiv im Zeichnungsdokument verwendet wird. -
Die
StyleLocation, darf nicht der aktiven Stilbibliothek entsprechen. Auskunft darüber gibt der sogenannteStyleLocationEnum, der generell drei mögliche Werte kennt:kLocalStyleLocation: Der Stil ist nur lokal vorhanden und nicht in der aktiven Bibliotheken enthalten.kLibraryStyleLocation: Der Stil stammt aus einer aktiven Bibliothek.kBothStyleLocation: Der Stil ist lokal am Dokument vorhanden, entspricht aber den Vorgaben einer aktiven Bibliothek.
In Code geschrieben sehen diese Bedingungen so aus:
Private Sub PurgeDrawingStylesHistory()
Dim oStyles As Styles = ThisDoc.Document.StylesManager.Styles
For Each oStyle As Style In oStyles
If (oStyle.InUse = False And oStyle.StyleLocation <> StyleLocationEnum.kLibraryStyleLocation) Then
Logger.Info(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Removed unused style: " & oStyle.Name)
oStyle.Delete()
End If
Next
End Sub
Bauteilstile bereinigen
Für Bauteile und Baugruppen ist der Vorgang ein Anderer. Um in diesem Fall die Historie an Stilen zu löschen, muss auf das Assets Object zurückgegriffen werden. Dieses steht unter oDoc.Assets zur Verfügung. Jedes Asset (Material, Appearance, etc.) wird dort als AssetType gelistet. Die Art des Assets wird über den AssetTypeEnum ermittelt. Grundsätzlich stehen vier Auswahlmöglichkeiten an AssetTypes zur Auswahl:
kAssetTypeAppearance: Darstellungseinstellungen, wie bspw. ein Material gerendert werden soll.kAssetTypeMaterial: Ein Material, das zuweisbar ist.kAssetTypePhysicalProperties: Die physischen Eigenschaften des Materials, bspw. Dichte.kAssetTypeUnknown: Ein nicht näher definierbares Asset.
Relevant sind lediglich kAssetTypeAppearance, kAssetTypeMaterial und die beiden Properties IsReadOnly und IsUsed. Nur ein schreibbares Asset (IsReadOnly = False) kann auch gelöscht werden und, wie auch bei den Zeichnungsstilen, kann nur ein Asset gelöscht werden, das nicht aktive in Verwendung (IsUsed = False) ist.
Zusätzlich gibt es ein Verhalten in Inventor, das eine strikte Einhaltung bei der Löschung der Stile erforderlich macht: Material Assets müssen vor den Appearance Assets gelöscht werden.
Mit diesen Erkenntnissen kann eine Sub-Routine bspw. folgendermaßen aussehen:
Private Sub PurgePartStylesHistory()
Dim oAssets As Assets = ThisDoc.Document.Assets
' Clean Material Assets first
For Each oAsset As Asset In oAssets
Try
If (oAsset.AssetType = AssetTypeEnum.kAssetTypeMaterial And oAsset.IsReadOnly = False And oAsset.IsUsed = False) Then
Logger.Info(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Removed unused Material Asset: " & oAsset.Name)
oAsset.Delete()
End If
Catch
Logger.Warn(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Error when removing unused Material Asset.")
End Try
Next
' Clean Appearance Assets second
For Each oAsset As Asset In oAssets
Try
If (oAsset.AssetType = AssetTypeEnum.kAssetTypeAppearance And oAsset.IsReadOnly = False And oAsset.IsUsed = False) Then
Logger.Info(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Removed unused Appearance Asset: " & oAsset.Name)
oAsset.Delete()
End If
Catch
Logger.Warn(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Error when removing unused Appearance Asset.")
End Try
Next
End Sub
Das wäre aber zu einfach! Bei Bauteilen und Baugruppen kommt noch eine Besonderheit zum Tragen und zwar die Model States, die seit Version 2022 in Inventor zur Verfügung stehen. Diese können zur Variantenkonstruktion genutzt werden, sprich in einem Bauteil können unterschiedliche Materialien einem Model State zugewiesen werden. Es gilt daher zu beachten, dass lediglich der aktive Model State des Dokuments bereinigt wird.
iLogic für Zeichnungen und Bauteile
Im Post iLogic: Dokumententypen wurde bereits erläutert, wie Dokumententypen eindeutig identifiziert wurde. Möchte man nun den gezeigten Code in einer iLogic laufen lassen und zweitgleich Bauteile und Zeichnungen adressieren, kann dies folgendermaßen aussehen:
Sub Main()
Dim oDoc As Document = ThisDoc.Document
If oDoc.DocumentType = kPartDocumentObject Then
PurgePartStylesHistory()
Else If oDoc.DocumentType = kDrawingsDocumentObject Then
PurgeDrawingStylesHistory()
End If
End Sub
Private Sub PurgePartStylesHistory()
Dim oAssets As Assets = ThisDoc.Document.Assets
' Clean Material Assets first
For Each oAsset As Asset In oAssets
Try
If (oAsset.AssetType = AssetTypeEnum.kAssetTypeMaterial And oAsset.IsReadOnly = False And oAsset.IsUsed = False) Then
Logger.Info(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Removed unused Material Asset: " & oAsset.Name)
oAsset.Delete()
End If
Catch
Logger.Warn(iLogicVb.RuleName & " | " & ThisDoc.Fil(True) & " | Error when removing unused Material Asset.")
End Try
Next
' Clean Appearance Assets second
For Each oAsset As Asset In oAssets
Try
If (oAsset.AssetType = AssetTypeEnum.kAssetTypeAppearance And oAsset.IsReadOnly = False And oAsset.IsUsed = False) Then
Logger.Info(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Removed unused Appearance Asset: " & oAsset.Name)
oAsset.Delete()
End If
Catch
Logger.Warn(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Error when removing unused Appearance Asset.")
End Try
Next
End Sub
Private Sub PurgeDrawingStylesHistory()
Dim oStyles As Styles = ThisDoc.Document.StylesManager.Styles
For Each oStyle As Style In oStyles
If (oStyle.InUse = False And oStyle.StyleLocation <> StyleLocationEnum.kLibraryStyleLocation) Then
Logger.Info(iLogicVb.RuleName & " | " & ThisDoc.FileName(True) & " | Removed unused style: " & oStyle.Name)
oStyle.Delete()
End If
Next
End Sub
Dieser Code könnte somit auf einen Event Trigger, bspw. Before Save Document, für alle Dokumente gelegt werden und würde bei jedem Speichern die Stilhistorie bereinigen.