这是在某个群里有人提出来的问题,在NX二次开发的时候,经常会看到大家都在弄无参零件库的工具,这个工具UI大致就是下面的表示这样,左边有一个树列表,列出本地电脑某个文件夹下所有.prt,右上方是一个预览图:
----------------------------
| |___预览图 |
| 树列表 |
| 确定 应用 |
--------------------------
这个功能几年前我就搞过了,当时思路也很简单,当用户在左侧树中切换的时候,就不停的导入模型就可以了,但这有一个问题,就是模型稍微大一点,用户不停的在树上切换节点,会很卡的,所以后来在实际项目中,就在本地库中每个part对应生成了一个全是曲线的part 。这样,在选择树节点时就导入曲线来实现预览,点“确定”时就导入真实的part。
注:怎么快速对三维抽取轮廓曲线?NX有一个“抽取曲线”命令(现在高版本隐藏了)打开后,点“完全在工作视图中”这一个就可以,就直接生成了你想要的曲线。
但是,群里面有人提到别人的工具包似乎没有用这思路。他们的工具,有这样几个特点:①只有一个.prt,但操作后,会多一个.sho出来;②预览的曲线不是用NX自带画的;(因为NX12开始,如果是自带曲线命令画线,一般会在导航器上能看出来的)③一个球体,它有三条预览曲线;如果是抽取曲线的话,它应该只有一条;
我一开始就说,他应该是抽取曲线,因为我想法很简单,有现成的,干吗自己去写一个算法来抽轮廓?
后来,他专门发了人家的工具包,我也就去测了一下他的这外挂无参零件库的功能,我得出的结论,他的思想是这样的:
1、将零件库的指定part复制到c:\temp中命名为:NoParameterPart.prt 直接将它导入到当前模型中;
2、抽取轮廓,抽了三次,应该是前,俯视,左(或者)右视图,这个视图方向分别抽取线;
3、第2步中得到的曲线,只有实体内部的曲线,但没有实体外轮廓的,外轮廓是直接通用边的数据去得到的;
4、他把这些曲线抽取后,离散成点坐标,再存到.sho的二进制文件中,把曲线再删了;
5、当用户指定位置时,就从.sho中读取坐标点,再利用UDO来创建显示;
经过我的测试,他这个里面有几个BUG;
1、如果你的.sho已经存在,他就不会创建,而实际上这个时候,有可能用户.prt已经更改,这个.sho的数据应该更新才对;
2、.sho二进制数据中,没有做格式检验;
3、在某些特殊情况,会导致既不创建.sho,也不会导入part ;
二、为什么人家要搞这么复杂?
1、原创
现在抄袭者,模仿者太多,不搞一点人家想不明白的东西出来,估计大神都觉得对不起自己是老司机了;
2、性能考虑
利用曲线显示,一般都是为了提高性能,显示效率。但实际,我个人觉得他这个里面效率不一定能有很大的提升,因为第一次的,总是会要导入part 抽取线,只有第二次用的时候才会直接读.sho文件。
我倒觉得,可以考虑设置一个首选项,让用户设置是否在保存part的时候就自动创建二进制的.sho文件,这样用户只要在创建零件库零件时,就自动生成了二进制文件,这样可能会对效率帮助更大。
另外一个方法,也可以尝试一下,不要用导入part,而是用装配这个part进来,利用最小化加载,再去提取坐标点生成.sho文件,这样可能效率会更高一点。
三、怎么去猜测别人的功能实现?
其实NX二次开发这东西,没有啥好研究的了,你开发的功能再好,你只要用NX开发放的API,我基本可以直接一键追踪出来,你调了哪些函数,通过这些函数就可以直接看出你的思路了。
比如上方这个功能,直接可以追踪出来,它调了这些UFUN函数:
UF_GROUP_ask_group_data
UF_OBJ_ask_type_and_subtype
UF_GROUP_del_member_from_group
UF_free
UF_OBJ_set_blank_status - 用于在抽取轮廓线时,隐藏它,让用户感觉不到这步操作
UF_OBJ_ask_status
UF_MODL_ask_body_edges
UF_MODL_ask_list_count
UF_MODL_ask_list_item
UF_MODL_ask_edge_type
UF_MODL_ask_edge_verts
UF_MODL_delete_list
UF_VIEW_ask_tag_of_view_name
UF_CURVE_create_silhouette
UF_VIEW_ask_tag_of_view_name
UF_CURVE_create_silhouette
UF_VIEW_ask_tag_of_view_name
UF_CURVE_create_silhouette
UF_OBJ_delete_object
UF_MODL_update
UF_CSYS_map_point
UF_MODL_ask_curve_points
从这些函数,我们就可以直接看出来,抽取曲线,他用的函数是,UF_CURVE_create_silhouette,这个函数只能生成部分轮廓,有些轮廓是没有的,直接有边的对象是用UF_MODL_ask_curve_points来离散的边的坐标。UF_MODL_ask_edge_type判断了边的类型,只有边是非线性类型,才会用到UF_MODL_ask_curve_points,其它的时候,是直接用了UF_MODL_ask_edge_verts。