Add Component and Mate Example (VBA)
This example shows how to add and mate a component to an assembly:
Main module
'---------------------------------------------------------------------------
' Preconditions: Open
' install_dir\Program Files\SolidWorks\samples\tutorial\toolbox\lens_mount.sldasm
'
' Postconditions:
' 1. The specified component, camtest.sldprt, and a mate,
' top_coinc_camtest-1, are added to the assembly.
' * AddItemNotify event fires.
' 2. The specified component is made virtual by saving it to the assembly with a
new name.
' * RenameItemNotify event fires.
' 3. Observe the new name of the virtual component in the FeatureManager design
tree.
' 4. Inspect the Immediate window for event notifications.
'
' NOTE: Because the models are used elsewhere, do not save any changes when
closing them.
'----------------------------------------------------------------------------
Option Explicit
Dim swApp As New SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim swDocExt As ModelDocExtension
Dim swAssy As AssemblyDoc
Dim swAssyEvents As Class1
Dim tmpPath As String
Dim tmpObj As SldWorks.ModelDoc2
Dim boolstat As Boolean, stat As Boolean
Dim strings As Variant
Dim swcomponent As SldWorks.Component2
Dim matefeature As SldWorks.Feature
Dim MateName As String
Dim FirstSelection As String
Dim SecondSelection As String
Dim strCompName As String
Dim AssemblyTitle As String
Dim AssemblyName As String
Dim errors As Long
Dim warnings As Long
Dim mateError As Long
Sub Main()
Set swApp =
CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc
' Get title of assembly document
AssemblyTitle = swModel.GetTitle
' Split the title into two strings using
the period (.) as the delimiter
strings = Split(AssemblyTitle, ".")
' You'll use AssemblyName when mating the
component with the assembly
AssemblyName = strings(0)
Debug.Print AssemblyName
boolstat = True
Dim strCompModelname As String
strCompModelname = "camtest.sldprt"
' Because the component resides in the
same folder as the assembly, get
' the assembly's path and use it when opening the component
tmpPath = Left(swModel.GetPathName,
InStrRev(swModel.GetPathName, "\"))
' Open the component
Set tmpObj = swApp.OpenDoc6(tmpPath + strCompModelname,
swDocPART, 0, "", errors, warnings)
' Check to see if the file is read-only or
cannot be found; display error
' messages if either
If warnings = swFileLoadWarning_ReadOnly Then
MsgBox "This file is read-only."
boolstat = False
End If
If tmpObj Is Nothing Then
MsgBox "Cannot locate the file."
boolstat = False
End If
' Re-activate the assembly so that you can
add the component to it
Set swModel = swApp.ActivateDoc3(AssemblyTitle, True,
swUserDecision, errors)
' Set up events
Set swAssy = swModel
Set swAssyEvents = New Class1
Set swAssyEvents.swAssy = swApp.ActiveDoc
' Add the camtest part to the assembly
document.
'
' Currently only one option,
swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelectedConfig,
' works for adding a part using IComponent2::AddComponent5.
' The other options,
swAddComponentConfigOptions_e.swAddComponentConfigOptions_NewConfigWithAllReferenceModels
' and
swAddComponentConfigOptions_e.swAddComponentConfigOptions_NewConfigWithAsmStructure,
' work only for adding assemblies.
Set swcomponent = swAssy.AddComponent5(strCompModelname,
swAddComponentConfigOptions_CurrentSelectedConfig, "", False, "", -1, -1, -1)
' Make the component virtual
stat = swcomponent.MakeVirtual
' Get the name of the component for the
mate
strCompName = swcomponent.Name2()
' Create the name of the mate and the
names of the planes to use for the mate
MateName = "top_coinc_" + strCompName
FirstSelection = "Top@" + strCompName & "@" + AssemblyName
SecondSelection = "Front@" + AssemblyName
swModel.ClearSelection2 (True)
Set swDocExt = swModel.Extension
' Select the planes for the mate
boolstat = swDocExt.SelectByID2(FirstSelection,
"PLANE", 0, 0, 0, True, 1, Nothing, swSelectOptionDefault)
boolstat = swDocExt.SelectByID2(SecondSelection,
"PLANE", 0, 0, 0, True, 1, Nothing, swSelectOptionDefault)
' Add the mate
Set matefeature = swAssy.AddMate3(swMateCOINCIDENT,
swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)
matefeature.Name = MateName
swModel.ViewZoomtofit2
End Sub
Class module
Option Explicit
Public WithEvents swAssy As SldWorks.AssemblyDoc
Private Function swAssy_AddItemNotify(ByVal EntityType As
Long, ByVal itemName As String) As Long
Debug.Print "Component added: " & itemName
End Function
Private Function swAssy_RenameItemNotify(ByVal
EntityType As Long, ByVal oldName As String, ByVal NewName As String) As Long
Debug.Print "Virtual component name: " & NewName
End Function