electracomplex
Automotive
- Jan 17, 2014
- 42
At some length, and with forum help I was able to create a dialog box that assigns attributes to solid bodies. This journal (below) calls a primitive input box and I've since had an NX dialog box created with Block UI Styler.
Saving the Block UI Styler dialog box outputs a .vb and .dxi file - I'm not sure where to put those and then how to execute them from within NX.
I'm out of my depth here but can usually tweak some code to get a decent result with help but if this is simply beyond a noob I'd be almost relieved to hear it. If so, then outsourcing it would make the most sense.
But I hate admitting defeat!
Thanks for any insight in advance!
Current journal:
Option Strict Off
Imports NXOpenUI
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.UF
Module Module1
Dim theSession As Session = Session.GetSession()
Dim theUfSession As UFSession = UFSession.GetUFSession()
Dim theUI As UI = UI.GetUI()
Dim lw As ListingWindow = theSession.ListingWindow
Sub Main()
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "body attributes")
lw.Open()
Dim selobj As NXObject
Dim type As Integer
Dim subtype As Integer
Dim theBodies As New List(Of Body)
Dim theUI As UI = UI.GetUI
Dim numsel As Integer = theUI.SelectionManager.GetNumSelectedObjects()
Dim answer As String = ""
'process the preselected bodies
If numsel > 0 Then
For inx As Integer = 0 To numsel - 1
selobj = theUI.SelectionManager.GetSelectedTaggedObject(inx)
theUfSession.Obj.AskTypeAndSubtype(selobj.Tag, type, subtype)
If type = UFConstants.UF_solid_type Then
theBodies.Add(selobj)
End If
Next
Else
'prompt to select bodies
If SelectBodies("Select Bodies to assign attributes", theBodies) = Selection.Response.Cancel Then
Return
End If
End If
For Each temp As Body In theBodies
DeleteAllAttributes(temp)
'input box: prompt and title
answer = NXInputBox.GetInputString("Detail Name", "")
AddBodyAttribute(temp, "DET_NAME", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Detail Number", "")
AddBodyAttribute(temp, "DET_NUMBER", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Material", "")
AddBodyAttribute(temp, "MAT'L", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Stock Size", "")
AddBodyAttribute(temp, "STOCK_SIZE", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Heat Treat", "")
AddBodyAttribute(temp, "HEAT_TREAT", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Surface Finish", "")
AddBodyAttribute(temp, "Surface_Finish", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Vendor", "")
AddBodyAttribute(temp, "VENDOR", answer)
'add other attributes as needed
Next
lw.Close()
End Sub
Function SelectBodies(ByVal prompt As String, ByRef selBod As List(Of Body)) As Selection.Response
Dim theUI As UI = UI.GetUI
Dim title As String = "Select bodies"
Dim includeFeatures As Boolean = False
Dim keepHighlighted As Boolean = False
Dim selAction As Selection.SelectionAction = Selection.SelectionAction.ClearAndEnableSpecific
Dim scope As Selection.SelectionScope = Selection.SelectionScope.WorkPart
Dim selectionMask_array(0) As Selection.MaskTriple
Dim selObj() As TaggedObject
With selectionMask_array(0)
.Type = UFConstants.UF_solid_type
.SolidBodySubtype = UFConstants.UF_UI_SEL_FEATURE_BODY
End With
Dim resp As Selection.Response = theUI.SelectionManager.SelectTaggedObjects(prompt,
title, scope, selAction,
includeFeatures, keepHighlighted, selectionMask_array, selObj)
If resp = Selection.Response.Ok Then
For Each temp As TaggedObject In selObj
selBod.Add(temp)
Next
Return Selection.Response.Ok
Else
Return Selection.Response.Cancel
End If
End Function
Sub AddBodyAttribute(ByVal theBody As Body, ByVal attTitle As String, ByVal attValue As String)
Dim markId4 As Session.UndoMarkId
markId4 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "add body attribute")
Dim attributePropertiesBuilder1 As AttributePropertiesBuilder
attributePropertiesBuilder1 = theSession.AttributeManager.CreateAttributePropertiesBuilder(theSession.Parts.Work, {theBody}, AttributePropertiesBuilder.OperationType.None)
attributePropertiesBuilder1.IsArray = False
attributePropertiesBuilder1.DataType = AttributePropertiesBaseBuilder.DataTypeOptions.String
attributePropertiesBuilder1.Title = attTitle
attributePropertiesBuilder1.StringValue = attValue
Dim nXObject1 As NXObject
nXObject1 = attributePropertiesBuilder1.Commit()
Dim id1 As Session.UndoMarkId
id1 = theSession.GetNewestUndoMark(Session.MarkVisibility.Visible)
Dim nErrs1 As Integer
nErrs1 = theSession.UpdateManager.DoUpdate(id1)
attributePropertiesBuilder1.Destroy()
End Sub
Sub DeleteAllAttributes(ByVal theObject As NXObject)
Dim attributeInfo() As NXObject.AttributeInformation = theObject.GetUserAttributes
For Each temp As NXObject.AttributeInformation In attributeInfo
theObject.DeleteUserAttributes(temp.Type, Update.Option.Now)
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
~Felicia H.
NX 9.0.2.5
"Design all things as simple as possible but not simpler."
Saving the Block UI Styler dialog box outputs a .vb and .dxi file - I'm not sure where to put those and then how to execute them from within NX.
I'm out of my depth here but can usually tweak some code to get a decent result with help but if this is simply beyond a noob I'd be almost relieved to hear it. If so, then outsourcing it would make the most sense.
But I hate admitting defeat!
Thanks for any insight in advance!
Current journal:
Option Strict Off
Imports NXOpenUI
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.UF
Module Module1
Dim theSession As Session = Session.GetSession()
Dim theUfSession As UFSession = UFSession.GetUFSession()
Dim theUI As UI = UI.GetUI()
Dim lw As ListingWindow = theSession.ListingWindow
Sub Main()
Dim markId1 As Session.UndoMarkId
markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "body attributes")
lw.Open()
Dim selobj As NXObject
Dim type As Integer
Dim subtype As Integer
Dim theBodies As New List(Of Body)
Dim theUI As UI = UI.GetUI
Dim numsel As Integer = theUI.SelectionManager.GetNumSelectedObjects()
Dim answer As String = ""
'process the preselected bodies
If numsel > 0 Then
For inx As Integer = 0 To numsel - 1
selobj = theUI.SelectionManager.GetSelectedTaggedObject(inx)
theUfSession.Obj.AskTypeAndSubtype(selobj.Tag, type, subtype)
If type = UFConstants.UF_solid_type Then
theBodies.Add(selobj)
End If
Next
Else
'prompt to select bodies
If SelectBodies("Select Bodies to assign attributes", theBodies) = Selection.Response.Cancel Then
Return
End If
End If
For Each temp As Body In theBodies
DeleteAllAttributes(temp)
'input box: prompt and title
answer = NXInputBox.GetInputString("Detail Name", "")
AddBodyAttribute(temp, "DET_NAME", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Detail Number", "")
AddBodyAttribute(temp, "DET_NUMBER", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Material", "")
AddBodyAttribute(temp, "MAT'L", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Stock Size", "")
AddBodyAttribute(temp, "STOCK_SIZE", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Heat Treat", "")
AddBodyAttribute(temp, "HEAT_TREAT", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Surface Finish", "")
AddBodyAttribute(temp, "Surface_Finish", answer)
'input box: prompt and title
answer = NXInputBox.GetInputString("Vendor", "")
AddBodyAttribute(temp, "VENDOR", answer)
'add other attributes as needed
Next
lw.Close()
End Sub
Function SelectBodies(ByVal prompt As String, ByRef selBod As List(Of Body)) As Selection.Response
Dim theUI As UI = UI.GetUI
Dim title As String = "Select bodies"
Dim includeFeatures As Boolean = False
Dim keepHighlighted As Boolean = False
Dim selAction As Selection.SelectionAction = Selection.SelectionAction.ClearAndEnableSpecific
Dim scope As Selection.SelectionScope = Selection.SelectionScope.WorkPart
Dim selectionMask_array(0) As Selection.MaskTriple
Dim selObj() As TaggedObject
With selectionMask_array(0)
.Type = UFConstants.UF_solid_type
.SolidBodySubtype = UFConstants.UF_UI_SEL_FEATURE_BODY
End With
Dim resp As Selection.Response = theUI.SelectionManager.SelectTaggedObjects(prompt,
title, scope, selAction,
includeFeatures, keepHighlighted, selectionMask_array, selObj)
If resp = Selection.Response.Ok Then
For Each temp As TaggedObject In selObj
selBod.Add(temp)
Next
Return Selection.Response.Ok
Else
Return Selection.Response.Cancel
End If
End Function
Sub AddBodyAttribute(ByVal theBody As Body, ByVal attTitle As String, ByVal attValue As String)
Dim markId4 As Session.UndoMarkId
markId4 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "add body attribute")
Dim attributePropertiesBuilder1 As AttributePropertiesBuilder
attributePropertiesBuilder1 = theSession.AttributeManager.CreateAttributePropertiesBuilder(theSession.Parts.Work, {theBody}, AttributePropertiesBuilder.OperationType.None)
attributePropertiesBuilder1.IsArray = False
attributePropertiesBuilder1.DataType = AttributePropertiesBaseBuilder.DataTypeOptions.String
attributePropertiesBuilder1.Title = attTitle
attributePropertiesBuilder1.StringValue = attValue
Dim nXObject1 As NXObject
nXObject1 = attributePropertiesBuilder1.Commit()
Dim id1 As Session.UndoMarkId
id1 = theSession.GetNewestUndoMark(Session.MarkVisibility.Visible)
Dim nErrs1 As Integer
nErrs1 = theSession.UpdateManager.DoUpdate(id1)
attributePropertiesBuilder1.Destroy()
End Sub
Sub DeleteAllAttributes(ByVal theObject As NXObject)
Dim attributeInfo() As NXObject.AttributeInformation = theObject.GetUserAttributes
For Each temp As NXObject.AttributeInformation In attributeInfo
theObject.DeleteUserAttributes(temp.Type, Update.Option.Now)
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
~Felicia H.
NX 9.0.2.5
"Design all things as simple as possible but not simpler."