Add Nonuniform Force Distribution Example (VBA)
This example shows how to add a force of nonuniform distribution to a study.
NOTE: To get persistent reference
identifiers (PIDs) for model selections, you can use
pidcollector.exe
or IModelDocExtension::GetPersistReference3.
'----------------------------------------------------------------------------
' Preconditions:
' 1. Add the SOLIDWORKS Simulation as an add-in (in
SOLIDWORKS, click
'
Tools > Add-ins > SOLIDWORKS Simulation
> OK).
' 2. Add the SOLIDWORKS Simulation type library as a
reference (in the IDE,
'
click Tools > References > SOLIDWORKS
Simulation version type library).
' 3. Verify that the specified assembly exists.
' 4. Open the Immediate window.
'
' Postconditions:
' 1. Opens the assembly.
' 2. Inserts a coordinate system.
' 3. Gets the Ready study.
' 4. Adds a force of nonuniform distribution to
Ready.
' 5. Inspect the Immediate window.
'
' NOTE: Because this assembly is used elsewhere, do not
save changes.
'----------------------------------------------------------------------------
Option Explicit
Sub main()
Dim
SwApp As SldWorks.SldWorks
Dim
COSMOSWORKS As Object
Dim
COSMOSObject As CosmosWorksLib.CwAddincallback
Dim
ActDoc As CosmosWorksLib.CWModelDoc
Dim
StudyMngr As CosmosWorksLib.CWStudyManager
Dim
Study As CosmosWorksLib.CWStudy
Dim
swModel As SldWorks.ModelDoc2
Dim
swModelDocExt As SldWorks.ModelDocExtension
Dim
LBCMgr As CosmosWorksLib.CWLoadsAndRestraintsManager
Dim
CWForce As CosmosWorksLib.CWForce
Dim
selection1 As String
Dim
var1 As Variant
Dim
varArray1 As Variant
Dim
oSelect1 As Object
Dim
oSelect2 As Object
Dim
var2 As Variant
Dim
status As Long, warnings As Long
Dim
errCode As Long
Dim
boolstatus As Boolean
Dim
DistanceValues As Variant
Dim
ForceValues As Variant
Dim
ComponentValues As Variant
Dim
data(6) As Double
Dim
bVal1 As Long
Set
SwApp = Application.SldWorks
SwApp.OpenDoc6 "C:\Users\Public\Documents\SOLIDWORKS\SOLIDWORKS
2021\samples\Simulation Examples\mixedmesh-1.sldasm", swDocASSEMBLY,
swOpenDocOptions_Silent, "", status, warnings
Set
swModel = SwApp.ActiveDoc()
Set
swModelDocExt = swModel.Extension
'
Insert a coordinate system
boolstatus = swModelDocExt.SelectByID2("", "POINTREF", 4.01079772470056E-02,
0.176063265567817, -4.11470845460259E-02, False, 1, Nothing, 0)
boolstatus = swModelDocExt.SelectByID2("", "EDGE", 1.80650048999951E-02,
0.166100889103177, 0.123043418741133, True, 2, Nothing, 0)
boolstatus = swModelDocExt.SelectByID2("", "EDGE", 4.76117249541517E-02,
0.243477752733071, -4.18878531492055E-02, True, 4, Nothing, 0)
boolstatus = swModelDocExt.SelectByID2("", "EDGE", -8.21419006116457E-02,
0.165357357368464, -4.11028452107871E-02, True, 8, Nothing, 0)
boolstatus = swModel.InsertCoordinateSystem(False, False, False)
' Get the coordinate system object
selection1 = "80,55,0,0,1,0,0,0,255,254,255,0,0,0,0,0,125,0,0,0"
selection1 = selection1 & ",Type=1"
StringtoArray selection1, var2
Set
oSelect2 = swModelDocExt.GetObjectByPersistReference3((var2), status)
'
Get the SOLIDWORKS Simulation object
Set
COSMOSObject = SwApp.GetAddInObject("SldWorks.Simulation")
If
COSMOSObject Is Nothing Then ErrorMsg SwApp, "COSMOSObject object not found"
Set
COSMOSWORKS = COSMOSObject.COSMOSWORKS
If
COSMOSWORKS Is Nothing Then ErrorMsg SwApp, "COSMOSWORKS object not found"
Set
ActDoc = COSMOSWORKS.ActiveDoc()
If
ActDoc Is Nothing Then ErrorMsg SwApp, "No active document"
Set
StudyMngr = ActDoc.StudyManager()
If
StudyMngr Is Nothing Then ErrorMsg SwApp, "No CWStudyManager object"
'
Get the Ready study
Set
Study = StudyMngr.GetStudy(0)
If
Study Is Nothing Then ErrorMsg SwApp, "No study"
'
Get the face to which to apply a force
selection1 =
"13,17,0,0,3,0,0,0,255,254,255,27,77,0,105,0,120,0,101,0,100,0,45,0,49,0,45,0,83,0,111,0,108,0,105,0,100,0,45,0,51,0,64,0,109,0,105,0,120,0,101,0,100,0,109,0,101,0,115,0,104,0,45,0,49,0,4,0,0,0,16,0,0,0,1,0,0,0,1,0,0,0,17,0,0,0,255,255,1,0,11,0,109,111,70,97,99,101,82,101,102,95,99,1,0,0,0,0,0,0,0,6,0,0,0,0,3,0,0,0,0,0,0,125,195,148,37,173,73,178,84,125,195,148,37,173,73,178,84,0,0,255,255,1,0,23,0,109,111,70,114,111,109,83,107,116,69,110,116,83,117,114,102,73,100,82,101,112,95,99,0,0,255,255,1,0,6,0,109,111,70,82,95,99,255,255,1,0,13,0,109,111,69,120,116,79,98,106,101,99,116,95,99,255,255,1,0,17,0,109,111,67,83,116,114,105,110,103,72,97,110,100,108,101,95,99,255,254,255,79,67,0,58,0,92,0,80,0,114,0,111,0,103,0,114,0,97,0,109,0,32,0,70,0,105,0,108,0,101,0,115,0,92,0,83,0,111,0,108,0,105,0,100,0,87,0,111,0,114,0,107,0,115,0,92,0,83,0,111,0,108,0,105,0,100,0,87,0,111,0,114,0,107,0,115,0,32,0,83,0,105,0,109,0,117,0,108,0,97,0,116,0,105,0,111,0,110,0,92,0,69,0,120,0,97,0,109,"
selection1 = selection1 &
"0,112,0,108,0,101,0,115,0,92,0,77,0,105,0,120,0,101,0,100,0,45,0,49,0,45,0,83,0,111,0,108,0,105,0,100,0,46,0,83,0,76,0,68,0,80,0,82,0,84,0,9,128,255,254,255,13,77,0,105,0,120,0,101,0,100,0,45,0,49,0,45,0,83,0,111,0,108,0,105,0,100,0,2,0,0,124,49,104,66,0,0,0,48,0,0,0,0,0,0,0,0,0,2,0,0,0,255,254,255,7,68,0,101,0,102,0,97,0,117,0,108,0,116,0,0,0,0,0,0,0,0,0,0,0,48,0,24,0,0,0,26,50,104,66,4,0,0,0,255,255,1,0,20,0,109,111,69,110,100,70,97,99,101,83,117,114,102,73,100,82,101,112,95,99,0,0,5,128,8,0,24,0,0,0,26,50,104,66,0,0,0,0,0,0,0,0,3,128,0,0,5,128,8,0,24,0,0,0,26,50,104,66,11,0,0,0,12,128,0,0,5,128,8,0,24,0,0,0,26,50,104,66,1,0,0,0,0,0,0,0,3,128,0,0,5,128,8,0,24,0,0,0,26,50,104,66,1,0,0,0,0,0,0,0,0,0,0,0,0,0"
StringtoArray selection1, var1
Set
oSelect1 = swModelDocExt.GetObjectByPersistReference3((var1), status)
varArray1 = Array(oSelect1)
Set
LBCMgr = Study.LoadsAndRestraintsManager
data(0) = 2#
data(1) = 3#
data(2) = 1#
data(3) = 1.5
data(4) = 1#
data(5) = 1#
ComponentValues = data
'
Add force
Set
CWForce = LBCMgr.AddForce3(swsForceTypeNormal, 0, -1, 0, 0, 0,
(DistanceValues), (ForceValues), True, False, 0, 0, 0, 1#, (ComponentValues),
False, False, (varArray1), Nothing, False, errCode)
If
errCode <> 0 Then ErrorMsg SwApp, "No force applied"
'
Edit the force to be of nonuniform distribution
CWForce.ForceBeginEdit
CWForce.IncludeNonUniformDistribution2 = True
CWForce.SetCoordinateSystem oSelect2
CWForce.EquationCoordinateSystemType = 1
CWForce.EquationLinearUnit = 0
CWForce.Equation = """x"" + ""y"" + ""z"""
errCode = CWForce.ForceEndEdit
Debug.Print "Force:"
Debug.Print " Type as defined in
swsForceType_e: " & CWForce.ForceType
Debug.Print " Units as defined in
swsForceUnit_e: " & CWForce.Unit
Debug.Print " Value: " & CWForce.NormalForceOrTorqueValue
bVal1 = CWForce.IncludeNonUniformDistribution2
Debug.Print " Nonuniform
distribution? (True=-1, False=0) " & bVal1
If
bVal1 = -1 Then
Debug.Print " Coordinate
system type as defined in swsCoordinateType_e: " & CWForce.EquationCoordinateSystemType
Debug.Print " Equation linear
units as defined in swsLinearUnit_e: " & CWForce.EquationLinearUnit
If CWForce.EquationCoordinateSystemType = 2 Or CWForce.EquationCoordinateSystemType
= 3 Then
Debug.Print " Equation
angular units as defined in " & CWForce.EquationAngularUnit
End If
If CWForce.Equation = "" Then
Debug.Print " Nonuniform
force distribution equation not set."
Else
Debug.Print " Nonuniform
force distribution equation: " & CWForce.Equation
End If
End
If
End Sub
Sub ErrorMsg(SwApp As SldWorks.SldWorks, Message As
String)
SwApp.SendMsgToUser2 Message, 0, 0
SwApp.RecordLine "'*** WARNING - General"
SwApp.RecordLine "'*** " & Message
SwApp.RecordLine ""
End Sub
Sub StringtoArray(inputSTR As String, varEntity As
Variant)
Dim
PID() As Byte
Dim
i As Integer
varEntity = Split(inputSTR, ",")
ReDim PID(UBound(varEntity))
For
i = 0 To (UBound(varEntity) - 1)
PID(i) = varEntity(i)
Next
i
varEntity = PID
End Sub