Find tables from drawing by type using SOLIDWORKS API

Edit ArticleEdit Article

Tables in the drawing document
Tables in the drawing document

This examples allows to find all tables by specified type from the active drawing document using SOLIDWORKS API.

It is required to specify the array of types using the Array function, where each value represents the type of the table (BOM, general, cut-list, revision, title block etc.) as defined in swTableAnnotationType_e enumeration.

As the result array of pointer to ITableAnnotation SOLIDWORKS API interface is returned and title of each table is output to the immediate window of VBA editor.

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    Dim swDraw As SldWorks.DrawingDoc
    Set swDraw = swApp.ActiveDoc
    If Not swDraw Is Nothing Then
        Dim vTables As Variant
        vTables = FindTables(swDraw, Array(swTableAnnotationType_e.swTableAnnotation_BillOfMaterials, swTableAnnotationType_e.swTableAnnotation_RevisionBlock))
        If Not IsEmpty(vTables) Then
            Dim i As Integer
            For i = 0 To UBound(vTables)
                Dim swTable As SldWorks.TableAnnotation
                Set swTable = vTables(i)
                Debug.Print swTable.Title
        End If
        MsgBox "Please open drawing"
    End If
End Sub

Function FindTables(draw As SldWorks.DrawingDoc, filter As Variant) As Variant
    Dim swTables() As SldWorks.TableAnnotation
    Dim isInit As Boolean
    isInit = False
    Dim vSheets As Variant
    vSheets = draw.GetViews()
    Dim i As Integer
    For i = 0 To UBound(vSheets)
        Dim vViews As Variant
        vViews = vSheets(i)
        Dim swSheetView As SldWorks.View
        Set swSheetView = vViews(0)
        Dim vTableAnns As Variant
        vTableAnns = swSheetView.GetTableAnnotations
        If Not IsEmpty(vTableAnns) Then
            Dim j As Integer
            For j = 0 To UBound(vTableAnns)
                Dim swTableAnn As SldWorks.TableAnnotation
                Set swTableAnn = vTableAnns(j)
                If FilterContains(swTableAnn.Type, filter) Then
                    If isInit Then
                        ReDim Preserve swTables(UBound(swTables) + 1)
                        ReDim swTables(0)
                        isInit = True
                    End If
                End If
                Set swTables(UBound(swTables)) = swTableAnn
        End If
    FindTables = swTables
End Function

Function FilterContains(val As swTableAnnotationType_e, filter As Variant) As Boolean
    Dim i As Integer
    For i = 0 To UBound(filter)
        If val = filter(i) Then
            FilterContains = True
            Exit Function
        End If
    FilterContains = False
End Function


All articles and code at CodeStack are now open-source and hosted on GitHub. If you want to contribute by modifying existing articles and code snippets, submitting new ones, reporting errors and bugs etc. please follow this blog post for more information. We appreciate any contribution.

Product of Xarial Product of Xarial