Quantcast
Channel: NX Journaling - Journaling / NXOpen API
Viewing all articles
Browse latest Browse all 783

Mirrored/Linked bodies not exporting

$
0
0

I've written a script to loop over all the bodies in an assembly and identify ones that match a certain NX_material string. These are then exported as STLs later.

However, parts that appear to be links/mirrors (I don't know the right NX terminology) are not exported, only the root part is exported.

As I loop over the bodies, though, and set the setHighlight flag to "1", all the mirrored/linked parts are highlighted, for a given body, but later, the ExportSTL call only exports one of these.

How can I export all occurrences (?) of this part.

Here's the full VB script with a few sensitive pieces of information removed:

Option Strict Off
Imports System
Imports System.ThreadingImports System.Collections.GenericImports NXOpen
Imports NXOpen.UFImports NXOpen.AssembliesImports NXOpen.Features 
Module Module1
 
    Dim theSession As Session = Session.GetSession()Dim theUfSession As UFSession = UFSession.GetUFSession()Dim lw As ListingWindow = theSession.ListingWindow 
	Dim bCheckIfFullyLoaded AsBoolean=FalseDim stlOutFileName AsString="C:/This/is/a/path"Dim qualifiers AsString=""Dim materialList AsNew List(OfString)From{"Material_name_1", "Material_name_2"} 
 
	Dim bWriteSTL AsBoolean=FalseDim bWriteAsIndividualFiles AsBoolean=False 
    Sub Main() 
        If IsNothing(theSession.Parts.BaseWork)Then'active part requiredReturnEndIf 
        Dim workParts AsNew List(Of Part)ForEach tempPart As Part In theSession.Parts'Dim c As ComponentAssembly = tempPart.ComponentAssembly
			workParts.Add(tempPart)Next 
        lw.Open() 
        Const undoMarkName AsString="export solids to STL"Dim markId1 As Session.UndoMarkId
        markId1 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, undoMarkName) 
        Dim theSolids AsNew List(Of Body) 
        'collect the solid bodies in the work part 
		ForEach part As Part in workParts
			Dim isLoadead AsBoolean= part.IsFullyLoaded()Dim partDesc AsString= part.GetStringAttribute("DB_PART_DESC")
			lw.WriteLine(part.Name+" "+ partDesc) 
			If bCheckIfFullyLoaded ThenIf isLoadead Then
					lw.WriteLine(" Fully Loaded")Else
					lw.WriteLine(" Not Fully Loaded")
					lw.WriteLine("  Trying to fully load this part")Try
						part.LoadThisPartFully()Catch ex As Exception
						lw.WriteLine("Error: "+ ex.Message)EndTryEndIfEndIf 
			ForEach body As Body In part.Bodies
				lw.WriteLine("-"+ body.Name)
				theUfSession.Disp.SetHighlight(body.Tag, 0)If body.HasUserAttribute("NX_Material", NXObject.AttributeType.String, 0)ThenDim obj As NXOpen.NXObject.AttributeInformation= body.GetUserAttribute("NX_Material", NXObject.AttributeType.String, -1)Dim material AsString= obj.StringValue 
					lw.WriteLine("... "+ material) 
					Dim bKeepThisBody AsBoolean=FalseDim bContinue =False 
					ForEach mat AsStringIn materialList
						If material.Contains(mat)Then
							bContinue =TrueEndIf 
						' HACK to get a portion of the rollbar selectedIf mat ="SPECIAL_NAME"ThenIf partDesc.Contains("ROLLBAR")And material.Contains("ZERO MASS")Then
								bContinue =TrueEndIfEndIfNext 
 
					If bContinue ThenIf qualifiers <>""ThenForEach feature As Feature in body.GetFeatures()If feature.Name.Contains(qualifiers)
									bKeepThisBody =TrueEndIfNextElse
							bKeepThisBody =TrueEndIf 
						If bKeepThisBody Then
							theUfSession.Disp.SetHighlight(body.Tag, 1)
							theUfSession.Disp.MakeDisplayUpToDate()
							System.Threading.Thread.Sleep(200) 
							theUfSession.Disp.SetHighlight(body.Tag, 0)
							theUfSession.Disp.MakeDisplayUpToDate()
							lw.WriteLine(body.Name)
							theSolids.Add(body)EndIfEndIfEndIfNextNext 
 
		If bWriteSTL ThenIf bWriteAsIndividualFiles
				ForEach body As Body In theSolids
					Dim singleObject AsNew List(Of Body)
					singleObject.Add(body)
					ExportSTL(stlOutFileName +"_"+CStr(body.Tag), singleObject, 0.03)NextElse
				ExportSTL(stlOutFileName, theSolids, 0.03)EndIfEndIf'Try'ExportSTL(workPart.FullPath, theSolids, 0.003, 0.003)'Catch ex As NXException'lw.WriteLine("NX Error: " & ex.Message)'Catch ex As Exception'lw.WriteLine("Error: " & ex.Message)'End Try 
        lw.Close() 
    EndSub 
 
    Sub ExportSTL(ByVal FileName AsString, ByVal theObjects As List(Of Body), ByVal triangleTolerance AsDouble) 
        Dim NumErrors AsIntegerDim FileHandle As IntPtr
        Dim InfoError()As UFStd.StlErrorDim Header, FileBaseName AsStringDim lw As ListingWindow = theSession.ListingWindowDim theUfSession As UFSession = UFSession.GetUFSession()'Dim numNegated As Integer'Dim Negated() As Tag 
		lw.Open()'Negated = Nothing
        InfoError =Nothing 
        FileName = IO.Path.ChangeExtension(FileName, ".stl") 
        FileBaseName = IO.Path.GetFileName(FileName)
        Header ="Header: "& FileBaseName
 
        theUfSession.Std.OpenBinaryStlFile(FileName, False, Header, FileHandle) 
        theUfSession.Ui.SetPrompt("Creating file ... "& FileBaseName &" ...") 
        ForEach temp As Body In theObjects
            If temp.IsSolidBodyThen
				lw.WriteLine(" body is occurrence: "+ temp.IsOccurrence.ToString)Try
					theUfSession.Std.PutSolidInStlFile(FileHandle, Tag.Null, temp.Tag, 0.0, 5.0, triangleTolerance, NumErrors, InfoError)
					theUfSession.Disp.SetHighlight(temp.Tag, 0)Catch ex As Exception
					lw.WriteLine("Error with STL : "+ ex.Message)EndTryEndIfNext 
        theUfSession.Std.CloseStlFile(FileHandle) 
        theUfSession.Ui.SetStatus("File ... "& FileBaseName &" generated ...") 
    EndSub 
    PublicFunction GetUnloadOption(ByVal dummy AsString)AsInteger 
        'Unloads the image immediately after execution within NX
        GetUnloadOption = NXOpen.Session.LibraryUnloadOption.Immediately 
    EndFunction 
EndModule

Viewing all articles
Browse latest Browse all 783

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>