![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=1739231357-Qn3MrPEu3AUKKa964DpUMrCeqTxQFZtj-0-7f955d55e5809c0ef2da0c3ae2d5e398)
图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=1739231357-hD1oxKZtonBAsOT6v6GttEFfMkTNpORX-0-758eb2e7eeff6673a4a81e5c5204125c)
图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=1739231357-pJV2mkg8gLWEIeqtJRekdz86BQuqx0if-0-d018b864623f7b89d5815f5970b03ba6)
在ch5_5.cpp中,添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_72_4.jpg?sign=1739231357-0BTFWckwSL4Uwn9ynDs5GcT9Wd4S7Ao5-0-f354f602eef74ef1dfda8cf4257d03bb)
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_1.jpg?sign=1739231357-Y18tjT7SLHUMnuMo5RB9bGtwk1tnKM39-0-ed3e6d9bbf55a16f33b4956c7f05bc5e)
以上代码的逻辑是对话框的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=1739231357-ClVoH0qJt3UAVk7L9IYjVw6vlmPNa3q3-0-ffaabb6eae056b3b17f7eed59dc6e68e)
(6)当对话框打开后,用户也可以自由切换type中的选项,此时也应该保证对话框显示正确。由于这个操作是期望对话框发生变化的,因此,代码要添加到update_cb()这个回调中,添加的代码格式如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_3.jpg?sign=1739231357-Cxzs1SzbmVZsVPZey4U3IvEWdoYXaq66-0-d814a0db26af21b85aa43475c26790ac)
(7)由于创建Block与Sphere,使用了NXOpen C API,因此,需要在ch5_5.hpp中,添加下列头文件:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_4.jpg?sign=1739231357-SG7HKCr5NkOC0u3Zv3njWeMQtmTYpKiQ-0-07c90cae87fd15ded92641e1583bf729)
(8)在ch5_5.cpp的ufusr()中添加初始化与终止API(初学者很容易忽略这一步,如果忽略它,代码编译链接成功,但在NX执行应用程序时有异常),格式如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_73_5.jpg?sign=1739231357-FeHApshRviUkOqjMKTHU6ekGbfZBb5Re-0-3cd4b69aa945839551f5a735eedac21b)
(9)转换字符串,将double类型转换为string类型。在ch5_5.hpp中添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_74_1.jpg?sign=1739231357-e8ZxwbcPpUkCJxpKDplEOAzD1uVp0bYO-0-d7dddce1104718bd237577a25b742aea)
在ch5.cpp中,添加代码如下:
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_74_2.jpg?sign=1739231357-TqXo77Jic6kP6FvsbjpUrRZdAXoBEguK-0-ad2254480fba20e21f937211ffc42d12)
(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=1739231357-BcffbPzSBSfxOdE5oGdi9yWo3t4bwnSc-0-4d66d5eb7d021906e9163330769ec4c0)
![](https://epubservercos.yuewen.com/A6F99C/21440188008281206/epubprivate/OEBPS/Images/32757_75_1.jpg?sign=1739231357-vozhSJn6VkHoNtJAtbDOKEXEVkYNYstf-0-94e36418056dc5b36dcf4ca2d9bd0bcb)
(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=1739231357-YtBrH0zyvI9GYC67OYAJqVj77zlVHqYQ-0-eb66f677b8594d45befca05a0104c35a)
图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=1739231357-FJQ7r51h9yytcrl3qDOb2sAiiCsKj1CW-0-6a4133da93f3da545ec6e88d22f1905a)
图5-13 运行应用程序显示结果