VB.net对UG进行二次开发及实例 - yunbo

时间:2024-03-11 07:36:32

首先从UG5下面的UGOPENvs_files文件夹中拷贝VB文件夹到 Microsoft Visual Studio 9.0(我用的是vs2008)文件夹下覆盖原来文件

开启VS点击新建会找到UG5的visual basic模板,取名为Project,打开这个模板会给自动给你创建初始代码如下:

------------------------------------

Option Strict Off 

Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

\'------------------------------------------------------------
\'
\'  Module MyProject
\'
\'      (Add description here)
\'------------------------------------------------------------
Module MyProject


\'------------------------------------------------------------
\'
\'  Main()
\'
\'      (Add description here)
\'
\'------------------------------------------------------------
Sub Main()

    \'Add your code here


End Sub

\'------------------------------------------------------------
\'
\'  GetUnloadOption()
\'
\'     Used to tell NX when to unload this library
\'
\'     Available options include:
\'       Session.LibraryUnloadOption.Immediately
\'       Session.LibraryUnloadOption.Explicitly
\'       Session.LibraryUnloadOption.AtTermination
\'
\'     Any programs that register callbacks must use
\'     AtTermination as the unload option.
\'------------------------------------------------------------
Public Function GetUnloadOption(ByVal dummy As String) As Integer
    GetUnloadOption = Session.LibraryUnloadOption.Immediately
End Function

 

End Module

 

------------------------------------

其中Sub main()是UG入口函数

此时我们从右边解决资源管理器中右键点击MyProject选择添加新项,并添加一个windows窗体组件默认名称为Form1.vb,这样我们就生成了一个窗口类,类名为Form1

然后在sub main过程中添加如下代码显示窗口:

 Dim f As New Form1\'定义f为Form1类

  f.ShowDialog()\'显示f窗口

此时代码完成.选择解决资源管理器,双击Project选择调试,选择启动外部调试,浏览UG主文件ugraf.exe

然后调试运行,等UG加载完成后新建或打开一个UGpart文件,按Ctrl+U调出对话框,到VS工程文件夹(默认在你的文档下)打开当前工程文件夹下的bin文件夹勾选VS生成的Project.DLL文件,这样就显示一个窗口了,当然我们可以在窗口上添加其它控件运用UGopen函数完成其它功能。

 

第一个例子:怎样用VB.NET在UG中创建一个点?
Option Strict Off

Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module CreatePoint

    Dim s As Session = Session.GetSession()
    Dim ufs As UFSession = UFSession.GetUFSession()

    Sub Main()

        Dim sp As New Point3d(0, 0, 0)

        Dim thePoint As Point = s.Parts.Work.Points.CreatePoint(sp)

    End Sub

    Public Function GetUnloadOption(ByVal dummy As String) As Integer

        GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY

    End Function

End Module

第二个例子:怎样用VB.NET在UG中创建一个条线?

Option Strict Off  

Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module template_code

  Dim s As Session = Session.GetSession()

Sub Main()

  Dim sp As New Point3d(0, 0, 0)
  Dim ep As New Point3d(10, 10, 0)

  Dim theLine As Line = s.Parts.Work.Curves.CreateLine(sp, ep)

        
End Sub

  Public Function GetUnloadOption(ByVal dummy As String) As Integer

      GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY

  End Function

End Module

 

第三个例子:怎样用VB.NET在UG中创建一个圆柱,然后更改它的颜色?

Option Strict Off  
Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module create_a_cylinder_and_set_color

    Sub Main()

        Dim s As Session = Session.GetSession()
        Dim ufs As UFSession = UFSession.GetUFSession()

        Dim wp As Part = s.Parts.Work()

        Dim cyl_feat_tag As NXOpen.Tag
        Dim orig() As Double = {1, 1, 0}
        Dim dir() As Double = {1, 1, 1}

        ufs.Modl.CreateCylinder(FeatureSigns.Nullsign, Nothing, orig, "50", _
            "25", dir, cyl_feat_tag)

        Dim cyl_body_tag As NXOpen.Tag

        ufs.Modl.AskFeatBody(cyl_feat_tag, cyl_body_tag)
        Dim cyl_body As Body = CType(NXObjectManager.Get(cyl_body_tag), Body)

        MsgBox("Color change", MsgBoxStyle.Information, "Current Operation:")
        cyl_body.Color = 3
        cyl_body.RedisplayObject()

        s.Preferences.ScreenVisualization.FitPercentage = 95
        wp.Views.WorkView.Fit()


  end Sub

    Public Function GetUnloadOption(ByVal dummy As String) As Integer

        GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY

    End Function

End Module

第四个例子:怎样用VB.NET在UG中创建注释?

Option Strict Off  

Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module create_note

  Dim s As Session = Session.GetSession()
  Dim ufs As UFSession = UFSession.GetUFSession()

Sub Main()

    Dim theNote As NXOpen.Tag
Try
    Dim workPart As Part = s.Parts.Work
    Dim workPartTag As NXOpen.Tag = workPart.Tag

