Does anyone worked on creating a WinForm UI to select a point or curve in NX using C#?

Hi All,
Does anyone worked on selecting a point or curve in NX using winform UI in C#? I'm well aware of Block and UI styler and all the options. But as we have constrains using both the options, I need your help in creating a winform UI to select a point or curve in NX and pass it as a tag in code for further use. Any help will be appreciated. Thanks in advance.

It's going to be hard. You need to read the cursor position, and then translate this into a 3D "ray" (an infinite line in 3D space). Then you need to cycle through all the objects in the part file, finding the one the ray hits, or passes close to. You would essentially be rewriting the NX selection functionality. Getting it work at all will require a lot of effort. Getting it to work with good performance will require even more effort. Unless you have vast amounts of time, and zero money, I'd recommend buying additional SW licenses. You could buy a Block Styler license. Or you could buy a SNAP license, which lets you create "BlockForm" dialogs without Block Styler.

If you are working with plain vanilla journals (no author license, no block styler license), then your options are fairly limited. You can show a winform as a modal dialog, which means that it will have focus and you will not be able to interact with NX while it is shown.

I have some old example code (written in VB, posted below) that uses a winform to allow the user to set a selection filter; those choices are then passed to the main journal and used in the selection function. By passing information between the journal and the form, a more elaborate interaction would be possible. For instance, one could select options on the form, close the form, select the objects in the NX window, then show the form again with information about the selected objects. So, depending on your desired workflow, it may be possible to accomplish with a journal and a winform.

Option Strict Off
Imports System
Imports System.Collections.Generic
Imports NXOpen
Imports NXOpen.UF
Module Module1
    Sub Main()
        Dim theSession As Session = Session.GetSession()
        Dim theUI As UI = UI.GetUI()
        If IsNothing(theSession.Parts.Work) Then
            'active part required
        End If
        Dim workPart As Part = theSession.Parts.Work
        Dim lw As ListingWindow = theSession.ListingWindow
        Dim theForm As New Form1
        If theForm.DialogResult = System.Windows.Forms.DialogResult.Cancel Then
            MsgBox("user pressed 'Cancel', exit journal")
        End If
        MsgBox("continue journal code in Sub Main()")
        Dim selectionMask() As Selection.MaskTriple = Nothing
        BuildSelectionMask(selectionMask, theForm.chkFaces.Checked, theForm.chkCurves.Checked)
        Dim userSelectedObjects() As TaggedObject = Nothing
        If SelectObjects(selectionMask, userSelectedObjects) = Selection.Response.Cancel Then
            lw.WriteLine("object selection canceled")
        End If
        lw.WriteLine("Options selected:")
        lw.WriteLine("Select Solids: " & theForm.chkSolids.Checked.ToString)
        lw.WriteLine("Select Faces: " & theForm.chkFaces.Checked.ToString)
        lw.WriteLine("Select Curves: " & theForm.chkCurves.Checked.ToString)
        lw.WriteLine(userSelectedObjects.Length.ToString & " object(s) selected")
        For Each temp As TaggedObject In userSelectedObjects
            lw.WriteLine("object type: " & temp.GetType.ToString)
            lw.WriteLine("object tag: " & temp.Tag.ToString)
    End Sub
    Function SelectObjects(ByVal selMask() As Selection.MaskTriple, ByRef selObj() As TaggedObject) As Selection.Response
        Dim theUI As UI = UI.GetUI
        Dim prompt As String = "Select Objects"
        Dim title As String = "Selection"
        Dim includeFeatures As Boolean = False
        Dim keepHighlighted As Boolean = False
        Dim selAction As Selection.SelectionAction = _
        Dim scope As Selection.SelectionScope = Selection.SelectionScope.WorkPart
        Dim resp As Selection.Response = theUI.SelectionManager.SelectTaggedObjects( _
            prompt, title, scope, selAction, _
            includeFeatures, keepHighlighted, selMask, selObj)
        If resp = Selection.Response.Ok Then
            Return Selection.Response.Ok
            Return Selection.Response.Cancel
        End If
    End Function
    Sub BuildSelectionMask(ByRef maskArray() As Selection.MaskTriple, ByVal faces As Boolean, ByVal curves As Boolean)
        Dim theSelectionMasks As New List(Of Selection.MaskTriple)
        Dim newSelMask As Selection.MaskTriple
        With newSelMask
            .Type = UFConstants.UF_solid_type
            .SolidBodySubtype = UFConstants.UF_UI_SEL_FEATURE_SOLID_BODY
        End With
        If faces Then
            newSelMask.Type = UFConstants.UF_solid_type
            newSelMask.SolidBodySubtype = UFConstants.UF_UI_SEL_FEATURE_ANY_FACE
        End If
        If curves Then
            newSelMask.Type = UFConstants.UF_line_type
            newSelMask.Subtype = UFConstants.UF_line_normal_subtype
            newSelMask.Type = UFConstants.UF_circle_type
            newSelMask.Subtype = UFConstants.UF_all_subtype
            newSelMask.Type = UFConstants.UF_conic_type
            newSelMask.Subtype = UFConstants.UF_all_subtype
            newSelMask.Type = UFConstants.UF_spline_type
            newSelMask.Subtype = UFConstants.UF_all_subtype
        End If
        maskArray = theSelectionMasks.ToArray
    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
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
    End Sub
