[摘 要] 通过对Windows NT微机版的 ugⅡ(V16.0)进行二次开发( UG/API)生成三维装配件特殊运动的多幅连续动画图片,介绍了UGⅡ(V16.0)上运用UG/Open开发UGⅡ内部应用程序的一般方法,并解决了UGII中某些运动仿真不能实现的的问题。 [关 键 词] UGⅡ;装配件;特殊运动;二次开发 中图分类号: TP391.7 文献标识码: A UGⅡ作为CAD/CAM/CAE的集成软件以其功能强大,使用方便,技术支持好等优点在国内正拥有越来越多的用户。许多企业在使用UGⅡ一段时间后,都有对UGⅡ进行二次开发的内在要求。如许多企业希望UGII在满足计算机辅助设计的同时,能够以生动形象的方式将新产品介绍给客户,许多企业希望能将三维设计结果以动画形式展示给客户,以提高企业的知名度和吸引更多的的客户。UGⅡ中一般用UG的机构运动或仿真模块产生动画效果[1],但要求在UG中运行,某些特殊的运动无法仿真。
6 I# o1 C' a4 [: L, p! o 本文介绍一种用UG/Open 和C语言开发的动画图片生成程序[2],它首先建立装配中各部件动作的方式和轨迹与某些关键参数间的关系,然后在UGⅡ内部用所开发的程序改变关键参数值,更新整个装配,并保存图片到硬盘。特别适合没有购买机构学仿真模块的用户和处理某些机构学不能实现的动作,如链条的传动、变轨迹皮带运动以及运动过程中零件的形状发生变化的装配件等。
, b) c+ Y( }1 P. ?' P& l( n 1 设定环境变量 1.1 首先确保已购买了相应的进行UGⅡ二次开发的许可证和执行许可证。
- r, P. }: O/ v% G m7 i8 r 1.2 在UG_env.dat/ w7 G. k& Y' k& g5 w6 p! x* l
中指定UGⅡ_USER_DIR或UGⅡ_SITE_DIR或UGⅡ_VENDOR_DIR,以指定存放二次开发结果所使用的目录。这里设定UGⅡ_USER_DIR=c:\UGS160\UGⅡ\C_Picture,在该目录下建立startup和application子目录以放置用户菜单、对话框和动态连接库。 2 建立对话框 UG/Open UIStyler所创建的对话框与UGⅡ的对话框风格一致,所以用它创建对话框。8 A! P' ]* {( l, d* P
启动UGⅡ→Application→激活User interface Styler,建立图1所示对话框。# c1 I+ o5 B% x' e, [
图1 UG/Open UIStyler所建立的Bottom型对话框
2 }! M2 f3 Q7 d2 N2 E( [1 w C_Picture.h:含有指向对话框每个对象的指针;& [, W6 E1 s6 R2 o2 s
C_Picture _template.c:包含了用MenuScript或UG/Open API集成对话框到内部应用程序的框架;8 x; R) ~" y5 u$ ?
C_Picture.dlg:是菜单脚本所规定的动作与API中激活UF_MB_add_styler_actions
0 `" r6 b6 N: D( v- b% Q. s的桥梁;
+ s) ~! f$ r m% R9 s. |' I 3 建立UG内部应用程序 3.1 设置VC6.0环境
2 X4 i5 [' H( p4 k- l. G ⑴建立动态连接库3 c5 y* w3 o, e i) U' O
File→new →Project Workspace→Dynamic -Link Library →OK ⑵设置编译和连接选项
( i" I8 Y0 D% t/ o6 y Project→Settings→C/C++→Category:Code Generation;Use run-time library:Mutli threaded DLL Project→Settings→Link→Object/library modules增加UG的二个库文件:libufun.lib、libugopenint.lib2 _+ |8 P& b! p5 g
⑶设置Include路径和库文件路径
f5 S$ k" Q* F0 j+ r# X Tools→Options→Directories→Show directories for→Include files:c:\UGS160\UGⅡ\ugopen Tools→Options→Show directories for→Library files:c:\UGS160\ugopen 3.2 向C_Picture_template.c中增加代码,进行编译和连接, 保存产生的dll文件到Startup目录下
4 t3 ]* P% H- A 下面就代码的关键部分作一介绍。
1 h0 Q; d0 k, ~ /*导入头文件*/ #include <uf.h> ......' \1 C1 H9 a' A
/*定义函数原型及变量*/ static int C_Picture _file_selection(char *part_name) //显示文件对话框并读入所选文件名5 K/ }* J5 h8 t$ D
int C_Picture _open_part(char *part_name, tag_t *part_tag) //打开所选择文件
9 H) a0 L' a7 Q- f$ T /*定义回叫函数的个数*/ define C_Picture _CB_COUNT ( 1 + 1 ) /* Add 1 for the terminator */ /*定义被对话框所使用的回叫函数入口.*/ static UF_STYLER_callback_info_t MOTIVE_cbs[MOTIVE_CB_COUNT] = { {UF_STYLER_DIALOG_INDEX, UF_STYLER_APPLY_CB , 0, C_Picture _apply_cb}, {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 } }; static UF_MB_styler_actions_t actions[] = { { "C_Picture.dlg",? NULL,?? C_PICTURE _cbs,? UF_MB_STYLER_IS_NOT_TOP }, { NULL,? NULL,? NULL,? 0 } /* This is a NULL terminated list */ }; extern void ufsta (char *param, int *retcode, int rlen){ int error_code; if ( (UF_initialize()) != 0) ??return; /*UF_MB_add_styler_actions 和UF_MB_styler_actions_t注册对话框及其回叫函数到菜单条,作为按下菜单项时执行的动作*/ if ( (error_code = UF_MB_add_styler_actions
5 T" F& z: U4 w8 X( actions ) ) != 0 ) { 显示出错信息 } UF_terminate(); return ; } //注册对话框及回叫函数到菜单条
; P" }, j$ r. G/ ?; p int C_Picture_apply_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data){ UF_STYLER_item_value_type_t data_1; //建立对话框对象( m& h1 [/ L5 [: x7 R9 ]
if ( UF_initialize() != 0) return ( UF_UI_CB_CONTINUE_DIALOG ); /*给定对话框对象的item_id、item_attr,以读取用户在该对象中输入的值。对话框对象ID是建立该对象时用户为其指定的名称,存放在C_Picture.h中。*/ data_1.item_id = C_Picture _STR_0; data_1.item_attr?? =UF_STYLER_VALUE; irc=UF_STYLER_ask_value ( dialog_id, &data_1); C_Picture _make_picture(); //制作图片6 K/ W1 ]4 e5 u+ q1 D- [
UF_terminate(); return (UF_UI_CB_CONTINUE_DIALOG); }//在点击对话框Apply按钮时被激活并读取输入值
' v# @- O' E' s/ ~* ^ `/ W void C_Picture _make_picture(void) { err=UF_initialize(); if(!err){ /*如果没有工作部件,读入一个部件*/ C_Picture _file_selection(part_name); C_Picture _open_part(part_name, &part_tag); /*如果存在工作部件,判变量是否在工作部件中,不在则提示出错*/ UF_MODL_is_exp_in_part (part_tag, STR_dParam , &is_exp_in_part ); uc1601("This expression? is not in work part .",1); /*如变量在工作部件中,修改表达式值,更新图形区,并建立图片到指定目录*/ UF_MODL_edit_exp(exp_str);?? UF_MODL_update( ); UF_DISP_create_image(temp_picture,UF_DISP_TIFF,UF_DISP_ORIGINAL); }//建立并保存图片到硬盘! c' D Q) t8 a; G8 y5 k
UF_terminate(); } 注意:回叫函数中的执行代码应放在UF_initialize() 和 UF_terminate()之间。, y. I9 V$ l8 F+ h7 s4 a8 y: n) l
4 建立菜单条 在UGⅡ中可以运用UGⅡ的菜单脚本编辑UGⅡ菜单条。首先在ugⅡ_env.dat中设定UGⅡ_MENUSCRIPT_SESSION=true,使UGⅡ在启动时获得一个菜单脚本许可,用ASCⅡ文件编辑UG菜单,建立适合用户特定要求的菜单。编辑UGⅡ菜单有二个途径:(1)建立修改菜单的文件;(2)直接修改系统菜单文件;这里用第一种方法。0 i& s: q$ V E9 W
⑴建立菜单文件C_Picture.menu并保存到UGⅡ_USER_DIR/startup目录下$ \/ u) ^& b0 u% w9 b
VERSION 120 EDIT UG_GATEWAY_MAIN_MENUBAR //编辑主菜单条7 ~+ C* W0 `4 R/ s9 [
MENU CUSTOM //给出菜单项标签6 h; _2 c' m. k S
BUTTON C_PICTURE_BTN LABEL Create Picture ACTIONS? C_Picture.dlg //规定选中时所执行的动作
9 z5 B4 b" v* |2 I2 K/ ?( q( b END_OF_MENU AFTER UG_TOOLBOX //在UG_TOOLS后增加菜单( t0 t6 y; F! A$ L
CASCADE_BUTTON CUSTOM LABEL CUSTOM END_OF_AFTER
1 J/ N% y2 ^' }. k% z8 Y0 S
( w( V& a4 F) D1 t( N0 Y8 h+ O% u 图2 MenuScript所建立的菜单标签" s. K" H( E2 U5 W: v: g$ m( J
⑵将Actions所定义的C_Picture.dlg存放到UGⅡ_USER_DIR\application目录下。# F" G) s2 ?. b
这样,重新启动UGⅡ后,便可以对装配件进行生成动画图片的操作。
' ~4 ?6 F: ^7 H- a! t" V. m7 | 无论是直线运动还是曲线运动或回转运动,都有自已的规律。制作动画前首先是确定能表达运动规律的参数和对象,然后建立参数间关系,试着修改参数、分析运动形式,找出规律。下面以小车定滑轮皮带传动为例加以说明。
4 g- d/ o, _/ a( U4 F$ t 图3 小车定滑轮皮带传动示意图2 h) Q$ E& J) |
制作该动画流程: 首先定义小车端至滑轮垂直距离h,滑块端至滑轮垂直距离h1,小车端皮带与立板距离d。对各零件通过建立配对关系进行装配,并在装配文件中定义a为Belt_3的可伸缩长度。为使动画逼真,可给滑轮定义基准面datum_1和datum_2(如图3所示),并在装配时规定滑轮的基准面与Face_1或Face_2间夹角,建立起夹角与参数a之间的关系;规定Belt_1的实际长度为  ;Belt_1与Face_1夹角为deg(atan(d/h));Belt_3长度为h1。假设装配件名称为assm.prt,则在装配文件中规定h=h0+assm::a,h1=ho-assm::a,通过选择View→Make motive picture激活对话框,在参数名中输入a,给定具体变化步数、循环次数和方式,点击Apply自动生成连续的动画图片,再加入到动画软件中便可进行播放。
) h3 l# k! O4 G3 p Y6 L, M% T8 |5 结 论 UGII软件本身提供了良好的二次开发功能,为用户进行适合特定要求的二次开发提供了丰富的工具。包括从编辑菜单、建立对话框到抽取或给定部件中对象、特征、装配信息的函数,只要充分运用UGII的现有功能,完全可以实现用户的各种特定要求。 |