Solidworks VBA Macro - Add Concentric Mate

14 minute read

This article has "Beginner ➡ Intermediate" level Macro program.
If you are following my articles then will not be an issue for you.
In this article we did not use 🚀 UserForm for taking inputs, instead we use 🚀 Input Box for value input and 🚀 Message Box to notify user.
I hope you will also like this type of tutorials.
Thank you for reading.

Objective

In this article we create and understand VBA macro of adding Concentric Mate in Assembly document of SOLIDWORKS CAD Software.

This method is most updated method, so use this method if you want to add Concentric Mate quickly.

Results We Can Get

After running our macro we successfully add Concentric Mate a Component in an Assembly as a result.

Below image shows the result we get.

assembly-Concentric-mate

We add Concentric Mate in following steps in general.

  1. loop through each component in current assembly.
  2. Loop through each face.
  3. Get desired cylindrical face.
  4. Select required faces for mate.
  5. Add Concentric Mate.
  6. Final Work

To get the correct result please follow the steps correctly.

Macro Video

Below 🎬 video shows Adding Concentric Mate from SOLIDWORKS VBA Macros.


Above video is just for visualization and there are no explanation.

I have explained each and every line in this article.

It is advisable to watch video, since it help you to better understand the process.

VBA Macro

Below is the VBA macro for Concentric Mate.

Option Explicit

' Variable for Solidworks Application
Dim swApp As SldWorks.SldWorks

' Variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2

' Variable for Solidworks Assembly
Dim swAssembly As SldWorks.AssemblyDoc

' Variable for Solidworks Component
Dim swComponent As SldWorks.Component2

' Variable for Solidworks Body
Dim swBody As SldWorks.Body2

' Variable for Solidworks Mate Feature
Dim swMateFeature As SldWorks.Feature

' Variable for Solidworks Face
Dim swFace As SldWorks.Face2

' Variable for Solidworks Face List
Dim vFaces(1 To 2) As SldWorks.Face2

' Program to add Concentric Mate
Sub main()
  
  ' Set Solidworks Application variable to current application
  Set swApp = Application.SldWorks
  
  ' Set Solidworks document variable to currently opened document
  Set swDoc = swApp.ActiveDoc
  
  ' Check if Solidworks document is opened or not
  If swDoc Is Nothing Then
    MsgBox "Solidworks document is not opened."
    Exit Sub
  End If
  
  ' Set Solidworks Assembly document
  Set swAssembly = swDoc
  
  ' Variable for List of elements
  Dim vArray As Variant
  
  ' Get Components list in opened assembly
  vArray = swAssembly.GetComponents(True)
  
  ' Variable for component Index
  Dim componentIndex As Integer
  
  ' Loop Components List
  For componentIndex = 0 To UBound(vArray)
    
    ' Set Solidworks Component variable
    Set swComponent = vArray(componentIndex)
    
    ' Calling this function
    SelectFace swComponent, componentIndex
    
  Next
  
  ' Variable for Solidworks Select Data
  Dim swSelData As SldWorks.SelectData
  
  ' Set value of Solidworks Select Data variable
  Set swSelData = swDoc.SelectionManager.CreateSelectData
  
  ' Set Mark of Solidworks Select Data
  swSelData.Mark = 1
  
  ' Boolean variable
  Dim boolStatus As Boolean
  
  ' Select faces for Concentric mate
  boolStatus = swDoc.Extension.MultiSelect2(vFaces, False, swSelData)

  ' Check if faces are selected
  If boolStatus = False Then
    MsgBox "Failed to select faces."
    swDoc.ClearSelection2 True
    Exit Sub
  End If
  
  ' Add Concentric Mate
  Set swMateFeature = swAssembly.AddMate5(swMateCONCENTRIC, swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, swAddMateError_ErrorUknown)

  ' Check if Mate is added or not
  If swMateFeature Is Nothing Then
    MsgBox "Failed to Add Mate."
    swDoc.ClearSelection2 True
    Exit Sub
  End If
  
  ' Clear all selection
  swDoc.ClearSelection2 True
  
  ' Zoom view to fit
  swDoc.ViewZoomtofit2
  
  ' Rebuild assembly
  swDoc.ForceRebuild3 True
  
End Sub