End Class
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form
    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing AndAlso components IsNot Nothing Then
            End If
        End Try
    End Sub
    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer
    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.GroupBox1 = New System.Windows.Forms.GroupBox()
        Me.chkCurves = New System.Windows.Forms.CheckBox()
        Me.chkFaces = New System.Windows.Forms.CheckBox()
        Me.chkSolids = New System.Windows.Forms.CheckBox()
        Me.Button1 = New System.Windows.Forms.Button()
        Me.Button2 = New System.Windows.Forms.Button()
        Me.GroupBox1.Location = New System.Drawing.Point(12, 26)
        Me.GroupBox1.Name = "GroupBox1"
        Me.GroupBox1.Size = New System.Drawing.Size(260, 118)
        Me.GroupBox1.TabIndex = 0
        Me.GroupBox1.TabStop = False
        Me.GroupBox1.Text = "Selection Options"
        Me.chkCurves.AutoSize = True
        Me.chkCurves.Location = New System.Drawing.Point(22, 76)
        Me.chkCurves.Name = "chkCurves"
        Me.chkCurves.Size = New System.Drawing.Size(59, 17)
        Me.chkCurves.TabIndex = 2
        Me.chkCurves.Text = "Curves"
        Me.chkCurves.UseVisualStyleBackColor = True
        Me.chkFaces.AutoSize = True
        Me.chkFaces.Location = New System.Drawing.Point(22, 53)
        Me.chkFaces.Name = "chkFaces"
        Me.chkFaces.Size = New System.Drawing.Size(55, 17)
        Me.chkFaces.TabIndex = 1
        Me.chkFaces.Text = "Faces"
        Me.chkFaces.UseVisualStyleBackColor = True
        Me.chkSolids.AutoSize = True
        Me.chkSolids.Checked = True
        Me.chkSolids.CheckState = System.Windows.Forms.CheckState.Checked
        Me.chkSolids.Enabled = False
        Me.chkSolids.Location = New System.Drawing.Point(22, 30)
        Me.chkSolids.Name = "chkSolids"
        Me.chkSolids.Size = New System.Drawing.Size(54, 17)
        Me.chkSolids.TabIndex = 0
        Me.chkSolids.Text = "Solids"
        Me.chkSolids.UseVisualStyleBackColor = True
        Me.Button1.Location = New System.Drawing.Point(12, 165)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(84, 34)
        Me.Button1.TabIndex = 1
        Me.Button1.Text = "Select Objects"
        Me.Button1.UseVisualStyleBackColor = True
        Me.Button2.DialogResult = System.Windows.Forms.DialogResult.Cancel
        Me.Button2.Location = New System.Drawing.Point(188, 165)
        Me.Button2.Name = "Button2"
        Me.Button2.Size = New System.Drawing.Size(84, 34)
        Me.Button2.TabIndex = 2
        Me.Button2.Text = "Cancel"
        Me.Button2.UseVisualStyleBackColor = True
        Me.AcceptButton = Me.Button1
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.CancelButton = Me.Button2
        Me.ClientSize = New System.Drawing.Size(284, 218)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D
        Me.MaximizeBox = False
        Me.MinimizeBox = False
        Me.Name = "Form1"
        Me.Text = "Form1"
    End Sub
    Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox
    Friend WithEvents chkCurves As System.Windows.Forms.CheckBox
    Friend WithEvents chkFaces As System.Windows.Forms.CheckBox
    Friend WithEvents chkSolids As System.Windows.Forms.CheckBox
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.Button
End Class