Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations IFRs on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

Uniting All Objects on a Layer 1

Status
Not open for further replies.

kfraysur

Bioengineer
Feb 4, 2010
42
Is there a function that can be used in a journal to unite all bodies on a given layer? We often have scenarios where we copy all bodies in view to a single layer and then unite all and I am looking to automate this process. I already know how to automate the copying portion, and am hoping that the uniting is similarly simple.

We run NX8. Thanks in advance for any help.
 
Replies continue below

Recommended for you

No, it makes no difference as long as all the bodies are united in the end.
 
Do all the bodies always properly intersect the "target"? There might not be a logical way to do all the unites in a single operation.

Proud Member of the Reality-Based Community..

[green]To the Toolmaker, your nice little cartoon drawing of your glass looks cool, but your solid model sucks. Do you want me to fix it, or are you going to take all week to get it back to me so I can get some work done?[/green]
 
Here's a quick journal. It doesn't do any error checking, we'll have to add code to fix problems as you find them. If one of the solids doesn't intersect the others (and it is not designated as the target), it will disappear and there will be a warning message on the unite feature. This behavior is no different than interactive NX and you can roll back and edit the unite to fix it, so I didn't add any checks/fixes for this. Currently, it unites all the solids on layer 1. Change the value of the myLayer variable to change this.

Code:
[COLOR=green]'Unite all the solid bodies on a given layer[/color]

[COLOR=blue]Option[/color] [COLOR=blue]Strict[/color] [COLOR=blue]Off[/color]  
[COLOR=blue]Imports[/color] System  
[COLOR=blue]Imports[/color] System.Collections.Generic  
[COLOR=blue]Imports[/color] NXOpen  

[COLOR=blue]Module[/color] Module1  

    [COLOR=blue]Sub[/color] Main()  

        [COLOR=blue]Dim[/color] theSession [COLOR=blue]As[/color] Session [COLOR=blue]=[/color] Session.GetSession()  
        [COLOR=blue]Dim[/color] workPart [COLOR=blue]As[/color] Part [COLOR=blue]=[/color] theSession.Parts.Work  
        [COLOR=blue]Dim[/color] myLayer [COLOR=blue]As[/color] [COLOR=blue]Integer[/color] [COLOR=blue]=[/color] 1  

        [COLOR=blue]Dim[/color] bodiesOnLayer [COLOR=blue]As[/color] [COLOR=blue]New[/color] List(Of Body)  

 [COLOR=green]'get list of solid bodies on given layer[/color]
        [COLOR=blue]For[/color] [COLOR=blue]Each[/color] temp [COLOR=blue]As[/color] Body [COLOR=blue]In[/color] workPart.Bodies  
            [COLOR=blue]If[/color] temp.IsSolidBody [COLOR=blue]And[/color] temp.Layer [COLOR=blue]=[/color] myLayer [COLOR=blue]Then[/color]  
                bodiesOnLayer.Add(temp)  
            End [COLOR=blue]If[/color]  
        [COLOR=blue]Next[/color]  

 [COLOR=green]'MsgBox("there are " & bodiesOnLayer.Count & " solid bodies on layer " & myLayer.ToString)[/color]

        [COLOR=blue]Dim[/color] markId1 [COLOR=blue]As[/color] Session.UndoMarkId  
        markId1 [COLOR=blue]=[/color] theSession.SetUndoMark(Session.MarkVisibility.Visible, "Unite solids on layer " [COLOR=blue]&[/color] myLayer.ToString)  

        [COLOR=blue]Dim[/color] nullFeatures_BooleanFeature [COLOR=blue]As[/color] Features.BooleanFeature [COLOR=blue]=[/color] [COLOR=blue]Nothing[/color]  

        [COLOR=blue]Dim[/color] booleanBuilder1 [COLOR=blue]As[/color] Features.BooleanBuilder  
        booleanBuilder1 [COLOR=blue]=[/color] workPart.Features.CreateBooleanBuilderUsingCollector(nullFeatures_BooleanFeature)  

        [COLOR=blue]Dim[/color] scCollector1 [COLOR=blue]As[/color] ScCollector  
        scCollector1 [COLOR=blue]=[/color] booleanBuilder1.ToolBodyCollector  

        booleanBuilder1.Tolerance [COLOR=blue]=[/color] 0.001  

        booleanBuilder1.Operation [COLOR=blue]=[/color] Features.Feature.BooleanType.Unite  

        [COLOR=blue]Dim[/color] added1 [COLOR=blue]As[/color] [COLOR=blue]Boolean[/color]  
        added1 [COLOR=blue]=[/color] booleanBuilder1.Targets.Add(bodiesOnLayer.Item(0))  
