Forums:
The code I copied from http://www.nxjournaling.com/content/creating-bounding-box-arround-solid is very good but it is accurate when applied to the displayed part only. In the assembly mode, it is not accurate as it does not create box around the correct directions.In other words, the box dimensions reported in displayed-part mode and assembly mode are not the same. How should the code be adjusted so the dimensions in assembly mode is the same as the displayed part mode?
Option Strict Off Imports System Imports NXOpen Imports NXOpen.UI Imports NXOpen.Utilities Imports NXOpen.UF Module make_bounding_block_of_selected_body_relative_to_wcs Dim s As Session = Session.GetSession() Dim ufs As UFSession = UFSession.GetUFSession() Dim lw As ListingWindow = s.ListingWindow() Sub Main() Dim a_body As NXOpen.Tag = NXOpen.Tag.Null Dim csys As NXOpen.Tag = NXOpen.Tag.Null Dim target As NXOpen.Tag = NXOpen.Tag.Null Dim blockFeature As NXOpen.Tag = NXOpen.Tag.Null Dim min_corner(2) As Double Dim directions(2, 2) As Double Dim distances(2) As Double Dim edge_len(2) As String While select_a_body(a_body) = Selection.Response.Ok ufs.Csys.AskWcs(csys) ufs.Modl.AskBoundingBoxExact(a_body, csys, min_corner, directions, _ distances) lw.Open() lw.WriteLine("Min_corner: " & _ min_corner(0).ToString & ", " & _ min_corner(1).ToString & ", " & _ min_corner(2).ToString & ", ") lw.WriteLine("X direction: " & _ directions(0, 0).ToString & ", " & _ directions(0, 1).ToString & ", " & _ directions(0, 2).ToString & ", ") lw.WriteLine("X distance: " & _ distances(0).ToString) lw.WriteLine("Y direction: " & _ directions(1, 0).ToString & ", " & _ directions(1, 1).ToString & ", " & _ directions(1, 2).ToString & ", ") lw.WriteLine("Y distance: " & _ distances(1).ToString) lw.WriteLine("Z direction: " & _ directions(2, 0).ToString & ", " & _ directions(2, 1).ToString & ", " & _ directions(2, 2).ToString & ", ") lw.WriteLine("Z distance: " & _ distances(2).ToString) edge_len(0) = distances(0).ToString() edge_len(1) = distances(1).ToString() edge_len(2) = distances(2).ToString() ufs.Modl.CreateBlock(FeatureSigns.Nullsign, _ target, min_corner, edge_len, blockFeature) End While End Sub Function select_a_body(ByRef a_body As NXOpen.Tag) As Selection.Response Dim message As String = "Select a body" Dim title As String = "Select a body" Dim scope As Integer = UFConstants.UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY Dim response As Integer Dim view As NXOpen.Tag Dim cursor(2) As Double Dim ip As UFUi.SelInitFnT = AddressOf body_init_proc ufs.Ui.LockUgAccess(UFConstants.UF_UI_FROM_CUSTOM) Try ufs.Ui.SelectWithSingleDialog(message, title, scope, ip, _ Nothing, response, a_body, cursor, view) Finally ufs.Ui.UnlockUgAccess(UFConstants.UF_UI_FROM_CUSTOM) End Try If response <> UFConstants.UF_UI_OBJECT_SELECTED And _ response <> UFConstants.UF_UI_OBJECT_SELECTED_BY_NAME Then Return Selection.Response.Cancel Else ufs.Disp.SetHighlight(a_body, 0) Return Selection.Response.Ok End If End Function Function body_init_proc(ByVal select_ As IntPtr, _ ByVal userdata As IntPtr) As Integer Dim num_triples As Integer = 1 Dim mask_triples(0) As UFUi.Mask mask_triples(0).object_type = UFConstants.UF_solid_type mask_triples(0).object_subtype = UFConstants.UF_solid_body_subtype mask_triples(0).solid_type = UFConstants.UF_UI_SEL_FEATURE_BODY ufs.Ui.SetSelMask(select_, _ UFUi.SelMaskAction.SelMaskClearAndEnableSpecific, _ num_triples, mask_triples) Return UFConstants.UF_UI_SEL_SUCCESS End Function Public Function GetUnloadOption(ByVal dummy As String) As Integer GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY End Function