ln1=line/pp
(1),pp
(1),tanto,involute
pp2=point/xlarge,intof,ln1,gdf
delete/ln1
ln1=line/pp
(1),pp2
mat1=matrix/mirror,ln_mir
invo_mir=transf/mat1,involute
invo_ln=transf/mat1,ln1
pt4=point/intof,gda,ln_mir
pt5=point/intof,gda,involute
pt6=point/intof,gda,invo_mir
curda=circle/pt5,pt4,pt6
pt1=point/intof,gdf,ln1
mat4=matrix/xyrot,360/z
pt1=transf/mat4,pt1
pt2=point/intof,gdf,invo_ln
pt3=point/intof,gdf,ln_mir
pt7
(1)=pt3
j=1
do/l30:
i,1,2*z-1
mat3=matrix/xyrot,i*180/z
ifthen/modf(i,2)<>0
pt7(j+1)=transf/mat3,pt7
(1)
j=j+1
endif
l30:
curdf=circle/pt2,pt7
(2),pt1
shape
(1)=involute
shape1
(1)=ln1
shape2
(1)=curdf
shape3
(1)=invo_ln
shape4
(1)=invo_mir
shape5
(1)=curda
do/l40:
i,1,z-1
mat2=matrix/xyrot,i*360/z
shape(i+1)=transf/mat2,shape
(1)
shape1(i+1)=transf/mat2,shape1
(1)
shape2(i+1)=transf/mat2,shape2
(1)
shape3(i+1)=transf/mat2,shape3
(1)
shape4(i+1)=transf/mat2,shape4
(1)
shape5(i+1)=transf/mat2,shape5
(1)
l40:
mask/2
delete/all
mask/3
blank/all
mask/5
blank/all
mask/9
blank/all
solid=solext/shape(1..z),shape1(1..z),shape2(1..z),$
shape3(1..z),shape4(1..z),shape5(1..z),$
height,w,axis,0,0,1
else
crvtrm/involute,ref,pp
(1),first,gdf,notrim,status,stus
mat1=matrix/mirror,ln_mir
invo_mir=transf/mat1,involute
pt4=point/intof,gda,ln_mir
pt5=point/intof,gda,involute
pt6=point/intof,gda,invo_mir
curda=circle/pt5,pt4,pt6
pt1=point/intof,gdf,involute
mat4=matrix/xyrot,360/z
pt1=transf/mat4,pt1
pt2=point/intof,gdf,invo_mir
pt3=point/intof,gdf,ln_mir
pt7
(1)=pt3
j=1
do/l50:
i,1,2*z-1
mat3=matrix/xyrot,i*180/z
ifthen/modf(i,2)<>0
pt7(j+1)=transf/mat3,pt7
(1)
j=j+1
endif
l50:
curdf=circle/pt2,pt7
(2),pt1
shape
(1)=involute
shape1
(1)=curdf
shape2
(1)=invo_mir
shape3
(1)=curda
do/l60:
i,1,z-1
mat2=matrix/xyrot,i*360/z
shape(i+1)=transf/mat2,shape
(1)
shape1(i+1)=transf/mat2,shape1
(1)
shape2(i+1)=transf/mat2,shape2
(1)
shape3(i+1)=transf/mat2,shape3
(1)
l60:
mask/2
delete/all
mask/3
blank/all
mask/5
blank/all
mask/9
blank/all
solid=solext/shape(1..z),shape1(1..z),shape2(1..z),$
shape3(1..z),height,w,axis,0,0,1
endif
stop:
halt
(4)编译和连接
对UG/OpenGrip程序通过UG自身带的NXOpenGrip进行编译和连接,生成*.grx文件,之后就能在启动UG之后进行调用,进行自动建模了。
三、用户界面设计
编译完成的Grip程序在使用时需要用户进行手动调用,在实际运用时可能会存在麻烦,所以可以进行对用户友好的界面设计,从而更进一步简化设计过程。
1.UG应用开发环境设计
(1)新建文件夹,并在该文件夹下建立startup和application连个文件夹,startup子文件夹用于放置菜单以及dll文件,application子文件夹用于放置对话框文件*.dlg。
(2)注册环境变量,新建变量名“UGII_USER_DIR”,变量值为上述文件夹的地址。
这样,以便UG在进行程序调用时成功能进行动态链接。
如图1所示。
图1环境变量设置
2.菜单设计
在startup文件夹下,新建菜单文件(.men),内容如下:
VERSION120
EDITUG_GATEWAY_MAIN_MENUBAR
AFTERUG_APPLICATION
CASCADE_BUTTONgear_menu
LABEL齿轮参数化设计系统
END_OF_AFTER
MENUgear_menu
BUTTONzgear
LABEL渐开线直齿轮
ACTIONSzgear.dlg
END_OF_MENU
上面的脚本程序将添加菜单栏项目如图2所示:
图2菜单栏
3.UIStyler对话框设计
启动UG的UIStyler制作对话框界面,完成后的对话框界面如图3所示。
图3对话框界面
在此对话框中有5个文本框,【确定】按钮和【取消】按钮,对话框及对话框中各控件的属性如图4和图5所示。
图4 对话框属性
图5对话框属性的定义
在此对话框中,定义了4个回调函数。
Cancel按钮回调函数cancel_zgear,构造回调函数constructor_zgear,析构回调函数destructor_zgear,OK按钮回调函数ok_zgear,如图6所示。
图6 回调函数的定义
最后,将制作完成的对话框另存至上述建立的application文件夹中。
4.使用VisualC++建立应用程序框架
编写相应的回调函数,代码如下:
(1)框架源程序:
#ifndefZGEAR_H_INCLUDED
#defineZGEAR_H_INCLUDED
#include
#include
#include
#ifdef__cplusplus
extern"C"{
#endif
#defineZGEAR_NUM("NUM")
#defineZGEAR_M("M")
#defineZGEAR_Z("Z")
#defineZGEAR_A("A")
#defineZGEAR_W("W")
#defineZGEAR_DIALOG_OBJECT_COUNT(5)
intZGEAR_constructor_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data);
intZGEAR_donstructor_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data);
intZGEAR_ok_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data);
intZGEAR_cancel_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data);
voidwrite_para(intdialog_id);
#ifdef__cplusplus
}
#endif
#endif/*ZGEAR_H_INCLUDED*/
(2)对话框源程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"zgear.h"
#defineZGEAR_CB_COUNT(4+1)
UF_STYLER_item_value_type_tdata[5];
staticUF_STYLER_callback_info_tZGEAR_cbs[ZGEAR_CB_COUNT]=
{
{UF_STYLER_DIALOG_INDEX,UF_STYLER_CONSTRUCTOR_CB,0,ZGEAR_constructor_zgear},
{UF_STYLER_DIALOG_INDEX,UF_STYLER_DESTRUCTOR_CB,0,ZGEAR_donstructor_zgear},
{UF_STYLER_DIALOG_INDEX,UF_STYLER_OK_CB,0,ZGEAR_ok_zgear},
{UF_STYLER_DIALOG_INDEX,UF_STYLER_CANCEL_CB,0,ZGEAR_cancel_zgear},
{UF_STYLER_NULL_OBJECT,UF_STYLER_NO_CB,0,0}
};
staticUF_MB_styler_actions_tactions[]={
{"zgear.dlg",NULL,ZGEAR_cbs,UF_MB_STYLER_IS_NOT_TOP},
{NULL,NULL,NULL,0}
};
//#ifdefMENUBAR_COMMENTED_OUT
externvoidufsta(char*param,int*retcode,intrlen)
{
interror_code;
if((UF_initialize())!
=0)
return;
if((error_code=UF_MB_add_styler_actions(actions))!
=0)
{
charfail_message[133];
UF_get_fail_message(error_code,fail_message);
printf("%s\n",fail_message);
}
UF_terminate();
return;
}
//#endif
#ifdefDISPLAY_FROM_CALLBACK
externint(int*response)
{
interror_code=0;
if((error_code=UF_initialize())!
=0)
return(0);
if((error_code=UF_STYLER_create_dialog("zgear.dlg",
ZGEAR_cbs,
ZGEAR_CB_COUNT,
NULL,/
response))!
=0)
{
charfail_message[133];
UF_get_fail_message(error_code,fail_message);
UF_UI_set_status(fail_message);
printf("%s\n",fail_message);
}
UF_terminate();
return(error_code);
}
#endif
#ifdefDISPLAY_FROM_USER_EXIT
externvoid(char*param,int*retcode,intrlen)
{
intresponse=0;
interror_code=0;
if((UF_initialize())!
=0)
return;
if((error_code=UF_STYLER_create_dialog("zgear.dlg",
ZGEAR_cbs,/*Callbacksfromdialog*/
ZGEAR_CB_COUNT,/*numberofcallbacks*/
NULL,/*Thisisyourclientdata*/
&response))!
=0)
{
charfail_message[133];
UF_get_fail_message(error_code,fail_message);
UF_UI_set_status(fail_message);
printf("%s\n",fail_message);
}
UF_terminate();
return;
}
externintufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
externvoidufusr_cleanup(void)
{
return;
}
#endif
intZGEAR_constructor_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data)
{
if(UF_initialize()!
=0)
return(UF_UI_CB_CONTINUE_DIALOG);
UF_terminate();
return(UF_UI_CB_CONTINUE_DIALOG);
}
intZGEAR_donstructor_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data)
{
if(UF_initialize()!
=0)
return(UF_UI_CB_CONTINUE_DIALOG);
UF_terminate();
return(UF_UI_CB_CONTINUE_DIALOG);
}
intZGEAR_ok_zgear(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data)
{
if(UF_initialize()!
=0)
return(UF_UI_CB_CONTINUE_DIALOG);
UF_STYLER_item_value_type_tnum;
num.item_attr=UF_STYLER_VALUE;
num.item_id=ZGEAR_NUM;
UF_STYLER_ask_value(dialog_id,&num);
if((num.value.string)=="")
{
uc1601("齿轮号不能为空!
",1);
return(UF_UI_CB_CONTINUE_D