bodiesOnLayer.  [COLOR=green]Remove(bodiesOnLayer.Item(0))[/color]

        [COLOR=blue]Dim[/color] scCollector2 [COLOR=blue]As[/color] ScCollector  
        scCollector2 [COLOR=blue]=[/color] workPart.ScCollectors.CreateCollector()  

        [COLOR=blue]Dim[/color] bodies1() [COLOR=blue]As[/color] Body [COLOR=blue]=[/color] bodiesOnLayer.ToArray  
        [COLOR=blue]Dim[/color] bodyDumbRule1 [COLOR=blue]As[/color] BodyDumbRule  
        bodyDumbRule1 [COLOR=blue]=[/color] workPart.ScRuleFactory.CreateRuleBodyDumb(bodies1)  

        [COLOR=blue]Dim[/color] rules1(0) [COLOR=blue]As[/color] SelectionIntentRule  
        rules1(0) [COLOR=blue]=[/color] bodyDumbRule1  
        scCollector2.ReplaceRules(rules1, [COLOR=blue]False[/color])  

        booleanBuilder1.ToolBodyCollector [COLOR=blue]=[/color] scCollector2  

        [COLOR=blue]Dim[/color] nXObject1 [COLOR=blue]As[/color] NXObject  
        nXObject1 [COLOR=blue]=[/color] booleanBuilder1.Commit()  

        booleanBuilder1.Destroy()  


    End [COLOR=blue]Sub[/color]  


    [COLOR=blue]Public[/color] [COLOR=blue]Function[/color] GetUnloadOption(ByVal dummy [COLOR=blue]As[/color] [COLOR=blue]String[/color]) [COLOR=blue]As[/color] [COLOR=blue]Integer[/color]  

 [COLOR=green]'Unloads the image when the NX session terminates[/color]
        GetUnloadOption [COLOR=blue]=[/color] NXOpen.Session.LibraryUnloadOption.AtTermination  

    End [COLOR=blue]Function[/color]  

End [COLOR=blue]Module[/color]


www.nxjournaling.com
 
Cowski that is really excellent. Thank you very much.

All the bodies should be intersecting any time we perform this function, so it should be fine. As you say, the unite function is always something we can edit.

As this worked so well, would it then be possible to subtract all the bodies from another layer from the bodies on the layer that just got united. So, let's say we used what you have already written to unite everything on layer 200. I would want to then subtract some bodies on layer 205 from the united bodies on layer 200. It would be preferable if the bodies used for the subtraction on layer 205 could be kept (like choosing the 'Keep Tool' box in the 'Subtract' interface). Would this work?
 
Change the layerUnite and layerSubtract variables as needed.
This is a lot of cut & paste from the journal recorder, so it could probably stand a little more cleanup but seems to do the job.

Code:
[COLOR=green]'Unite all the solid bodies on a given layer[/color]
[COLOR=green]' then subtract all the solid bodies on a given layer from the resulting solid[/color]

[COLOR=blue]Option[/color] [COLOR=blue]Strict[/color] [COLOR=blue]Off[/color]  
[COLOR=blue]Imports[/color] System  
[COLOR=blue]Imports[/color] System.Collections.Generic  
[COLOR=blue]Imports[/color] NXOpen  

