激活NX窗口的按钮

原理:取得按钮名称以后,通过运行宏文件激活按钮

Imports System.IO
Imports System.Runtime.InteropServices
Imports NXOpen.MenuBar

    <DllImport("libugui", EntryPoint:="?MACRO_playback_from_usertool@@YAXPEBD@Z", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
    Private Sub MACRO_playback_from_usertool(ByVal lpName As String)
    End Sub
    <DllImport("libugui", EntryPoint:="?MACRO_playback_from_usertool@@YAXPBD@Z", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
    Private Sub MACRO_playback_from_usertoolA(ByVal lpName As String) '32位用法
    End Sub

    ''' <summary>
    ''' 执行宏文件.
    ''' </summary>
    ''' <param name="macroFile">指定宏文件路径</param>
    ''' <returns><c>true</c> 运行成功, <c>false</c> 否则.</returns>
    Public Function ExecuteMacro(ByVal macroFile As String) As Boolean
        Dim response As Boolean = False
        Try
            If File.Exists(macroFile) Then
                If IntPtr.Size = 8 Then
                    MACRO_playback_from_usertool(macroFile)
                Else
                    MACRO_playback_from_usertoolA(macroFile)
                End If
                response = True
            End If
        Catch ex As Exception
        End Try
        Return response
    End Function

    ''' <summary>
    ''' 激活NX窗口按钮
    ''' </summary>
    ''' <param name="menuBtn">指定需要激活的按钮,必须是PushButton或者ApplicationButton</param>
    ''' <returns>激活成功,返回<c>true</c>,否则返回<c>false</c></returns>
    ''' <remarks>
    ''' 最低版本NX6.0.0,<br/>
    ''' 许可证要求: None.
    ''' </remarks>
    ''' <example>
    ''' <code src="src" language="VB.NET" encoding="c"/>
    ''' Dim menuBtn As NXOpen.MenuBar.MenuButton<br/>
    ''' menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_MODELING_BLOCK_FEATURE")<br/>
    ''' menuBtn.ActiveMenuButton()<br/>
    ''' <code src="src" language="C#" encoding="c"/>
    ''' NXOpen.MenuBar.MenuButton menuBtn<br/>
    ''' menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_MODELING_BLOCK_FEATURE");<br/>
    ''' menuBtn.ActiveMenuButton();<br/>
    ''' </example>
    Public Function ActiveMenuButton(ByVal menuBtn As MenuButton) As Boolean
        Dim response As Boolean = False
        Try
            If menuBtn Is Nothing Then
                Exit Try
            End If
            Dim menuType = menuBtn.ButtonType
            If menuType <> MenuButton.Type.PushButton OrElse menuType = MenuButton.Type.ApplicationButton Then
                Exit Try
            End If
            Dim macroFile As String = Path.GetDirectoryName(My.Application.GetType.Assembly.Location) & "actionBtn.macro"
            If File.Exists(macroFile) Then
                File.Delete(macroFile)
            End If
            Dim sw As New StreamWriter(macroFile)
            sw.WriteLine("NX 6.0.0")
            sw.WriteLine("Macro File: " & macroFile)
            sw.WriteLine("Macro Version 7.30")
            sw.WriteLine("Macro List Language and Codeset: simplified chine 13")
            sw.WriteLine("Created by Administrator on Fri Aug 21 18:28:49 2015")
            sw.WriteLine("Part Name Display Style: $FILENAME")
            sw.WriteLine("Selection Parameters 1 2 0.305380 1")
            sw.WriteLine("Display Parameters 1.000000 19.601460 14.127756 -1.000000 -0.720750 1.000000 0.720750")
            sw.WriteLine("*****************")
            sw.WriteLine("RESET")
            sw.WriteLine(String.Format("MENU, 0, {0} UG_GATEWAY_MAIN_MENUBAR ! ", menuBtn.ButtonName))
            sw.Close()
            If ExecuteMacro(macroFile) Then
                response = True
            End If
            File.Delete(macroFile)
        Catch ex As Exception
        End Try
        Return response
    End Function


    ''' <summary>
    ''' 激活NX窗口按钮toggle按钮.
    ''' </summary>
    ''' <param name="menuBtn">ToggleButton.</param>
    ''' <param name="ToggleStatus">切换状态</param>
    ''' <returns>激活成功,返回<c>true</c>,否则返回<c>false</c></returns>
    ''' <remarks>
    ''' 最低版本NX6.0.0,<br/>
    ''' 许可证要求: None.
    ''' </remarks>
    ''' <example>
    ''' <code src="src" language="VB.NET" encoding="c"/>
    ''' Dim menuBtn As NXOpen.MenuBar.MenuButton<br/>
    ''' menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_WCS_DISPLAY")<br/>
    ''' menuBtn.ActiveToggleButton()<br/>
    ''' <code src="src" language="C#" encoding="c"/>
    ''' NXOpen.MenuBar.MenuButton menuBtn<br/>
    ''' menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_WCS_DISPLAY");<br/>
    ''' menuBtn.ActiveToggleButton();<br/>
    ''' </example>
    Public Function ActiveToggleButton(ByVal menuBtn As MenuButton, ByVal ToggleStatus As MenuButton.Toggle) As Boolean
        Dim response As Boolean = False
        Try
            If menuBtn Is Nothing Then
                Exit Try
            End If
            If menuBtn.ButtonType <> MenuButton.Type.ToggleButton Then
                Exit Try
            End If

            If menuBtn.ToggleStatus = ToggleStatus Then
                Exit Try
            End If

            Dim macroFile As String = Path.GetDirectoryName(My.Application.GetType.Assembly.Location) & "actionBtn.macro"
            If File.Exists(macroFile) Then
                File.Delete(macroFile)
            End If
            Dim sw As New StreamWriter(macroFile)
            sw.WriteLine("NX 6.0.0")
            sw.WriteLine("Macro File: " & macroFile)
            sw.WriteLine("Macro Version 7.30")
            sw.WriteLine("Macro List Language and Codeset: simplified chine 13")
            sw.WriteLine("Created by Administrator on Fri Aug 21 18:28:49 2015")
            sw.WriteLine("Part Name Display Style: $FILENAME")
            sw.WriteLine("Selection Parameters 1 2 0.305380 1")
            sw.WriteLine("Display Parameters 1.000000 19.601460 14.127756 -1.000000 -0.720750 1.000000 0.720750")
            sw.WriteLine("*****************")
            sw.WriteLine("RESET")
            sw.WriteLine(String.Format("MENU, {0}, {1} UG_GATEWAY_MAIN_MENUBAR ! ", If(ToggleStatus = MenuButton.Toggle.Off, 0, 1), menuBtn.ButtonName))
            sw.Close()
            If ExecuteMacro(macroFile) Then
                response = True
            End If
            File.Delete(macroFile)
        Catch ex As Exception
        End Try
        Return response
    End Function
VB.NET代码
using System.IO;
using System.Runtime.InteropServices;
using NXOpen.MenuBar;

[DllImport("libugui", EntryPoint = "?MACRO_playback_from_usertool@@YAXPEBD@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private void MACRO_playback_from_usertool(string lpName)
{
}
[DllImport("libugui", EntryPoint = "?MACRO_playback_from_usertool@@YAXPBD@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
//32位用法
private void MACRO_playback_from_usertoolA(string lpName)
{
}

/// <summary>
/// 执行宏文件.
/// </summary>
/// <param name="macroFile">指定宏文件路径</param>
/// <returns><c>true</c> 运行成功, <c>false</c> 否则.</returns>
public bool ExecuteMacro(string macroFile)
{
        bool response = false;
        try {
                if (File.Exists(macroFile)) {
                        if (IntPtr.Size == 8) {
                                MACRO_playback_from_usertool(macroFile);
                        } else {
                                MACRO_playback_from_usertoolA(macroFile);
                        }
                        response = true;
                }
        } catch (Exception ex) {
        }
        return response;
}

/// <summary>
/// 激活NX窗口按钮
/// </summary>
/// <param name="menuBtn">指定需要激活的按钮,必须是PushButton或者ApplicationButton</param>
/// <returns>激活成功,返回<c>true</c>,否则返回<c>false</c></returns>
/// <remarks>
/// 最低版本NX6.0.0,<br/>
/// 许可证要求: None.
/// </remarks>
/// <example>
/// <code src="src" language="VB.NET" encoding="c"/>
/// Dim menuBtn As NXOpen.MenuBar.MenuButton<br/>
/// menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_MODELING_BLOCK_FEATURE")<br/>
/// menuBtn.ActiveMenuButton()<br/>
/// <code src="src" language="C#" encoding="c"/>
/// NXOpen.MenuBar.MenuButton menuBtn<br/>
/// menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_MODELING_BLOCK_FEATURE");<br/>
/// menuBtn.ActiveMenuButton();<br/>
/// </example>
public bool ActiveMenuButton(MenuButton menuBtn)
{
        bool response = false;
        try {
                if (menuBtn == null) {
                        break; // TODO: might not be correct. Was : Exit Try
                }
                dynamic menuType = menuBtn.ButtonType;
                if (menuType != MenuButton.Type.PushButton || menuType == MenuButton.Type.ApplicationButton) {
                        break; // TODO: might not be correct. Was : Exit Try
                }
                string macroFile = Path.GetDirectoryName(My.Application.GetType.Assembly.Location) + "\actionBtn.macro";
                if (File.Exists(macroFile)) {
                        File.Delete(macroFile);
                }
                StreamWriter sw = new StreamWriter(macroFile);
                sw.WriteLine("NX 6.0.0");
                sw.WriteLine("Macro File: " + macroFile);
                sw.WriteLine("Macro Version 7.30");
                sw.WriteLine("Macro List Language and Codeset: simplified chine 13");
                sw.WriteLine("Created by Administrator on Fri Aug 21 18:28:49 2015");
                sw.WriteLine("Part Name Display Style: $FILENAME");
                sw.WriteLine("Selection Parameters 1 2 0.305380 1");
                sw.WriteLine("Display Parameters 1.000000 19.601460 14.127756 -1.000000 -0.720750 1.000000 0.720750");
                sw.WriteLine("*****************");
                sw.WriteLine("RESET");
                sw.WriteLine(string.Format("MENU, 0, {0} UG_GATEWAY_MAIN_MENUBAR ! ", menuBtn.ButtonName));
                sw.Close();
                if ExecuteMacro(macroFile)) {
                        response = true;
                }
                File.Delete(macroFile);
        } catch (Exception ex) {
        }
        return response;
}


/// <summary>
/// 激活NX窗口按钮toggle按钮.
/// </summary>
/// <param name="menuBtn">ToggleButton.</param>
/// <param name="ToggleStatus">切换状态</param>
/// <returns>激活成功,返回<c>true</c>,否则返回<c>false</c></returns>
/// <remarks>
/// 最低版本NX6.0.0,<br/>
/// 许可证要求: None.
/// </remarks>
/// <example>
/// <code src="src" language="VB.NET" encoding="c"/>
/// Dim menuBtn As NXOpen.MenuBar.MenuButton<br/>
/// menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_WCS_DISPLAY")<br/>
/// menuBtn.ActiveToggleButton()<br/>
/// <code src="src" language="C#" encoding="c"/>
/// NXOpen.MenuBar.MenuButton menuBtn<br/>
/// menuBtn= NXOpen.UI.GetUI.MenuBarManager.GetButtonFromName("UG_WCS_DISPLAY");<br/>
/// menuBtn.ActiveToggleButton();<br/>
/// </example>
public bool ActiveToggleButton(MenuButton menuBtn, MenuButton.Toggle ToggleStatus)
{
        bool response = false;
        try {
                if (menuBtn == null) {
                        break; // TODO: might not be correct. Was : Exit Try
                }
                if (menuBtn.ButtonType != MenuButton.Type.ToggleButton) {
                        break; // TODO: might not be correct. Was : Exit Try
                }

                if (menuBtn.ToggleStatus == ToggleStatus) {
                        break; // TODO: might not be correct. Was : Exit Try
                }

                string macroFile = Path.GetDirectoryName(My.Application.GetType.Assembly.Location) + "\actionBtn.macro";
                if (File.Exists(macroFile)) {
                        File.Delete(macroFile);
                }
                StreamWriter sw = new StreamWriter(macroFile);
                sw.WriteLine("NX 6.0.0");
                sw.WriteLine("Macro File: " + macroFile);
                sw.WriteLine("Macro Version 7.30");
                sw.WriteLine("Macro List Language and Codeset: simplified chine 13");
                sw.WriteLine("Created by Administrator on Fri Aug 21 18:28:49 2015");
                sw.WriteLine("Part Name Display Style: $FILENAME");
                sw.WriteLine("Selection Parameters 1 2 0.305380 1");
                sw.WriteLine("Display Parameters 1.000000 19.601460 14.127756 -1.000000 -0.720750 1.000000 0.720750");
                sw.WriteLine("*****************");
                sw.WriteLine("RESET");
                sw.WriteLine(string.Format("MENU, {0}, {1} UG_GATEWAY_MAIN_MENUBAR ! ", ToggleStatus == MenuButton.Toggle.Off ? 0 : 1, menuBtn.ButtonName));
                sw.Close();
                if (ExecuteMacro(macroFile)) {
                        response = true;
                }
                File.Delete(macroFile);
        } catch (Exception ex) {
        }
        return response;
}
C#代码

使用方法

Dim theUI As NXOpen.UI = NXOpen.UI.GetUI()
Dim menuBtn = theUI.MenuBarManager.GetButtonFromName("UG_MODELING_BLOCK_FEATURE")
ActiveMenuButton(menuBtn)

static BOOL RunMacro(const char* macropath)
{
    try
    {
        if(!PathFileExists(macropath))
            return FALSE;
        typedef void (_stdcall *MyFun )( char const * );
        MyFun mfun = NULL;
        HINSTANCE hHandle = NULL;
        char *ptr;
        UF_translate_variable("UGII_ROOT_DIR", &ptr);
        CString strDllPath(ptr);
        sprintf(ptr,"%s\libugui.dll", ptr);
        hHandle = LoadLibraryA(ptr /*"D:\Program Files\UGS\NX 7.5\UGII\libugui.dll" */);
        mfun = (MyFun)::GetProcAddress(hHandle, "?MACRO_playback_from_usertool@@YAXPBD@Z") ;
        if( mfun != NULL )
        {
            mfun(macropath );
        }
        else
            return FALSE;
    }
    catch(...)
    {
        return FALSE;
    }
    return TRUE;
}
C运行宏

GRIP调用宏(本人没有测试)

xspawn/concur,'D:qq.micro'

halt

原文地址:https://www.cnblogs.com/bizca/p/4755553.html