NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

  • 前言

给那些不会调内部函数的人,一个学习方法,大概知道怎么找内部接口,怎么调用内部函数的。

复杂的东西我也不会,等我研究出来了,在更新到博客上。

 

  • 版本

NX9+VS2012

 

  • 需求

想快速设置类型过滤器里面的选项,提高画图效率。

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

 

 

  • 解决方案

因为UFUN和NXOPEN并未开放设置类型过滤器的API函数接口,

我们去反编译libugui.dll,得到设置类型过滤器的接口。

 

 

  • 详细步骤

1.找到dll,至于为什么是libugui.dll,是哪个内部函数接口,要么自己一个个找。

要么百度在网上找别人写的,https://blog.csdn.net/u012077233/article/details/105112510/

相关资料去参考。

 

2.去libugui.dll找内部函数接口

先把NX切换成英文版的,鼠标放在这里,弹出英文单词

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

 

 拿着英文单词去IDA Pro里面打开libugui.dll,到Exports栏目处ctrl+f开始搜索英文单词

与之相关的内部函数全部列出来了

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

 

 选择其中一个函数,点击右键

勾上这个就会显示输入输出的参数类型

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

 

 不勾就是下面这样

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

 

 3.新建个NX二次开发项目,去写代码,调用内部函数

源代码

//NX9_NXOpenCPP_Wizard6

// Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h>

// Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx>

// Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>

#include <uf.h>
#include <uf_ui.h>

// Std C++ Includes
#include <iostream>
#include <sstream>

using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;


//------------------------------------------------------------------------------
// NXOpen c++ test class 
//------------------------------------------------------------------------------
class MyClass
{
    // class members
public:
    static Session *theSession;
    static UI *theUI;

    MyClass();
    ~MyClass();

    void do_it();
    void print(const NXString &);
    void print(const string &);
    void print(const char*);

private:
    Part *workPart, *displayPart;
    NXMessageBox *mb;
    ListingWindow *lw;
    LogFile *lf;
};

//------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL;

//------------------------------------------------------------------------------
// Constructor 
//------------------------------------------------------------------------------
MyClass::MyClass()
{

    // Initialize the NX Open C++ API environment
    MyClass::theSession = NXOpen::Session::GetSession();
    MyClass::theUI = UI::GetUI();
    mb = theUI->NXMessageBox();
    lw = theSession->ListingWindow();
    lf = theSession->LogFile();

    workPart = theSession->Parts()->Work();
    displayPart = theSession->Parts()->Display();
    
}

//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
}

//------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}




//------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{

    // TODO: add your code here
    
    UF_initialize();

    //调内部函数 设置当前过滤类型(输入名字) 此方法中英文版本不通用,并且NX11高版本取消了这个函数
    typedef void(*load_ufusr_f_p_t)(char* v1);//定义传参
    load_ufusr_f_p_t SEL_set_type_filter_index_by_label = NULL;
    UF_load_library("D:\\Program Files\\Siemens\\NX 9.0\\UGII\\libugui.dll", "?SEL_set_type_filter_index_by_label@@YAXPEAD@Z", (UF_load_f_p_t *)&SEL_set_type_filter_index_by_label);
    if (SEL_set_type_filter_index_by_label != NULL)
    {
        SEL_set_type_filter_index_by_label("Curve");//中文版NX用 边
    }


    UF_terminate();

}

//------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
//  Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
    try
    {
        // Create NXOpen C++ class instance
        MyClass *theMyClass;
        theMyClass = new MyClass();
        theMyClass->do_it();
        delete theMyClass;
    }
    catch (const NXException& e1)
    {
        UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
    }
    catch (const exception& e2)
    {
        UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
    }
    catch (...)
    {
        UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
    }
}


//------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
    return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}

演示

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

其他用法

源代码

    //调内部函数 获取当前过滤类型个数
    typedef void(*load_ufusr_f_p_t)(bool v1, int *v2);//定义传参
    load_ufusr_f_p_t SEL_ask_type_filter_index = NULL;
    UF_load_library("D:\\Program Files\\Siemens\\NX 9.0\\UGII\\libugui.dll", "?SEL_ask_type_filter_index@@YAH_NPEAH@Z", (UF_load_f_p_t *)&SEL_ask_type_filter_index);
    if (SEL_ask_type_filter_index != NULL)
    {
        int num = 0;
        SEL_ask_type_filter_index(FALSE, &num);

        char msg[256];
        sprintf(msg, "%d", num);
        uc1601(msg, 1);
    }

演示

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

源代码

    //调内部函数 设置当前过滤类型(输入索引)
    typedef void(*load_ufusr_f_p_t)(int v1, bool v2, bool v3);//定义传参
    load_ufusr_f_p_t SEL_set_type_filter_index = NULL;
    UF_load_library("D:\\Program Files\\Siemens\\NX 9.0\\UGII\\libugui.dll", "?SEL_set_type_filter_index@@YAXH_N0@Z", (UF_load_f_p_t *)&SEL_set_type_filter_index);
    if (SEL_set_type_filter_index != NULL)
    {
        SEL_set_type_filter_index(2, FALSE, FALSE);
    }

演示

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

 

其他更多用法,后续找到会更新上来。

简单的数据类型好调用,复杂的结构体类型,还是要花时间去研究。

 

阿飞

2021年9月2日

 

NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数

上一篇:C# winform datagridview rowheader 添加行标题的方法


下一篇:使用 vite 开发 react + antd 一个月的开发体验和遇到的问题,持续更新中