' Function to select required face for Concentric mate
Function SelectFace(component As SldWorks.Component2, componentIndex As Integer)
  
  ' Get body of current component
  Set swBody = component.GetBody
  
  ' Array for Solidworks Faces
  Dim faceArray As Variant
  
  ' Variable for Solidworks Face
  Dim eachFace As Variant
  
  ' Get all faces
  faceArray = swBody.GetFaces
  
  ' Loop through all faces
  For Each eachFace In faceArray
    
    ' Get current face
    Set swFace = eachFace
    
    ' Solidworks Surface variable
    Dim swSurface As SldWorks.Surface
    
    ' Get the Surface from the Solidworks Face variable
    Set swSurface = swFace.GetSurface
    
    ' If we have cylinder surface
    If swSurface.IsCylinder() Then
      
      ' Add current face to List of Faces
      Set vFaces(componentIndex + 1) = swFace
      
      ' Clear current selection
      swDoc.ClearSelection2 True
      Exit Function
      
    End If
    
    ' Clear current selection
    swDoc.ClearSelection2 True
    
  Next

End Function

Prerequisite

There are some prerequisite for this article.

  • Knowledge of VBA programming language is ❗required.

  • We use existing parts in Assembly document.

  • One component is fully constraint and other component is Float as shown in below image.

prerequisite

We will apply checks in this article, so the code we write should be error free most of the time.

Steps To Follow

This VBA macro can be divided into following sections:

  1. Create and Initialize required variables
  2. Get Components and Loop through them
  3. Get desired face
  4. Select faces
  5. Add Concentric Mate
  6. Final Work

Every section with each line is explained below.

I also give some links (see icon 🚀) so that you can go through them if there are anything I explained in previous articles.

Create and Initialize required variables

Option Explicit
' Variable for Solidworks application
Dim swApp As SldWorks.SldWorks
  • Purpose: In above line, we create a variable for Solidworks application.
  • Variable Name: swApp
  • Type: SldWorks.SldWorks
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
  • Purpose: In above line, we create a variable for Solidworks document.
  • Variable Name: swDoc
  • Type: SldWorks.ModelDoc2
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks Assembly
Dim swAssembly As SldWorks.AssemblyDoc
  • Purpose: In above line, we create a variable for Solidworks Assembly.
  • Variable Name: swAssembly
  • Type: SldWorks.AssemblyDoc
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks Component
Dim swComponent As SldWorks.Component2
  • Purpose: In above line, we create a variable for Solidworks Component.
  • Variable Name: swComponent
  • Type: SldWorks.Component2.
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks Body
Dim swBody As SldWorks.Body2
  • Purpose: In above line, we create a variable for Solidworks Component.
  • Variable Name: swBody
  • Type: SldWorks.Body2.
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks Mate Feature
Dim swMateFeature As SldWorks.Feature
  • Purpose: In above line, we create a variable for Solidworks Mate Feature.
  • Variable Name: swMateFeature
  • Type: SldWorks.Feature.
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks Face
Dim swFace As SldWorks.Face2
  • Purpose: In above line, we create a variable for Solidworks Face.
  • Variable Name: swFace
  • Type: SldWorks.Face2.
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Variable for Solidworks Face List
Dim vFaces(1 To 2) As SldWorks.Face2
  • Purpose: Define 🚀 Array of Face2.
  • Variable Name: vFaces
  • Type: Face2
  • Length of Array: (1 To 2)
  • Reference: Please visit

These all are our global variables.

They are SOLIDWORKS API Objects.

' Program to add Concentric Mate
Sub main()

End Sub
  • In above line, we create main Program to add Concentric Mate in assembly.
  • This is a Sub procedure which has name of main.
  • This procedure hold all the statements (instructions) we give to computer.
  • Reference: Detailed information 🚀 VBA Sub and Function Procedures article of this website.
' Set Solidworks Application variable to current application
Set swApp = Application.SldWorks
  • In above line, we set value of swApp variable.
  • This value is currently opened Solidworks application.
' Set Solidworks document variable to currently opened document
Set swDoc = swApp.ActiveDoc
  • In above line, we set value of swDoc variable.
  • This value is currently opened part document.
' Check if Solidworks document is opened or not
If swDoc Is Nothing Then
  MsgBox ("Solidworks document is not opened.")
  Exit Sub