Catch ex As Exception
    ufs.Ui.OpenListingWindow()
    ufs.Ui.WriteListingWindow(ex.GetBaseException.ToString())
    ufs.Ui.WriteListingWindow(vbCrLf & "+++ Work Part Required" & vbCrLf)
    Return
End Try


    Dim num_lines As Integer = 2
    Dim textString As String() = {"This is the first line.", _
                                  "This is the second line."}
    Dim origin_3d() As Double = {6, 6, 0}
    Dim orientation As Integer = 0 \' zero is Horizontal, 1 is Vertical

Try

    ufs.Drf.CreateNote(num_lines, textString, origin_3d, _
                    orientation, theNote)

Catch ex As Exception
    ufs.Ui.OpenListingWindow()
    ufs.Ui.WriteListingWindow(ex.GetBaseException.ToString())
    ufs.Ui.WriteListingWindow(vbCrLf & "+++ Note not created" & vbCrLf)
End Try

End Sub

  Public Function GetUnloadOption(ByVal dummy As String) As Integer

      GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY

  End Function

End Module

第五个例子:怎样用VB.NET在UG中创建两个体然后做布尔加操作?

Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module template_code

Sub Main()

  Dim s As Session = Session.GetSession()
  Dim ufs As UFSession = UFSession.GetUFSession()

  \'
  \' ------------------------------------------------- make sure we have a part
  Dim this_part As NXOpen.Tag
Try
  this_part = s.Parts.Work.Tag
Catch ex As Exception

  If this_part = NXOpen.Tag.Null Then
    MsgBox("You need an open part to run this program.", MsgBoxStyle.OKOnly)
    \' no part, so exit program gracefully
    Exit Sub
  End If

End Try

  \'
  \' ------------------------------------------------- first solid: a block

  Dim corner_pt(2) As Double
  Dim block_feat_tag As NXOpen.Tag
  Dim edge_lengths(2) As String

  \' This is an alternate way to set the string value:
  \'
  \'Dim lengths(2) As Double
  \'lengths(0) = 150.1234
  \'edge_lengths(0) = lengths(0).ToString
  \'
  \' but setting it this way, we get the expression to boot:

  edge_lengths(0) = "xlen=150.1234"
  edge_lengths(1) = "ylen=65.4321"
  edge_lengths(2) = "thickness=25."

  Dim sign As FeatureSigns

  sign = FeatureSigns.Nullsign

  corner_pt(0) = 20
  corner_pt(1) = 30
  corner_pt(2) = -10

  ufs.Modl.CreateBlock1(sign, corner_pt, edge_lengths, block_feat_tag)

  If block_feat_tag <> NXOpen.Tag.Null Then
    ufs.View.FitView(NXOpen.Tag.Null, 1.0)
    MsgBox("First Solid Body tag is: " & block_feat_tag.ToString)
  End If

  \'
  \' ------------------------------------------------- second solid: a cylinder

  Dim height As String
  Dim diameter As String
  Dim direction(2) As Double
  Dim cyl_feat_tag As NXOpen.Tag

  height = "cyl_height=90"
  diameter = "cyl_dia=40"

  direction(0) = 0.707
  direction(1) = 0.707
  direction(2) = 0.707

  ufs.Modl.CreateCyl1(sign, corner_pt, height, diameter, direction, cyl_feat_tag)

  If cyl_feat_tag <> NXOpen.Tag.Null Then
    ufs.View.FitView(NXOpen.Tag.Null, 1.0)
    MsgBox("Second Solid Body tag is: " & cyl_feat_tag.ToString)
  End If

  \'
  \' ------------------------------------------------- unite the two solids

  Dim block_body_tag As NXOpen.Tag
  Dim cyl_body_tag As NXOpen.Tag

  ufs.Modl.AskFeatBody(block_feat_tag, block_body_tag)
  ufs.Modl.AskFeatBody(cyl_feat_tag, cyl_body_tag)

  ufs.Modl.UniteBodies(block_body_tag, cyl_body_tag)

  \'
  \' ------------------------------------------------- report count of solids

  Dim all_bodies() As Body = s.Parts.Work.Bodies.ToArray()
  Dim body_count As Integer

  body_count = all_bodies.Length

  MsgBox("Count of Bodies now in Work Part: " & body_count)

End Sub

  Public Function GetUnloadOption(ByVal dummy As String) As Integer

      GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY

  End Function

End Module

第六个例子:怎样用VB.NET在UG中选择一个体?
Option Strict Off

Imports System

Imports NXOpen
Imports NXOpen.UI
Imports NXOpen.Utilities
Imports NXOpen.UF

Module select_a_body_demo

  Dim s As Session = Session.GetSession()
  Dim ufs As UFSession = UFSession.GetUFSession()

Sub Main()
    Dim body As NXOpen.Tag

    While select_a_body(body) = Selection.Response.Ok

        MsgBox("Body Tag:" & body.ToString())

        ufs.Disp.SetHighlight(body, 0)

    End While

    End Sub

