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