ChaseWichert
Mining
- Jan 4, 2012
- 147
I am trying to find a way to create 100 step files that will be used in a rendering. I found code by Cowski, and modified it to make it loop through the number of "Frames" which will update an expression, and then export the resulting body as a step. However on the second loop I get a Memory Access Violation on Line 93 or the step214Creator1.Destroy().
NX 8.5.2.3
Code:
'Purpose: automate STEP export of the following entities:
'Layer 1 - Solids
'Layer 4 - Solids
'Layer 5 - Solids
'Layer 41 - Lines
'Layer 44 - Points
'Layer 63 - Solids
'eng-tips thread561-321704
'May 11, 2012
Option Strict Off
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports System.Threading
Module Module1
Dim theSession As Session = Session.GetSession()
Dim workPart As Part = theSession.Parts.Work
Dim displayPart As Part = theSession.Parts.Display
Dim lw As ListingWindow = theSession.ListingWindow
Sub Main()
lw.Open()
Dim mySelectedObjects As New List(Of NXObject)
Dim tempSelectedObjects() As NXObject
Dim step214File As String
Dim outputPath As String = IO.Path.GetDirectoryName(workPart.FullPath)
Dim STEP214UG_DIR As String = theSession.GetEnvironmentVariableValue("STEP214UG_DIR")
step214File = IO.Path.Combine(STEP214UG_DIR, "ugstep214.def")
If Not IO.File.Exists(step214File) Then
MsgBox("The step214 settings file (ugstep214.def) was not found." & vbCrLf & _
"This journal will now exit.", vbOKOnly + vbCritical)
Exit Sub
Else
'lw.WriteLine("STEP214 definition file found at: " & step214File)
End If
Dim intFrameCount As Integer = 0
Dim intFrameTotal As Integer = InputBox("How many frames do you want?")
Dim a As Integer = 0
Dim filename As String = InputBox("Input .stp Filename")
Dim outputfile As String
Dim step214Creator1 As Step214Creator
Do Until intFrameCount = intFrameTotal
outputFile = IO.Path.Combine(outputPath, filename & intFrameCount & ".stp")
Dim FrameNumber As Expression = CType(workPart.Expressions.FindObject("FrameNumber"), Expression)
'MsgBox(workPart.Expressions.GetAttributeExpression(CType(workPart.Expressions.FindObject("FrameNumber"), NXObject),,NXObject.AttributeType.String)
workPart.Expressions.EditWithUnits(FrameNumber, Nothing, intFrameCount)
AddSolidsFromLayer(1, mySelectedObjects)
'add lines from layer 41
'tempSelectedObjects = workPart.Layers.GetAllObjectsOnLayer(41)
'For Each obj As NXObject In tempSelectedObjects
' If TypeOf obj Is Line Then
' mySelectedObjects.Add(obj)
' End If
'Next
' 'add points from layer 44
' tempSelectedObjects = workPart.Layers.GetAllObjectsOnLayer(44)
' For Each obj As NXObject In tempSelectedObjects
' If TypeOf obj Is Point Then
' mySelectedObjects.Add(obj)
' End If
'Next
'export to STEP214 file
step214Creator1 = theSession.DexManager.CreateStep214Creator()
step214Creator1.SettingsFile = step214File
step214Creator1.ObjectTypes.Solids = True
step214Creator1.LayerMask = "1-256"
step214Creator1.InputFile = workPart.FullPath
step214Creator1.OutputFile = outputFile
step214Creator1.FileSaveFlag = False
step214Creator1.ExportSelectionBlock.SelectionScope = ObjectSelector.Scope.SelectedObjects
Dim added1 As Boolean
added1 = step214Creator1.ExportSelectionBlock.SelectionComp.Add(mySelectedObjects.ToArray)
Dim nXObject1 As NXObject
nXObject1 = step214Creator1.Commit()
step214Creator1.Destroy()
intFrameCount = intFrameCount + 1
'Thread.Sleep(5000)
Loop
End Sub
Sub AddSolidsFromLayer(ByVal layer As Integer, ByRef objList As List(Of NXObject))
Dim tempselectedobjects() As NXObject
Dim tempSolidObj As Body
tempselectedobjects = workPart.Layers.GetAllObjectsOnLayer(layer)
'filter out the solid bodies on the layer and add them to the export list
For Each obj As NXObject In tempselectedobjects
If TypeOf obj Is Body Then
tempSolidObj = CType(obj, Body)
If tempSolidObj.IsSolidBody Then
objList.Add(tempSolidObj)
End If
End If
Next
End Sub
Function SelectObjects(ByVal prompt As String, _
ByRef selObj As NXObject()) As Selection.Response
Dim theUI As UI = UI.GetUI
Dim typeArray() As Selection.SelectionType = _
{Selection.SelectionType.All}
Dim resp As Selection.Response = theUI.SelectionManager.SelectObjects( _
prompt, "Select Objects for STEP Export", _
Selection.SelectionScope.WorkPart, _
False, typeArray, selObj)
If resp = Selection.Response.ObjectSelected Or _
resp = Selection.Response.ObjectSelectedByName Or _
resp = Selection.Response.Ok Then
Return Selection.Response.Ok
Else
Return Selection.Response.Cancel
End If
End Function
Public Function GetUnloadOption(ByVal dummy As String) As Integer
'Unloads the image when the NX session terminates
GetUnloadOption = NXOpen.Session.LibraryUnloadOption.AtTermination
End Function
End Module
NX 8.5.2.3