Get Bodies from component groups

Hi,
I want to collect bodies from each component group individually to create wrap geometry, But this is collecting all the bodies in the workpart. Is there anyway to change it only the component from group.

'Collect all Component group detail and Template coordinate system details
Dim GroupList As List(Of ComponentGroup) = New List(Of ComponentGroup)
Dim BodyList As List(Of Body) = New List(Of Body)
Dim PartsList As List(Of Part) = New List(Of Part)
For Each Mygroup As ComponentGroup In workPart.ComponentGroups
If TypeOf Mygroup Is ComponentGroup Then
GroupList.Add(Mygroup)
End If
Next
For Each MyG As ComponentGroup In GroupList
For Each Mycomp As Component In MyG.GetComponents
PartsList.Add(Mycomp.OwningPart)
Next

For Each MyP As Part In PartsList
For Each MyB As Body In AskAllBodies(MyP).ToArray
BodyList.Add(MyB)
Next
Next
lw.WriteLine("Count: " & BodyList.Count.ToString)

'Create Wrap gemotry with bodyList and move to next group
Dim nullFeatures_WrapGeometry As WrapGeometry = Nothing
Dim WrapBuild As Features.WrapGeometryBuilder
WrapBuild = workPart.Features.CreateWrapGeometryBuilder(nullFeatures_WrapGeometry)
WrapBuild.CloseGaps = Features.WrapGeometryBuilder.CloseGapType.NoOffset
WrapBuild.AddOffset.RightHandSide = "0"
WrapBuild.SplitOffset.RightHandSide = "0"
WrapBuild.IsInterpart = True
WrapBuild.DistTol = 0.01
WrapBuild.Associative = False
Dim AddBodies As Boolean = Nothing
AddBodies = WrapBuild.Geometry.Add(BodyList.ToArray)
WrapBuild.PlanesList.Clear(ObjectList.DeleteOption.NoDelete)
Dim NxObj As NXObject
NxObj = WrapBuild.Commit()
Dim MyBrep As Brep = Utilities.NXObjectManager.Get(NxObj.Tag)
MyBrep.SetName("Group_" & MyG.Name)
Dim HideObj() As DisplayableObject = Nothing
HideObj = MyBrep.GetBodies()
theSession.DisplayManager.BlankObjects(HideObj)
workPart.ModelingViews.WorkView.FitAfterShowOrHide(NXOpen.View.ShowOrHideType.HideOnly)
WrapBuild.Destroy()
Next

Function AskAllBodies(ByVal thePart As Part) As List(Of Body)
Dim thebodies As New List(Of Body)
Try
Dim BodyTag As Tag = Tag.Null
Do
ufs.Obj.CycleObjsInPart(thePart.Tag, UFConstants.UF_solid_type, BodyTag)
If BodyTag = Tag.Null Then
Exit Do
End If
Dim theType As Integer, theSubtype As Integer
ufs.Obj.AskTypeAndSubtype(BodyTag, theType, theSubtype)
If theSubtype = UFConstants.UF_solid_body_subtype Then
thebodies.Add(Utilities.NXObjectManager.Get(BodyTag))
End If
Loop While True
Catch ex As NXException
lw.WriteLine(ex.ErrorCode & ex.Message)
End Try
Return thebodies
End Function

I did something similar with this code


Dim J As integer
For Each myFeature As Features.Feature In theSession.Parts.Work.Features.GetFeatures()
If myFeature.FeatureType= "FSET" Then
theUfSession.Modl.AskAllMembersOfSet(myFeature.tag, List_groups, i)
for J = 0 to i - 1
'...
Next
End If
Next

I've not dealt with the "wrap" functions as yet, I assume that you will need the occurrence bodies for this to work correctly. To get the occurrence bodies of a specific component group, 2 different strategies come to mind:

  • Continue using the AskAllBodies function (it returns occurrence bodies of the components and any prototype bodies owned by the assembly); for each body returned, query the .OwningComponent property to see if the component belongs to the component group.
  • Attack the problem from the other direction. Get the components from the desired component group and query the reference set currently used in the assembly. In the component part file, gather up the bodies in the reference set (these will be prototype bodies) then use the .FindOccurrence method to find the corresponding occurrence body in the assembly.

I tend to favor the first option, a couple of easy checks will tell you if the body belongs to a component in the group. The second option would require more code and would probably require the components to be fully loaded.

In either case, be careful will deformed or promoted components (perhaps also wave-linked bodies) as these may need some special handling.