跳到主要内容

用于给SOLIDWORKS钣金和焊接切割清单项上色的宏

这个VBA宏允许根据自定义属性的值为每个切割清单项(钣金或焊接)分配唯一的颜色。

这个宏最常见的用途是根据型材尺寸区分不同类型的焊接件。

宏将自动为特定的组分配随机颜色。也可以指定用于特定组的固定颜色。

配置

为了指定从中读取值并对切割清单项进行分组的自定义属性的名称,请更改PRP_NAME常量的值。

Const PRP_NAME As String = "Description" '将Description的值更改为选择不同的自定义属性

为了指定颜色,需要修改InitColors方法中的值。

Sub InitColors(Optional dummy As Variant = Empty)

ColorsMap.Add "SB BEAM 80 X 6", RGB(255, 0, 0)
ColorsMap.Add "TUBE, RECTANGULAR 50 X 30 X 2.60", RGB(0, 255, 0)

End Sub

要向映射中添加新颜色,请添加以下行

ColorsMap.Add "[属性值]", RGB([红色], [绿色], [蓝色])

例如,要将蓝色(RGB = 0, 0, 255)添加到焊接型材“50 X 50”,需要添加以下行

ColorsMap.Add "50 X 50", RGB(0, 0, 255)
Const PRP_NAME As String = "Description"

Dim swApp As SldWorks.SldWorks
Dim ColorsMap As Object

Sub main()

try_:

On Error GoTo catch_

Set ColorsMap = CreateObject("Scripting.Dictionary")

ColorsMap.CompareMode = vbTextCompare

InitColors

Set swApp = Application.SldWorks

Dim swModel As SldWorks.ModelDoc2

Set swModel = swApp.ActiveDoc

If Not swModel Is Nothing Then
If swModel.GetType() = swDocumentTypes_e.swDocPART Then
Dim vCutLists As Variant
vCutLists = GetCutLists(swModel)
ColorizeCutLists vCutLists
swModel.GraphicsRedraw2
Else
Err.Raise vbError, "", "仅支持零件文档"
End If
Else
Err.Raise vbError, "", "打开零件文档"
End If

GoTo finally_

catch_:
MsgBox Err.Description, vbCritical
finally_:

End Sub

Sub InitColors(Optional dummy As Variant = Empty)

ColorsMap.Add "SB BEAM 80 X 6", RGB(255, 0, 0)
ColorsMap.Add "TUBE, RECTANGULAR 50 X 30 X 2.60", RGB(0, 255, 0)

End Sub

Sub ColorizeCutLists(vCutLists As Variant)

Dim i As Integer

For i = 0 To UBound(vCutLists)

Dim swCutList As SldWorks.Feature
Set swCutList = vCutLists(i)

Dim swBodyFolder As SldWorks.BodyFolder
Set swBodyFolder = swCutList.GetSpecificFeature2

If swBodyFolder.GetBodyCount() > 0 Then

Dim swCustPrpsMgr As SldWorks.CustomPropertyManager
Set swCustPrpsMgr = swCutList.CustomPropertyManager
Dim prpVal As String
swCustPrpsMgr.Get5 PRP_NAME, True, "", prpVal, False

Dim color As Long

If ColorsMap.Exists(prpVal) Then
color = ColorsMap(prpVal)
Else
color = RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd))
ColorsMap.Add prpVal, color
End If

Dim j As Integer

Dim vBodies As Variant
vBodies = swBodyFolder.GetBodies

For j = 0 To UBound(vBodies)

Dim swBody As SldWorks.Body2
Set swBody = vBodies(j)

Dim RGBHex As String

RGBHex = Right("000000" & Hex(color), 6)

Dim dMatPrps(8) As Double

dMatPrps(0) = CInt("&H" & Mid(RGBHex, 5, 2)) / 255
dMatPrps(1) = CInt("&H" & Mid(RGBHex, 3, 2)) / 255
dMatPrps(2) = CInt("&H" & Mid(RGBHex, 1, 2)) / 255
dMatPrps(3) = 1
dMatPrps(4) = 1
dMatPrps(5) = 0.5
dMatPrps(6) = 0.3125
dMatPrps(7) = 0
dMatPrps(8) = 0

swBody.MaterialPropertyValues2 = dMatPrps
Next

End If

Next

End Sub

Function GetCutLists(model As SldWorks.ModelDoc2) As Variant

Dim swFeat As SldWorks.Feature

Dim swCutLists() As SldWorks.Feature

Set swFeat = model.FirstFeature

While Not swFeat Is Nothing

If swFeat.GetTypeName2 <> "HistoryFolder" Then

ProcessFeature swFeat, swCutLists

TraverseSubFeatures swFeat, swCutLists

End If

Set swFeat = swFeat.GetNextFeature

Wend

GetCutLists = swCutLists

End Function

Sub TraverseSubFeatures(parentFeat As SldWorks.Feature, cutLists() As SldWorks.Feature)

Dim swChildFeat As SldWorks.Feature
Set swChildFeat = parentFeat.GetFirstSubFeature

While Not swChildFeat Is Nothing
ProcessFeature swChildFeat, cutLists
Set swChildFeat = swChildFeat.GetNextSubFeature()
Wend

End Sub

Sub ProcessFeature(feat As SldWorks.Feature, cutLists() As SldWorks.Feature)

If feat.GetTypeName2() = "SolidBodyFolder" Then
Dim swBodyFolder As SldWorks.BodyFolder
Set swBodyFolder = feat.GetSpecificFeature2
swBodyFolder.UpdateCutList
ElseIf feat.GetTypeName2() = "CutListFolder" Then

If Not Contains(cutLists, feat) Then
If (Not cutLists) = -1 Then
ReDim cutLists(0)
Else
ReDim Preserve cutLists(UBound(cutLists) + 1)
End If

Set cutLists(UBound(cutLists)) = feat
End If

End If

End Sub

Function Contains(arr As Variant, item As Object) As Boolean

Dim i As Integer

For i = 0 To UBound(arr)
If arr(i) Is item Then
Contains = True
Exit Function
End If
Next

Contains = False

End Function