摘要:本文简述了在二次开发过程中,利用UG/Open API对成型特征进行相对定位的方法,对定位过程中关键问题进行了详细的论述。同时利用实例说明了该方法的实现。
关键词:UG/Open API,成型特征,相对定位约束
1、研究目的
UG建模工具已经发展成为一套完整的产品设计解决方案,在整个产品开发过程中,它提供给工程人员和设计者技术领先的功能。UG/Open具有供多种应用软件与UG柔性集成的开放式结构,它为用户集成和定制应用软件提供了工具,许多企业都开始利用UG二次开发语言的模块UG/Open API和UG/Open GRIP,以及辅助开发模块UG/Open Menuscript和UG/Open Uistyler对UG进行二次开发。本文介绍了在UG/Open API开发的过程中,对成型特征的相对定位进行了探讨,使我们不仅在UG交互环境中实现零件及产品的关联改变,同时通过API二次开发出的零件及产品也能实现关联改变。论述了利用API进行相对定位的方法,以及一此特殊约束类型的实现,并利用相对定位的方法在一个长方形的块上建立了型腔和孔的特征。
2、关于UG/Open API
UG/Open API是UG提供的一个二次开发语言模块,具有与外部高级开发语言接口。UG/Open API程序是用C语言编制的,因此,它除了能够在UG的环境下对UG进行功能调用外,还能在程序中使用C语言支持的全部功能,具有很大的灵活性。UG/Open API提供的UG功能全部以标准C语言头文件(*.h文件)的形式保存在UG安装目录下的ugopen\目录中,不同的头文件包含了不同的UG功能。如uf.h文件包含了UG接口,任何UG/Open API程序都必须包含这个头文件。由于与各种C语言编辑环境有良好的兼容性,UG/Open API程序的使用范围最为广泛。
3、成型特征的相对定位
3.1相对定位的方法
API主要利用函数UF_MODL_create_rpo_constraints()来建立相对定位。成型特征用于模型的细节设计,包括孔、槽、型腔、凸台和凸垫等,成型特征在建立的过程中需要和目标体进行布尔运算。因此利用相对定位函数对成型特征进行定位时,必须在成型特征建立的过程中,即成型特征和目标体布尔运算之前进行。为此可在调用成型特征函数之前,利用函数UF_MODL_register_rpo_routine()注册一个用户函数,在注册的用户函数中调用定义相对定位的函数,这样可保证在利用API函数建立成型特征时,可实现相对定位,以保证所建立零件能实现相关改变。 注册的用户函数格式如下:
UF_MODL_register_rpo_routine(user_rpo_routine)
int user_rpo_routine(tag_t obj_id)
3.2临时特征标识
其中注册的用户函数只有一个输入参数,它是由程序自动转输,这个参数为一个特征标识,这个特征标识并不是调用成型特征函数后返回的特征标识,而是调用成型特征函数过程中生成的临时特征标识,这个临时特征为与目标体进行布尔运算的特征,比如孔特征,它是由一个与孔特征参数相同的实体特征与目标体相交形成的,程序自动转输给注册用户函数的临时特征即为这个与孔特征参数相同的实体特征。
在注册的用户函数中,利用临时特征标识可获得在相对定位函数中需要的工具对象,比如建立孔特征中,利用临时特征可获得孔的边。
3.3特殊的约束处理
相对定位函数中,约束类型只提供了水平定位、垂直定位、平行定位、平行间距定位、正交定位、角度定位,而没有点到点定位、线到线定位、点到线定位。对于这三种定位方式,可利用已有的约束类型结合约束值来实现,具体点到点定位可选择平行定位,同时将约束值置零;线到线定位可选择平行间距定位,同时将约束值置零;点到线定位可选择正交定位,同时将约束值置零。
4、应用实例
为充分说明在API中如何实现成型特征的相对定位,本例首先创建了一个长方形的块,在块上创建了一个型腔,利用线到线的定位方式,实现了型腔和块的相对定位;然后对块进行了边倒圆,同时创建一个简单孔特征,利用点到点的定位方式,使孔与倒圆边同心,从而实现了孔特征与目标体的相对定位。其结果如图1-1所示。
1-1 在块上建立型腔和孔特征的示意图 为确定成型特征安置面的标识,可以在获取块上面标识的循环过程中,插入下段程序。该段程序会高亮显示块上的面并弹出一个需用户确认的对话框,对话框中显示该对象的标识号。同理利用该方法可以获取用于相对定位的边标识。
UF_DISP_set_highlight(tem_tag,1);
Sprintf(mess, "The object is %d!", i);
uc1601(mess, 1);
UF_DISP_set_highlight(tem_tag,0);
以下为利用UG/OPEN API函数,实现型腔和孔在块上相对定位的主程序,该程序的运行必须先打开一个部件文件,在编译连接后,通过File→Execute→User Function,即可运行。
#include < stdio.h>
#include < uf.h>
#include < uf_modl.h>
#include < uf_ui.h>
#include < malloc.h>
/*定义全局变量,用于转递相对定位的目标边*/
tag_t edge_blk[12];
tag_t edge_blend[4];
/*注册型腔定位的用户函数*/
int rpo_routine_pocket(tag_t obj_id)
{
int irc=0,i;
uf_list_p_t edge_list;
int count_list;
tag_t tem_tag,*edge_pock;
edge_pock=(tag_t *)malloc(12*sizeof(tag_t));
tag_t *obj_id_target,*obj_id_tool;
obj_id_target=(tag_t *)malloc(3*sizeof(tag_t));
obj_id_tool=(tag_t *)malloc(3*sizeof(tag_t));
char *constraint_value[]={"0.0","0.0"};
char *constraint_array[]={"PARA_EDGE_PARMS","PARA_EDGE_PARMS"};
int target_qualifier[]={UF_MODL_ENDPOINT_1,UF_MODL_ENDPOINT_1};
int tool_qualifier[]={UF_MODL_ENDPOINT_1,UF_MODL_ENDPOINT_1};
UF_MODL_ask_feat_edges(obj_id,&edge_list );
UF_MODL_ask_list_count(edge_list,&count_list);
for (i=0;i < count_list;i++)
{
UF_MODL_ask_list_item(edge_list,i,&tem_tag);
edge_pock[i]=tem_tag;
}
UF_MODL_delete_list(&edge_list);
obj_id_tool[0]=edge_pock[0];
obj_id_tool[1]=edge_pock[4];
obj_id_target[0]=edge_blk[1];
obj_id_target[1]=edge_blk[0];
irc=UF_MODL_create_rpo_constraints(obj_id,NULL_TAG,NULL_TAG,obj_id_target, target_qualifier,obj_id_tool,tool_qualifier,constraint_value,constraint_array,2); free(edge_pock);
free(obj_id_target);
free(obj_id_tool);
if (irc == 0)
return (0);
else return (1);
}
/*注册孔定位的用户函数*/
int rpo_routine_hole(tag_t obj_id)
{
int irc,i;
int count_list;
tag_t tem_tag;
tag_t edge_tool[5];
uf_list_p_t edge_list;
tag_t obj_id_target[2],obj_id_tool[2];
char *constraint_value[]={"0.0"};
char *constraint_array[]={"PARA_DIST_PARMS"};
int target_qualifier[]={UF_MODL_ARC_CENTER};
int tool_qualifier[]={UF_MODL_ARC_CENTER};
UF_MODL_ask_feat_edges(obj_id,&edge_list );
UF_MODL_ask_list_count(edge_list,&count_list);
for (i=0;i< count_list;i++)
{
UF_MODL_ask_list_item(edge_list,i,&tem_tag);
edge_tool[i]=tem_tag;
}
UF_MODL_delete_list(&edge_list);
obj_id_target[0]=edge_blend[2];
obj_id_tool[0]=edge_tool[1];
irc=UF_MODL_create_rpo_constraints(obj_id,NULL_TAG,NULL_TAG,obj_id_target, target_qualifier,obj_id_tool,tool_qualifier,constraint_value,constraint_array,1);
if (irc == 0)
return (0);
else
return (1);
}
/*UG/OPEN API内部环境的入口函数*/
void ufusr(char *param, int *retcode, int paramLen)
{
if (!UF_initialize())
{
/*定义创建块的参数*/
UF_FEATURE_SIGN sign = UF_NULLSIGN;
double block_orig[3] = {0.0,0.0,0.0};
char *block_len[3] = {"100","60","40"};
tag_t blk_fea,blk_obj,tem_tag,face_blk[6];
uf_list_p_t face_list,edge_list; int count_list;
int i;
/*定义创建型腔的参数*/
double pock_loc[3] = {25.0,30.0,40.0};
double pock_dir[3] = {0.0,0.0,-1.0};
double pock_x_dir[3]= {1.0,0.0,0.0};
char *pock_len[3]={"50.0","40.0","20.0"};
char *pock_corner={"0.0"};
char *pock_floor={"0.0"};
char *pock_angle={"0.0"};
tag_t pock_id;
/*定义创建边倒圆的参数*/
char *blend_radius="20.0";
uf_list_p_t blend_list,blend_edge_list;
tag_t blend_id;
/*定义创建孔的参数*/
double hole_origin[3] = {60.0,30.0,40.0};
double hole_cyl_dir[3] = {0.0,0.0,-1.0};
char *hole_dia = "25.0";
char *hole_height = "5.0";
char *hole_angle = "0.0";
tag_t hole_id;
/*创建块*/
UF_MODL_create_block1(sign, block_orig, block_len, &blk_fea);
UF_MODL_ask_feat_body(blk_fea,&blk_obj);
/*获得块上面的标识,用于确定成型特征的孔和型腔安置面, 以及孔的穿透面*/
UF_MODL_ask_body_faces(blk_obj,&face_list);
UF_MODL_ask_list_count(face_list,&count_list);
for (i=0;i< count_list;i++)
{
UF_MODL_ask_list_item(face_list,i,&tem_tag);
face_blk[i]=tem_tag;
}
UF_MODL_delete_list(&face_list);
/*获得块上边的标识,用于相对定位*/
UF_MODL_ask_body_edges(blk_obj,&edge_list);
UF_MODL_ask_list_count(edge_list,&count_list);
for (i=0;i< count_list;i++)
{
UF_MODL_ask_list_item(edge_list,i,&tem_tag);
edge_blk[i]=tem_tag;
}
UF_MODL_delete_list(&edge_list);
/*创建型腔,并进行相对定位*/
UF_MODL_register_rpo_routine(rpo_routine_pocket);
UF_MODL_create_rect_pocket(pock_loc,pock_dir,pock_x_dir,pock_len, pock_corner,pock_floor,pock_angle,face_blk[0],&pock_id );
UF_MODL_unregister_rpo_routine();
/*进行边倒圆*/
UF_MODL_create_list(&blend_list);
UF_MODL_put_list_item(blend_list,edge_blk[6]);
UF_MODL_create_blend(blend_radius,blend_list,0,0,0,0.5,&blend_id);
/*获取倒圆的边,用于孔的相对定位*/
UF_MODL_ask_feat_edges(blend_id,&blend_edge_list);
UF_MODL_ask_list_count(blend_edge_list,&count_list);
for (i=0;i< count_list;i++)
{
UF_MODL_ask_list_item(blend_edge_list,i,&tem_tag);
edge_blend[i]=tem_tag;
}
UF_MODL_delete_list(&blend_edge_list);
/*创建孔,并进行相对定位*/
UF_MODL_register_rpo_routine(rpo_routine_hole);
UF_MODL_create_simple_hole(hole_origin,hole_cyl_dir,hole_dia, hole_height,hole_angle,face_blk[0],face_blk[1],&hole_id); UF_MODL_unregister_rpo_routine(); UF_terminate();
}
}
5、结论
在UG/Open API开发的过程中,利用API函数可以实现对成型特征进行相对定位。
本文通过在一个长方形的块上建立了型腔和孔的特征,以实例说明成型特征进行相对定位的方法,并对一些特殊约束类型的实现进行了说明。
(end)
|