End If
  • In above code block, we check if we successfully set the value of swDoc variable.
  • We use 🚀 IF statement for checking.
  • Condition: swDoc Is Nothing
  • When this condition is True,
    • We show and 🚀 message window to user.
    • Message: SOLIDWORKS document is not opened.
    • Then we stop our macro here.
' Set Solidworks Assembly document
Set swAssembly = swDoc
  • In above line, we set value of swAssembly variable.
  • This value is swDoc variable.

Get Components and Loop through them

In this section, we Get Components and Loop through them.

' Variable for List of elements
Dim vArray As Variant
  • Purpose: In above line, we create a variable for List of elements.
  • Variable Name: vArray
  • Type: Variant
' Get Components list in opened assembly
vArray = swAssembly.GetComponents(True)
  • In above line, we set the value of vArray variable.
  • We set value by GetComponents method of swAssembly variable.
' Variable for component Index
Dim componentIndex As Integer
  • In above line, we create a variable for component Index as a counter.
  • Variable Name: componentIndex
  • Type: Integer
' Loop Components List
For componentIndex = 0 To UBound(vArray)
  
Next
  • In above line, we create a For loop.
  • This loops start from i = 0 to maximum number of items in vArray we select.
' Set Solidworks Component variable
Set swComponent = vArray(componentIndex)
  • In above line, we set value of swComponent variable.
  • This value is current value of array vArray.

Get desired face

In this section we get desired face for Concentric mate.

' Calling this function
SelectFace swComponent, componentIndex
  • In above line, we call a function.
  • Function Name: SelectFace
  • Function Parameters: They are
    • swComponent
    • componentIndex
' Function to select required face for Concentric mate
Function SelectFace(component As SldWorks.Component2, componentIndex As Integer)
  
End Function
  • In above line, we create a Function to select required face for Concentric mate.
  • This is a Function procedure which has name of SelectFace.
  • This procedure hold all the statements (instructions) for select required face for Concentric mate.
  • Reference: Detailed information 🚀 VBA Sub and Function Procedures article of this website.

This function has 2 parameters as follows:

  • component As SldWorks.Component2
  • componentIndex As Integer
' Get body of current component
Set swBody = component.GetBody
  • In above line, we set value of swBody variable.
  • Value of swBody variable is set by GetBody method of component variable.
' Array for Solidworks Faces
Dim faceArray As Variant
  • Purpose: In above line, we create a variable for 🚀 Solidworks Faces.
  • Variable Name: faceArray
  • Type: Variant
' Variable for Solidworks Face
Dim eachFace As Variant
  • Purpose: In above line, we create a variable for each 🚀 Solidworks Face from Solidworks Faces array.
  • Variable Name: eachFace
  • Type: Variant
' Get all faces
faceArray = swBody.GetFaces
  • In above line, we set value of faceArray variable.
  • Value of faceArray variable is set by GetFaces method, which is part of swBody variable.
' Loop through all faces
For Each eachFace In faceArray
  
Next
  • Purpose: In above line, we loop through all Faces.
  • faceArray: Array of 🚀 Solidworks Faces.
  • eachFace: Solidworks Face variable inside faceArray array.
' Get current face
Set swFace = eachFace
  • In above line, we set value of swFace variable.
  • Value of swFace variable is set to eachFace variable of Solidworks array.
' Solidworks Surface variable
Dim swSurface As SldWorks.Surface
  • Purpose: In above line, we create a variable for Solidworks Surface.
  • Variable Name: swSurface
  • Type: SldWorks.Surface.
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Get the Surface from the Solidworks Face variable
Set swSurface = swFace.GetSurface
  • In above line, we set value of swSurface variable.
  • Value of swSurface variable is set by GetSurface method, which is part of swFace variable.
' If we have cylinder surface
If swSurface.IsCylinder() Then

End If
  • In above code block, we check if user response if Yes.
  • We use 🚀 IF statement for checking.
  • Condition: swSurface.IsCylinder()
' Add current face to List of Faces
Set vFaces(componentIndex + 1) = swFace
  • When user response if Yes, then above code execute.
  • In above line, 1st we add current face to List of Faces.
