Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

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

Change colors in an assembly 5

Status
Not open for further replies.
Replies continue below

Recommended for you

Are several components. To open each one will take a lot.

Can you open each component automatically and run a macro to replace colors?
 
Right click a component
choose make work part
change the color

Right click next part
choose make work part
change the color

...
 
If you mean change the component color
you can simply color it in the assembly.
 

That's exactly it:

Right click a component
choose make work part
change the color

Right click next part
choose make work part
change the color

...


But, I would like to do this automatically with macro or journal.
 
Sorry I'm wrong these steps change the component specific color
and not the model color. If this what you want you car
Simply use the edit display and color the component directly
without make work part.
 
For coloring the model you need do make display part.
 
You want to change face color in part or in assembly? Because if You change colors from assembly level (make work part) it will be only visible in assembly. Next when You make display part the colors will go back to the previous state.

With best regards
Michael
 
Below is some code I created to process whole assembly and change faces color from 78 to 36 and from 181 to 211.

Code:
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

With best regards
Michael
 
That's exactly what I wanted.
Thank you Michael (@niedzviedz)!!!

Best Regards
Jonatas Fuckner
 
Remember that in this yournal, the colors are only changed in assembly. Not in parts. So if You wanna change them permanently, the code must be different.

With best regards
Michael
 
Hi niedzviedz

I test your journal on an assembly
and the journal run without errors
But when I Scan the assembly to see
what happened I can't see nothing.
 
Since at least the last 6 years there is a option in the "Edit Object Display" dialog to apply the changes to the "Owning part". ( It does exist in NX7.5 but not in NX6)
This will do exactly the same as the "Make displayed part etc etc click-click-click"
The trick is to select "Bodies" and not "Components".

1) Select the body ( Set selection filter to Solid Bodies)
2) Press Ctrl+J
3) select color and tick apply to owning part.
4) OK
Done.
A journal or Macro will not do this much quicker, or with much less clicks.

Regards,
Tomas
 
What are the color numbers You wanna change? Maybe there is a problem? I used 78 to change to 36 and 181 to change to 211. Please provide simply assembly with 2 elements.

With best regards
Michael
 
Niedzwiedz

I have a friend who has color blindness and can not see some colors.
The idea is to paint the design according to the colors that it can differentiate and at the end of the project, in the assembly environment it will paint all the components with the colors that really should be.
But, do not paint in the assembly environment, but in "make display part".
Your Journal did just that. Now I should just change some command lines to change the colors according to our need.

Thank you again!
 
Few years ago, I want to change NX palette color to be the same color we have in Catia (Catai has RGB standard). So I created my CDF file. Each column has a representation of R, G and B value in percentage, when 0 is 0 and 255 is 1. So I create excel file to covert RGB value to NX. After that I created model with cube, and colored his faces with my new colors. Then I exported this file (stp) to power mill, so guys from CAM could check if values are the same as they are in Catia. What We have found out, was that there wasn't the same values. I also exported picture to paint, and it was confirmed - even if You customize your palette, the valueas didn't be the same as RGB You want. So I gave up, I only changed values for Background in drafting to black.

With best regards
Michael
 
The CDF is part specific; as long as you keep the prt file intact, the colors should show up as you specified (regardless of who opens the file). In your situation, exporting to STEP may have changed the colors; I'm not sure how colors are assigned upon export...

www.nxjournaling.com
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor