为企业打造卓越的工具平台

UG二次开发无参零件库的预览问题解决方案

发布日期:2022-05-10 15:05:13

UG二次开发无参零件库的预览问题解决方案


这是在某个群里有人提出来的问题,在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。