Jonatasrf
Mechanical
- Aug 7, 2017
- 13
How to change specific colors of models in an assembly quickly in NX?
Would you like to open each component with macro, change the color and return to the main assembly?
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Option Strict Off
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.Utilities
Imports NXOpen.Assemblies
Imports NXOpen.UF
Imports NXOpenUI
Module MoveComponents
Dim theSession As Session = Session.GetSession()
Public ufs As UFSession = UFSession.GetUFSession()
Dim lw As ListingWindow = theSession.ListingWindow
Dim layerNumber as Integer = 250
Dim newlayer as Integer = 1
Dim i as integer = 0
Dim myobjects as DisplayableObject()
Dim allObjects as NXObject()
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)
ReportComponentChildren1(c.RootComponent, 0)
end if
Catch e As Exception
theSession.ListingWindow.WriteLine("Failed: " & e.ToString)
End Try
lw.Close
workpart.Save(BasePart.SaveComponents.True, BasePart.CloseAfterSave.false)
End Sub
'*****************************************************************************************
' EMPTY RUN
'*****************************************************************************************
Sub reportComponentChildren( ByVal comp As Component, ByVal indent As Integer)
Dim workPart As Part = theSession.Parts.Work
Dim dispPart As Part = theSession.Parts.Display
For Each child As Component In comp.GetChildren()
Dim MyPart As Part = child.Prototype.OwningPart
Try
if child.IsSuppressed = true then
lw.writeline(" Error: " & child.DisplayName & ".prt" & " -> " & "part is closed")
Continue for
end if
Catch e1 As Exception
theSession.ListingWindow.WriteLine("Failed: " & e1.ToString)
end try
If LoadComponent(child) Then
Else
'component could not be loaded
End If
reportComponentChildren(child, indent+1)
Next
End Sub
'*****************************************************************************************
' Changing colors
'*****************************************************************************************
Sub reportComponentChildren1( ByVal comp As Component, ByVal indent As Integer)
Dim workPart As Part = theSession.Parts.Work
Dim dispPart As Part = theSession.Parts.Display
For Each child As Component In comp.GetChildren()
Dim MyPart As Part = child.Prototype.OwningPart
Try
if child.IsSuppressed = true then
'lw.writeline(" Error: " & child.DisplayName & ".prt" & " -> " & "part is closed")
Continue for
end if
Catch e11 As Exception
theSession.ListingWindow.WriteLine("Failed: " & e11.ToString)
end try
Dim theFaces1 As New List(Of Face)
Dim theFaces2 As New List(Of Face)
If LoadComponent(child) Then
For Each theBody As Body In myPart.Bodies
Dim bodyFaces() As Face
bodyFaces = theBody.GetFaces
For Each tempFace As Face In bodyFaces
If tempFace.Color = 78 Then
theFaces1.Add(tempFace)
else if tempFace.Color = 181 Then
theFaces2.Add(tempFace)
End If
Next
Next
Dim displayModification1 As DisplayModification
displayModification1 = theSession.DisplayManager.NewDisplayModification()
displayModification1.ApplyToAllFaces = true
displayModification1.ApplyToOwningParts = False
displayModification1.NewColor = 36
For Each tempFace As Face In theFaces1
Dim objects1(0) As DisplayableObject
Dim face1 As Face
face1 = tempFace
objects1(0) = face1
displayModification1.Apply(objects1)
Next
displayModification1.Dispose()
Dim displayModification2 As DisplayModification
displayModification2 = theSession.DisplayManager.NewDisplayModification()
displayModification2.ApplyToAllFaces = true
displayModification2.ApplyToOwningParts = False
displayModification2.NewColor = 211
For Each tempFace As Face In theFaces2
Dim objects1(0) As DisplayableObject
Dim face1 As Face
face1 = tempFace
objects1(0) = face1
displayModification2.Apply(objects1)
Next
displayModification2.Dispose()
Else
'component could not be loaded
End If
reportComponentChildren1(child, indent+1)
Next
End Sub
'**********************************************************
' FUNCTION TO LOAD COMPONENTS
'**********************************************************
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
if ex2.message = "File not found" then
lw.WriteLine("Error: " & partname & " " & "File not found")
else
lw.WriteLine("Error: " & partname & " " & ex2.Message)
end if
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