Hide Table of Contents

Analyze Part (C#)

This example shows how to create a static analysis of a part.

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).
// 2. Add the SolidWorks Simulation primary interop assembly
//    (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\CLR2 folder, and
//    select SolidWorks.Interop.cosworks.dll)  
// 3. Modify the path to solidworks materials.sldmat as needed.
// 4. Open the Immediate window.
// 5. Run the macro.
//
// Postconditions:
// 1.  Adds a default static study results plot.
// 2.  Creates a study called Static-solid.
// 3.  Applies a material to the model.
// 4.  Applies restraints and pressure to the selected faces.
// 5.  Creates a mesh.
// 6.  Runs the analysis.
// 7.  Prints stress and strain values to the Immediate window.
// 8.  Hides fixture and force symbols. Examine the graphics area to verify.
// 9.  Press F5 to continue.
// 10. Shows fixture and force symbols. Examine the graphics area to verify.
// 11. Inspect the static study results plot.
//
// NOTE: Because this part document is used elsewhere,
// do not save any changes when closing it.
//-------------------------------------

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using SolidWorks.Interop.cosworks;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace AnalyzePartCSharp.csproj
{
 
    partial class SolidWorksMacro
    {
        public void Main()
        {
            CosmosWorks COSMOSWORKS = default(CosmosWorks);
            CwAddincallback CWObject = default(CwAddincallback);
            CWModelDoc ActDoc = default(CWModelDoc);
            CWStudyManager StudyMngr = default(CWStudyManager);
            CWStudy Study = default(CWStudy);
            CWSolidManager SolidMgr = default(CWSolidManager);
            CWSolidComponent SolidComponent = default(CWSolidComponent);
            CWSolidBody SolidBody = default(CWSolidBody);
            CWMesh CwMesh = default(CWMesh);
            CWResults CWResult = default(CWResults);
            object stress = null;
            ModelDoc2 Part = default(ModelDoc2);
            CWLoadsAndRestraintsManager LBCMgr = default(CWLoadsAndRestraintsManager);
            CWPressure CWPressure = default(CWPressure);
            CWRestraint CWRes1 = default(CWRestraint);
            object pointer1 = null;
            object pointer2 = null;
            object pointer3 = null;
            CWMaterial CWMat = default(CWMaterial);
            byte[] var1 = null;
            byte[] var2 = null;
            byte[] var3 = null;
            int returnValue = 0;
            string selection1 = null;
            string selection2 = null;
            string selection3 = null;
            int status = 0;
            int warnings = 0;
            int errCode = 0;
            int NSource = 0;
            double el = 0;
            double tl = 0;
 
 
            // Open SolidWorks part document 
            Part = (ModelDoc2)swApp.OpenDoc6("C:\\Program Files\\SolidWorks Corp\\SolidWorks\\Simulation\\Examples\\Tutor1.SLDPRT ", (int)swDocumentTypes_e.swDocPART, 1, ""ref status, ref warnings);
            if (Part == null) ErrorMsg(swApp, "Failed to open C:\\Program Files\\SolidWorks Corp\\SolidWorks\\Simulation\\Examples\\Tutor1.SLDPRT."true);
 
            // Get SolidWorks Simulation object 
            CWObject = (CwAddincallback)swApp.GetAddInObject("SldWorks.Simulation");
            if (CWObject == null) ErrorMsg(swApp, "CWObject object not found."true);
            COSMOSWORKS = (CosmosWorks)CWObject.CosmosWorks;
            if (COSMOSWORKS == null) ErrorMsg(swApp, "CWObject not found."true);
 
            // Get active document        
            ActDoc = (CWModelDoc)COSMOSWORKS.ActiveDoc;
            if (ActDoc == null) ErrorMsg(swApp, "No active document."true);
	   // Add default static study results plot
	   errCode = ActDoc.AddDefaultStaticStudyPlot((int)swsDefaultStaticResultTypes_e.swsStaticResultElementalStrain, (int)swsStaticResultElementalStrainComponentTypes_e.swsStaticElementalStrain_ENERGY);
 
            // Create new static study 
            StudyMngr = (CWStudyManager)ActDoc.StudyManager;
            if (StudyMngr == null) ErrorMsg(swApp, "StudyMngr object not there."true);
            Study = (CWStudy)StudyMngr.CreateNewStudy3("Static_solid", (int)swsAnalysisStudyType_e.swsAnalysisStudyTypeStatic, (int)swsMeshType_e.swsMeshTypeSolid, out errCode);
            if (Study == null) ErrorMsg(swApp, "Study not created."true);
 
            // Set material from the SolidWorks material library 
            SolidMgr = (CWSolidManager)Study.SolidManager;
            if (SolidMgr == null) ErrorMsg(swApp, "SolidMgr object not there."true);
            SolidComponent = (CWSolidComponent)SolidMgr.GetComponentAt(0, out errCode);
            if (errCode != 0) ErrorMsg(swApp, "No solid component."true);
            SolidBody = (CWSolidBody)SolidComponent.GetSolidBodyAt(0, out errCode);
            if (errCode != 0) ErrorMsg(swApp, "No solid body."true);
            returnValue = SolidBody.SetLibraryMaterial("c:\\Program Files\\SolidWorks Corp\\SolidWorks\\lang\\english\\sldmaterials\\solidworks materials.sldmat""Ductile Iron (SN)");
            if (returnValue == 0) ErrorMsg(swApp, "No material applied."true);
            CWMat = (CWMaterial)SolidBody.GetDefaultMaterial();
            NSource = CWMat.Source;
 
            // Get the PIDs of the faces 
            // First two selections are the faces for restraints 
            // Third selection is the face where pressure is applied 
            selection1 = "216,14,0,0,3,0,0,0,255,254,255,0,0,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,5,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,21,0,109,111,76,80,97,116,116,101,114,110,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,14,0,109,111,79,98,106,70,105,108,101,68,101,102,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,6,84,0,117,0,116,0,111,0,114,0,49,0,123,228,186,50,11,128,255,254,255,62,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,67,0,79,0,83,0,77,0,79,0,83,0,87,0,111,0,114,0,107,0,115,0,92,0,69,0,120,0,97,0,109,0,112,0,108,0,101,0,115,0,92,0,84,0,117,0,116,0,111,0,114,0,49,0,46,0,83,0,76,0,68,0,80,0,82,0,84,0,97,23,28,65,0,0,0,0";
            selection1 = selection1 + ",2,0,1,0,0,0,0,0,0,0,1,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,0,0,17,0,0,0,156,231,186,50,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,5,128,8,0,14,0,0,0,88,231,186,50,3,0,0,0,1,0,0,0,0,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,6,0,0,0,211,228,186,50,1,0,0,0,255,255,255,255,0,0,17,128,0,0,5,128,8,0,6,0,0,0,211,228,186,50,0,0,0,0,255,255,255,255,0,0,0,0,0,0";
            StringtoArray(selection1, ref var1);
            pointer1 = Part.Extension.GetObjectByPersistReference3((var1), out status);
 
            selection2 = "216,14,0,0,3,0,0,0,255,254,255,0,0,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,5,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,14,0,109,111,79,98,106,70,105,108,101,68,101,102,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,6,84,0,117,0,116,0,111,0,114,0,49,0,123,228,186,50,11,128,255,254,255,62,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,67,0,79,0,83,0,77,0,79,0,83,0,87,0,111,0,114,0,107,0,115,0,92,0,69,0,120,0,97,0,109,0,112,0,108,0,101,0,115,0,92,0,84,0,117,0,116,0,111,0,114,0,49,0,46,0,83,0,76,0,68,0,80,0,82,0,84,0,97,23,28,";
            selection2 = selection2 + "65,0,0,0,0,2,0,1,0,0,0,0,0,0,0,1,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,0,0,14,0,0,0,88,231,186,50,3,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,6,0,0,0,211,228,186,50,1,0,0,0,255,255,255,255,0,0,14,128,0,0,5,128,8,0,6,0,0,0,211,228,186,50,0,0,0,0,255,255,255,255,0,0,0,0,0,0";
            StringtoArray(selection2, ref var2);
            pointer2 = Part.Extension.GetObjectByPersistReference3((var2), out status);
 
            selection3 = "216,14,0,0,3,0,0,0,255,254,255,0,0,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,8,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,20,0,109,111,69,110,100,70,97,99,101,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,14,0,109,111,79,98,106,70,105,108,101,68,101,102,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,6,84,0,117,0,116,0,111,0,114,0,49,0,123,228,186,50,11,128,255,254,255,62,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,67,0,79,0,83,0,77,0,79,0,83,0,87,0,111,0,114,0,107,0,115,0,92,0,69,0,120,0,97,0,109,0,112,0,108,0,101,0,115,0,92,0,84,0,117,0,116,0,111,0,114,0,49,0,46,0,83,0,76,0,68,0,80,0,82,0,84,0,97,23,28,65,0,0,0,0,2,0,";
            selection3 = selection3 + "1,0,0,0,0,0,0,0,1,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,0,0,11,0,0,0,51,230,186,50,1,0,0,0,255,255,255,255,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,5,128,8,0,8,0,0,0,218,229,186,50,4,0,0,0,0,0,255,255,1,0,18,0,109,111,80,76,105,110,101,83,117,114,102,73,100,82,101,112,95,99,0,0,5,128,8,0,31,0,0,0,210,195,223,50,17,128,0,0,5,128,8,0,23,0,0,0,160,192,223,50,14,128,0,0,5,128,8,0,19,0,0,0,181,233,186,50,1,0,0,0,1,0,0,0,2,0,0,0,17,128,0,0,5,128,8,0,31,0,0,0,210,195,223,50,17,128,0,0,5,128,8,0,23,0,0,0,160,192,223,50,14,128,0,0,5,128,8,0,19,0,0,0,181,233,186,50,1,0,0,0,1,0,0,0,1,0,0,0,17,128,0,0,5,128,8,0,31,0,0,0,210,195,223,50,17,128,0,0,5,128,8,0,23,0,0,0,160,192,223,50,14,128,0,0,5,128,8,0,19,0,0,0,181,233,186,50,1,0,0,0,2,0,0,0,3,0,0,0,17,128,0,0,5,128,8,0,31,0,0,0,210,195,223,50,17,128,0,0,5,128,8,0,23,0,0,0,160,192,223,50,14,";
            selection3 = selection3 + "128,0,0,5,128,8,0,19,0,0,0,181,233,186,50,1,0,0,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0";
            StringtoArray(selection3, ref var3);
            pointer3 = Part.Extension.GetObjectByPersistReference3((var3), out status);
 
            // Create VARIANT arrays 
            object[] varArray1 = { pointer1, pointer2 };
            object[] varArray2 = { pointer3 };
 
            // Add fixed restraint 
            LBCMgr = (CWLoadsAndRestraintsManager)Study.LoadsAndRestraintsManager;
            if (LBCMgr == null) ErrorMsg(swApp, "No loads and restraints manager."false);
            CWRes1 = (CWRestraint)LBCMgr.AddRestraint(0, (varArray1), nullout errCode);
            if (errCode != 0) ErrorMsg(swApp, "No fixed restraint created."true);
 
            // Apply pressure normal to selected face 
            CWPressure = (CWPressure)LBCMgr.AddPressure(0, (varArray2), nullout errCode);
            if (errCode != 0) ErrorMsg(swApp, "No normal pressure created."true);
            CWPressure.PressureBeginEdit();
            CWPressure.Unit = 1;
            CWPressure.Value = 1000;
            errCode = CWPressure.PressureEndEdit();
            if (errCode != 0) ErrorMsg(swApp, "Nonuniform pressure distribution not set."true);
 
            // Create mesh 
            CwMesh = (CWMesh)Study.Mesh;
            if (CwMesh == null) ErrorMsg(swApp, "No mesh object."false);
            CwMesh.Quality = 1;
            CwMesh.GetDefaultElementSizeAndTolerance(0, out el, out tl);
            errCode = Study.CreateMesh(0, el, tl);
            if (errCode != 0) ErrorMsg(swApp, "Mesh failed."true);
 
            //Run analysis 
            errCode = Study.RunAnalysis();
            if (errCode != 0) ErrorMsg(swApp, "Analysis failed."true);
            CWResult = (CWResults)Study.Results;
            if (CWResult == null) ErrorMsg(swApp, "No result object."false);
            stress = CWResult.GetMinMaxStress(0, 0, 1, null, 0, out errCode);
 
            // Get strain and stress values for 
            // first face selected for restraint 
            DispatchWrapper[] dispWrapper = new DispatchWrapper[1];
            dispWrapper[0] = new DispatchWrapper((Entity)pointer1);
            object[] results = null;
            string resultsString = null;
 
            int i;
            Debug.Print("  Strain value by node:");
            results = (object[])CWResult.GetStrainForEntities3(true, (int)swsStrainComponent_e.swsStrainComponentESTRN, 1, null, dispWrapper, status, 0, false, out errCode);
            for (i = 0; i < results.Length; i++)
            {
                resultsString = Convert.ToString(results[i]);
                Debug.Print("    " + resultsString);
            }
 
            Debug.Print(" ");
            Debug.Print("  Stress value by node:");
            results = (object[])CWResult.GetStressForEntities3(true, (int)swsStressComponent_e.swsStressComponentVON, 1, null, dispWrapper, (int)swsStrengthUnit_e.swsStrengthUnitPascal, status, 0, false, out errCode);
            for (i = 0; i < results.Length; i++)
            {
                resultsString = Convert.ToString(results[i]);
                Debug.Print("    " + resultsString);
            }
 
            //Hide fixture and force symbols
            Study.ShowOrHideFixtures = false;
            Study.ShowOrHideForce = false;
 
            System.Diagnostics.Debugger.Break();
 
            //Show fixture and force symbols
            Study.ShowOrHideFixtures = true;
            Study.ShowOrHideForce = true;
        }
 
 
        private void ErrorMsg(object SwApp, string Message, bool EndTest)
        {
            swApp.SendMsgToUser2(Message, 0, 0);
            swApp.RecordLine("'*** WARNING - General");
            swApp.RecordLine("'*** " + Message);
            swApp.RecordLine("");
            if (EndTest)
            {
 
            }
        }
 
 
        private void StringtoArray(string inputSTR, ref byte[] varEntity)
        {
            string[] PIDArray = null;
            byte[] PID = null;
            int i;
 
            // Parse string into an array
            PIDArray = inputSTR.Split(new char[] { ',' });
 
            //Convert string array to byte array
            int sizeArray = PIDArray.Length;
            PID = new byte[sizeArray];
            for (i = 0; i < PIDArray.Length; i++)
            {
 
                PID[i] = Convert.ToByte(PIDArray[i]);
            }
            varEntity = PID;
        }
 
 
        /// <summary> 
        /// The SldWorks swApp variable is pre-assigned for you. 
        /// </summary> 
        public SldWorks swApp;
    }
 
}


Provide feedback on this topic

SOLIDWORKS welcomes your feedback concerning the presentation, accuracy, and thoroughness of the documentation. Use the form below to send your comments and suggestions about this topic directly to our documentation team. The documentation team cannot answer technical support questions. Click here for information about technical support.

* Required

 
*Email:  
Subject:   Feedback on Help Topics
Page:   Analyze Part Example (C#)
*Comment:  
*   I acknowledge I have read and I hereby accept the privacy policy under which my Personal Data will be used by Dassault Systèmes

Print Topic

Select the scope of content to print:

x

We have detected you are using a browser version older than Internet Explorer 7. For optimized display, we suggest upgrading your browser to Internet Explorer 7 or newer.

 Never show this message again
x

Web Help Content Version: API Help (English only) 2014 SP05

To disable Web help from within SOLIDWORKS and use local help instead, click Help > Use SOLIDWORKS Web Help.

To report problems encountered with the Web help interface and search, contact your local support representative. To provide feedback on individual help topics, use the “Feedback on this topic” link on the individual topic page.