Hy alltogether,
i tried to sync the Routing attributes from the part to the assembly.
It works pretty good if i use properties inside NX.
I recordet a Journal to see what happend and have a look into net.ref.
What i tried out is the following Code but it didn´t work.
Sub Main(ByVal args() As String)
Dim theSession As Session = Session.GetSession()
Dim workPart As Part = theSession.Parts.Work
Dim lw As ListingWindow = theSession.ListingWindow
lw.Open()
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Start")
Dim cw As ComponentAssembly = workPart.ComponentAssembly
If Not IsNothing(cw.RootComponent) Then
For Each child As Component In cw.RootComponent.GetChildren()
Dim objects1(0) As NXObject
objects1(0) = child
Dim assembliesGeneralPropertiesBuilder1 As Assemblies.AssembliesGeneralPropertiesBuilder
assembliesGeneralPropertiesBuilder1 = workPart.PropertiesManager.CreateAssembliesGeneralPropertiesBuilder(objects1)
assembliesGeneralPropertiesBuilder1.SynchronizeAttributes()
Dim markId2 As Session.UndoMarkId
markId2 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Komponente Eigenschaften")
theSession.DeleteUndoMark(markId2, Nothing)
Dim markId3 As Session.UndoMarkId
markId3 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Komponente Eigenschaften")
Dim nXObject1 As NXObject
nXObject1 = assembliesGeneralPropertiesBuilder1.Commit()
'workPart.PartPreviewMode = BasePart.PartPreview.None
Dim id1 As Session.UndoMarkId
id1 = theSession.GetNewestUndoMark(Session.MarkVisibility.Visible)
Dim nErrs1 As Integer
nErrs1 = theSession.UpdateManager.DoUpdate(id1)
theSession.DeleteUndoMark(markId3, Nothing)
theSession.SetUndoMarkName(id1, "Komponente Eigenschaften")
assembliesGeneralPropertiesBuilder1.Destroy()
Next
End If
End Sub
Can somebody help please.
Thanks Hagen
re: synchronize attributes
I'm not familiar with the routing application. Do the routing attributes show up as part attributes or are they applied directly to the routing objects?
Yes, if you open item as
Yes, if you open item as display part or sync attributes you can see it under properties - attributes.
I work also with workpart.getuserattribute and everthing is fine.
If I reopen assembly and rightklick the part, choose property - attribute it is empty.
In this case I need to sync them to the assembly.
I hope I discribed it in the right way.
Thanks Hagen
NX 9 and Team Center 10
re: synchronize attributes
When you right click on a subassembly in the assembly navigator and choose: properties -> assembly -> synchronize subassembly properties, there are options for "layers", "display", and "attributes". Is this the same 'synchronize attributes' that you want to accomplish with the API?
Or did you have something else in mind?
Yes this is exactly what I
Yes this is exactly what I want to do.
NX 9 and Team Center 10
re: synchronize attributes
From what I can see, the "synchronize attributes" command is only valid to use on subassemblies. The code below looks for subassmeblies in the currently displayed part and runs the "synchronize attributes" command on them.
Option Strict Off
Imports System
Imports NXOpen
Imports NXOpen.Assemblies
Module Module1
Dim theSession As Session = Session.GetSession()
Dim lw As ListingWindow = theSession.ListingWindow
Dim workPart As Part = theSession.Parts.Work
Dim dispPart As Part = theSession.Parts.Display
Sub Main()
If IsNothing(theSession.Parts.BaseWork) Then
'active part required
Return
End If
lw.Open()
Const undoMarkName As String = "Synchronize Attributes"
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, undoMarkName)
Try
Dim c As ComponentAssembly = dispPart.ComponentAssembly
If Not IsNothing(c.RootComponent) Then
ProcessComponentChildren(c.RootComponent)
End If
Catch e As Exception
theSession.ListingWindow.WriteLine("Failed: " & e.ToString)
End Try
lw.Close()
End Sub
Sub ProcessComponentChildren(ByVal comp As Component)
For Each child As Component In comp.GetChildren()
If child.GetChildren.Length <> 0 Then
'*** this is a subassembly, add code specific to subassemblies
Dim objects1(0) As NXObject
objects1(0) = child
Dim assembliesGeneralPropertiesBuilder1 As Assemblies.AssembliesGeneralPropertiesBuilder
assembliesGeneralPropertiesBuilder1 = dispPart.PropertiesManager.CreateAssembliesGeneralPropertiesBuilder(objects1)
assembliesGeneralPropertiesBuilder1.SynchronizeAttributes()
Dim nXObject1 As NXObject
nXObject1 = assembliesGeneralPropertiesBuilder1.Commit()
Dim id1 As Session.UndoMarkId
id1 = theSession.GetNewestUndoMark(Session.MarkVisibility.Visible)
Dim nErrs1 As Integer
nErrs1 = theSession.UpdateManager.DoUpdate(id1)
assembliesGeneralPropertiesBuilder1.Destroy()
End If
ProcessComponentChildren(child)
Next
End Sub
Public Function GetUnloadOption(ByVal dummy As String) As Integer
'Unloads the image immediately after execution within NX
GetUnloadOption = NXOpen.Session.LibraryUnloadOption.Immediately
End Function
End Module
Thank you so much.
Thank you so much.
The code works great. The only thing is that you raise an exception if a subassembly is unload.
This is not important for me and i can solve my self if nessesary.
Is only an information if somebody else will use it.
Thanks Hagen
NX 9 and Team Center 10
re: synchronize attributes
Yes, I noticed that during my testing, but forgot to mention it in the description above. Thanks for the reminder.