' Clear current  selection
swDoc.ClearSelection2 True
Exit Function
  • In above line, we clear current selection.
  • For this we use ClearSelection2 method which is part of SOLIDWORKS Document variable i.e swDoc variable.
  • After this we exit function.
' Clear current  selection
swDoc.ClearSelection2 True
  • In above line, we clear current selection inside For loop.
  • For this we use ClearSelection2 method which is part of SOLIDWORKS Document variable i.e swDoc variable.

Select Faces

In this section, we Select Faces.

' Variable for Solidworks Select Data
Dim swSelData As SldWorks.SelectData
  • Purpose: In above line, we create a variable for Solidworks Select Data.
  • Variable Name: swSelData
  • Type: SldWorks.SelectData
  • Reference: Please visit 🚀 online SOLIDWORKS API Help.
' Set value of Solidworks Select Data variable
Set swSelData = swDoc.SelectionManager.CreateSelectData
  • In above line, we set value of swSelData variable.
  • Value of swSelData variable is set by CreateSelectData, which is part of SelectionManager. This SelectionManager is part of swDoc variable.
' Set Mark of Solidworks Select Data
swSelData.Mark = 1
  • In above line, we set Mark of swSelData variable to 1.
' Boolean variable
Dim boolStatus As Boolean
  • Purpose: In above line, we create a Boolean variable.
  • Variable Name: boolStatus
  • Type: Boolean
' Select faces for Concentric mate
boolStatus = swDoc.Extension.MultiSelect2(vFaces, False, swSelData)
  • In above line, we select Faces by MultiSelect2 method.
  • This MultiSelect2 method takes following parameter.
    • Objects: Array of selectable objects.
    • AppendFlag: True to append the objects to the selection list, False to replace the current selection list with these objects.
    • Data: 🚀 ISelectData object, Nothing, or null
' Check if faces are selected
If boolStatus = False Then
  MsgBox "Failed to select faces."
  swDoc.ClearSelection2 True
  Exit Sub
End If
  • In above code block, we check if we successfully selected the faces.
  • We use 🚀 IF statement for checking.
  • Condition: boolStatus = False
  • When this condition is True,
    • We show and 🚀 message window to user.
    • Message: Failed to select faces.
    • Then we stop our macro here.

Add Concentric Mate

In this section, we add Concentric Mate.

