第一章渐开线直齿轮的二次开发.docx

上传人:b****6 文档编号:16065387 上传时间:2023-07-10 格式:DOCX 页数:23 大小:243.97KB
下载 相关 举报
第一章渐开线直齿轮的二次开发.docx_第1页
第1页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第2页
第2页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第3页
第3页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第4页
第4页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第5页
第5页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第6页
第6页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第7页
第7页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第8页
第8页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第9页
第9页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第10页
第10页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第11页
第11页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第12页
第12页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第13页
第13页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第14页
第14页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第15页
第15页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第16页
第16页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第17页
第17页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第18页
第18页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第19页
第19页 / 共23页
第一章渐开线直齿轮的二次开发.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第一章渐开线直齿轮的二次开发.docx

《第一章渐开线直齿轮的二次开发.docx》由会员分享,可在线阅读,更多相关《第一章渐开线直齿轮的二次开发.docx(23页珍藏版)》请在冰点文库上搜索。

第一章渐开线直齿轮的二次开发.docx

第一章渐开线直齿轮的二次开发

第一章渐开线直齿轮的二次开发

第一节前言

齿轮是机械零件中非常重要的一类零件,所以齿轮的二维乃至三维的造型建模,在机械设计中是相当重要的。

然而,在设计软件中传统的齿轮建模方法是很麻烦的,尤其是渐开线齿轮。

而且还存在着设计的重复性,即之前已经建模好的齿轮模型,不能在下一次设计中进行应用,因为齿轮的相关参数相对较多,而且相互之间也存在一定的数学关系,因此,不同的齿轮只能进行不同的建模。

这样极大地浪费了人力,增加了重复而又不必要的劳动。

应用UG进行齿轮的二次开发,就能很大程度上减少建模程序,提高工作效率。

第二节渐开线

渐开线的形成是渐开线齿轮建模中的基础。

UG有着功能强大的公式导入的功能,因此可以通过添加渐开线控制参数(xt,yt,zt,s,t)来生成渐开线。

其中关系式如下所示:

S=pi()*db*t/4

Xt=db*cos(angle)/2+s*sin(angle)

Yt=db*sin(angle)/2-s*cos(angle)

Zt=0

由此可以生成渐开线,然后通过镜像处理,可形成单齿,再进行阵列就能形成完整齿轮。

第三节参数化设计

一、通过创建电子表格进行参数化设计

利用上述第二节里完成的齿轮建模,就能进行最基本的参数化控制建模了。

这里探讨利用Excel电子表格控制已存模型里的表达式及公式,最终控制模型进行参数化设计。

1.确定驱动参数

在这里,可以选用模数,齿数等参数进行建模控制

2.启动Modeling应用

3.在Excel表格里从部件里抽取表达式,并清除不需要的表达式

4.修改表格,定义表达式区域,更新部件

以上是简单的通过创建关联的电子表格来实现参数化建模控制,但是这种方法需要以已经建模成功的模型为基础,而且进行操作的时候,驱动参数的选择有很大的局限性,不能由用户进行自由的设计,也就是人性化不够。

二、通过UG的内置编程语言进行参数化设计

Grip(GraphicsInteractiveProgramming)是一种专用的图形交互编程语言,用户通过Grip语言编程能够自动完成在UG下进行参数化设计和绝大部分操作。

用户编制的Grip主程序可以读取用户编制的数据文件,从而使一个主程序可以得到一系列不同规格标准的三维实体。

直齿轮的参数化设计程序主要通过UG/OpenGrip 程序实现,依据渐开线方程,计算关键点的数据,应用Grip 中的样条指令绘制出渐开线,然后根据直齿轮的参数计算公式,得到相应的曲线,最后用实体建模命令以及变换矩阵得到渐开线直齿轮实体模型。

(1)渐开线方程的Grip实现

   do/l20:

ak,0,36

rk=0.5*db/cosf(ak)

ok=sinf(ak)/cosf(ak)-ak*&pi/180

xk=rk*cosf(ok*180/&pi)

yk=rk*sinf(ok*180/&pi)

pp(ak+1)=point/xk,yk

l20:

(2)渐开线直齿轮的参数

   d=m*z

db=d*cosf(a)

da=d+2*ha*m

df=d-2*(ha+c)*m

s=&pi*m/2

ra=da/2

rd=d/2

rf=df/2

rb=db/2

    其中是m模数,z是齿数,a是压力角,ha是齿顶高系数,c是径向间隙系数,d是分度圆直径,db是基圆直径,da是齿顶圆直径,df是齿根圆直径,s是分度圆上齿轮的厚度。

(3)Grip程序的实现

  number/m,z,a,w,ha,c

number/mat(12),mat1(12),mat2(12),mat3(12),mat4(12)

data/ha,1,c,0.25

entity/involute,gda,gdb,gdf,gd,invo_rot,pt_mir,ln_mir,invo_mir,ln1,invo_ln

entity/pp(37),pt,pt1,pt2,pt3,pt4,pt5,pt6,pt7(1000),curda,curdf,pp2,ptori

entity/solid,shape(1000),shape1(1000),shape2(1000)

entity/shape3(1000),shape4(1000),shape5(1000)

ufargs/m,z,a,w

ifthen/z>120

messg/'输入齿数超过‘120’!

'

jump/stop:

endif

d=m*z

db=d*cosf(a)

da=d+2*ha*m

df=d-2*(ha+c)*m

s=&pi*m/2

ra=da/2

rd=d/2

rf=df/2

rb=db/2

do/l20:

ak,0,36

rk=0.5*db/cosf(ak)

ok=sinf(ak)/cosf(ak)-ak*&pi/180

xk=rk*cosf(ok*180/&pi)

yk=rk*sinf(ok*180/&pi)

pp(ak+1)=point/xk,yk

l20:

gda=circle/0,0,0,ra

gd=circle/0,0,0,rd

gdf=circle/0,0,0,rf

gdb=circle/0,0,0,rb

involute=spline/pp

crvtrm/involute,ref,pp(37),first,gda,notrim,status,stus

view/7

pt=point/intof,gd,involute

mat=matrix/xyrot,(s/rd)*(180/&pi)/2

pt_mir=transf/mat,pt

ptori=point/0,0,0

ln_mir=line/ptori,pt_mir,perpto,gda

blank/gda,gdf

ifthen/df

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2