Zum Hauptinhalt springen
Featured image for iLogic: Stile bereinigen

iLogic: Stile bereinigen

·992 Wörter·5 min·
Inhaltsverzeichnis
Inventor iLogic - Dieser Artikel ist Teil einer Serie.
Teil 15: Dieser Artikel

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:

Purge Styles Button

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:

Purge Styles Button

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:

Drawing Styles

Um alte Stile eindeutig erkennen und auslesen zu können, müssen zwei Bedingungen erfüllt sein:

  1. Das Property InUse muss den Wert False besitzen. Damit ist sichergestellt, dass der Stil nicht aktiv im Zeichnungsdokument verwendet wird.

  2. Die StyleLocation, darf nicht der aktiven Stilbibliothek entsprechen. Auskunft darüber gibt der sogenannte StyleLocationEnum, 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:

  1. kAssetTypeAppearance: Darstellungseinstellungen, wie bspw. ein Material gerendert werden soll.
  2. kAssetTypeMaterial: Ein Material, das zuweisbar ist.
  3. kAssetTypePhysicalProperties: Die physischen Eigenschaften des Materials, bspw. Dichte.
  4. kAssetTypeUnknown: Ein nicht näher definierbares Asset.
Purge Styles Button

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.

Inventor iLogic - Dieser Artikel ist Teil einer Serie.
Teil 15: Dieser Artikel