'Journal to recursively walk through the assembly structure
' will run on assemblies or piece parts
' will step through all components of the displayed part
'NX 7.5, native
'NXJournaling.com February 24, 2012
Option Strict Off
Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.Assemblies
Imports System.Collections.Generic
Module NXJournal
Public theSession As Session = Session.GetSession()
Public ufs As UFSession = UFSession.GetUFSession()
Public lw As ListingWindow = theSession.ListingWindow
Sub Main()
Dim workPart As Part = theSession.Parts.Work
Dim dispPart As Part = theSession.Parts.Display
lw.Open
Try
Dim c As ComponentAssembly = dispPart.ComponentAssembly
if not IsNothing(c.RootComponent) then
ReportComponentChildren(c.RootComponent, 0)
else
lw.WriteLine("Part has no components")
end if
Catch e As Exception
theSession.ListingWindow.WriteLine("Failed: " & e.ToString)
End Try
lw.Close
End Sub
'**********************************************************
Sub reportComponentChildren( ByVal comp As Component, _
ByVal indent As Integer)
Dim dispPart As Part = theSession.Parts.Display
Dim lw As ListingWindow = theSession.ListingWindow
Dim tagList() As NXOpen.Tag
Dim exportFileName As String = Nothing
Dim exportFileName1 As String = Nothing
Dim nazwa as string
Dim path As String
Dim PSversion as integer = 240
Dim layerNumber as Integer = 1
Dim i As Integer = 0
Dim theBodies As New List(Of Body)
Dim inx As Integer = 0
Dim theBodyTags as New List(Of Tag)
For Each child As Component In comp.GetChildren()
If LoadComponent(child) Then
Dim MyPart As Part = child.Prototype.OwningPart
lw.open
theBodyTags.clear()
For each tempBody as Body in mypart.Bodies
if tempBody.Layer = 1 then
theBodytags.Add(tempBody.tag)
end if
Next
' lw.WriteLine("number of bodies found: " & theBodyTags.Count.ToString)
if theBodyTags.Count = 0 then
lw.writeline("no bodies to export")
return
end if
exportFileName = myPart.FullPath
nazwa = myPart.Leaf
path = IO.Path.Combine(IO.Path.GetDirectoryName(myPart.FullPath), "step")
If(Not System.IO.Directory.Exists(Path)) Then
System.IO.Directory.CreateDirectory(Path)
End If
exportFileName = IO.Path.Combine(path, nazwa & ".x_t")
'if this file already exists, delete it
If My.Computer.FileSystem.FileExists(exportFileName) Then
My.Computer.FileSystem.DeleteFile(exportFileName)
End If
Dim numUnexported As Integer
Try
ufs.Ps.ExportLinkedData(theBodyTags.ToArray, theBodyTags.Count, exportFileName, PSversion, Nothing,
numUnexported, Nothing)
Catch ex As NXException
lw.WriteLine("*** ERROR ***")
lw.WriteLine(ex.ErrorCode.ToString & " : " & ex.Message)
End Try
lw.Close()
Else
'component could not be loaded
End If
reportComponentChildren(child, indent + 1)
Next
End Sub
Private Function LoadComponent(ByVal theComponent As Component) As Boolean
Dim thePart As Part = theComponent.Prototype.OwningPart
Dim partName As String = ""
Dim refsetName As String = ""
Dim instanceName As String = ""
Dim origin(2) As Double
Dim csysMatrix(8) As Double
Dim transform(3, 3) As Double
Try
If thePart.IsFullyLoaded Then
'component is fully loaded
Else
'component is partially loaded
End If
Return True
Catch ex As NullReferenceException
'component is not loaded
Try
ufs.Assem.AskComponentData(theComponent.Tag, partName, refsetName, instanceName, origin,
csysMatrix, transform)
Dim theLoadStatus As PartLoadStatus
theSession.Parts.Open(partName, theLoadStatus)
If theLoadStatus.NumberUnloadedParts > 0 Then
Dim allReadOnly As Boolean = True
For i As Integer = 0 To theLoadStatus.NumberUnloadedParts - 1
If theLoadStatus.GetStatus(i) = 641058 Then
'read-only warning, file loaded ok
Else
'641044: file not found
lw.WriteLine("file not found")
allReadOnly = False
End If
Next
If allReadOnly Then
Return True
Else
'warnings other than read-only...
Return False
End If
Else
Return True
End If
Catch ex2 As NXException
lw.WriteLine("error: " & ex2.Message)
Return False
End Try
Catch ex As NXException
'unexpected error
lw.WriteLine("error: " & ex.Message)
Return False
End Try
End Function
'**********************************************************
Public Function GetUnloadOption(ByVal dummy As String) As Integer
Return Session.LibraryUnloadOption.Immediately
End Function
'**********************************************************
End Module