![Siemens NX二次开发](https://wfqqreader-1252317822.image.myqcloud.com/cover/979/41202979/b_41202979.jpg)
5.7 编程实例
至此,关于NX二次开发涉及的三部分知识(菜单与功能区设计、对话框设计、代码设计)您已经基本了解。为了更好地帮助开发者整合这些知识点,接下来使用Block UI与NXOpen C结合的方式开发一个简单的应用程序。基本的需求如下:
● 设计如图5-10所示的“Base Body Test”对话框。
● 在对话框Type下拉列表中有两种类型——Block与Sphere,当显示为“Block”时,Dimensions组中的“Diameter”对应的UI Block不显示。
● 当Type下拉列表中显示为“Sphere”时,Dimensions组中的“Length(XC)”“Width(YC)”“Height(ZC)”对应的三个UI Block不显示。
● 用户在NX的图形窗口指定了Point后,单击对话框中的OK或者Apply按钮,在指定的Point位置,根据对话框上的信息,创建Block或者Sphere Feature。
(1)制作菜单与功能区(相关知识请参阅第2章)。针对本实例,菜单与功能区的制作已完成(请参阅2.4节)。
(2)设计对话框(相关知识请参阅第3章)。针对本实例,对话框设计已完成(请参阅3.4节,并且通过Block UI Styler模块自动生成的三个文件都保存在NX二次开发根目录下的application目录中)。
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_72_1.jpg?sign=1738896002-iJxrWPWLue9dRa13uYmdO0LeFlLEpZGK-0-b87884622d71c81710a6b0f4bd6ae169)
图5-10 Base Body Test对话框
(3)启动Visual Studio,利用NXOpen C++Wizard创建一个名为ch5_5的项目(本例代码保存在“D:\nxopen_demo\code\ch5_5”),删除原有ch5_5.cpp文件,再将Block UI Styler模块自动生成的ch5_5.hpp与ch5_5.cpp拷贝到这个项目中,并将它们添加到Visual Studio Project中,如图5-11所示。
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_72_2.jpg?sign=1738896002-SyjQ6zBXs3QUyw3EdHZyt1mfiCgTkY9B-0-7ab9571a280fae34d9ec701a2b21090b)
图5-11 添加文件到Visual Studio Project中
(4)处理代码以确保对话框打开时,UI Block显示正确。在ch5_5.hpp中添加下列代码:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_72_3.jpg?sign=1738896002-7f0w0zs35hFK26GQepjCPQCcGAexnhvz-0-c39ce4be9436f0227ee55b2d54dbb3ec)
在ch5_5.cpp中,添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_72_4.jpg?sign=1738896002-9sgnmdkYWBqXHdnl2vai2g4kvCpHGMiY-0-e71d64c69241e81d1da883b31bd2f838)
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_1.jpg?sign=1738896002-giaKaocgJjKEKBEFjJkH8oUQwhc896L3-0-a1669254d70b4aa1366695e944a7fed4)
以上代码的逻辑是对话框的type下拉列表有两个选项,获取当前选中选项的索引值(从0开始计数),如果是第0项,就通过BlockID设置“Length(XC)”“Width(YC)”“Height(ZC)”对应的三个UI Block显示。如果是第1项,就显示“Diameter”对应的UI Block,其他未设置的,默认一直可见。
(5)由于期望对话框打开后显示正确,因此SetUIVisibility()这个函数,要添加到initialize_cb()或者dialogShown_cb()回调中。在dialogShown_cb()中添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_2.jpg?sign=1738896002-HiXwZlCihyNL614aqukLjhhsHXi4wr92-0-ffc87406d8227fb970cd49cd48581c65)
(6)当对话框打开后,用户也可以自由切换type中的选项,此时也应该保证对话框显示正确。由于这个操作是期望对话框发生变化的,因此,代码要添加到update_cb()这个回调中,添加的代码格式如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_3.jpg?sign=1738896002-d6DXEXqNJuvvlaoC1R0AzOY26WjrVWPE-0-764ebad40befc883abc163251760f5ba)
(7)由于创建Block与Sphere,使用了NXOpen C API,因此,需要在ch5_5.hpp中,添加下列头文件:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_4.jpg?sign=1738896002-ku2fseZUIvStDk9M3R8QBVfahzcS0KwF-0-877643b0bedefbb534f8f1d3e1edc875)
(8)在ch5_5.cpp的ufusr()中添加初始化与终止API(初学者很容易忽略这一步,如果忽略它,代码编译链接成功,但在NX执行应用程序时有异常),格式如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_5.jpg?sign=1738896002-l9vEnZPlM9wZWaadnBUo1aaWLbhVpMwW-0-c8d90c7ebe8662e2f9e9a8910d09fe02)
(9)转换字符串,将double类型转换为string类型。在ch5_5.hpp中添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_74_1.jpg?sign=1738896002-3JXwypc2ad9BkPtNHVSHF0jTs6QpLSk3-0-a0dfae1231e47be6e31785ab4ec61efb)
在ch5.cpp中,添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_74_2.jpg?sign=1738896002-j1WHzEk3Ap9CgepeKU8Bx0xsiJ3XBJBH-0-d2308fd0c4c0753ad54f879dbcbe001f)
(10)接下来,需要处理单击对话框上的“OK”或“Apply”按钮时,创建Feature的逻辑。在这个过程中,主要涉及使用Block UI时,如何获取UI Block对应的值。这是C++基础知识的应用,开发者可以打开对应的头文件或者官方API帮助文档,查看相关类下的函数,也可以参考“%UGII_BASE_DIR%\UGOPEN\SampleNXOpenApplications\C++\BlockStyler”目录下的样例。
在ch5_5.cpp的apply_cb()中添加下列代码:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_74_3.jpg?sign=1738896002-575QRu50nKblUDCwVDC2mItgZJWet0R1-0-bb7f99c6b255805eaa249b3305ddafff)
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_75_1.jpg?sign=1738896002-kvpTiKaPcVjcHwt3Fk1VsMwjYb9McXuB-0-f8bbddfeffeea53cc57c3db4c3484913)
(11)编译链接生成*.dll文件,并将该文件拷贝到NX二次开发根目录下的application目录中。
在编写代码时,开发者经常需要在编写一定数量的代码后,编译链接生成*.dll文件,再进行代码调试,这样就会出现总是要拷贝*.dll文件到application目录中的问题。
如果您觉得拷贝操作过于烦琐,且设置的NX二次开发的目录结构与本书第2章所介绍内容一致,就可以在Visual Studio主界面中,单击“Project”→“Properties”按钮,设置“Output File”如图5-12所示。设置后,每次编译链接生成的*.dll文件会自动存放到NX二次开发根目录下的application目录中。
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_75_2.jpg?sign=1738896002-YVdfPUz1VucznA1480ACvqltgpjk04Q7-0-8be66748fb4c128fa8ba8ab1bceaa0dc)
图5-12 设置Output File到application目录
(12)在NX中新建或打开一部件文件,单击Ribbon工具条上的“NXOpen Demo”→“Base Body”按钮,启动Base Body工具,在NX图形窗口指定一个点,更改对话框上的数值,单击Apply按钮就可以创建Feature,结果如图5-13所示。
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_75_3.jpg?sign=1738896002-LBRY38raewyCvdvyNuC4RpwGrq07yZLV-0-74c49ff19ca6565673aff15c04e2d197)
图5-13 运行应用程序显示结果