NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发

关于用QT界面做NX二次开发的资料在网络是搜不到的,没有这方面的资料,目前我只找到了 “NX/UG二次开发—QT—基于QT平台的UG二次开发https://blog.csdn.net/u012077233/article/details/105119912/ ”这个是张工之前写的,

他应该是网络上第一个写QT做NX二次开发的。但他这个是模态对话框的,会堵塞前后台交互,体验不是很好。而且他是拿Qt Creator做的。

QT界面做NX二次开发这个我半年前给公司做QT应用程序开发的时候,就已经开始在研究怎么把QT界面做到NX里,但之前的尝试都是模态对话框,一直没有研究出来非模态对话框。

直到今天我在B站看MFC非模态对话框视频的时候,突然一个细节设置给了我灵感。在加上我之前做过PyQt界面做FreeCAD的开发基础。今天搞定了这个问题。

我之前写过“MFC界面做NX二次开发”,“winform界面做NX二次开发”,今天写"C++ QT界面界面做NX二次开发"。界面这些东西都是有共性的。结合NX做开发,思路都是一样的。其实会一种就够用了。

为什么写C++ QT,因为QT除了C++,还有python版本的PyQt,我觉得用PyQt+NXOpenPython也是可以做开发的。后面有空去研究研究。因为FreeCAD我也是拿PyQt去做的。

演示:

版本 NX11+VS2013+Qt 5.6.3(64位)

过程我不会写的太详细,因为工作量太多。但我会把重要的部分写出来。至于QT怎么安装,怎么搭建项目,自己百度吧,我这里不会写那些。

1.新建项目

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第1张图片

 NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第2张图片

 NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第3张图片

 NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第4张图片

编译项目。成功

 NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第5张图片

 2.将exe项目设置成dll项目

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第6张图片

 NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第7张图片

 在编译生成,已经变为dll项目

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第8张图片

 3.添加NX的库文件,头文件,入口函数等

设置附加包含目录$(UGII_BASE_DIR)\ugopen

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第9张图片

 设置附加库目录$(UGII_BASE_DIR)\ugopen

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第10张图片

 设置附加依赖项

libufun.lib
libufun_cae.lib
libufun_cam.lib
libufun_die.lib
libufun_vdac.lib
libufun_weld.lib
libnxopencpp.lib
libnxopencpp_annotations.lib
libnxopencpp_assemblies.lib
libnxopencpp_bodydes.lib
libnxopencpp_cae.lib
libnxopencpp_cam.lib
libnxopencpp_diagramming.lib
libnxopencpp_diagramminglibraryauthor.lib
libnxopencpp_die.lib
libnxopencpp_display.lib
libnxopencpp_drafting.lib
libnxopencpp_drawings.lib
libnxopencpp_facet.lib
libnxopencpp_features.lib
libnxopencpp_fields.lib
libnxopencpp_formboard.lib
libnxopencpp_gateway.lib
libnxopencpp_geometricanalysis.lib
libnxopencpp_geometricutilities.lib
libnxopencpp_issue.lib
libnxopencpp_layer.lib
libnxopencpp_layout2d.lib
libnxopencpp_markup.lib
libnxopencpp_mechanicalrouting.lib
libnxopencpp_mechatronics.lib
libnxopencpp_mfg.lib
libnxopencpp_modldirect.lib
libnxopencpp_motion.lib
libnxopencpp_openxml.lib
libnxopencpp_optimization.lib
libnxopencpp_options.lib
libnxopencpp_partfamily.lib
libnxopencpp_pdm.lib
libnxopencpp_physmat.lib
libnxopencpp_placement.lib
libnxopencpp_plas.lib
libnxopencpp_positioning.lib
libnxopencpp_preferences.lib
libnxopencpp_report.lib
libnxopencpp_routing.lib
libnxopencpp_shapesearch.lib
libnxopencpp_sheetmetal.lib
libnxopencpp_shipdesign.lib
libnxopencpp_sim.lib
libnxopencpp_tooling.lib
libnxopencpp_userdefinedobjects.lib
libnxopencpp_userdefinedtemplate.lib
libnxopencpp_validate.lib
libnxopencpp_visualreporting.lib
libnxopencpp_weld.lib
libugopenint.lib
libugopenint_cae.lib
libugopenint_cam.lib
libnxopenuicpp.lib

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第11张图片

 添加uf头文件

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第12张图片

 添加ufusr入口函数

extern "C" DllExport void  ufusr(char *param, int *retcod, int param_len)
{

    if (UF_initialize())
    {
        /* Failed to initialize */
        return;
    }


    UF_terminate();
}

extern "C" DllExport int ufusr_ask_unload()
{
    return (UF_UNLOAD_UG_TERMINATE);
    //return (UF_UNLOAD_IMMEDIATELY);
    //return UF_UNLOAD_SEL_DIALOG;
}

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第13张图片

 编译项目,成功

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第14张图片

 4.将对话框添加到uf入口函数中,以非模态方式显示出来。(重点)

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第15张图片

 注意点:

1.如果把

int argc = 0;
QApplication a(argc, 0);
MyTest w;

w.show();

全部写到入口函数里,那么对话框在执行的时候就会一闪而过。只有把上三行定义在外面在不会一闪而过。这是今天在看MFC非模态对话框时学到的细节。也是我之前研究了半年卡住的地方。

