This example shows how to create a drop test study.
//----------------------------------------------------------------------------
// Preconditions:
// 1. Open:
// install_dir\samples\tutorial\api\KeyPad_1.sldasm.
// 2. Add the SolidWorks Simulation as an add-in
// (in SolidWorks, click Tools > Add-ins > SolidWorks Simulation).
// 3. Add the SolidWorks Simulation primary interop assembly as
// a reference (in the IDE's Project Explorer, right-click
// the project name, select Add Reference, click the Browse tab,
// navigate to the install_dir\api\redist folder and
// select SolidWorks.Interop.cosworks.dll).
//
// Postconditions:
// 1. Drop test study, "Study 2", is created.
// 2. Nylon 101 Solidworks material is applied to all components.
// 3. The mesh is created.
// 4. Drop height is set to 1000 mm.
// 5. Analysis is run.
// 6. Von Mises stress results in the last step are validated.
// 7. When the macro stops, inspect the Immediate window for the
// 1000 mm drop test study's setup and result options.
// Inspect the plots in the Results folder and
click F5 to continue.
// 8. Drop height is changed to 2000 mm.
// 9. Analysis is run again. Inspect the new plots in the Results folder.
//
// NOTE: Because the model is used elsewhere,
// do not save changes when closing it.
//
---------------------------------------------------------------------------
using
Microsoft.VisualBasic;
using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.Data;
using
System.Diagnostics;
using
SolidWorks.Interop.sldworks;
using
SolidWorks.Interop.swconst;
using
SolidWorks.Interop.cosworks;
using
System.Runtime.InteropServices;
namespace
DropTest_CSharp.csproj
{
partial
class
SolidWorksMacro
{
ModelDoc2
Part;
CosmosWorks
COSMOSWORKS;
CwAddincallback
CWAddinCallBack;
CWModelDoc
ActDoc;
CWStudyManager
StudyMngr;
CWStudy
Study;
CWMesh
CWMesh;
CWResults
CWFeatObj;
CWSolidManager
SolidMgr;
CWSolidComponent
SolidComponent;
CWSolidBody
Solidbody;
CWDropTestSetup
Setup;
CWDropTestResultOptions
ResultOptions;
CWDropTestStudyOptions
StudyOptions;
object
Selection;
string
CosmosFolder;
string
sLibWithPathname;
string
sMaterialName;
string
sName;
int
errCode;
int
nStep;
double
VMS1000;
double
VMS2000;
object[]
Stress = new
object[4];
int
CompCount;
int
j;
double
Height;
int
bApp;
Hashtable
PIDCollection = new
Hashtable();
double
Tol;
double
A;
double
B;
public
void Main()
{
PIDCollection = PIDInitializer();
Tol = 0.25;
//25% tolerance
VMS1000 = 7314431;
//maximum Von Mises stress at
step 25 for drop height = 1000 mm
VMS2000 = 10389063;
//maximum Von Mises stress at
step 25 for drop height = 2000 mm
if
(swApp == null)
return;
CosmosFolder = swApp.GetExecutablePath();
Part = (ModelDoc2)swApp.ActiveDoc;
CWAddinCallBack = (CwAddincallback)swApp.GetAddInObject("SldWorks.Simulation");
COSMOSWORKS = CWAddinCallBack.CosmosWorks;
ActDoc = COSMOSWORKS.ActiveDoc;
StudyMngr = ActDoc.StudyManager;
//Create a drop test study
Study =
StudyMngr.CreateNewStudy3("Study 2",
6, 0, out
errCode);
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to create a drop test study");
StudyOptions = Study.DropTestStudyOptions;
Debug.Print("Study
results folder: " +
StudyOptions.ResultFolder);
Debug.Print("Study
displacement formulation (1 = large): " +
StudyOptions.LargeDisplacement);
ResultOptions = Study.DropTestResultOptions;
Debug.Print("Number
of graph steps: " +
ResultOptions.NoOfGraphSteps);
Debug.Print("Number
of plots: " + ResultOptions.NoOfPlots);
Debug.Print("Save
results from starting time (sec): " +
ResultOptions.SaveResultsStartingTime);
Debug.Print("Time
to solve after impact (sec): " +
ResultOptions.SolutionTimeAfterImpact);
//Create mesh
CWMesh = Study.Mesh;
CWMesh.MesherType = 0;
//standard mesh = 0, CB mesh =
1
CWMesh.Quality = 0;
//draft = 0, high quality = 1
errCode = Study.CreateMesh(0,
2, 0.05);
//create mesh, 0-1-2-3-4 :
mm-cm-m-in-ft
//Apply
material
sLibWithPathname = CosmosFolder
+ "\\lang\\english\\sldmaterials\\solidworks
materials.sldmat";
sMaterialName = "Nylon 101";
//Nylon 101 SolidWorks material
SolidMgr = Study.SolidManager;
CompCount = SolidMgr.ComponentCount;
//Apply material to all solid
components
for
(j = 0; j <= (CompCount - 1); j++)
{
SolidComponent = SolidMgr.GetComponentAt(j,
out errCode);
sName = SolidComponent.ComponentName;
Solidbody = SolidComponent.GetSolidBodyAt(0,
out errCode);
bApp = Solidbody.SetLibraryMaterial(sLibWithPathname,
sMaterialName);
Solidbody = null;
}
//Assign drop test setup
Selection = SelectByPID(Part,
"selection1",
PIDCollection);
Setup = Study.AddDropTestSetup(Selection,
out errCode);
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to create DropTestSetup object");
if
(Setup == null)
ErrorMsg(swApp, "Failed
to get DropTestSetup object");
Height = Setup.DropHeight;
if
(Height != 1000)
ErrorMsg(swApp, "Failed
to validate drop height = 1000 mm from original Study 1");
Debug.Print("Drop
height (mm): " + Setup.DropHeight);
Debug.Print("Drop
height type (swsDropHeightType_e): " +
Setup.DropHeightType);
Debug.Print("Drop
height units (swsLinearUnit_e): " +
Setup.DropHeightUnit);
Debug.Print("Drop
type (swsDropType_e): " + Setup.DropType);
Debug.Print("Reverse
gravity direction? (1 = yes) " +
Setup.FlipGravityDirection);
Debug.Print("Reverse
velocity direction? (1 = yes) " +
Setup.FlipVelocityDirection);
Debug.Print("Coefficient
of friction: " + Setup.FrictionCoefficient);
Debug.Print("Gravity
magnitude: " + Setup.Gravity);
Debug.Print("Gravity
units (swsAccelerationUnit_e): " +
Setup.GravityUnit);
Debug.Print("Mass
density of impact layer: " +
Setup.MassDensity);
Debug.Print("Stiffness
per unit area normal to impact plane: " +
Setup.NormalStiffness);
Debug.Print("Units
of stiffness (swsUnitSystem_e): " +
Setup.StiffnessUnit);
Debug.Print("Stiffness
per unit area parallel to the impact plane: "
+ Setup.TangentialStiffness);
Debug.Print("Orientation
of impact plane (swsDropTargetOrientationType_e): "
+ Setup.TargetOrientationType);
Debug.Print("Stiffness
type (swsDropTargetStiffnessType)e): " +
Setup.TargetStiffnessType);
Debug.Print("Thickness
of the impact layer: " +
Setup.TargetThickness);
Debug.Print("Units
of thickness (swsLinearUnit_e): " +
Setup.ThicknessUnit);
Debug.Print("Velocity
at impact: " + Setup.Velocity);
Debug.Print("Units
of velocity (swsVelocityUnit_e): " +
Setup.VelocityUnit);
//Run Study for drop height =
1000 mm
errCode = Study.RunAnalysis();
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to run study (drop height = 1000 mm)");
CWFeatObj = Study.Results;
if
(CWFeatObj == null)
ErrorMsg(swApp, "Failed
to get Result Object (drop height = 1000 mm)");
nStep = CWFeatObj.GetMaximumAvailableSteps();
//nStep = last step of study
if
(nStep != 25)
ErrorMsg(swApp, "Total
number of steps in result is incorrect (drop height = 1000 mm)");
Stress = (object[])CWFeatObj.GetMinMaxStress(9,
0, nStep, null,
0, out
errCode);
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to get Von Mises stress result for drop height = 1000 mm");
A = (float)Stress[3];
B = VMS1000;
if
(ResultsVer(A, B, Tol) == true)
{
ErrorMsg(swApp, "Von
Mises stress result for drop height = 1000 mm has % error = "
+ ResultsError(A, B, Tol));
}
//Change drop height from 1000
mm to 2000 mm
Setup.DropTestSetupBeginEdit();
Setup.DropType = 0;
Setup.DropHeightType = 0;
Setup.DropHeight = 2000;
Setup.DropHeightUnit = 0;
errCode = Setup.DropTestSetupEndEdit();
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to make change to drop height");
Height = Setup.DropHeight;
if
(Height != 2000)
ErrorMsg(swApp, "Failed
to correctly change drop height to 2000 mm");
System.Diagnostics.Debugger.Break();
// Inspect results for drop
height = 1000 mm
//Run
study for drop height = 2000 mm
errCode = Study.RunAnalysis();
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to run study (drop height = 2000 mm)");
CWFeatObj = Study.Results;
if
(CWFeatObj == null)
ErrorMsg(swApp, "Failed
to get Result Object (drop height = 2000 mm)");
nStep = CWFeatObj.GetMaximumAvailableSteps();
//nStep = last step of study
if
(nStep != 25)
ErrorMsg(swApp, "Total
number of steps in result is incorrect (drop height = 2000 mm)");
Stress = (object[])CWFeatObj.GetMinMaxStress(9,
0, nStep, null,
0, out
errCode);
if
(errCode != 0)
ErrorMsg(swApp, "Failed
to get Von Mises stress result for drop height = 2000 mm");
A = (float)Stress[3];
B = VMS2000;
if
(A < VMS1000 | A == VMS1000)
ErrorMsg(swApp, "Von
Mises stress result for drop height = 2000 mm is less than or equal to drop
height = 1000 mm");
if
(ResultsVer(A, B, Tol) == true)
{
ErrorMsg(swApp, "Von
Mises stress result for drop height = 2000 mm has % error = "
+ ResultsError(A, B, Tol));
}
}
public
bool
ResultsVer(double
ActualResult, double
ReferenceResult, double
Tolerance)
{
return
(ActualResult < (1 - Tolerance) * ReferenceResult) | (ActualResult > (1 +
Tolerance) * ReferenceResult);
}
public
double
ResultsError(double
ActualResult, double
ReferenceResult, double
Tolerence)
{
return
(ActualResult - ReferenceResult) / ReferenceResult * 100;
}
public
void
ErrorMsg(SldWorks
SwApp, string
Message)
{
SwApp.SendMsgToUser2(Message, 0, 0);
SwApp.RecordLine("'***
WARNING - General");
SwApp.RecordLine("'*** "
+ Message);
SwApp.RecordLine("");
}
public
object
SelectByPID(ModelDoc2
nPart, string
PIDName, Hashtable
PIDCollection)
{
object
functionReturnValue = null;
byte[]
PID = null;
string[]
PIDVariant = null;
string
PIDString = null;
int
i = 0;
object
SelObj = null;
//Get the value mapped to the
PIDName key from the hashtable
PIDString =
"";
IDictionaryEnumerator
enumerator = (IDictionaryEnumerator)PIDCollection.GetEnumerator();
enumerator.Reset();
while
(enumerator.MoveNext())
{
if
((string)enumerator.Key
== PIDName)
{
PIDString = (string)enumerator.Value;
break;
}
}
//Parse the string into an
array
PIDVariant = PIDString.Split(new
char[] {
',' });
int
sizeArray = PIDVariant.Length;
PID = new
byte[sizeArray];
//Change to a byte array
for
(i = 0; i < PIDVariant.Length - 1; i++)
{
PID[i] = Convert.ToByte(PIDVariant[i]);
}
//Select the entity
SelObj =
nPart.Extension.GetObjectByPersistReference((PID));
functionReturnValue = SelObj;
return
functionReturnValue;
}
public
Hashtable
PIDInitializer()
{
Hashtable
PIDCollection = new
Hashtable();
string
selection1 = null;
//Constants
selection1 =
"35,29,213,113,218,129,72,162,168,88,152,178,27,137,239,153,20,0,0,0,25,0,0,0,120,1,147,22,102,96,96,100,96,96,248,255,239,63,144,100,96,96,1,98,0,36,141,3,48,0,0,0,0,0,0,0,0";
selection1 = selection1 +
",Type=1";
//Store constants in a
collection
PIDCollection.Add("selection1",
selection1);
return
PIDCollection;
}
public
SldWorks
swApp;
}
}