Read Hole Callout

Hi,

I am trying to read drawing dimensions to a table. I used workPart.Dimensions.ToArray() method. Linear dimensions fine. However, dimensions that made with "hole callout" have more than one entity in the array. For example, a general hole will have three dimensions in the array (HoleDimension 119341, RadiusDimension 160698, RadiusDimension 160672). Is in NX Open or UG Open a function that bound these dimensions?

Thank you,

You can check the type of the dimension, hole callouts will be type: Annotations.HoleDimension. You can use the HoleDimension properties/methods and/or the RadialDimensionBuilder to get information about the hole callout.

yes I am using radialdimensionbuilder to get information about the hole callout. But when I returning to my original array I still have 2 entities in there which I have to pull out. I can lop it and compare information I got from radialdimensionbuilder and get rid of this entities. However, is there an easier way?

ntr

I don't see a good way in the API to tell which dimensions belong to a particular hole dimension. However, I did come up with a method that seems to work. It needs more testing; if you find a situation where it gives incorrect results, please post back or email me.

The journal below will look through the dimensions in the work part. If a hole dimension is found, it will look for dimensions with no lines associated with it. These dimensions will be assumed to be "internal" to the hole dimension.

Option Strict Off
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.UF
 
Module Module2
 
    Sub Main()
 
        Dim theSession As Session = Session.GetSession()
        Dim theUfSession As UFSession = UFSession.GetUFSession()
        If IsNothing(theSession.Parts.BaseWork) Then
            'active part required
            Return
        End If
 
        Dim workPart As Part = theSession.Parts.Work
        Dim lw As ListingWindow = theSession.ListingWindow
        lw.Open()
 
        Const undoMarkName As String = "NXJ journal"
        Dim markId1 As Session.UndoMarkId
        markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, undoMarkName)
 
        Dim partDimensions As New List(Of Annotations.Dimension)
        Dim holeDimensions As New Dictionary(Of Annotations.Dimension, List(Of Annotations.Dimension))
        Dim theHoleDim As Annotations.HoleDimension = Nothing
        Dim holeDimFound As Boolean = False
        For Each tempDim As Annotations.Dimension In workPart.Dimensions
 
            If TypeOf (tempDim) Is Annotations.HoleDimension Then
                holeDimFound = True
                partDimensions.Add(tempDim)
                theHoleDim = tempDim
                holeDimensions.Add(theHoleDim, New List(Of Annotations.Dimension))
                Continue For
            End If
 
 
            If holeDimFound Then
                'any dimensions after a hole dimension that do not
                'have line or arrow blocks belong to the hole dimension
                Dim numBlock(4) As Integer
                theUfSession.Drf.AskNumberBlocks(tempDim.Tag, numBlock)
 
                If numBlock(0) = 0 Then
                    'dimension is used by the hole dimension
                    If holeDimensions.ContainsKey(theHoleDim) Then
                        holeDimensions.Item(theHoleDim).Add(tempDim)
                    End If
 
                Else
                    'this dimension does not belong to the previous hole dimension
                    'reset the "hole dimension found" flag
                    holeDimFound = False
                    partDimensions.Add(tempDim)
                End If
            Else
                partDimensions.Add(tempDim)
            End If
 
        Next
 
 
        'report the dimensions found
        lw.WriteLine("part dimensions shown (main dim text shown)")
        For Each tempDim As Annotations.Dimension In partDimensions
 
            lw.WriteLine("tag: " & tempDim.Tag.ToString)
            lw.WriteLine("type: " & tempDim.GetType.ToString)
 
            Dim mainText() As String = Nothing
            Dim dualText() As String = Nothing
            tempDim.GetDimensionText(mainText, dualText)
            For Each tempLine As String In mainText
                lw.WriteLine("text: " & tempLine)
            Next
 
            lw.WriteLine("")
 
        Next
 
        lw.WriteLine("")
        lw.WriteLine("hole dimensions found")
        For Each kvp As KeyValuePair(Of Annotations.Dimension, List(Of Annotations.Dimension)) In holeDimensions
            lw.WriteLine("tag: " & kvp.Key.Tag.ToString)
            lw.WriteLine("type: " & kvp.Key.GetType.ToString)
 
            Dim mainText() As String = Nothing
            Dim dualText() As String = Nothing
            kvp.Key.GetDimensionText(mainText, dualText)
            For Each tempLine As String In mainText
                lw.WriteLine("text: " & tempLine)
            Next
 
            lw.WriteLine("internal dims:")
            For Each temp As Annotations.Dimension In kvp.Value
                lw.WriteLine("  tag: " & temp.Tag.ToString)
                lw.WriteLine("  type: " & temp.GetType.ToString)
 
                Dim mainText2() As String = Nothing
                Dim dualText2() As String = Nothing
                temp.GetDimensionText(mainText2, dualText2)
                For Each tempLine As String In mainText2
                    lw.WriteLine("  text: " & tempLine)
                Next
 
            Next
            lw.WriteLine("")
 
        Next
 
        lw.Close()
 
    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

Thank you, I will look thru the code.

ntr

Thank you again for your solution. However, I decided to go with NXObject firstObject = firstAssociativity.FirstObject; to define holecallout members in the dimension array I ask for an Associative object. Holecallout members reference arcs with 0 0 coordinates and/or lines that start from 0 0.
For now I sort the dimension array based on that principle. But I am still looking for the improvement.
Thank you

ntr

After chatting with GTAC, I found out that the dimensions used by the hole callout will have a layer property value of "257". This is outside the normal layer range and is a good indicator that the dimension is used internally by something else (a hole callout, in this case).

Thank you! It will add to my verification.

ntr