Function select_a_body(ByRef body As NXOpen.Tag) As Selection.Response

    Dim message As String
    Dim title As String = "Select a body"
    Dim scope As Integer = UFConstants.UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY
    Dim response As Integer
    Dim obj As NXOpen.Tag
    Dim view As NXOpen.Tag
    Dim cursor(2) As Double
    Dim ip As UFUi.SelInitFnT = AddressOf init_proc

    ufs.Ui.LockUgAccess(UFConstants.UF_UI_FROM_CUSTOM)

    Try
        ufs.Ui.SelectWithSingleDialog(message, title, scope, ip, _
                     Nothing, response, 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
        Return Selection.Response.Ok
    End If

    End Function

Function 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

End Module

第七个例子:怎样用VB.NET在UG中选择一个面?

Option Strict Off

Imports System

Imports NXOpen
Imports NXOpen.UI
Imports NXOpen.Utilities
Imports NXOpen.UF

Module select_a_face_demo

  Dim s As Session = Session.GetSession()
  Dim ufs As UFSession = UFSession.GetUFSession()

Sub Main()
    Dim face As NXOpen.Tag

    While select_a_face(face) = Selection.Response.Ok

        MsgBox("Face Tag:" & face.ToString())

        ufs.Disp.SetHighlight(face, 0)

    End While

    End Sub

Function select_a_face(ByRef face As NXOpen.Tag) As Selection.Response

    Dim message As String
    Dim title As String = "Select a FACE"
    Dim scope As Integer = UFConstants.UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY
    Dim response As Integer
    Dim obj As NXOpen.Tag
    Dim view As NXOpen.Tag
    Dim cursor(2) As Double
    Dim mask_face As UFUi.SelInitFnT = AddressOf mask_for_faces

    ufs.Ui.LockUgAccess(UFConstants.UF_UI_FROM_CUSTOM)

    Try
        ufs.Ui.SelectWithSingleDialog(message, title, scope, mask_face, _
                     Nothing, response, face, 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
        Return Selection.Response.Ok
    End If

    End Function

Function mask_for_faces(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_face_subtype
    mask_triples(0).solid_type = UFConstants.UF_UI_SEL_FEATURE_ANY_FACE

    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

End Module

第八个例子:怎样用VB.NET在UG中选择曲线和边?

Option Strict Off  

Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module select_curves_or_edges

  Dim s As Session = Session.GetSession()
  Dim ufs As UFSession = UFSession.GetUFSession()

Sub Main()

Dim curves() As NXOpen.Tag
Dim num_curves As Integer
Dim n As String = vbCrLf

    num_curves = select_curves_or_edges("Select Curves or Edges:", curves)

    If (num_curves) > 0 Then
        ufs.Ui.OpenListingWindow()
        ufs.Ui.WriteListingWindow("Selected count: " & num_curves.ToString & n)
    End If

End Sub

Function select_curves_or_edges(ByVal prompt As String, _
                                ByRef curves() As NXOpen.Tag) As Integer

    Dim cnt As Integer = 0
    Dim response As Integer
    Dim inx As Integer = 0
    Dim mask_crvs As UFUi.SelInitFnT = AddressOf mask_for_curves

    ufs.Ui.LockUgAccess(UFConstants.UF_UI_FROM_CUSTOM)

    Try
        ufs.Ui.SelectWithClassDialog(prompt, "Curves:", _
            UFConstants.UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY, _
            mask_crvs, Nothing, response, cnt, curves)
    Finally
        ufs.Ui.UnlockUgAccess(UFConstants.UF_UI_FROM_CUSTOM)
    End Try

    For inx = 0 To curves.Length - 1
        ufs.Disp.SetHighlight(curves(inx), 0)
    Next

    Return cnt

End Function

Function mask_for_curves(ByVal select_ As IntPtr, _
                       ByVal userdata As IntPtr) As Integer

    Dim num_triples As Integer = 6
    Dim mask_triples(5) As UFUi.Mask

    mask_triples(0).object_type = UFConstants.UF_line_type
    mask_triples(0).object_subtype = 0
    mask_triples(0).solid_type = 0

    mask_triples(1).object_type = UFConstants.UF_circle_type
    mask_triples(1).object_subtype = 0
    mask_triples(1).solid_type = 0

    mask_triples(2).object_type = UFConstants.UF_conic_type
    mask_triples(2).object_subtype = 0
    mask_triples(2).solid_type = 0

    mask_triples(3).object_type = UFConstants.UF_spline_type
    mask_triples(3).object_subtype = 0
    mask_triples(3).solid_type = 0

    mask_triples(4).object_type = UFConstants.UF_point_type
    mask_triples(4).object_subtype = 0
    mask_triples(4).solid_type = 0

    mask_triples(5).object_type = UFConstants.UF_solid_type
    mask_triples(5).object_subtype = 0
    mask_triples(5).solid_type = UFConstants.UF_UI_SEL_FEATURE_ANY_EDGE

    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

End Module