' Add Concentric Mate
Set swMateFeature = swAssembly.AddMate5(swMateCONCENTRIC, swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, swAddMateError_ErrorUknown)
  • In above line, we set the value of variable swMateFeature by AddMate5 method.

  • This AddMate5 method takes following parameters as explained:

    • MateTypeFromEnum - Type of mate as defined in swMateType_e:

      Member Description
      swMateANGLE 6
      swMateCAMFOLLOWER 9
      swMateCOINCIDENT 0
      swMateCONCENTRIC 1
      swMateCOORDINATE 20
      swMateDISTANCE 5
      swMateGEAR 10
      swMateHINGE 22
      swMateLINEARCOUPLER 18
      swMateLOCK 16
      swMateLOCKTOSKETCH 12
      swMateMAGNETIC 25
      swMateMAXMATES 14
      swMatePARALLEL 3
      swMatePATH 15
      swMatePERPENDICULAR 2
      swMatePROFILECENTER 24
      swMateRACKPINION 13
      swMateSCREW 17
      swMateSLIDER 23
      swMateSLOT 21
      swMateSYMMETRIC 8
      swMateTANGENT 4
      swMateUNIVERSALJOINT 19
      swMateUNKNOWN 7
      swMateWIDTH 11
    • AlignFromEnum - Type of mate as defined in swMateAlign_e:

      Member Description
      swAlignAGAINST Obsolete. Do not use.
      swAlignNONE Obsolete. Do not use.
      swAlignSAME Obsolete. Do not use.
      swMateAlignALIGNED 0
      swMateAlignANTI_ALIGNED 1
      swMateAlignCLOSEST 2
    • Flip - True to flip the mate entities, False to not; valid only if MateTypeFromEnum is swMatetype_e.swMateDISTANCE.

    • Distance - Distance value; valid only if MateTypeFromEnum is swMateType_e.swMateDISTANCE.

    • DistanceAbsUpperLimit - Absolute maximum distance value; valid only if MateTypeFromEnum is swMateType_e.swMateDISTANCE.

    • DistanceAbsLowerLimit - Absolute minimum distance value; valid only if MateTypeFromEnum is swMateType_e.swMateDISTANCE.

    • GearRatioNumerator - Gear ratio numerator value; valid only if MateTypeFromEnum is swMateType_e.swMateGEAR.

    • GearRatioDenominator - Gear ratio denominator value; valid only if MateTypeFromEnum is swMateType_e.swMateGEAR.

    • Angle - Angle value; valid only if MateTypeFromEnum is swMateType_e.swMateANGLE.

    • AngleAbsUpperLimit - Absolute maximum angle value; valid only if MateTypeFromEnum is swMateType_e.swMateANGLE.

    • AngleAbsLowerLimit - Absolute minimum angle value; valid only if MateTypeFromEnum is swMateType_e.swMateANGLE.

    • ForPositioningOnly - True to only position the components according to the mating relationship and not return a mate, False to return a mate.

    • LockRotation - True to lock component rotation, False to not.

    • WidthMateOption - Width mate options as defined in swMateWidthOptions_e; valid only if MateTypeFromEnum is swMateType_e.swMateWIDTH.

      Member Description
      swMateWidth_Centered 0
      swMateWidth_Dimension 2
      swMateWidth_Free 1
      swMateWidth_Percent 3
    • ErrorStatus - Success or error as defined by swAddMateError_e as follows.

      Member Description
      swAddMateError_ErrorUknown 0
      swAddMateError_IncorrectAlignment 3
      swAddMateError_IncorrectGearRatios 6
      swAddMateError_IncorrectMateType 2
      swAddMateError_IncorrectSelections 4
      swAddMateError_NoError 1
      swAddMateError_OverDefinedAssembly 5
  • Return Value : This AddMate5 method return 👉 Mate2 data object.

  • In our code, I have used following values:

    Parameter Name Value Used
    MateTypeFromEnum swMateCONCENTRIC
    AlignFromEnum swMateAlignALIGNED
    Flip false
    Distance 0
    DistanceAbsUpperLimit 0
    DistanceAbsLowerLimit 0
    GearRatioNumerator 0
    GearRatioDenominator 0
    Angle 0
    AngleAbsUpperLimit 0
    AngleAbsLowerLimit 0
    ForPositioningOnly False
    LockRotation False
    WidthMateOption 0
    ErrorStatus swAddMateError_ErrorUknown

Reference: For more details about

' Check if Mate is added or not
If swMateFeature Is Nothing Then
  MsgBox "Failed to Add Mate."
  swDoc.ClearSelection2 True
  Exit Sub
End If
  • In above code block, we check if we successfully added Concentric Mate or not.
  • We use 🚀 IF statement for checking.
  • Condition: swMateFeature Is Nothing
  • When this condition is True,
    • We show and 🚀 message window to user.
    • Message: *Failed to Add Mate.
    • After that we clear the selection.
    • Then we stop our macro here.

Now we run the macro and after running macro we get Concentric Mate as shown in below image.

assembly-concentric-mate

Final work

In this section, after adding Concentric Mate, we have to do some cleaning work so that we can use this macro frequently.

' Clear all selection
swDoc.ClearSelection2 True
  • In above line, we clear all selection.
  • For this we use ClearSelection2 method which is part of SOLIDWORKS Document variable i.e swDoc variable.
' View zoom to fit
swDoc.ViewZoomtofit2
  • In above line, we make our view zoom to fit the model.
  • For this we use ViewZoomtofit2 method which is part of SOLIDWORKS Document variable i.e swDoc variable.
' Rebuild assembly
swDoc.ForceRebuild3 True
  • In above line, we Rebuild assembly.
  • For this we use ForceRebuild3 method which is part of SOLIDWORKS Document variable i.e swDoc variable.

This is it !!!

I hope my efforts will helpful to someone!

If you found anything to add or update, please let me know on my e-mail.

Hope this post helps you to Concentric Mate with SOLIDWORKS VBA Macros.

For more such tutorials on SOLIDWORKS VBA Macro, do come to this website after sometime.

If you like the post then please share it with your friends also.

Do let me know by you like this post or not!

Till then, Happy learning!!!

Updated: