Good afternoon, Gentlemen:
Thanks to the wealth of knowledge available here on the forums and on the API help guide, I've been able to generate a macro that will export the mass properties for an assembly from SW to excel. This greatly improves our weight tracking ability.
However, I cannot seem to get the macro to look at both the configuration-specific mass AND the assigned Mass. Assigned mass should, of couse, supercede the configuration-specific mass, but the macro is only outputting the "solved" mass.
I've created a simple assembly to test the functionality of the macro. In it I have the following:
(1) Cylinder with no other configurations (only assigned mass)
(2) Bolts with differing configurations
(3) Thin Blocks. All three are different configurations and two of them have assigned mass.
My attempt here was to capture any possibility the macro might encounter as it pertains to configuration/assigned mass.
The macro does a good of job seeing the different configurations, but if the configuration (or part) has an assigned mass, it ignores it. So for any of the assigned masses, it just shows what SW solves for the mass.
There is something inherently wrong with home I'm doing this as if I put in "(some cell in excel) = MassProp.userDefined" it returns as FALSE for all of them, no matter if it has an assigned mass or not. If I use swMass.UserDefined, it is TRUE for all parts.
I've tried to condense this down as much as possible. The whole code and test assembly is attached.
Components = swAssembly.GetComponents(False) 'False for not just top level components only
Set swModExt = SwModel.Extension
Set MassProp = swModExt.CreateMassProperty
On Error Resume Next
For Each Component In Components
Set SwComp = Component
Set SwCompModel = SwComp.GetModelDoc2 'there is also a SwComp.GetModelDoc2... try if GetModelDoc doesn't work correctly
Set SwCompBody = SwComp.GetBody
Set tmpDocExt = SwCompBody.Extension
Set swMass = SwCompModel.Extension.CreateMassProperty(2, 0) ' 0 = default, 1 = as is, 2 = maximum and second parameter is type of body: 0 = user body, 1 = normal body (2,0)
'Set vMassProp = tmpDocExt.GetMassProperties(2, 0)
If SwComp.GetSuppression <> 0 Then
Bodies = SwComp.GetBodies2(0) 'array for number of bodies
RetBool = MassProp.AddBodies(Bodies) 'vMassProp.AddBodies(Bodies)
RetBool2 = vMassProp.AddBodies(Bodies) 'troubleshooting
RetBool3 = swMass.AddBodies(Bodies) 'troubleshooting
CenOfM = MassProp.CenterOfMass
If IsEmpty(Bodies) = True Then
GoTo LNNext
Else 'If IsEmpty(Bodies) = False Then
'If Bodies > 1 Then GoTo Multi
'Else: GoTo SingleBody
GoTo Multi
End If
Multi: 'If UBound(Bodies) > 1 And LCase(Right(SwComp.GetPathName, 3)) = "asm" Then (TAKEN OUT TO SIMPLIFY CODE DURING TROUBLESHOOTING)
For i = 0 To UBound(Bodies)
If swMass.UserAssigned = True Then 'COMING OUT TRUE FOR ALL PARTS (MassProp.UserAssigned comes out false for all)
nDensity = SwCompModel.Extension.GetUserPreferenceDouble(swUserPreferenceDoubleValue_e.swMaterialPropertyDensity, swUserPreferenceOption_e.swDetailingNoOptionSpecified)
vMassProp = SwCompBody.GetMassProperties(nDensity)
xlsheet.Range("I" & xlCurRow).Value = vMassProp(5) 'MassProp.Mass 'MassProp.Mass 'MassProp.Mass
Else
xlsheet.Range("I" & xlCurRow).Value = "NOPE" 'Just to show if the assigned mass was seen
End If
xlsheet.Range("D" & xlCurRow).Value = vMassProp 'troubleshooting
xlsheet.Range("E" & xlCurRow).Value = vMassProp(5) 'troubleshooting
xlsheet.Range("F" & xlCurRow).Value = vMassProp.Mass 'troubleshooting
xlsheet.Range("G" & xlCurRow).Value = swMass.Mass 'troubleshooting
LNNext: Next Component
.....
I would really appreciate any help you can offer. I've been working on this one issue in this code for a couple weeks and have exhausted my individual abilities. Thank you, everyone.