Skip to main content

Macro to flip alignment of the last inserted mate in SOLIDWORKS assembly

This VBA macro finds the last mate in the feature manager tree of the active SOLIDWORKS assembly.

For this mate the alignment is switched from anti-aligned to aligned and vice-versa.

Dim swApp As SldWorks.SldWorks

Sub main()

Set swApp = Application.SldWorks

Dim swAssy As SldWorks.AssemblyDoc

Set swAssy = swApp.ActiveDoc

Dim swLastMate As SldWorks.Mate2

Set swLastMate = GetLastMate(swAssy)

Dim curAlignment As swMateAlign_e
curAlignment = swLastMate.Alignment

Dim destAlignment As swMateAlign_e

If curAlignment = swMateAlignALIGNED Then
destAlignment = swMateAlignANTI_ALIGNED
ElseIf curAlignment = swMateAlignANTI_ALIGNED Then
destAlignment = swMateAlignALIGNED
Else
Exit Sub
End If

Dim swMateFeat As SldWorks.Feature
Set swMateFeat = swLastMate

Dim swMateFeatData As SldWorks.MateFeatureData

Set swMateFeatData = swMateFeat.GetDefinition

Select Case swMateFeatData.TypeName
Case swMateType_e.swMateANGLE
Dim swAngleMateFeatData As SldWorks.AngleMateFeatureData
Set swAngleMateFeatData = swMateFeatData
swAngleMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateCAMFOLLOWER
Dim swCamFollowerMateFeatData As SldWorks.CamFollowerMateFeatureData
Set swCamFollowerMateFeatData = swMateFeatData
swCamFollowerMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateCOINCIDENT
Dim swCoincidentMateFeatData As SldWorks.CoincidentMateFeatureData
Set swCoincidentMateFeatData = swMateFeatData
swCoincidentMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateCONCENTRIC
Dim swConcentricMateFeatData As SldWorks.ConcentricMateFeatureData
Set swConcentricMateFeatData = swMateFeatData
swConcentricMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateDISTANCE
Dim swDistanceMateFeatData As SldWorks.DistanceMateFeatureData
Set swDistanceMateFeatData = swMateFeatData
swDistanceMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateHINGE
Dim swHingeMateFeatData As SldWorks.HingeMateFeatureData
Set swHingeMateFeatData = swMateFeatData
swHingeMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMatePARALLEL
Dim swParallelMateFeatData As SldWorks.ParallelMateFeatureData
Set swParallelMateFeatData = swMateFeatData
swParallelMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMatePROFILECENTER
Dim swProfileCenterMateFeatData As SldWorks.ProfileCenterMateFeatureData
Set swProfileCenterMateFeatData = swMateFeatData
swProfileCenterMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateSCREW
Dim swScrewMateFeatData As SldWorks.ScrewMateFeatureData
Set swScrewMateFeatData = swMateFeatData
swScrewMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateSLOT
Dim swSlotMateFeatData As SldWorks.SlotMateFeatureData
Set swSlotMateFeatData = swMateFeatData
swSlotMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateSYMMETRIC
Dim swSymmetricMateFeatData As SldWorks.SymmetricMateFeatureData
Set swSymmetricMateFeatData = swMateFeatData
swSymmetricMateFeatData.MateAlignment = destAlignment
Case swMateType_e.swMateTANGENT
Dim swTangentMateFeatData As SldWorks.TangentMateFeatureData
Set swTangentMateFeatData = swMateFeatData
swTangentMateFeatData.MateAlignment = destAlignment
Case Else
Err.Raise vbError, "", "Not supported mate type"
End Select

swMateFeat.ModifyDefinition swMateFeatData, swAssy, Nothing

End Sub

Function GetLastMate(assm As SldWorks.AssemblyDoc) As SldWorks.Mate2

Dim swMates() As SldWorks.Feature
Dim isInit As Boolean
isInit = False

Dim swModel As SldWorks.ModelDoc2
Set swModel = assm

Dim swMateGroupFeat As SldWorks.Feature

Dim featIndex As Integer
featIndex = 0

Do
Set swMateGroupFeat = swModel.FeatureByPositionReverse(featIndex)

featIndex = featIndex + 1
Loop While swMateGroupFeat.GetTypeName2() <> "MateGroup"

Dim swLastMateFeat As SldWorks.Feature

Dim swMateFeat As SldWorks.Feature

Set swMateFeat = swMateGroupFeat.GetFirstSubFeature

While Not swMateFeat Is Nothing

If TypeOf swMateFeat.GetSpecificFeature2() Is SldWorks.Mate2 Then
Set swLastMateFeat = swMateFeat
End If

Set swMateFeat = swMateFeat.GetNextSubFeature
Wend

Debug.Print swLastMateFeat.Name

Set GetLastMate = swLastMateFeat.GetSpecificFeature2

End Function