[COLOR=blue]Module[/color] Module1  

    [COLOR=blue]Sub[/color] Main()  

        [COLOR=blue]Dim[/color] theSession [COLOR=blue]As[/color] Session [COLOR=blue]=[/color] Session.GetSession()  
        [COLOR=blue]Dim[/color] workPart [COLOR=blue]As[/color] Part [COLOR=blue]=[/color] theSession.Parts.Work  
        [COLOR=blue]Dim[/color] layerUnite [COLOR=blue]As[/color] [COLOR=blue]Integer[/color] [COLOR=blue]=[/color] 1  
        [COLOR=blue]Dim[/color] layerSubtract [COLOR=blue]As[/color] [COLOR=blue]Integer[/color] [COLOR=blue]=[/color] 2  

        [COLOR=blue]Dim[/color] bodiesOnUniteLayer [COLOR=blue]As[/color] [COLOR=blue]New[/color] List(Of Body)  
        [COLOR=blue]Dim[/color] bodiesOnSubtractLayer [COLOR=blue]As[/color] [COLOR=blue]New[/color] List(Of Body)  

 [COLOR=green]'get list of solid bodies on given layer[/color]
        [COLOR=blue]For[/color] [COLOR=blue]Each[/color] temp [COLOR=blue]As[/color] Body [COLOR=blue]In[/color] workPart.Bodies  
            [COLOR=blue]If[/color] temp.IsSolidBody [COLOR=blue]Then[/color]  
                [COLOR=blue]If[/color] temp.Layer [COLOR=blue]=[/color] layerUnite [COLOR=blue]Then[/color]  
                    bodiesOnUniteLayer.Add(temp)  
                [COLOR=blue]ElseIf[/color] temp.Layer [COLOR=blue]=[/color] layerSubtract [COLOR=blue]Then[/color]  
                    bodiesOnSubtractLayer.Add(temp)  
                End [COLOR=blue]If[/color]  
            End [COLOR=blue]If[/color]  
        [COLOR=blue]Next[/color]  

 [COLOR=green]'Unite solids on specified layer[/color]
        [COLOR=blue]Dim[/color] markId1 [COLOR=blue]As[/color] Session.UndoMarkId  
        markId1 [COLOR=blue]=[/color] theSession.SetUndoMark(Session.MarkVisibility.Visible, "Unite solids on layer " [COLOR=blue]&[/color] layerUnite.ToString)  

        [COLOR=blue]Dim[/color] nullFeatures_BooleanFeature [COLOR=blue]As[/color] Features.BooleanFeature [COLOR=blue]=[/color] [COLOR=blue]Nothing[/color]  

        [COLOR=blue]Dim[/color] booleanBuilder1 [COLOR=blue]As[/color] Features.BooleanBuilder  
        booleanBuilder1 [COLOR=blue]=[/color] workPart.Features.CreateBooleanBuilderUsingCollector(nullFeatures_BooleanFeature)  

        booleanBuilder1.Tolerance [COLOR=blue]=[/color] 0.001  

        booleanBuilder1.Operation [COLOR=blue]=[/color] Features.Feature.BooleanType.Unite  

        [COLOR=blue]Dim[/color] added1 [COLOR=blue]As[/color] [COLOR=blue]Boolean[/color]  
        added1 [COLOR=blue]=[/color] booleanBuilder1.Targets.Add(bodiesOnUniteLayer.Item(0))  
