Page 1 of 1

Body Mass in Part

Posted: Tue Feb 27, 2024 6:01 am
by senuba
Hello,

I have a body in part where I created separate bodies without using "merge the end" while extruding on a part. The weight of this part is 45kg. However, it consists of 3 different bodies weighing 10kg+15kg+20kg. How can I obtain these masses with a macro?

I can retrieve the body names using this link. Now, I need the masses. Thank you in advance for your help.

https://help.solidworks.com/2022/englis ... ple_vb.htm

Re: Body Mass in Part

Posted: Tue Feb 27, 2024 7:47 am
by AlexLachance
I could provide a note that links to the property of the body within the view it is attached to. This is how our multibody weights are displayed

Edit: can't attach it so here's some images to show
image.png
image.png

Re: Body Mass in Part

Posted: Tue Feb 27, 2024 8:42 am
by senuba
AlexLachance wrote: Tue Feb 27, 2024 7:47 am I could provide a note that links to the property of the body within the view it is attached to. This is how our multibody weights are displayed

Edit: can't attach it so here's some images to show

image.png
image.png

I don't want the technical drawing part. When I run the macro within the part, it will provide me with the weight of "Pah5" using debug.print, which is 258kg. I want the weights of "Pah5" and the others. I can get all the names here, but I can't get their weights.

Re: Body Mass in Part

Posted: Tue Feb 27, 2024 8:46 am
by AlexLachance
senuba wrote: Tue Feb 27, 2024 8:42 am I don't want the technical drawing part. When I run the macro within the part, it will provide me with the weight of "Pah5" using debug.print, which is 258kg. I want the weights of "Pah5" and the others. I can get all the names here, but I can't get their weights.
Unfortunately I can't really help macro-wise. Perhaps @gupta9665 could be of help. I don't think it's complicated since the evaluate tool can call them out.

Re: Body Mass in Part

Posted: Tue Feb 27, 2024 9:19 am
by AlexB
I think this is what you're looking for. You would have to pre-select the components you would like measured before calling this method.

https://help.solidworks.com/2016/englis ... ties2.html

Re: Body Mass in Part

Posted: Tue Feb 27, 2024 11:13 am
by gupta9665
You can use GetMassProperties Method (IBody2) method.

https://help.solidworks.com/2021/englis ... rties.html

Re: Body Mass in Part

Posted: Tue Feb 27, 2024 11:38 am
by JSculley
Here's a C# macro that will print the mass of each body in a multi-body part:

Code: Select all

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System.Runtime.InteropServices;
using System;
using System.Diagnostics;

namespace BodyWeights.csproj
{
    public partial class SolidWorksMacro
    {
        /// <summary>
        ///  The SldWorks swApp variable is pre-assigned for you.
        /// </summary>
        public SldWorks swApp;      

        public void Main()
        {
            ModelDoc2 mDoc = swApp.ActiveDoc as ModelDoc2;
            ModelDocExtension mExt = mDoc.Extension;
            MassProperty massProp = mExt.CreateMassProperty() as MassProperty;
            massProp.UseSystemUnits = false;
            FeatureManager fMgr = mDoc.FeatureManager;
            object[] featObjArray = fMgr.GetFeatures(false) as object[];
            foreach (object o in featObjArray)
            {
                Feature nextFeat = o as Feature;
                if (!nextFeat.GetTypeName2().Equals("SolidBodyFolder"))
                {
                    continue;
                }
                BodyFolder bFolder = nextFeat.GetSpecificFeature2() as BodyFolder;
                object[] bodyObjArray = bFolder.GetBodies() as object[];
                foreach (object b in bodyObjArray)
                {
                    Body2 nextBody = b as Body2;
                    object[] vBodies = new object[1];
                    vBodies[0] = nextBody;
                    DispatchWrapper[] dispArray = ObjectArrayToDispatchWrapperArray(vBodies);
                    massProp.AddBodies((dispArray));
                    double bodyMass = massProp.Mass;
                    Debug.Print("Body: " + nextBody.Name + " Mass: " + bodyMass);                  
                }
                break;
            }         
        }

        public DispatchWrapper[] ObjectArrayToDispatchWrapperArray(object[] Objects)
        {
            int ArraySize = 0;
            ArraySize = Objects.GetUpperBound(0);
            DispatchWrapper[] d = new DispatchWrapper[ArraySize + 1];
            int ArrayIndex = 0;
            for (ArrayIndex = 0; ArrayIndex <= ArraySize; ArrayIndex++)
            {
                d[ArrayIndex] = new DispatchWrapper(Objects[ArrayIndex]);
            }
            return d;
        }        
    }
}
A sample part:
image.png

The results:

Body: Tube (square) TS2X2X0.1875(1) Mass: 1.08582871900086
Body: Mirror2[2] Mass: 0.0649513950420028
Body: 9/16 (0.5625) Diameter Hole1[1] Mass: 0.0649513950420025
Body: Mirror2[1] Mass: 0.0649513950420026
Body: 9/16 (0.5625) Diameter Hole1[2] Mass: 0.064951395042003

Basically, you use the FeatureManager object to get the BodyFolder for the solid bodies in the model and then loop through each body in the folder passing it to the AddBodies method of the MassProperty object.

Re: Body Mass in Part

Posted: Wed Feb 28, 2024 12:49 am
by senuba
JSculley wrote: Tue Feb 27, 2024 11:38 am Here's a C# macro that will print the mass of each body in a multi-body part:

Code: Select all

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System.Runtime.InteropServices;
using System;
using System.Diagnostics;

