使用SOLIDWORKS API对文件和配置特定的自定义属性进行排序
{ width=350 }
这个VBA宏使用SOLIDWORKS API按照逻辑顺序对文件和所有配置的自定义属性进行排序。可以指定升序和降序。
逻辑顺序的排序如下所示。这是Windows文件资源管理器中文件的排序顺序:
- 属性1
- 属性2
- 属性3
- 属性12
- 属性20
- 属性21
- 属性30
而按字母顺序排序上述序列将产生以下结果:
- 属性1
- 属性12
- 属性2
- 属性20
- 属性21
- 属性3
- 属性30
配置
可以通过更改宏中的常量值来配置宏,如下所示:
Const ASCENDING As Boolean = True 'True表示升序,False表示降序
Const REORDER_GENERAL_CUST_PRPS As Boolean = True 'True表示对文件特定的自定义属性进行排序,False表示跳过
Const REORDER_CONF_CUST_PRPS As Boolean = True 'True表示对配置特定的自定义属性进行排序(对于零件和装配体),False表示跳过
观看演示视频
Declare PtrSafe Function StrCmpLogicalW Lib "shlwapi" (ByVal s1 As String, ByVal s2 As String) As Integer
Const ASCENDING As Boolean = True
Const REORDER_GENERAL_CUST_PRPS As Boolean = True
Const REORDER_CONF_CUST_PRPS As Boolean = True
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
If Not swModel Is Nothing Then
If REORDER_GENERAL_CUST_PRPS Then
Dim swCustPrpMgr As SldWorks.CustomPropertyManager
Set swCustPrpMgr = swModel.Extension.CustomPropertyManager("")
ReorderProperties swCustPrpMgr, ASCENDING
End If
If REORDER_CONF_CUST_PRPS Then
Dim vConfNames As Variant
vConfNames = swModel.GetConfigurationNames
If Not IsEmpty(vConfNames) Then
Dim i As Integer
For i = 0 To UBound(vConfNames)
Dim swConfCustPrpMgr As SldWorks.CustomPropertyManager
Set swConfCustPrpMgr = swModel.Extension.CustomPropertyManager(vConfNames(i))
ReorderProperties swConfCustPrpMgr, ASCENDING
Next
End If
End If
swModel.SetSaveFlag
Else
MsgBox "请打开文档"
End If
End Sub
Sub ReorderProperties(custPrpMgr As SldWorks.CustomPropertyManager, asc As Boolean)
Dim vPrpNames As Variant
Dim vPrpTypes As Variant
'注意:返回的属性值对valOut和resValOut参数都进行了解析
custPrpMgr.GetAll2 vPrpNames, vPrpTypes, Empty, Empty
If Not IsEmpty(vPrpNames) Then
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Integer
For i = 0 To UBound(vPrpNames)
Dim prpVal As String
custPrpMgr.Get3 vPrpNames(i), False, prpVal, ""
dict.Add vPrpNames(i), Array(vPrpTypes(i), prpVal)
custPrpMgr.Delete2 vPrpNames(i)
Next
vPrpNames = BubbleSort(vPrpNames, asc)
For i = 0 To UBound(vPrpNames)
Dim vPrpData As Variant
vPrpData = dict.Item(vPrpNames(i))
If custPrpMgr.Add3(vPrpNames(i), vPrpData(0), vPrpData(1), swCustomPropertyAddOption_e.swCustomPropertyOnlyIfNew) <> swCustomInfoAddResult_e.swCustomInfoAddResult_AddedOrChanged Then
Err.Raise vbError, "", "添加属性失败"
End If
Next
End If
End Sub
Function BubbleSort(vStrArray As Variant, asc As Boolean) As Variant
Dim swapPos As Integer
swapPos = IIf(asc, 1, -1)
Dim vResStrArray As Variant
vResStrArray = vStrArray
Dim i As Integer
Dim j As Integer
Dim tempVal As String
For i = 0 To UBound(vResStrArray)
For j = i To UBound(vResStrArray)
If StrCmpLogicalW(StrConv(CStr(vResStrArray(i)), vbUnicode), StrConv(CStr(vResStrArray(j)), vbUnicode)) = swapPos Then
tempVal = vResStrArray(j)
vResStrArray(j) = vResStrArray(i)
vResStrArray(i) = tempVal
End If
Next
Next
BubbleSort = vResStrArray
End Function