AnsweredAssumed Answered

Save New Version

Question asked by Willie Roelofs on Aug 24, 2015
Latest reply on Aug 28, 2015 by Willie Roelofs



I'm writing a macro for saving new versions of my solidworks files. What I want is to make a "snapshot" of the motherassembly and saves it with a new version number.

- The macro creates a new folder (named after the version number)

- The macro creates a subfolder (always named the same)

- The macro does a pack and go, targeting that subfolder;

- The macro renames every part, assembly, subparts and subassemblies;

     * No toolbox components or parts from third parties.

- The macro does a forced update and saves the assembly


In the future I want to use the macro to:

- check if there are files that have a different version number, but are exactly the same.

     If two or more are the same, the file with the oldest number will be referenced to the assembly. The rest will be deleted.


The problems

Subassemblies: Some of the vba codes can only target assembly's children, they can't target subassembly's children. I want to write the macro that it can target every single file.

Pack and go: I don't know how to exclude files from the Pack and Go feature.

Pack and go: I'm uncertain that Pack and Go is the way to go. I'm thinking a "Save As" might be easier to write?



(Drive):\Projecten\ (Projectname) \ (Versionnumber) \ 04 - SOLIDWORKS\       

Projectname is an abbreviation of the Project, usually containing 2 to 4 letters.

Versionnumber is the versioncontrol, containing 3 numbers.


The code:

Currently I have only code to rename children in an assembly:


Public Enum swUserPreferenceToggle_e
    swExtRefUpdateCompNames = 18
End Enum
Sub main()
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swConfigMgr             As SldWorks.ConfigurationManager
    Dim swConfig                As SldWorks.Configuration
    Dim swRootComp              As SldWorks.Component2
    Dim Children                As Variant
    Dim swChild                 As SldWorks.Component2
    Dim ChildCount              As Integer
    Dim OldName                 As String
    Dim NewName                 As String
    Dim bOldSetting             As Boolean
    Dim bRet                    As Boolean
    Dim i                       As Long
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConfigMgr = swModel.ConfigurationManager
    Set swConfig = swConfigMgr.ActiveConfiguration
    Set swRootComp = swConfig.GetRootComponent
    bOldSetting = swApp.GetUserPreferenceToggle(swExtRefUpdateCompNames)
    swApp.SetUserPreferenceToggle swExtRefUpdateCompNames, False
    Children = swRootComp.GetChildren
    ChildCount = UBound(Children)

    j = 0
    Debug.Print swModel.GetTitle
        j = j + 1
            If Not InStr(Left(swModel.GetTitle, j), "-") = 0 Then
            SearchStr = Left(swModel.GetTitle, j)
            Bla = "Ja"
        End If
    Loop Until Bla = "Ja"
    'Versienummer toekenning
            versie = InputBox("Welke versienummer wilt u toekennen?" & vbCrLf & "Versienummers bestaan uit 3 getallen", "VERSIENUMMER", Mid(swModel.GetTitle, j + 1, 3))
        Loop Until Len(versie) = 3
    Loop Until IsNumeric(versie) = True
    For i = 0 To ChildCount
        Set swChild = Children(i)
        ' Changing component name requires component to be selected
        bRet = swChild.Select2(False, 0)
        Debug.Print swChild.Name2
        If Left(swChild.Name2, j) = SearchStr Then
            OldName = swChild.Name2
            NewName = Left(SearchStr & versie & Right(OldName, Len(OldName) - Len(SearchStr) - 3), Len(versie) + 11)
            swChild.Name2 = NewName
        End If
    Next i
    swApp.SetUserPreferenceToggle swExtRefUpdateCompNames, bOldSetting
End Sub