namespace BodyWeights.csproj
{
    public partial class SolidWorksMacro
    {
        /// <summary>
        ///  The SldWorks swApp variable is pre-assigned for you.
        /// </summary>
        public SldWorks swApp;      

        public void Main()
        {
            ModelDoc2 mDoc = swApp.ActiveDoc as ModelDoc2;
            ModelDocExtension mExt = mDoc.Extension;
            MassProperty massProp = mExt.CreateMassProperty() as MassProperty;
            massProp.UseSystemUnits = false;
            FeatureManager fMgr = mDoc.FeatureManager;
            object[] featObjArray = fMgr.GetFeatures(false) as object[];
            foreach (object o in featObjArray)
            {
                Feature nextFeat = o as Feature;
                if (!nextFeat.GetTypeName2().Equals("SolidBodyFolder"))
                {
                    continue;
                }
                BodyFolder bFolder = nextFeat.GetSpecificFeature2() as BodyFolder;
                object[] bodyObjArray = bFolder.GetBodies() as object[];
                foreach (object b in bodyObjArray)
                {
                    Body2 nextBody = b as Body2;
                    object[] vBodies = new object[1];
                    vBodies[0] = nextBody;
                    DispatchWrapper[] dispArray = ObjectArrayToDispatchWrapperArray(vBodies);
                    massProp.AddBodies((dispArray));
                    double bodyMass = massProp.Mass;
                    Debug.Print("Body: " + nextBody.Name + " Mass: " + bodyMass);                  
                }
                break;
            }         
        }

        public DispatchWrapper[] ObjectArrayToDispatchWrapperArray(object[] Objects)
        {
            int ArraySize = 0;
            ArraySize = Objects.GetUpperBound(0);
            DispatchWrapper[] d = new DispatchWrapper[ArraySize + 1];
            int ArrayIndex = 0;
            for (ArrayIndex = 0; ArrayIndex <= ArraySize; ArrayIndex++)
            {
                d[ArrayIndex] = new DispatchWrapper(Objects[ArrayIndex]);
            }
            return d;
        }        
    }
}
A sample part:image.png


The results:

Body: Tube (square) TS2X2X0.1875(1) Mass: 1.08582871900086
Body: Mirror2[2] Mass: 0.0649513950420028
Body: 9/16 (0.5625) Diameter Hole1[1] Mass: 0.0649513950420025
Body: Mirror2[1] Mass: 0.0649513950420026
Body: 9/16 (0.5625) Diameter Hole1[2] Mass: 0.064951395042003

Basically, you use the FeatureManager object to get the BodyFolder for the solid bodies in the model and then loop through each body in the folder passing it to the AddBodies method of the MassProperty object.
The result I want is exactly this. How it's written in VBA, the AI couldn't convert it.

Re: Body Mass in Part

Posted: Wed Feb 28, 2024 9:24 am
by JSculley
Here's a VBA version, using PartDoc::GetBodies instead of traversing the feature tree, which shortens the code quite a bit:

Code: Select all

Option Explicit
Dim swApp As SldWorks.SldWorks

Sub main()
    Dim mDoc As ModelDoc2
    Dim pDoc As PartDoc
    Dim mExt As ModelDocExtension
    Dim massProp As MassProperty
    Dim vBodies As Variant
    Dim i As Integer
    Dim bodyMass As Double
    Set swApp = Application.SldWorks
    Set mDoc = swApp.ActiveDoc
    Set pDoc = mDoc
    Set mExt = mDoc.Extension
    Set massProp = mExt.CreateMassProperty
    massProp.UseSystemUnits = False
    vBodies = pDoc.GetBodies2(swBodyType_e.swSolidBody, False)
    For i = 0 To UBound(vBodies)
        Dim nextBod(0) As Body2
        Set nextBod(0) = vBodies(i)
        massProp.AddBodies (nextBod)
        bodyMass = massProp.Mass
        Debug.Print ("Body: " & nextBod(0).Name & " Mass: " & bodyMass)
    Next i
End Sub


Re: Body Mass in Part

Posted: Thu Feb 29, 2024 12:13 am
by senuba
JSculley wrote: Wed Feb 28, 2024 9:24 am Here's a VBA version, using PartDoc::GetBodies instead of traversing the feature tree, which shortens the code quite a bit:

Code: Select all

Option Explicit
Dim swApp As SldWorks.SldWorks

Sub main()
    Dim mDoc As ModelDoc2
    Dim pDoc As PartDoc
    Dim mExt As ModelDocExtension
    Dim massProp As MassProperty
    Dim vBodies As Variant
    Dim i As Integer
    Dim bodyMass As Double
    Set swApp = Application.SldWorks
    Set mDoc = swApp.ActiveDoc
    Set pDoc = mDoc
    Set mExt = mDoc.Extension
    Set massProp = mExt.CreateMassProperty
    massProp.UseSystemUnits = False
    vBodies = pDoc.GetBodies2(swBodyType_e.swSolidBody, False)
    For i = 0 To UBound(vBodies)
        Dim nextBod(0) As Body2
        Set nextBod(0) = vBodies(i)
        massProp.AddBodies (nextBod)
        bodyMass = massProp.Mass
        Debug.Print ("Body: " & nextBod(0).Name & " Mass: " & bodyMass)
    Next i
End Sub

Here it is :) You're awesome. Thank you so much. I've been struggling with this for so long, turns out it's this simple :)

Re: Body Mass in Part

Posted: Thu Feb 29, 2024 9:04 am
by AlexLachance
senuba wrote: Thu Feb 29, 2024 12:13 am Here it is :) You're awesome. Thank you so much. I've been struggling with this for so long, turns out it's this simple :)
If you ever have any other struggles, don't be shy to come here and ask. The community is great in helping each other.