AnsweredAssumed Answered

Regenerate Macro Feature using SwComFeature

Question asked by Brian Smith on Feb 4, 2017
Latest reply on Feb 6, 2017 by Keith Rice

I am trying to write a macro that does two things.

1.) A Control-Q rebuild

2.) Traverse assemblies and all sub-assemblies for nonread-only parts and rebuild any macro feature in them


I am doing this because calling a "full-full" rebuild (   swModel.ForceRebuild3(false)  ) takes a very long time for our assemblies because it is literally rebuilding every feature in every part and assembly. This "full-full" rebuild comes from: 2016 SOLIDWORKS API Help - Force Rebuild Example (VBA) and was the start of my macro.


This is currently the only way I know how to force a rebuild on lower level macro features. The macro I am trying to write now is meant to replace the control-Q rebuild and search out my macro features and will hopefully be faster than the "full-full" rebuild


I believe I am close and I think I am stuck on the last step, which is is running the SwComFeature regenerate method. 2015 SOLIDWORKS API Help - Regenerate Method (ISwComFeature)


I've already added the swPublished interface library, but when I try to call the regenerate rebuild I getting "Run-time error '91' : Object variable or with block variable not set"


I believe the problem is that I am not setting my ISWcomFeature object properly. I am still pretty green at writing macros so any help is appreciated. The line that is erroring out is bolded below.





Option Explicit

Public Enum swUserPreferenceIntegerValue_e

    swAutoSaveInterval = 3

End Enum



Sub RegenerateMacroFeature(Doc As SldWorks.ModelDoc2)

    Dim swApp As SldWorks.SldWorks

    Dim swFeat As SldWorks.Feature

    Dim instance As ISwComFeature

    Dim temp As Object


    Set swFeat = Doc.FirstFeature

    Set swApp = Application.SldWorks


    While Not swFeat Is Nothing

        If (swFeat.GetTypeName2 = "MacroFeature") Then

            Set temp = instance.Regenerate(swApp, Doc, swFeat)

        End If

        Set swFeat = swFeat.GetNextFeature


End Sub


Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)

    Dim swApp As SldWorks.SldWorks

    Dim vChildComp As Variant

    Dim swChildComp As SldWorks.Component2

    Dim swCompConfig As SldWorks.Configuration

    Dim sPadStr As String

    Dim Doc As ModelDoc2


    Dim i As Long

    For i = 0 To nLevel - 1

        sPadStr = sPadStr + "  "

    Next i

    vChildComp = swComp.GetChildren

    For i = 0 To UBound(vChildComp)

        Set swChildComp = vChildComp(i)


        Set Doc = swChildComp.GetModelDoc2

        If Doc.GetType() = 1 Then

            If Doc.IsOpenedReadOnly() = False Then

                RegenerateMacroFeature Doc

            End If

        End If

        TraverseComponent swChildComp, nLevel + 1

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

    Next i

End Sub



Sub main()

    Dim swApp As SldWorks.SldWorks

    Dim swModel As SldWorks.ModelDoc2

    Dim swConf As SldWorks.Configuration

    Dim swRootComp As SldWorks.Component2

    Dim nStart As Single

    Dim i As Long

    Dim bRet As Boolean


    Set swApp = Application.SldWorks

    Set swModel = swApp.ActiveDoc

    Set swConf = swModel.GetActiveConfiguration

    Set swRootComp = swConf.GetRootComponent3(True)


   'Turn off automatic save

    bRet = swApp.SetUserPreferenceIntegerValue(swAutoSaveInterval, 0)

    nStart = Timer



    bRet = swModel.ForceRebuild3(True)

    TraverseComponent swRootComp, 1

End Sub