Showing results for 
Search instead for 
Do you mean 
Reply
Solved! Go to solution

Checking type of part on the "fly"?

To all,

 

A (naive!) question related to the type of "part" being active when running an NX open code. I am playing around with a few lines of code which deal with groups. The code must work if the active part is a .sim , a .fem or or a .afm. Tested the code with active part = .sim and so far so good

I am "lauching" the code to be executed after the followign check

 

Dim bCarryOn As Boolean = True
'Dim theBasePart As CAE.CaePart = theSession.Parts.BaseWork 'does not work if it's a .prt If TypeOf theBasePart Is CAE.SimPart Then theSimPart = CType(theBasePart, CAE.SimPart) ElseIf TypeOf theBasePart Is CAE.FemPart Then theFEMPart = CType(theBasePart, CAE.FEMPart) ElseIf TypeOf theBasePart Is CAE.AssyFemPart Then theAFEMPart = CType(theBasePart, CAE.AssyFemPart) Else bCarryOn = False End if

 The snag is when I neend to convert the groups into an array

 

Dim workSimPart As CAE.SimPart = CType(theSession.Parts.BaseWork, CAE.SimPart)
Dim aTheCAEGroups() As CAE.CaeGroup
						
aTheCAEGroups = workSimPart.CaeGroups.ToArray()

 

 

Is there a "smart" way of checking what is the active part? if I was to run the code in a .fem then I think one would have something like

 

Dim workFemPart As CAE.FemPart = CType(theSession.Parts.BaseWork, CAE.FemPart)
aTheCAEGroups = workFemPart.CaeGroups.ToArray()

 

 

The only think I can think of is a "Try loop" one for each type of part

 

Thanks

Regards

Production: NX9.0.3.4, NX10.0.2.6
Development: VB.NET (amateur level !)
3 REPLIES

Re: Checking type of part on the "fly"?

[ Edited ]

Fempart, afmpart and simpart all inherit group methods from caepart. Do one check for a caepart type, then instantiate a caepart and do all of your group operations on the caepart.

 

I would typically do something like:

 

Dim caePart As CAE.CaePart = TryCast(theSession.Parts.BaseWork, CAE.CaePart)
If caePart Is Nothing Then
    theNXMessageBox.Show("My App Name", NXMessageBox.DialogType.Error, "Work part is not a CAE part")
    Return
End If

Dim aTheCAEGroups() As CAE.CaeGroup = caePart.CaeGroups.ToArray()

Re: Checking type of part on the "fly"?

Thaks for that JimB. That's the method I have used to get the  a list group. The issue still appears later in the code when I need to access element and / or node based on a list (of label)

 

If one is is in an .fem part then if you try to "access" and element ID you would define something like

 

fEModel1 = CType(theFEMPart.FindObject("FEModel"), NXOpen.CAE.FEModel)
For Each sitem As String In ListofFEElmLabel
	stemp = "Element[" & sitem &"]"
	Dim fEElement1 As CAE.FEElement = CType(fEModel1.Find(stemp), CAE.FEElement)
	theTaggedObjects(j)= fEElement1
Next sitem

 

 

The idea of using the Find() is to avoid setting an FEelementMap (or Nodemap). I put it in a Try loop. If the Find() does not work then the code just move on to the next one in the list. Maybe I have no choice put to set up the elementmap!

 

If one is in a sim  or .afm then I think one need to figure out the femoccurence, along this line...

Dim fEModelOccurrence1 As CAE.FEModelOccurrence = CType(workSimPart.FindObject("FEModelOccurrence[2]"), CAE.FEModelOccurrence)
For Each sitem As String In ListofFEElmLabel
 stemp = "Element[" & sitem &"]"
 Dim fEElement1 As CAE.FEElement = CType(fEModelOccurrence1.Find(stemp), CAE.FEElement)
 theTaggedObjects(j)= fEElement1
Next sitem

 

(which implies looping though each of the occurences!)

 

Thanks

Regards

Production: NX9.0.3.4, NX10.0.2.6
Development: VB.NET (amateur level !)
Solution
Solution
Accepted by topic author selex_ct
‎12-06-2015 09:16 AM

Re: Checking type of part on the "fly"?

I use a function such as this to get the nodeLabelMap when needed:

 

    Function getNodeLabelMap(ByVal caePart As CAE.CaePart) As CAE.FENodeLabelMap

        getNodeLabelMap = Nothing

        If TypeOf caePart Is CAE.FemPart Then
            Dim femPart As CAE.FemPart = CType(caePart, CAE.FemPart)
            getNodeLabelMap = femPart.BaseFEModel.FenodeLabelMap
        End If

        If TypeOf caePart Is CAE.SimPart Then
            Dim simPart As CAE.SimPart = CType(caePart, CAE.SimPart)
            getNodeLabelMap = simPart.Simulation.Femodel.FenodeLabelMap
        End If

    End Function

 

And a similar function for elementLabelMap.