bodiesOnUniteLayer.  [COLOR=green]Remove(bodiesOnUniteLayer.Item(0))[/color]

        [COLOR=blue]Dim[/color] scCollector1 [COLOR=blue]As[/color] ScCollector  
        scCollector1 [COLOR=blue]=[/color] workPart.ScCollectors.CreateCollector()  

        [COLOR=blue]Dim[/color] bodies1() [COLOR=blue]As[/color] Body [COLOR=blue]=[/color] bodiesOnUniteLayer.ToArray  
        [COLOR=blue]Dim[/color] bodyDumbRule1 [COLOR=blue]As[/color] BodyDumbRule  
        bodyDumbRule1 [COLOR=blue]=[/color] workPart.ScRuleFactory.CreateRuleBodyDumb(bodies1)  

        [COLOR=blue]Dim[/color] rules1(0) [COLOR=blue]As[/color] SelectionIntentRule  
        rules1(0) [COLOR=blue]=[/color] bodyDumbRule1  
        scCollector1.ReplaceRules(rules1, [COLOR=blue]False[/color])  

        booleanBuilder1.ToolBodyCollector [COLOR=blue]=[/color] scCollector1  

        [COLOR=blue]Dim[/color] uniteFeature [COLOR=blue]As[/color] Features.BooleanFeature  
        uniteFeature [COLOR=blue]=[/color] booleanBuilder1.Commit()  
        booleanBuilder1.Destroy()  

        MsgBox("united bodies: " [COLOR=blue]&[/color] uniteFeature.GetBodies.Length.ToString)  
        [COLOR=blue]Dim[/color] unitedBody [COLOR=blue]As[/color] Body [COLOR=blue]=[/color] uniteFeature.GetBodies(0)  


 [COLOR=green]'subtract solids from specified layer[/color]
        [COLOR=blue]Dim[/color] markId2 [COLOR=blue]As[/color] Session.UndoMarkId  
        markId2 [COLOR=blue]=[/color] theSession.SetUndoMark(Session.MarkVisibility.Visible, "Subtract solids on layer " [COLOR=blue]&[/color] layerSubtract.ToString)  


        [COLOR=blue]Dim[/color] booleanBuilder2 [COLOR=blue]As[/color] Features.BooleanBuilder  
        booleanBuilder2 [COLOR=blue]=[/color] workPart.Features.CreateBooleanBuilderUsingCollector(nullFeatures_BooleanFeature)  

        booleanBuilder2.Tolerance [COLOR=blue]=[/color] 0.001  

        booleanBuilder2.Operation [COLOR=blue]=[/color] Features.Feature.BooleanType.Subtract  

        booleanBuilder2.CopyTools [COLOR=blue]=[/color] [COLOR=blue]True[/color]  

        [COLOR=blue]Dim[/color] added2 [COLOR=blue]As[/color] [COLOR=blue]Boolean[/color]  
        added2 [COLOR=blue]=[/color] booleanBuilder2.Targets.Add(unitedBody)  

        [COLOR=blue]Dim[/color] scCollector2 [COLOR=blue]As[/color] ScCollector  
        scCollector2 [COLOR=blue]=[/color] workPart.ScCollectors.CreateCollector()  

        [COLOR=blue]Dim[/color] bodies2() [COLOR=blue]As[/color] Body [COLOR=blue]=[/color] bodiesOnSubtractLayer.ToArray  

        [COLOR=blue]Dim[/color] bodyDumbRule2 [COLOR=blue]As[/color] BodyDumbRule  
        bodyDumbRule2 [COLOR=blue]=[/color] workPart.ScRuleFactory.CreateRuleBodyDumb(bodies2)  

        [COLOR=blue]Dim[/color] rules2(0) [COLOR=blue]As[/color] SelectionIntentRule  
        rules2(0) [COLOR=blue]=[/color] bodyDumbRule2  
        scCollector2.ReplaceRules(rules2, [COLOR=blue]False[/color])  

        booleanBuilder2.ToolBodyCollector [COLOR=blue]=[/color] scCollector2  

        [COLOR=blue]Dim[/color] nXObject1 [COLOR=blue]As[/color] NXObject  
        nXObject1 [COLOR=blue]=[/color] booleanBuilder2.Commit()  

        booleanBuilder2.Destroy()  



    End [COLOR=blue]Sub[/color]  


    [COLOR=blue]Public[/color] [COLOR=blue]Function[/color] GetUnloadOption(ByVal dummy [COLOR=blue]As[/color] [COLOR=blue]String[/color]) [COLOR=blue]As[/color] [COLOR=blue]Integer[/color]  

 [COLOR=green]'Unloads the image when the NX session terminates[/color]
        GetUnloadOption [COLOR=blue]=[/color] NXOpen.Session.LibraryUnloadOption.AtTermination  

    End [COLOR=blue]Function[/color]  

End [COLOR=blue]Module[/color]


www.nxjournaling.com
 
Thanks again cowski. I probably won't have too much time to mess around with this today, but I wanted to thank you while the thread was still on the front page.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor