iCAx开思网

标题: 装配图中选中所有实体(solid bodies)的宏 [打印本页]

作者: panliang9    时间: 2021-11-10 10:11
标题: 装配图中选中所有实体(solid bodies)的宏
这是一个在装配或者零件环境下选中所有实体(solid bodies)的宏,不知道怎么回事,在我的SW2010下用不了,它总说,变量未定义,大家帮看下,是怎么回事。

[attach]1273334[/attach]

This example shows how to select both solid and surface bodies in either a part or an assembly.


'----------------------------------------

'

' Preconditions: Part or assembly is open.

'

' Postconditions: All solid and surface bodies are selected.

'

'----------------------------------------

Option Explicit

Public Enum swDocumentTypes_e

    swDocNONE = 0       '  Used to be TYPE_NONE

    swDocPART = 1       '  Used to be TYPE_PART

    swDocASSEMBLY = 2   '  Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    '  Used to be TYPE_DRAWING

End Enum

Public Enum swBodyType_e

    swSolidBody = 0

    swSheetBody = 1

    swWireBody = 2

    swMinimumBody = 3

    swGeneralBody = 4

    swEmptyBody = 5

End Enum

Sub SelectBodies _

( _

    swApp As SldWorks.SldWorks, _

    swModel As SldWorks.ModelDoc2, _

    vBody As Variant, _

    sPadStr As String _

)

    Dim swModExt                    As SldWorks.ModelDocExtension

    Dim swBody                      As SldWorks.body2

    Dim sBodySelStr                 As String

    Dim sBodyTypeSelStr             As String

    Dim i                           As Long

    Dim bRet                        As Boolean


    If IsEmpty(vBody) Then Exit Sub

    Set swModExt = swModel.Extension


    For i = 0 To UBound(vBody)

        Set swBody = vBody(i)


        sBodySelStr = swBody.GetSelectionId


        Debug.Print "  " & sPadStr & sBodySelStr


        Select Case swBody.GetType

            Case swSolidBody

                sBodyTypeSelStr = "SOLIDBODY"


            Case swSheetBody

                sBodyTypeSelStr = "SURFACEBODY"


            Case Else

                Debug.Assert False

        End Select


        bRet = swModExt.SelectByID2(sBodySelStr, sBodyTypeSelStr, 0#, 0#, 0#, True, 0, Nothing, swSelectOptionDefault): Debug.Assert bRet

    Next i

End Sub

Sub ProcessComponent _

( _

    swApp As SldWorks.SldWorks, _

    swModel As SldWorks.ModelDoc2, _

    swComp As SldWorks.Component2, _

    nLevel As Long _

)

    Dim vChildComp                  As Variant

    Dim swChildComp                 As SldWorks.Component2

    Dim swCompConfig                As SldWorks.Configuration

    Dim sPadStr                     As String

    Dim vBody                       As Variant

    Dim i                           As Long


    For i = 0 To nLevel - 1

        sPadStr = sPadStr + "  "

    Next i

    Debug.Print sPadStr & swComp.Name2 & " <" & swComp.ReferencedConfiguration & ">"

    ' Solid bodies

    vBody = swComp.GetBodies2(swSolidBody)

    SelectBodies swApp, swModel, vBody, sPadStr


    ' Surface bodies

    vBody = swComp.GetBodies2(swSheetBody)

    SelectBodies swApp, swModel, vBody, sPadStr


    vChildComp = swComp.GetChildren

    For i = 0 To UBound(vChildComp)

        Set swChildComp = vChildComp(i)


        ProcessComponent swApp, swModel, swChildComp, nLevel + 1

    Next i

End Sub

Sub ProcessAssembly _

( _

    swApp As SldWorks.SldWorks, _

    swModel As SldWorks.ModelDoc2 _

)

    Dim swConfigMgr                 As SldWorks.ConfigurationManager

    Dim swConf                      As SldWorks.Configuration

    Dim swRootComp                  As SldWorks.Component2


    Set swConfigMgr = swModel.ConfigurationManager

    Set swConf = swConfigMgr.ActiveConfiguration

    Set swRootComp = swConf.GetRootComponent

    ProcessComponent swApp, swModel, swRootComp, 1

End Sub

Sub main()

    Dim swApp                       As SldWorks.SldWorks

    Dim swModel                     As SldWorks.ModelDoc2

    Dim swPart                      As SldWorks.PartDoc

    Dim vBody                       As Variant

    Dim i                           As Long

    Dim bRet                        As Boolean


    Set swApp = Application.SldWorks

    Set swModel = swApp.ActiveDoc


    swModel.ClearSelection2 True


    Debug.Print "File = " & swModel.GetPathName


    Select Case swModel.GetType

        Case swDocPART

            Set swPart = swModel


            ' Solid bodies

            vBody = swPart2.GetBodies(swSolidBody, True)

            SelectBodies swApp, swModel, vBody, ""


            ' Surface bodies

            vBody = swPart.GetBodies(swSheetBody, True)

            SelectBodies swApp, swModel, vBody, ""


        Case swDocASSEMBLY

            ProcessAssembly swApp, swModel


        Case Else

            Exit Sub

    End Select

End Sub

'----------------------------------------






作者: 1066236582    时间: 2021-11-10 10:54
是否是引用的问题
作者: panliang9    时间: 2021-11-10 13:49
本帖最后由 panliang9 于 2021-11-10 14:28 编辑

重新换了一个2016版本的,问题解决了。h踢踢ps://help.solidworks.com/2016/english/api/sldworksapi/select_bodies_example_vb.htm?verRedirect=1





欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3