2.如果加上a.exec() 那么对话框就变成了模态对话框了,堵塞了前后台交互。这也是我之前研究了半年卡住的地方。

编译项目成功

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第16张图片

 5.去QT安装目录里的bin文件夹里把所有文件考过来,放到我们编译的dll所在目录里。

(至于到底需要bin里的那几个动态链接库dll,我觉得可能要一个个测试。我发现qt编译的dll和qt编译的exe所依赖的动态链接库不一样,可能dll需要的更多)

最终做完,还是要用Release编译的dll,去配bin里需要的那些dll

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第17张图片

 这个时候项目里的main.cpp就已经没用了

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第18张图片

 去NX里ctrl+u调用vs编译的dll,成功的非模态显示了对话框

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第19张图片

 6.最后以一个简单的创建块例子,结束文章。

使用Qt designer设置对话框

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第20张图片

 添加槽和信号

private slots:
    void m_CreateBlock(bool checked);

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第21张图片

connect(ui.pushButton, SIGNAL(clicked(bool)), this, SLOT(m_CreateBlock(bool)));//槽和信号

(波浪线不是错误,是因为VS没有更新读取出来Qt designer保存下来的控件id,编译不会报错的。)

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第22张图片

void MyTest::m_CreateBlock(bool checked)
{
    UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
    double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
    char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
    tag_t BlkTag = NULL_TAG;
    UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag);

}

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第23张图片

编译成功, 去NX里执行(这样就实现了QT界面做NX二次开发了)

7.补充

有些美中不足的是,目前我还没有找到怎么把QT对话框通过NX句柄嵌套在NX主窗口上。

虽然显示的非模态对话框就已经满足日常要求了。但是因为不是嵌套上去的,没有指定父项,所以对话框有时候会跑到NX主窗口的后面。体验不太友好。

后续我会继续研究这一块的。

研究入手点,参考资料:

C++ QT相关的

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第24张图片

 FreeCADA的PyQt

它这里外国的英文社区就明确的写到了获取主窗口的方法。虽然是PyQt,但C++的思路和py都是差不多的,都是qt公司的

https://wiki.freecadweb.org/Embedding_FreeCADGui

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第25张图片

 有一种结论,QT只能获得QT界面本身的父项窗口,去做嵌套。并不能嵌套到QT以外的主窗口上,这个需要我去验证。

Caesar卢尚宇

2020年4月14日

8.将QT对话框嵌套在NX主窗口

接着昨天的继续研究,今天已经研究出来了QT对话框嵌入到NX主窗口中。

其实也没啥东西,就是多了一个获取NX窗口句柄,将windows的HWND句柄转换成QT的QWindow,在设置窗口父子关系setParent,最后就把QT对话框嵌套上去。

参考资料https://blog.csdn.net/r5014/article/details/79286444

QWindow* windowLogin;
test::test(QWidget *parent)
    : QWidget(parent)
{

    UF_initialize();

    HWND UGHwnd = (HWND)UF_UI_get_default_parent();//获取UG窗口句柄
    windowLogin = QWindow::fromWinId((WId)UGHwnd);

    ui.setupUi(this);
    connect(ui.pushButton, SIGNAL(clicked(bool)), this, SLOT(m_CreateBlock(bool)));//创建块
    connect(ui.pushButton_2, SIGNAL(clicked(bool)), this, SLOT(m_close(bool)));//关闭对话框

    UF_terminate();
}

int argc = 0;
QApplication a(argc, 0);
test w;

extern "C" DllExport void  ufusr(char *param, int *retcod, int param_len)
{

    if (UF_initialize())
    {
        /* Failed to initialize */
        return;
    }

    w.winId();
    w.windowHandle()->setParent(windowLogin);
    w.show();

    UF_terminate();
}

extern "C" DllExport int ufusr_ask_unload()
{
    return (UF_UNLOAD_UG_TERMINATE);
    //return (UF_UNLOAD_IMMEDIATELY);
    //return UF_UNLOAD_SEL_DIALOG;
}

Caesar卢尚宇
2020年4月25日

至于移动对话框这些都是QT里的内容了,参考资料https://www.cnblogs.com/nxopen2018/p/12176486.html

9.将QT对话框嵌套在BlockUI对话框

待续。。。。。。

有时间会去研究的

思路已经很清晰了,先获得BlockUI的窗口句柄,然后转换成QWindow,嵌套上去就可以了。

 

 Caesar卢尚宇

2020年4月25日

 

10.问题补充

2020年4月29日

写好的QT dll考到客户电脑上没办法运行。

目前的解决办法是只能让客户先安装对应版本的QT软件,在以Release编译,连同

Qt5Core.dl  Qt5Gui.dll   Qt5Widgets.dll 一并考到客户电脑上才能运行dll

NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发_第26张图片

 

不建议用QT做开发,用着用着你就会发现问题还是很多的。稳定性兼容性很差。很多技术问题,暂时还不知道怎么解决。

2020年5月29日

更新内容

我汤大哥告诉我,QT程序打包用windeployqt.exe,会将程序所需的所有库文件全部打包。

2020年6月5日

前几天有网友跟我说,用windeployqt.exe打包,考到客户机上也不能用程序。

今天我测试了一下,确实不行。至少 用我文章中的创建项目,windeployqt.exe打包不管用。

你可能感兴趣的:(NX二次开发-基于C++ QT界面对话框(非模态嵌套)与NX交互的开发)