AnsweredAssumed Answered

Assembly and Component Save I'm in trouble

Question asked by 福 谷 勇 時 on Apr 14, 2020
Latest reply on Apr 14, 2020 by Deepak Gupta

please tell me.
A macro that saves assemblies and components to a specified folder.
I am in trouble because I cannot do it normally.
You can rename the assembly and components and save as usual.
However, when I open the saved assembly, the name of the component changes,but it still references the pre-saved component.

Works with flag = 3. Please try with SampleAssembly.
The save speed is also quite slow.
Please send me the corrected code to solve it. I would appreciate it if you could cooperate.
The environment is SolidWorks2020.


-----------Assembly & Component Save--------------------

Dim swApp As SldWorks.SldWorks
Dim swModelDoc As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension

Dim Part As Object
Dim Assem As Object
Dim Doctype As Long

Public flag As Integer

Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long


Sub main()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc


If swModel Is Nothing Then
MsgBox "ファイルが開かれてません"
Exit Sub
End If


Doctype = swModel.GetType


If Doctype = 1 Then
Set Part = swApp.ActiveDoc
ElseIf Doctype = 2 Then


If flag = 4 Then
flag = 0
Exit Sub
End If

Set Assem = swApp.ActiveDoc

MsgBox "部品orアセンブリファイルを選択下さい"
Exit Sub
End If


Dim objshell As Object
Dim objFolder As Object

Set objshell = CreateObject("Shell.Application")
Set objFolder = objshell.BrowseForFolder(0, "ファイルを含むフォルダーを選択してください。", 0, 0)
BrowseFolder = ""
If Not objFolder Is Nothing Then
BrowseFolder = objFolder.Self.Path
Exit Sub
End If

Set objFolder = Nothing
Set objshell = Nothing

Dim rc As VbMsgBoxResult
rc = MsgBox("保存してもよろしいですか?", vbYesNoCancel + vbExclamation, "保存確認")
If rc <> vbYes Then
If (rc = vbNo) Or (rc = vbCancel) Then
MsgBox "キャンセルしました"
flag = 0
Exit Sub
End If
End If


If Doctype = 1 Then Set swExt = Part.Extension
If Doctype = 2 Then Set swExt = Assem.Extension


Dim swPropMgr As CustomPropertyManager
Dim ValOut As String
Dim rValOut As String
Dim fPath As String
Dim fPath1 As String
Dim pName As String
pName = "ファイル名"

Dim ValOut1 As String
Dim rValOut1 As String
Dim ValOut2 As String
Dim rValOut2 As String
Dim ValOut3 As String
Dim rValOut3 As String


Set swPropMgr = swExt.CustomPropertyManager("")
swPropMgr.Get2 pName, ValOut, rValOut

Dim config As Configuration
Set config = Assem.GetActiveConfiguration
Set swPropMgr = config.CustomPropertyManager

swPropMgr.Get2 "設備NO", ValOut1, rValOut1
swPropMgr.Get2 "部位記号", ValOut2, rValOut2
swPropMgr.Get2 "品番", ValOut3, rValOut3

If rValOut1 = "" Then
MsgBox "プロパティ設備NOが入力されてません" & vbCrLf & "入力後マクロ実行して下さい"
Exit Sub
End If

If rValOut2 = "" Then
MsgBox "プロパティ部位記号が入力されてません" & vbCrLf & "入力後マクロ実行して下さい"
Exit Sub
End If

If rValOut3 = "" Then
MsgBox "プロパティ品番が入力されてません" & vbCrLf & "入力後マクロ実行して下さい"
Exit Sub
End If

If Doctype = 1 Then fPath = BrowseFolder & "\" & rValOut & ".SLDPRT"

If Doctype = 2 Then
If flag = 1 Then fPath = BrowseFolder & "\" & rValOut & ".SLDASM"
If flag = 2 Then fPath = BrowseFolder & "\" & rValOut & ".SLDPRT"

'****************Code in trouble****************************************
If flag = 3 Then
fPath = BrowseFolder & "\" & rValOut
If Dir(fPath, vbDirectory) = "" Then 'フォルダがなければ作る
MkDir fPath
End If
fPath1 = fPath
fPath = fPath & "\" & rValOut
End If
End If

Dim Options As Long
Dim errors As Long
Dim warnings As Long

Options = 1


If flag = 1 Or flag = 2 Then

boolstatus = swExt.SaveAs(fPath, 0, Options, Nothing, errors, warnings)


Dim swAssy As SldWorks.AssemblyDoc
Dim swConfig As SldWorks.Configuration
Dim swRootComp As SldWorks.Component
Dim Children As Variant
Dim swChild As SldWorks.Component
Dim ChildCount As Integer
Dim OldName As String
Dim NewName As String
Dim bOldSetting As Boolean
Dim bRet As Boolean
Dim i As Long
Dim i1 As Long


Set swApp = CreateObject("SldWorks.Application")
Set swAssy = swApp.ActiveDoc
Set swConfig = swAssy.GetActiveConfiguration
Set swRootComp = swConfig.GetRootComponent


bOldSetting = swApp.GetUserPreferenceToggle(swExtRefUpdateCompNames)
swApp.SetUserPreferenceToggle swExtRefUpdateCompNames, False

Children = swRootComp.GetChildren
ChildCount = UBound(Children)

i = 0
i1 = 1


For i = 0 To ChildCount

Set swChild = Children(i)

bRet = swChild.Select(False)

NewName = rValOut1 & rValOut2 & rValOut3 & "_part_" & i1

swChild.Name2 = NewName
NewName = fPath1 & "\" & NewName

boolstatus = swExt.SaveAs(NewName & ".SLDPRT", 0, Options, Nothing, errors, warnings)

i1 = i1 + 1

Next i

boolstatus = swExt.SaveAs(fPath & ".SLDASM", 0, Options, Nothing, errors, warnings)

End If


If boolstatus Then
MsgBox "保存に成功しました"
MsgBox "保存に失敗しました"
End If

End Sub



Private Sub UserForm_Initialize()

OptionButton1.Caption = "Assemblyのみ保存"
OptionButton2.Caption = "AssemblyをPartsとして保存"
OptionButton3.Caption = "AssemblyとPartsを同じフォルダに保存"
OptionButton1.Value = True

End Sub


Private Sub CommandButton1_Click()

If OptionButton1.Value = True Then
flag = 1
End If


If OptionButton2.Value = True Then
flag = 2
End If


If OptionButton3.Value = True Then
flag = 3
End If

Unload Me

End Sub


Private Sub CommandButton2_Click()

flag = 4
Unload Me

End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)


  If CloseMode = 0 Then
    flag = 4
    Unload Me
  End If

End Sub