extern void ufusr( char * param, int * retcod, int param_len ) {
if (!UF_initialize()) {
tag_t view_tag = NULL_TAG;
/* 创建圆柱的变量声明区 */
double cyl_origin[ 3 ] = { 0.0, 0.0, 0.0 }; char *cyl_height = \ char *cyl_diam = \
double cyl_direction[ 3 ] = { 0.0, 0.0, 1.0 }; tag_t cyl_obj_id;
uf_list_p_t face_list; /* 保存Cylinder面的链表 */
/* 创建相对参考平面的变量声明区 */ int num_refs = 1; tag_t object_tags[ 3 ]; tag_t object_tags1[ 3 ];
int point_select[ 3 ] = { 0, 1, 0 }; int which_plane = 1; char *offset_string = \ int num_dplanes; tag_t dplane_tag[ 2 ]; tag_t dplane_tag1[ 2 ];
int layer_fea_nu; tag_t *layer_fea_id;
/* 创建孔特征的变量声明区 */
double location[ 3 ] = { 5.0, 0.0, 10.0 }; double direction[ 3 ] = { -1.0, 0.0, 0.0 }; char *diame = \ char *depth = \ char *angle = \
tag_t face_li; /* 放置平面 */ tag_t face_t1; /* 穿透平面 */ tag_t hole_obj_id;
/* 创建圆柱体 */
UF_MODL_create_cyl1( UF_NULLSIGN, cyl_origin, cyl_height, cyl_diam, cyl_direction, &cyl_obj_id );
/* 获取圆满柱体所有的面,存入链表 */
UF_MODL_ask_feat_faces( cyl_obj_id, &face_list );
UF_MODL_ask_list_item( face_list, 2, &object_tags[ 0 ] );
UF_MODL_delete_list( &face_list );
/* 设置61层为工作层,将以下创建的参考平面放到61层 */ UF_LAYER_set_status( 61, UF_LAYER_WORK_LAYER ); /* 创建参考平面 */
UF_MODL_create_relative_dplane( num_refs, object_tags, point_select, which_plane, NULL, NULL, \ /* 获取参考平面的Object Tag */ object_tags1[0] = dplane_tag[0];
UF_MODL_ask_feat_object( dplane_tag[0], &layer_fea_nu, &layer_fea_id ); UF_OBJ_set_blank_status( layer_fea_id[0] , UF_OBJ_BLANKED); UF_free( layer_fea_id );
/* 由第一个参考平面偏置出第二个参考平面,使第二个参考平面与圆满柱平面相切 */ UF_MODL_create_relative_dplane( 1, object_tags1, point_select, which_plane, NULL, NULL, offset_string, &num_dplanes, dplane_tag1 );
/* 设置层1为工作层 */
UF_LAYER_set_status( 1, UF_LAYER_WORK_LAYER );
/* 创建孔特征 */
face_li = dplane_tag1[ 0 ]; /* 放置面为参考平面 */ face_t1 = object_tags[ 0 ]; /* 穿透面为圆柱平面 */ UF_MODL_create_simple_hole( location, direction, diame, depth, angle, face_li, face_t1, &hole_obj_id );
/* 调整视图到合适的大小 */
UF_VIEW_ask_work_view( &view_tag ); UF_VIEW_fit_view( view_tag, 0.7 );
/* 保存部件 */ UF_PART_save( );
UF_terminate( ); } }
在编译连接后,新建或打开一个部件文件。通过File→Execute→User Function调用生成的动态链接库文件。运行结果如图6-4所示。
图6-4创建相对参考平面
UF_LAYER_set_status
创建参考特征函数有些返回的是对象标识,有些返回的是特征标识,当返回的是特征标识时,可通过函数UF_MODL_ask_feat_object获得对应特征的对象标识;当返回的是对象标识时,可通过函数UF_MODL_ask_object_feat获得对应对象的特征标识。
表6.6查询参考特征函数
函数名称 UF_MODL_ask_datum_axis_parms UF_MODL_ask_datum_plane_parms UF_MODL_is_datum_axis_reversed UF_MODL_is_datum_plane_reversed UF_MODL_ask_daxis_size UF_MODL_ask_datum_point_and_direction 函数功能及要点 获得基准轴的原点和方向,其中输入的是基准轴的特征标识 获得基准平面的原点、方向、偏置距离和偏置角,其中输入的是基准轴的特征标识 查询基准轴的方向是否反向,如反向返回Ture,否则返回False 查询基准面的方向是否反向,如反向返回Ture,否则返回False 获得基准轴的长度 获得参考特征的点和方向的对象标识,如果没有点和方向的对象,则返回NULL 表6.7编辑参考特征函数
函数名称 UF_MODL_reverse_datum_axis UF_MODL_reverse_datum_plane 将基准轴方向反向 将基准平面方向反向 函数功能及要点 UF_MODL_convert_to_fixed_datum UF_MODL_edit_datum_direction UF_MODL_edit_datum_point 将输入的参考特征转化为固定参考特征,其中输入的是参考特征的特征标识 用新的方向对象标识来修改参考特征 用新的点对象标识来修改参考特征
6.4 创建布尔特征
布尔操作用于将两个或多个实体(或片体)组合成一个体,包括相加、相减、相交三种类型。执行布尔操作至少存在两个实体或片体,组合的体必须有重叠的部分。布尔操作的结果是实体还是片体取决于目标体,目标体为实体,结果为实体,目标体为片体,则结果为片体。UF函数允许用户对两个实体进行相加、相减和相交的各种布尔操作,并且用户可以根据需要来确定保留或删除目标体和工具体。布尔操作函数的输入参数都是体标识,因此在创建布尔操作特征前,应使用函数UF_MODL_ask_feat_body获得与与特征相连的体标识。其函数的声明主要包含在头文件uf_modl.h中。
表6.8布尔操作的函数
函数名称 UF_MODL_operations UF_MODL_unite_bodies UF_MODL_unite_bodies_with_retained_options UF_MODL_subtract_bodies UF_MODL_subtract_bodies_with_retained_options UF_MODL_intersect_bodies 函数功能及要点 对两个实体执行布尔操作,包括相加、相减和相交 相加布尔操作,不可保留目标体、工具体 相加布尔操作,可保留或删除目标体、工具体 相减布尔操作,不可保留目标体、工具体 相减布尔操作,可保留或删除目标体、工具体 相交布尔操作,不保留目标体、工具体 UF_MODL_intersect_bodies_with_retained_options 相交布尔操作,可保留或删除目标体、工具体 获得一个实体特征布尔操作状态的信息 UF_MODL_ask_feature_boolean UF_MODL_ask_feature_sign UF_MODL_replace_boolean_body UF_MODL_edit_boolean_with_retained_options 获得一个特征如何进行布尔操作标识 编辑布尔操作,替换目标体或工具体 编辑布尔操作,保留或替换目标体或工具体 下面以求差布尔操作为例,求差布尔操作有两个接口函数,分别为UF_MODL_subtract_bodies和UF_MODL_subtract_bodies_with_retained_options,其函数参数分别如下:
int UF_MODL_subtract_bodies( tag_t target //输入参数,目标体 tag_t tool //输入参数,工具体
int * num_result //输出参数,结果体的个数
tag_t * * resulting_bodies //输出参数,结果体的标识数组 )