6_UG二次开发实用教程 第六章 下载本文

第六章 零件设计

UG的特征建模功能非常强大,UG中几乎所有的几何特征都可以利用UG/OPEN API进行创建。UG/OPEN API提供诸如UF_MODL_create_XXX_XXX的函数用于创建几何特征,提供诸如UF_MODL_ask_XXX_XXX的函数用于查询特征的属性。但是通常情况下,修改几何特征往往要通过几何特征的参数来实现。

6.1 基本概念

1、明确特征的几何描述

利用函数UF_MODL_create_XXX_XXX创建几何特征,首先要明确几何特征的几何描述。以最简单的圆锥为例,可以通过函数UF_MODL_create_cone1()创建一个圆锥,但是如果你对圆锥特征的几何描述不清楚,你就不能明白函数UF_MODL_create_cone1()中参数的含义。

如果你在使用函数UF_MODL_create_cone1()创建圆锥特征之前,知道在三维空间中描述一个圆锥,需要知道圆锥的原点、高度、底部和顶部的直径、方向。此时你使用函数UF_MODL_create_cone1()时,

int UF_MODL_create_cone1( UF_FEATURE_SIGN sign double origin [ 3 ] char * height char * diam [ 2 ] double direction [ 3 ] tag_t * cone_obj_id )

也就是说,在创建任何特征之前,要明确特征的几何描述。

2、分清函数参数的类型

在二次开发过程中,必须分清UF函数是针对特征(Feature)操作、还是对象(Object)操作,还是实体(Body)操作。

特征是将用户对UG实体的所有操作过程都以特征的方式记录下来,一个实体往往可以拥有多个特征,如一个block经过倒角(blend),钻孔(hole)后,那么在这个实体上就存在了三个特征,并且按照时间先后顺序排列。

对象是指uf_object_types.h中说明的对象,包括:体(),表面,边缘,直线(line),圆(circle)、二次曲线(conic)和样条曲线(spline)等几何对象,还有基准轴(datum axis),基准面(datum plane)、草图(sketch)、表达式、颜色、线型、组等非几何对象。

Body 是指UG实体。利用UF函数可以从Body中得到所有在其上操作过的Feature。 特征、对象和实体之间可以相互访问,可以从Feature中得到相应的Body

UF_MODL_ask_feat_body UF_MODL_ask_feat_faces UF_MODL_ask_feat_edges

UF_MODL_ask_body_feats UF_MODL_ask_edge_feats UF_MODL_ask_face_feats

UF_MODL_ask_body_faces UF_MODL_ask_body_edges UF_MODL_ask_face_body UF_MODL_ask_face_edges

UF_MODL_ask_edge_body UF_MODL_ask_edge_faces

用UF_MODL_ask_feat_body可以获得与特征相连的体标识,相应的如果已知某个体标识,也可以利用函数UF_MODL_ask_body_feats获得与之相连的所有特征标识。

3、建模思路

UG基于特征的建模过程是仿真零件的加工过程。

采用UG/OPEN API建立零件模型时,可先在NX交互界面下生成实体模型,再根据其操作过程运用相应的API函数。

UF_MODL_create_cyl1()

UF_MODL_create_simple_hole() UF_MODL_create_edge_blend()

6.1 创建体素特征

基本体素是基本的解析外形,包括:长方体、圆柱体、圆锥体和球。UF函数允许用户创建和查询所有的基本体素特征,创建和查询基本体素的函数声明主要包含在头文件uf_modl.h中。

表6-1 与体素特征相关的函数

特征名 块 函数名 UF_MODL_create_block1 UF_MODL_create_block UF_MODL_ask_block_parms UF_MODL_create_cyl1 圆柱 UF_MODL_create_cyl UF_MODL_ask_cylinder_parms UF_MODL_create_cone1 圆锥 UF_MODL_create_cone UF_MODL_ask_cone_parms UF_MODL_create_sphere1 球

UF_MODL_create_sphere UF_MODL_ask_sphere_parms 下面以如何创建长方体为例,讲解创建体素特征,我们可以利用UF_MODL_create_block1()创建一个长方体,该函数包括三个输入参数和输出参数。

int UF_MODL_create_block1 (

UF_FEATURE_SIGN sign //输入参数,布尔操作标记 double corner_pt [ 3 ] //输入参数,长方体的原点 char * edge_len [ 3 ] //输入参数,长方体的长宽高 tag_t * blk_obj_id //输出参数,长方体的特征标识 )

其中,sign表示布尔操作的标记,表示新建的长方体与已存目标体的布尔操作方式,包括:

UF_NULLSIGN = 不进行布尔操作 UF_POSITIVE =与已存目标体加操作 UF_NEGATIVE =与已存目标体减操作 UF_UNSIGNED =与已存目标体相交操作

corner_pt表示长方体的原点,为底面斜角点,如下图所示,圆柱和圆锥的原点为底面中点,球的原点为球心位置。

edge_len是一个字符串数组,表示长方体的长宽高,可以直接赋值,也可以使用表达式赋值,比如:

char *block_len[3] = {“1\

char *block_len[3] = {“bl_length=1\如果直接赋值,将由系统自动生成“pn”格式的表达式,如果采用表达式赋值,此时在表达式中将会出现相应的表达式,建议采用表达式方式赋值。

blk_obj_id是输出参数,通过tag_t指针输出新建长方体的特征标识,如果需要可以通过函数UF_MODL_ask_feat_body获得对应特征的实体对象标识。

创建长方体特征的函数除

UF_MODL_create_block1()外,还有

UF_MODL_create_block()。事实上,UF_MODL_create_block()比UF_MODL_create_block1()多了一个参数tag_t类型的输入参数targ_tag,该参数表示当进行布尔操作时,可以通过该参数指定目标体,如果不进行布尔操作可将参数设置为NULL_TAG。

例6-1 通过一个选择菜单,让用户选择创建不同的基本体素特征。 例6-1创建基本体素

#include #include #include #include #include #include

extern void ufusr( char * param, int * retcod, int param_len ) {

/* 对话框设置 */ char *cp1 = \请选择\ int ip2 = 0;

char cp3[4][38] = { \创建一个块(Block)\ \创建一个圆柱(Cylinder)\ \创建一个圆锥(Cone)\ \创建一个球体(Sphere)\

int ip4 = 4;

int value;

tag_t view_tag = NULL_TAG;

UF_FEATURE_SIGN sign = UF_NULLSIGN;

/* Block的变量声明区 */

double blk_corner[ 3 ] = { 0.0, 0.0, 0.0 };

char *blk_edge_len[ 3 ] = { \ tag_t blk_obj_id;

/* Cylinder的变量声明区 */

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;

/* Cone的变量声明区 */

double cone_origin[ 3 ] = { 0.0, 0.0, 0.0 }; char *cone_height = \

char *cone_diam[ 2 ] = { \ double cone_direction[ 3 ] = { 0.0, 0.0, 1.0 }; tag_t cone_obj_id;

/* Sphere的变量声明区 */

double sphere_center[ 3 ] = { 0.0, 0.0, 0.0 }; char *sphere_diam = \ tag_t sphere_obj_id;

if ( !UF_initialize() ) {

/* 显示菜单 */

value = uc1603( cp1, ip2, cp3, ip4 ); switch( value ) {

case 5: /* 创建Block(块) */

UF_MODL_create_block1( sign, blk_corner, blk_edge_len, &blk_obj_id ); break;

case 6: /* 创建Cylinder(圆柱) */ UF_MODL_create_cyl1( sign, cyl_origin, cyl_height, cyl_diam, cyl_direction,

&cyl_obj_id ); break;

case 7: /* 创建Cone(圆锥) */

UF_MODL_create_cone1( sign, cone_origin, cone_height, cone_diam, cone_direction, &cone_obj_id ); break;

case 8: /* 创建Sphere(球体) */

UF_MODL_create_sphere1( sign, sphere_center, sphere_diam, &sphere_obj_id ); break; default:

uc1601( \发生了错误!\ }

/* 调整视图到合适的大小 */

UF_VIEW_ask_work_view( &view_tag ); UF_VIEW_fit_view( view_tag, 0.7 ); /* 保存文件 */ UF_PART_save( ); UF_terminate( ); } }

在编译连接后,新建或打开一个部件文件。通过File→Execute→User Function调用生成的动态链接库(*.dll)文件。此时界面弹出一个创建基本体素的对话框,如图6-1所示,用户可以选择一个基本体素的类型,即可创建需要的实体模型,如果如图6-2所示。

图6-1基本体素选择对话框

图6-2创建基本体素

体素特征是非关联的,意味着它们和用于生成它们的几何体是不相关的,因此,在运用NX建立参数化模型时,体素特征只作为第一个特征且只用一次。在二次开发过程中,建议也采用这种要求。

通过UF函数建立基本体素特征返回的是相应基本体素的特征标识,如果需要可以通过函数UF_MODL_ask_feat_body获得对应特征的实体对象标识。所有建立体素特征的函数中,基本体素的参数是通过字符指针变量来输入的,用户既可以直接输入相应参数的值,也可以用表达式的形式输入相应参数的值。基本体素的原点位置分别为:块为底面斜角点;圆柱和圆锥为底面中点;球为球心位置。其方向分别为其建立方向。

6.2 创建扫描特征

扫描特征是截面几何体(曲线、草图、片体或实体表面等)进行拉伸、旋转或沿导向线扫描来创建三维模型,包括拉伸体、旋转体、沿导向线扫描和管道四种方式,它是构成部件非解析形状毛坯的基础。UF函数允许用户创建、查询和编辑拉伸、旋转、沿导向线和管道等所有的扫描特征。其函数的声明主要包含在头文件uf_modl.h中。

表6.2创建扫描特征函数

函数名称 UF_MODL_create_extrude_trim_opts 函数功能及要点 可以采用UG交互环境中提供的所有拉伸体建立方法建立一个拉伸体特征,截面线串采用对象数组进行定义。 UF_MODL_create_extruded 采用方向距离法建立一个拉伸特征,截面线串采用链表进行定义,返回一个特征链表。 UF_MODL_create_revolution UF_MODL_create_revolved 建立一个旋转体特征,截面线串采用对象数组进行定义。 只能采用轴和角度的方法建立一个旋转体特征,截面线串采用链表进行定义 UF_MODL_create_extruded_path UF_MODL_create_extrusion_path UF_MODL_create_tube 利用用户定义了内、外直径的圆形横截面沿引导线串进行扫描建立管道或电缆特征,引导线串采用链表进行定义。

下面以如何创建拉伸体为例,讲解创建扫描特征,我们可以利用

UF_MODL_create_extruded()创建一个拉伸体,该函数采用方向距离法建立一个拉伸特征,截面线串采用链表进行定义,特征以链表形式返回。在创建拉伸特征之前,我们要对拉伸特征的几何描述

有明确的认识,创建一个拉伸特征,包括:截面几何体、拉伸的起始位置、方向,甚至还包括:拔模角、布尔操作等。

int UF_MODL_create_extruded

(

uf_list_p_t objects //输入参数,拉伸体的截面几何体 char * taper_angle //输入参数,拉伸体的拔模角 char * limit [ 2 ] //输入参数,拉伸起始位置 double point [ 3 ] //不使用

double direction [ 3 ] //输入参数,拉伸方向 UF_FEATURE_SIGN sign //输入参数, uf_list_p_t * features //输出参数, )

其中,objects表示拉伸体的截面几何体,该参数为链表类型。可以通过函数UF_MODL_create_list()创建一个链表,再将函数UF_MODL_put_list_item(),将相应的对象放入到链表中,不要忘记链表使用完后,必须使用函数UF_MODL_delete_list()释放空间。

UF_MODL_create_list(&loopList); for(i = 0; i < count; i++) {

UF_MODL_put_list_item(loop_list, objArray[i]); } ….

UF_MODL_delete_list();

taper_angle表示拉伸体的拔模角,其参数类型为字符串,同样建议以表达式形式赋值。当

扫描结果为片体时,拔模角必须设置为零。

sign表示布尔操作的标记,同创建基本体素相同。

features表示新建的拉伸体特征,其类型为链表,不要忘记链表使用完后,必须使用函数

UF_MODL_delete_list()释放空间。

例6-2 通过定义四条直线作为拉伸体的截面线串,使用函数

UF_MODL_create_extruded()。

例6-2创建拉伸体

#include #include #include #include #include

void ufusr(char *param, int *retcode, int paramLen) {

int i;

tag_t view_tag = NULL_TAG;

/* 定义四根线,作为扫描的截面线串 */

UF_CURVE_line_t sline1, sline2, sline3, sline4; tag_t line1, line2, line3, line4; tag_t generators[4];

/* 定义拉伸特征参数 */ uf_list_p_t objects; char *taper_angle = \

char *limit[ 2 ] = { \ double point[ 3 ] = { 0.0, 0.0, 0.0 }; double direction[ 3 ] = { 0.0, 0.0, 1.0 }; UF_FEATURE_SIGN sign = UF_NULLSIGN; uf_list_p_t features;

if (!UF_initialize()) {

/* 创建线#1 */

sline1.start_point[0] = 0.0; sline1.start_point[1] = 0.0; sline1.start_point[2] = 0.0; sline1.end_point[0] = 0.0; sline1.end_point[1] = 1.0; sline1.end_point[2] = 0.0;

UF_CURVE_create_line(&sline1,&line1);

/* 创建线#2 */

sline2.start_point[0] = 0.0; sline2.start_point[1] = 1.0; sline2.start_point[2] = 0.0; sline2.end_point[0] = 2.5; sline2.end_point[1] = 3.5; sline2.end_point[2] = 0.0;

UF_CURVE_create_line(&sline2,&line2); /* 创建线#3 */

sline3.start_point[0] = 2.5; sline3.start_point[1] = 3.5; sline3.start_point[2] = 0.0; sline3.end_point[0] = 1.0; sline3.end_point[1] = 0.0; sline3.end_point[2] = 0.0;

UF_CURVE_create_line(&sline3,&line3); /* 创建线#4 */

sline4.start_point[0] = 1.0; sline4.start_point[1] = 0.0; sline4.start_point[2] = 0.0; sline4.end_point[0] = 0.0; sline4.end_point[1] = 0.0; sline4.end_point[2] = 0.0;

UF_CURVE_create_line(&sline4,&line4); /* 把四根线的tag放入数组 */ generators[0] = line1; generators[1] = line2; generators[2] = line3; generators[3] = line4;

/* 拉伸(extruded) */

/* 创建一个链表,以存放扫描的截面线串 */ UF_MODL_create_list( &objects ); for ( i = 0; i < 4; i++ ) {

UF_MODL_put_list_item( objects, generators[ i ] ); }

UF_MODL_create_extruded( objects, taper_angle, limit, point, direction, sign, &features ); UF_MODL_delete_list( &objects );

/* 调整视图到合适的大小 */

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-3所示。

图6-3 创建扫描特征

函数UF_CURVE_create_line()通过两点创建一条直线,直线的起始点和终点是通过UF_CURVE_line_t

结构变量

来进行定义。函数的声明包含在头文件uf_curve.h中

事实上,当你要创建扫描特征时,在头文件uf_modl.h中有许多用于创建某个扫描特征的接口函数,创建拉伸体,除UF_MODL_create_extruded外,还有UF_MODL_create_extrusion、UF_MODL_create_extrusion_default等等,我们不能绝对说某个函数好还是不好,只能讲在某些应用环境中,某个函数比别的函数更适合,比如如果需要用多个轮廓线来定义截面线串,我们只能选择UF_MODL_create_extruded2()和UF_MODL_create_extrusion2(),而UF_MODL_create_extruded2()的截面线串是通过链表来进行定义,UF_MODL_create_extrusion2()的截面线串是通过数组来进行定义,因此,具体选择哪一个函数应该取决于你的应用环境。

函数名称 UF_MODL_create_extrude_trim_opts 函数功能及要点 可以采用UG交互环境中提供的所有拉伸体建立方法建立一个拉伸体特征,截面线串采用对象数组进行定义。 UF_MODL_create_extrude_trim_opts1 功能与函数UF_MODL_create_extrude_trim_opts类似,还可以与指定的目标体进行布尔操作 UF_MODL_create_extruded UF_MODL_create_extruded1 UF_MODL_create_extruded2 采用方向距离法建立一个拉伸特征,截面线串采用链表进行定义,返回一个特征链表。 功能与函数UF_MODL_create_extruded类似,还可以与指定的目标体进行布尔操作 功能与函数UF_MODL_create_extruded类似,不过该函数可以用多个轮廓线来定义截面线串 UF_MODL_create_extrusion 功能与函数UF_MODL_create_extrude_trim_opts类似,不过该函数修剪功能不强。 UF_MODL_create_extrusion1 功能与函数UF_MODL_create_extrusion类似,还可以与指定的目标体进行布尔操作 UF_MODL_create_extrusion2 功能与函数UF_MODL_create_extrusion类似,该函数可以用多个轮廓线来定义截面线串 UF_MODL_create_extrusion_default 该函数主要是对草图进行拉伸操作,功能与函数UF_MODL_create_extrude_trim_opts类似,不过该函数的拉伸方向不是通过方向数组指定,而是草图的法向或反法向。 UF_MODL_create_extrusion_default1 功能与函数UF_MODL_create_extrusion_default类似,还可以与指定的目标体进行布尔操作 UF_MODL_create_extrusion_dir 功能与函数UF_MODL_create_extrude_trim_opts类似,不过该函数的拉伸方向不是通过方向数组指定,而是基准面的法向。

Creates an extruded feature. The resulting body is a solid if the input string is closed and the solid_creation option is TRUE. Otherwise a sheet body results. A sheet can not be tapered and the taper_angle must be set to 0.0. The UF_MODL_SWEEP_TRIM_object structure is used to define the trim objects. The limits of extrusion are valid only if the

UF_MODL_SWEEP_TRIM_object structure is not specified (NULL). The region point corresponds to the point chosen after selecting intersecting objects. If the region_point_specified is false then the region point is ignored.

Note that the offset direction is determined by the cross product of the

direction vector of the first profile segment and the extrusion direction vector. The direction of a segment follows the direction of the profile flow instead of the parametric or mathematical direction of the segment.

The profile created by the object list must be contiguous.

如果你创建的拉伸

扫描的截面线串主要是用对象标识数组和链表两种方式来定义。扫描的修剪方式是通过类型为UF_MODL_SWEEP_TRIM_OPTS的参数来确定,UF_MODL_SWEEP_TRIM_object结构参数用来定义修剪对象,当选择基准平面作为修剪对象时,输入的修剪平面的对象标识。当UF_MODL_SWEEP_TRIM_object结构参数为NULL时,可以在函数中设置起始位置和终止位置。

在扫描特征的UF函数中可以通过逻辑变量来确定扫描结果为实体(Solid)或片体(Sheet) 。当函数的偏置参数为零时,只有截面线串是封闭的并且扫描结果的参数设置为实体,扫描结果才生成实体,否则生成片体。如果截面线串不封闭,必须使用偏置才能生成实体。

solid_body_creation = false

对于旋转体、沿导向线扫描和管道同拉伸体类型,具体函数说明可以参考“Open C Reference

Guide”,UF_MODL_ask_

表6.4编辑扫描特征函数

函数名称 UF_MODL_edit_sweep_curves UF_MODL_replace_sweep_strings UF_MODL_reattach_thru_faces UF_MODL_set_sweep_axis UF_MODL_set_sweep_tolerances

函数功能及要点 编辑扫描特征的轮廓线串和引导线串 功能与函数UF_MODL_edit_sweep_curves类似,但功能更强 重新定义扫描特征的修剪面和成型特征的穿透面 重新设置扫描特征的方向 重新设置扫描特征的链接和距离公差

6.3 创建参考特征

参考特征是设计零件中的一个非常有用的辅助设计工具,借助于参考特征,可以完成特定的功能,参考特征分为基准轴、基准面和基准坐标系。UF函数允许用户创建、查询和编辑相对和固定的参考特征,其函数的声明主要包含在头文件uf_modl.h中。

表6.5创建参考特征函数

函数名称 UF_MODL_create_fixed_daxis 函数功能及要点 通过两点建立固定基准轴对象,返回的是对象标识,可利用函数UF_MODL_ask_object_feat来获得固定基准轴的特征标识 通过点和方向建立固定基准平面对象返回的是对象标识,可利用函数UF_MODL_ask_object_feat来获得固定基准平面的特征标识 可以采用UG交互环境中提供的所有建立相对基准轴的方法建立一个相对基准轴,返回的是相对基准轴的特征标识 可以采用UG交互环境中提供的所有建立相对基准平面的方法建立一个相对基准平面。由于建立相对基准平面的方法很多,并不需要指定函数中所有的参数,而应根据用户选择方法的不同,有选择的进行参数设置,不需设置的参数可以赋NULL。函数返回的是相对基准平面的特征标识 UF_MODL_create_fixed_dplane UF_MODL_create_relative_daxis UF_MODL_create_relative_dplane UF_MODL_create_datum_csys UF_MODL_create_datum_csys_offset 下面以创建相对基准平面为例,讲解如何创建参考特征。首先来回顾一下在交互环境中是如何创建相对基准平面,创建基准面可以用一个几何约束,比如通过一个面(基准面、平表面)进行偏置创建一个相对基准平面;可以用两个几何约束,比如通过两条直线创建一个相对基准平面;可以用三个几何约束,比如通过三个点创建一个相对基准平面。但是无论你采取何种方式,创建一个相对基准平面几何约束对象的个数至少为一个(一个面),至多为三个(三个点),这就是创建相对基准平面的函数UF_MODL_create_relative_dplane(),其约束对象object_tags[3]为三个元素tag_t数组的原因。

int UF_MODL_create_relative_dplane (

int num_refs //输入参数,约束对象的个数 tag_t object_tags [ 3 ] //输入参数,约束对象的数组

int point_select [ 3 ] //输入参数,指定相应约束对象为边缘还是边缘上的点 int which_plane //输入参数,指定求解数 double reference_point [ 3 ] //输入参数, char * angle_string //输入参数,角度值

char * offset_string //输入参数,偏置值

int* num_dplanes //输出参数,根据约束条件,可能解的个数 tag_t dplane_tag [ 2 ]// 输出参数,解的特征对象数组

)

其中,num_refs用于指定几何约束对象的个数,至少一个,至多三个; object_tags约束对象的数组,其约束对象可能的类型包括:

约束类 一个几何约束 两个几何约束 过基准轴/线性几何体 过圆柱/圆锥/圆环/旋转表面的轴 与平表面或基准面成角 过点 平行平表面或基准面 相切于圆柱/圆锥/圆环/旋转表面 过圆柱/圆锥/圆环/旋转表面的轴 过点 过基准轴/线性几何体 过圆柱/圆锥/圆环/旋转表面的轴 与平表面或基准面成角 与平表面或基准面成角 过圆柱/圆锥/圆环/旋转表面的轴 相切于圆柱/圆锥/圆环/旋转表面 过圆柱/圆锥/圆环/旋转表面的轴 相切于圆柱/圆锥/圆环/旋转表面 三个几何约束 过三个点 过点 过基准轴/线性几何体 过基准轴/线性几何体 过基准轴/线性几何体 过圆柱/圆锥/圆环/旋转表面的轴 First Constraint 从平表面/基准面偏置 过点 过基准轴/线性几何体 Second Constraint 边缘上的点是通过object_tags[3]和point_select[3]共同来指定,其中,object_tags指定点所在边缘的对象标识,然后再通过point_select来指定相应边缘上的点,其参数说明如下

UF_MODL_EDGE 边缘 UF_MODL_MID_POINT UF_MODL_END_POINT UF_MODL_RIGHT_END_POINT UF_MODL_LEFT_END_POINT 边缘中点 边缘端点 边缘起始点 边缘终点

angle_string和offset_string分别用来指定角度值和偏置值,它们属于可选参数,根据需要进行指定,它们都为字符串类型,可以表达式形式赋值。

例6-3 在圆柱表面上打通孔,由于孔特征属于成型特征,需要有一个平的安置面,因此可以先创建一个基准面,以基准面作为孔特征的安置面。

例6-3创建

#include #include #include #include #include #include #include

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 //输出参数,结果体的标识数组 )

int UF_MODL_subtract_bodies_with_retained_options( tag_t original_target //输入参数,目标体 tag_t original_tool //输入参数,工具体

logical retain_target_body //输入参数,是否保留目标体 logical retain_tool_body //输入参数,是否保留工具体 tag_t * frec_eid //输出参数,结果体的标识

)

函数UF_MODL_subtract_bodies()的工具体可以横断目标体,将目标体一分为二,产生的结果为非参数化实体,即部件导航器中没有特征。函数UF_MODL_subtract_bodies_with_retained_options()必须要求工具体和目标体相交,且工具体不能横断目标体,否则布尔特征不能创建。其它的布尔操作接口函数与求差操作类似。

例6-4 在圆柱表面上打通孔,由于孔特征属于成型特征,需要有一个平的安置面,因此可以先创建一个基准面,以基准面作为孔特征的安置面。

例6-4创建

#include #include #include #include #include #include

extern void ufusr( char * param, int * retcod, int param_len ) {

if (!UF_initialize()) {

tag_t view_tag = NULL_TAG;

/* 对话框设置 */ char *cp1 = \请选择\ int ip2 = 0;

char cp3[4][38] = { \布尔操作:加\ \布尔操作:减\ \布尔操作:交\ int ip4 = 3;

/* 创建块的变量声明区 */

double blk_corner[ 3 ] = { 0.0, 0.0, 0.0 };

char *blk_edge_len[ 3 ] = { \ tag_t blk_obj_id; tag_t blk_body_id; /* 创建圆柱的变量声明区 */

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; tag_t cyl_body_id;

int num_result = 0;

tag_t *resulting_bodies = NULL;

/* 创建块特征 */

UF_MODL_create_block1( UF_NULLSIGN, blk_corner, blk_edge_len, &blk_obj_id );

UF_MODL_ask_feat_body( blk_obj_id, &blk_body_id );

/* 创建圆柱特征 */

UF_MODL_create_cyl1( UF_NULLSIGN, cyl_origin, cyl_height, cyl_diam, cyl_direction, &cyl_obj_id );

UF_MODL_ask_feat_body( cyl_obj_id, &cyl_body_id );

/* 调整视图到合适的大小 */

UF_VIEW_ask_work_view( &view_tag ); UF_VIEW_fit_view( view_tag, 0.7 );

/* 显示菜单 */

int value = uc1603( cp1, ip2, cp3, ip4 );

/* 根据用户选择执行相应的布尔操作 */ switch( value ) {

case 5: /* 布尔操作:加 */ UF_MODL_unite_bodies( blk_body_id, cyl_body_id ); break;

case 6: /* 布尔操作:减 */ UF_MODL_subtract_bodies( blk_body_id, cyl_body_id, &num_result, &resulting_bodies ); break;

case 7: /* 布尔操作:交 */ UF_MODL_intersect_bodies( blk_body_id, cyl_body_id, &num_result,

&resulting_bodies ); break; default:

uc1601( \发生了错误!\ }

if ( num_result > 0 ) {

UF_free( resulting_bodies ); resulting_bodies = NULL; }

/* 保存部件文件 */ UF_PART_save( );

UF_terminate( ); } }

在编译连接后,新建或打开一个部件文件。通过File→Execute→User Function调用生成的动态链接库文件。运行结果如图6-5所示。

图6-5创建布尔特征

6.5 创建成型特征

成型特征用于模型的细节设计,包括孔(Hole)、键槽(Slot)、型腔(Pocket)、圆台(Boss)、凸台(Pad)和沟槽(Groove)等。成型特征是完全相关到用于建立它们的几何体和参数值,即如果更改了用于生成成型特征的几何体,它会自动更新。

1、成型特征的相对定位

成型特征是定位在实体上的,如何确定成型特征和实体的相对位置?在UF函数中,成型特征的相对定位主要利用相对定位函数UF_MODL_create_rpo_constraints()来建立。由于成型特征在建立的过程中需要和目标体(定位在其上的实体)进行布尔操作,利用相对定位函数对成型特征进行定位时,必须在成型特征建立的过程中,即成型特征的工具体和目标体进行布尔操作之前进行。为此需要在调用成型特征函数之前,利用注册函数UF_MODL_register_rpo_routine()注册一个用户函数,在注册的用户函数中调用定义相对定位的函数,即UF_MODL_create_rpo_constraints(),这样可保证在建立成型特征时实现相对定位,以保证所建立零件能实现相关改变。

注册的用户函数格式如下:

UF_MODL_register_rpo_routine(UF_MODL_rpo_f_p_t user_rpo_routine)

其中注册用户函数的输入参数user_rpo_routine为用户自定义函数名,该函数的格式如下:

int user_rpo_routine(tag_t obj_id)

其中参数obj_id由程序自动传输,这个参数为一个特征标识,这个特征标识并不是调用成型特征函数后返回的特征标识,而是调用成型特征函数过程中生成的临时特征标识,这个临时特征为与目标体进行布尔运算的特征,比如孔特征,它是由一个与孔特征参数相同的实体特征与目标体相交形成的,程序自动转输给用户自定义函数的临时特征即为这个与孔特征参数相同的实体特征。需要注意的是利用这个临时特征标识可获得在相对定位函数中需要的工具对象,比如建立孔特征中,利用临时特征可获得孔的边。

用户将在user_rpo_routine函数中利用UF_MODL_create_rpo_constraints()对新建的成型特征进行相对定位。在创建成型特征并对此成型特征进行相对定位的格式如下:

/*注册孔定位的用户函数*/

int rpo_routine_hole(tag_t obj_id) {

error = UF_MODL_create_rpo_constraints(obj_id,…); //对新建的成型特征进行相对定位 }

static void do_ugopen_api(void) {

/*创建孔,并进行相对定位*/

UF_MODL_register_rpo_routine(rpo_routine_hole); UF_MODL_create_simple_hole(); }

//创建成型特征

//注册相对定位用户函数

UF_MODL_unregister_rpo_routine(); //取消注册相对定位用户函数

其中相对定位函数UF_MODL_create_rpo_constraints()的参数如下:

int UF_MODL_create_rpo_constraints(

tag_t feature_obj_id //输入参数,需要相对定位的特征标识 tag_t horz_dir_obj_id //输入参数,水平参考方向标识 tag_t vert_dir_obj_id //输入参数,垂直参考方向标识 tag_t obj_id_target [ ] //输入参数,相对定位目标边标识

int target_qualifier [ ] //输入参数,限定目标边上具体对象 tag_t obj_id_tool [ ] //输入参数,相对定位工具边标识 int tool_qualifier [ ] //输入参数,限定工具边上具体对象 char * constraint_value [ ] //输入参数,约束值 char * constraint_array [ ] //输入参数,约束类型 int num_of_constrnts //输入参数,约束个数 )

feature_obj_id表示需要进行相对定位的特征标识,这个参数由用户自定义函数

rpo_routine_hole自动传输进来;

horz_dir_obj_id和vert_dir_obj_id用来定义成型特征的水平参考,这两个参数只需要给其中一个赋值,另一个可以赋NULL_TAG;

obj_id_target和obj_id_tool分别为相对定位的目标边和工具边的标识,对于obj_id_tool如果为NULL_TAG表示中心线;

target_qualifier和tool_qualifier分别用来进一步指定目标边和工具边上的具体对象,比如直线的端点,圆弧的中心等。其中target_qualifier可限定的类型为UF_MODL_ARC_CENTER、

UF_MODL_ARC_TANGENT、UF_MODL_ENDPOINT_1、UF_MODL_ENDPOINT_2,tool_qualifier除

以上类型外,还包括

:UF_MODL_HORZ_CENTERLINE_PNT_1UF_MODL_VERT_CENTERLINE_PNT_1

、、

UF_MODL_HORZ_CENTERLINE_PNT_2UF_MODL_VERT_CENTERLINE_PNT_2。

constraint_array用来指定约束的类型,约束类型只提供了:角度定位

(ANGL_EDGE_PARMS),水平定位(HORZ_DIST_PARMS),垂直定位(VERT_DIST_PARMS),

平行定位(PARA_DIST_PARMS),平行间距定位(PARA_EDGE_PARMS),正交定位

(PERP_DIST_PARMS)。而没有点到点定位(Point Onto Point)、线到线定位(Line Onto Line)、

点到线定位(Point Onto Line)。对于这三种定位方式,可利用已有的约束类型结合约束值来实现,具体点到点定位可选择平行定位,同时将约束值置零;线到线定位可选择平行间距定位,同时将约束值置零;点到线定位可选择正交定位,同时将约束值置零。

2、成型特征的创建

UF函数允许用户创建、查询和编辑所有的成型特征。利用UF函数建立成型特征时,输入的参数基本上与交互环境下输入参数是一致的。其函数的声明主要包含在头文件uf_modl.h中。

表6.9创建成型特征函数

函数名称 UF_MODL_create_boss UF_MODL_create_rect_pad UF_MODL_create_general_pad UF_MODL_create_simple_hole UF_MODL_create_c_bore_hole 创建凸台特征 创建矩形凸垫特征 创建通用凸垫特征 创建简单孔特征 创建沉头孔特征 函数功能及要点 UF_MODL_create_c_sunk_hole UF_MODL_create_cyl_pocket UF_MODL_create_rect_pocket UF_MODL_create_general_pocket UF_MODL_create_rect_slot UF_MODL_create_ball_slot UF_MODL_create_u_slot UF_MODL_create_t_slot UF_MODL_create_dove_tail_slot UF_MODL_create_rect_groove UF_MODL_create_ball_groove UF_MODL_create_u_groove

创建埋头孔特征 创建柱形腔特征 创建矩形腔特征 创建通用腔特征 创建矩形键槽特征 创建球形未端键槽特征 创建U形键槽特征 创建T形键槽特征 创建燕尾形健槽特征 创建矩形沟槽特征 创建球形未端沟槽特征 创建U形沟槽特征 下面以创建简单孔为例,创建简单孔函数参数如下:

int UF_MODL_create_simple_hole (

double location [ 3 ] //输入参数,孔的位置 double direction [ 3 ] //输入参数,孔的方向 const char * diame //输入参数,孔的直径 const char * depth //输入参数,孔的深度 const char * angle //输入参数,孔的 tag_t face_li //输入参数,孔的安置面 tag_t face_t1 //输入参数,孔的穿透面

tag_t * feature_obj_id //输出参数,新建的孔特征 )

face_li表示孔的安置面,根据需要安置面可为基准面,当基准面为相对基准面时,孔特征将相对基准面的父实体作为目标体(定位在其上的实体);当基准面为绝对基准面时,必须通过函数UF_MODL_active_part()来指定目标体。

其它参数与在交互环境下创建简单孔特征相同,diame、depth和angle都为字符串类型,可以

表达式形式赋值。

例6-4 在圆柱表面上打通孔,由于孔特征属于成型特征,需要有一个平的安置面,因此可以先创建一个基准面,以基准面作为孔特征的安置面。

例6-4创建

#include #include #include #include #include

/*定义全局变量,用于转递相对定位的目标边*/

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[]={\

char *constraint_array[]={\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

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];

free(edge_pock); free(obj_id_target); free(obj_id_tool);

if (irc == 0)

target_qualifier,obj_id_tool,tool_qualifier,constraint_value,constraint_array,2); UF_MODL_ask_list_item(edge_list,i,&tem_tag); edge_pock[i]=tem_tag;

irc=UF_MODL_create_rpo_constraints(obj_id,NULL_TAG,NULL_TAG,obj_id_target,

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[]={\

char *constraint_array[]={\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

UF_MODL_delete_list(&edge_list);

obj_id_target[0]=edge_blend[2]; obj_id_tool[0]=edge_tool[1];

UF_MODL_ask_list_item(edge_list,i,&tem_tag); edge_tool[i]=tem_tag;

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); }

/*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] = {\tag_t blk_fea,blk_obj,tem_tag,face_blk[6];

return (0); return (1); if (irc == 0) else

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]={\char *pock_corner={\char *pock_floor={\char *pock_angle={\tag_t pock_id;

/*定义创建边倒圆的参数*/ char *blend_radius=\

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 = \char *hole_height = \char *hole_angle = \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

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

UF_MODL_ask_list_item(face_list,i,&tem_tag); face_blk[i]=tem_tag;

}

}

}

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,

/*进行边倒圆*/

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

UF_MODL_delete_list(&blend_edge_list);

/*创建孔,并进行相对定位*/

UF_MODL_register_rpo_routine(rpo_routine_hole);

UF_terminate();

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_MODL_ask_list_item(blend_edge_list,i,&tem_tag); edge_blend[i]=tem_tag;

pock_corner,pock_floor,pock_angle,face_blk[0],&pock_id ); UF_MODL_unregister_rpo_routine();

在编译连接后,新建或打开一个部件文件。通过File→Execute→User Function调用生成的动态链接库文件。其结果如图6-6所示。

图6-6 成型特征相对定位

所有成型特征需要一个安放表面,大多数成型特征(除通用凸垫、通用型腔和沟槽)的安放表面是平面的,安放表面通常是选择已有实体的表面,因此如果没有平表面可用作安放表面,可以先建立基准平面,然后利用这些基准平面作为安放平面。成型特征是法向于安放表面建立的,且与安放表面相关联。

表6.10查询成型特征函数

函数名称 UF_MODL_ask_boss_parms UF_MODL_ask_rect_pad_parms 函数功能及要点 通过凸台特征标识获得凸台的直径、高和拔模角 通过矩形凸垫特征标识获得矩形凸垫的长宽高、拐角半径和拔模角 UF_MODL_ask_general_pad1 通过通用凸垫特征标识获得建立通用凸垫时的相关参数,查询结束后,应使用函数UF_MODL_free_general_pad释放内存 UF_MODL_ask_simple_hole_parms UF_MODL_ask_c_bore_hole_parms UF_MODL_ask_c_sunk_hole_parms UF_MODL_ask_cyl_pocket_parms 通过简单孔特征标识获得简单孔的直径、深度和尖端角 通过沉头孔特征标识获得建立沉头孔时的所有参数 通过埋头孔特征标识获得建立埋头孔时的所有参数 通过柱型腔特征标识获得柱型腔的直径、深度、底面半径和拔锥角 UF_MODL_ask_rect_pocket_parms 通过矩形型腔特征标识获得矩形型腔的长宽深、拐角半径、底面半径和拔锥角 UF_MODL_ask_general_pocket1 通过通用型腔特征标识获得建立通用型腔时的相关参数,查询结束后,应使用函数UF_MODL_free_general_ pocket释放内存 UF_MODL_ask_rect_slot_parms 通过矩形键槽特征标识获得矩形键槽的长宽深和是否有穿透面的标识 UF_MODL_ask_ball_slot_parms 通过球形键槽特征标识获得球形键槽的球端直径、深度、长度和是否有穿透面的标识 UF_MODL_ask_u_slot_parms 通过U形键槽特征标识获得建立U形键槽时的所有参数及是否有穿透面的标识 UF_MODL_ask_t_slot_parms 通过T形键槽特征标识获得建立T形键槽时的所有参数及是否有穿透面的标识 UF_MODL_ask_dovetail_slot_parms 通过燕尾键槽特征标识获得建立燕尾键槽时的所有参数及是否有穿透面的标识 UF_MODL_ask_rect_groove_parms UF_MODL_ask_ball_groove_parms UF_MODL_ask_u_groove_parms

表6.11编辑成型特征函数

函数名称 UF_MODL_edit_hole_type UF_MODL_edit_slot_type 函数功能及要点 改变孔特征类型,包括简单孔、沉头孔和埋头孔 改变键槽特征的类型,包括矩形键槽、球形键槽、U形键槽、T形键槽和燕尾键槽 UF_MODL_add_thru_faces 给孔和键槽特征增加穿透面,其中孔最多只有一个穿透面,键槽可以有两个穿透面 UF_MODL_reattach_dir_ref UF_MODL_reverse_dir_ref 重新定义特征的水平或垂直方向参考 重新定义特征的水平或垂直方向参考,同时取指定方向的反方向 UF_MODL_reattach_target_face UF_MODL_reattach_tool_face UF_MODL_reattach_thru_faces UF_MODL_remove_thru_faces UF_MODL_edit_general_pad UF_MODL_edit_general_pocket UF_MODL_free_general_pad UF_MODL_free_general_pocket UF_MODL_register_rpo_routine

重新定义特征的目标安置面 重新定义工具安置面 重新定义成型特征的穿透面和扫描特征的修剪面 删除孔和键槽特征的所有穿透面 编辑创建通用凸垫时的所有参数 编辑创建通用型腔时的所有参数 查询通用凸垫的参数后,应用该函数释放内存 查询通用型腔的参数后,应用该函数释放内存 注册用户函数用于产生成型特征的相对定位 通过矩形沟槽特征标识获得矩形沟槽的直径和宽度 通过球形沟槽特征标识获得球形沟槽的直径和球端直径 通过U形沟槽特征标识获得建立U形沟槽时的相关参数 6.6 创建操作特征

操作特征是对已存在的实体或特征进行各种操作以满足设计的要求,包括:边缘倒角、边缘倒圆、面倒圆、拔锥、挖空、引用特征、螺纹、修剪实体、分割实体以及实体比例缩放等。创建、查询和编辑引用特征的有关函数包含在头文件uf_modl.h中。

引用特征以存在的特征为依据,采用指针方式复制特征,引用特征与原来的特征相关联。利用UF函数可以建立所有的引用特征,包括对已有特征的阵列(矩形阵列和环形阵列)、镜像(物体镜像和特征镜像)和表面模式。通过UF函数建立矩形阵列和环形阵列后,函数返回的是相应特征标识,为获得引用特征中每个纪录,可使用函数UF_MODL_ask_instance;同样可使用函数UF_MODL_ask_instance_iset,通过引用特征中的某一纪录的标识,获得引用特征的标识。

UF_MODL UF_MODL UF_MODL

Function

Function

Function

UF_MODL_create_blend_faces

UF_MODL_create_edge_blend_mult

UF_MODL_create_reblend_face

表6.12创建边缘操作函数

函数名称 UF_MODL_create_chamfer UF_MODL_cre_chamfer_with_flip_option UF_MODL_create_blend 函数功能及要点 建立边缘倒角,倒角边是通过链表的形式输入到函数的,可选择的建立方法包括:单偏置、双偏置和偏置加角度 功能与函数UF_MODL_create_chamfer相同,同时增加了可以选择反向倒角 建立恒定半径的边缘倒圆,倒圆边是通过链表的形式输入到函数的,可选择的溢出选项包括:允许光滑溢出、允许陡峭边缘溢出和允许缺口溢出 建立边缘倒圆,功能比函数UF_MODL_create_blend增强,可以建立变半径边缘倒圆,同时具有圆角所有的引用特征的选项,所有参数设置是通过UF_MODL_edge_blend_data_t类型的结构变量来输入的。 建立面倒圆特征,其中输入参数与UG交互环境中建立面倒圆特征需提供的参数相一致,该函数将取代UF_MODL_create_blend_faces UF_MODL_create_blend_faces UF_MODL_create_edge_blend UF_MODL_create_face_blend UF_MODL_create_edge_blend_mult UF_MODL_create_reblend_face UF_MODL_create_face_taper UF_MODL_create_taper_from_faces 建立表面拔锥特征,利用参考点、拔锥方向、拔锥角以及需要拔锥的一个或多个表面,拔锥表面通过链表形式输入 建立表面拔锥特征,功能与函数UF_MODL_create_face_taper类似,增加了“是否拔锥所有的引用特征”的选项,拔锥表面通过对象数组形式输入 建立从边缘拔锥特征,拔锥边缘通过对象数组形式输入 建立与面相切拔锥特征,相切的拔锥面通过对象数组形式输入 建立从分割线拔锥特征,分割边界线通过对象数组形式输入 建立从边缘拔锥特征,功能与函数UF_MODL_create_taper_from_edges 类似,增加了设置距离公差和角度公差的选项 在输入的实体特征上建立表面拔锥特征,输入的特征必须为实体特征 建立等厚度的挖空特征,其中输入函数中的面为穿透面,穿透面以链表的形式输入 建立等厚度或变厚度的挖空特征,其中输入参数与UG交互环境中建立挖空特征需提供的参数相一致 建立矩形阵列,输入参数与UG交互环境中建立矩形阵列特征需提供的参数相一致,其中进行引用操作的特征以链表的形式输入的,返回特征标识 建立圆形阵列,输入参数与UG交互环境中建立矩形阵列特征需提供的参数相一致,其中进行引用操作的特征以链表的形式输入的,返回特征标识 建立镜像实体,镜像平面必须为基准平面,返回特征标识 建立镜像特征,镜像特征与镜像实体的用法相似,但可以使用基准平面和实体的表面作为镜像面,进行镜像的特征以数组对象的形式输入,返回特征标识。 建立镜像表面区域,表面区域是通过类型为UF_MODL_dfo_region_s的结构变量来定义的。 建立符号螺纹特征,输入参数与UG交互环境中建立符号螺纹特征需提供的参数相一致,其输入参数是通过UF_MODL_symb_thread_data_t类型的结构传递的 修剪实体 修剪片体 分割实体 创建比例特征 创建非均匀比例特征 创建均匀比例特征 UF_MODL_create_taper_from_edges UF_MODL_create_taper_from_tangent_faces UF_MODL_create_taper_split_line UF_MODL_create_true_taper_from_edges UF_MODL_create_feature_taper UF_MODL_create_variable_taper_from_edges UF_MODL_create_hollow UF_MODL_create_variable_hollow UF_MODL_create_linear_iset UF_MODL_create_circular_iset UF_MODL_create_mirror_body UF_MODL_create_mirror_set UF_MODL_create_mirror_pattern_face UF_MODL_create_symb_thread UF_MODL_trim_body UF_MODL_trim_sheet UF_MODL_split_body UF_MODL_create_scale UF_MODL_create_non_uni_scale UF_MODL_create_uniform_scale

例6-4创建方形烟灰缸,通过拔模特征、倒圆特征、挖空特征来说明如何利用UF函数创建操作特征。

UF提供创建拔模特征的函数接口有很多,可根据需要选用相应的函数,具体可参见表

6.12。下面以面拔模UF_MODL_create_face_taper()为例,其格式如下:

int UF_MODL_create_face_taper(

double location [ ] //输入参数,拔模参考点 double direction [ ] //输入参数,拔模方向 char * angle //输入参数,拔模角

uf_list_p_t faces //输入参数,需要拔模的面

tag_t * feature_obj_id //输出参数,新建拔模特征

) 与

UF_MODL_create_face_taper()

拔模接口函数

UF_MODL_create_taper_from_faces(),其拔模参考点和方向是通过点和方向标识来指定的,而不是直接通过坐标值来指定;且需要拔模的面也是通过数组的形式来指定的,不是通过链表。

UF_MODL_create_blend() UF_MODL_create_hollow()

例6-4创建

#include #include #include #include #include #include #include #include #include

#define EPSILON 0.01

#define MAX(x, y) ( (x)>(y) ? (x):(y) ) #define MIN(x, y) ( (x)<(y) ? (x):(y) )

void ufusr(char *param, int *retcode, int paramLen) {

if (!UF_initialize()) {

/* 临时变量 */ int i; int count;

tag_t object; int object_type; double object_point[3]; double object_dir[3]; double object_box[6]; double object_radius; double object_rad_data; int object_sense;

/* 定义创建块特征的参数 */

UF_FEATURE_SIGN blk_sign = UF_NULLSIGN;

double blk_corner_pt[] = { 0.0, 0.0, 0.0 }; char *blk_edge_len_p[]={\ tag_t blk_obj_id;

uf_list_p_t blk_obj_list_faces = NULL;

/* 定义创建拔模特征的参数 */

double taper_location[] = { 0.0, 0.0, 0.0 }; double taper_direction[] = { 0.0, 0.0, 1.0 }; char taper_angle[] = { \ uf_list_p_t taper_face_list = NULL; tag_t taper_obj_id; uf_list_p_t taper_obj_list_edges = NULL;

/* 定义创建边倒圆特征的参数 */ char blend_radius[] = { \ uf_list_p_t blend_edge_list = NULL; int blend_smooth_overflow = 0; int blend_cliff_overflow = 0; int blend_notch_overflow = 0; double blend_vrb_tool = 0.5; tag_t blend_obj_id; double proto_point1[3]; double proto_point2[3]; int vertex_count = 0;

/* 定义创建挖空特征的参数 */ char hollow_thickness[] = { \ uf_list_p_t

/* 创建块特征 */

UF_MODL_create_block1( blk_sign, blk_corner_pt, blk_edge_len_p, &blk_obj_id ); UF_MODL_ask_feat_faces( blk_obj_id, &blk_obj_list_faces );

/* 获得块上面的标识,用于确定拔模面 */

hollow_face_list = NULL;

tag_t hollow_obj_id;

UF_MODL_create_list( &taper_face_list );

UF_MODL_ask_list_count( blk_obj_list_faces, &count );

for ( i = 0; i < count; i++ ) {

UF_MODL_ask_list_item( blk_obj_list_faces , i, &object );

UF_MODL_ask_face_data( object, &object_type, object_point, object_dir, object_box, &object_radius, &object_rad_data, &object_sense ); if ( fabs(object_dir[2]) <= EPSILON ) {

UF_MODL_put_list_item( taper_face_list, object ); } }

/* 创建拔模特征 */

UF_MODL_create_face_taper( taper_location, taper_direction, taper_angle, taper_face_list, &taper_obj_id ); UF_MODL_delete_list( &taper_face_list ); taper_face_list = NULL;

UF_MODL_ask_feat_edges( taper_obj_id, &taper_obj_list_edges );

/* generate blend_edge_list */

UF_MODL_create_list( &blend_edge_list );

UF_MODL_ask_list_count( taper_obj_list_edges, &count );

for ( i = 0; i < count; i++ ) {

UF_MODL_ask_list_item( taper_obj_list_edges, i, &object );

UF_MODL_ask_edge_verts( object, proto_point1, proto_point2, &vertex_count ); if ( fabs( fabs( proto_point1[2] - proto_point2[2] ) ) > EPSILON ) {

UF_MODL_put_list_item( blend_edge_list, object ); } }

UF_MODL_delete_list( &taper_obj_list_edges ); taper_obj_list_edges = NULL;

/* 创建边倒圆特征 */

UF_MODL_create_blend( blend_radius, blend_edge_list, blend_smooth_overflow, blend_cliff_overflow, blend_notch_overflow, blend_vrb_tool, &blend_obj_id ); UF_MODL_delete_list( &blend_edge_list ); blend_edge_list = NULL;

/* 获得挖空特征的安置面 */

UF_MODL_create_list( &hollow_face_list );

UF_MODL_ask_list_count( blk_obj_list_faces, &count ); for ( i = 0; i < count; i++) {

UF_MODL_ask_list_item( blk_obj_list_faces, i, &object );

UF_MODL_ask_face_data( object, &object_type, object_point, object_dir, object_box, &object_radius, &object_rad_data, &object_sense ); if ( 22 == object_type && fabs(object_dir[0]) <= EPSILON && fabs(object_dir[1]) <= EPSILON && object_dir[2] >= 0.5 ) {

UF_MODL_put_list_item( hollow_face_list, object ); break; } }

UF_MODL_delete_list( &blk_obj_list_faces ); blk_obj_list_faces = NULL;

/* 创建挖空特征 */

UF_MODL_create_hollow( hollow_thickness, hollow_face_list, &hollow_obj_id ); UF_MODL_delete_list( &hollow_face_list ); hollow_face_list = NULL;

/* 保存部件文件 */ UF_PART_save( );

UF_terminate(); } }

在编译连接后,新建或打开一个部件文件。通过File→Execute→User Function调用生成的动态链接库文件。其结果如图6-7所示。

图6-7 操作特征

表6.22查询其它特征函数

函数名称 UF_MODL_ask_symb_thread_parms UF_MODL_ask_scale 函数功能及要点 获得建立符号螺纹时的所有参数 获得指定的比例特征参数

表6.23编辑其它特征函数

函数名称 UF_MODL_edit_symb_thread UF_MODL_edit_trimmed_sheet UF_MODL_edit_scale 函数功能及要点 编辑符号螺纹特征 编辑修剪片体特征 编辑比例特征

表6.13查询边缘操作函数

函数名称 UF_MODL_ask_chamfer_parms UF_MODL_ask_blend_parms UF_MODL_ask_edge_blend1 函数功能及要点 通过边缘倒角特征标识获得边缘倒角的建立方法及相应的参数 通过边缘倒圆特征标识获得边缘倒圆的默认半径 通过边缘倒圆特征获得建立边缘倒圆的所有参数,该函数与UF_MODL_create_edge_blend相对应

表6.14编辑边缘操作函数

函数名称 UF_MODL_edit_edge_blend UF_MODL_register_var_blend

表6.16查询面操作函数

函数名称 UF_MODL_ask_blend_parms UF_MODL_ask_blend_face_data1 UF_MODL_ask_taper_parms UF_MODL_ask_taper_from_edges 获得倒圆的参数 通过面倒圆特征,获得建立面倒圆时的所有参数 获得拔锥角度 通过从边缘拔锥特征,获得建立从边缘拔锥时的所有参数,与函数UF_MODL_create_true_taper_from_edges相对应 通过挖空特征标识和类型,获得建立挖空特征时的所有参数 函数功能及要点 函数功能及要点 编辑边缘倒圆特征,该函数与UF_MODL_create_edge_blend相对应 注册用户函数用于产生变半径倒圆 UF_MODL_ask_hollow_data UF_MODL_ask_hollow_parms 获得挖空特征的参数

表6.17编辑面操作函数

函数名称 UF_MODL_init_face_blend_data UF_MODL_edit_taper_from_edges UF_MODL_edit_hollow UF_MODL_redefine_replace_faces 函数功能及要点 初始化产生面倒圆特征数据结构 编辑从边缘倒圆特征,其输入参数与函数UF_MODL_create_true_taper_from_edges类似 编辑挖空特征,其输入参数与函数UF_MODL_create_variable_hollow类似 利用新的面取代挖空特征的穿透面,或偏置特征的面,该函数只能应用与挖空特征和偏置特征。

表6.19查询引用特征函数

函数名称 UF_MODL_ask_instance UF_MODL_ask_instance_iset UF_MODL_ask_linear_iset_parms UF_MODL_ask_circular_iset_parms UF_MODL_ask_plane_of_mirror_set UF_MODL_ask_features_of_mirror_set UF_MODL_ask_all_members_of_set UF_MODL_ask_mirror_pattern_face 函数功能及要点 通过引用阵列特征标识获得矩形和圆形引用阵列的记录标识,以链表的形式返回 通过引用阵列某一记录标识获得引用阵列标识 获得矩形阵列的参数,包括X和Y向的阵列数量、偏置距离 获得圆形陈列的参数,包括阵列旋转半径、阵列数量和阵列角 通过镜像特征标识,获得镜像特征的镜像面 通过镜像特征标识,获得镜像特征操作中的要镜像的特征 通过镜像特征标识,获得镜像特征操作中的生成的镜像特征 获得镜像表面区域的参数,包括表面区域及镜像面的参数

表6.20编辑引用特征函数

函数名称 UF_MODL_edit_linear_iset UF_MODL_edit_circular_iset UF_MODL_edit_mirror_set UF_MODL_edit_mirror_pattern_face 函数功能及要点 编辑矩形阵列的参数,包括X和Y向的阵列数量、偏置距离 编辑圆形阵列的参数,包括阵列旋转半径、阵列数量和阵列角 编辑镜像特征的参数,重新选择欲建立镜像特征的特征及镜像面 编辑镜像表面区域的参数。

6.6.4 其它操作相关函数

UF函数允许用户创建螺纹、修剪实体和分割实体特征以及对实体比例缩放等操作,螺纹特征可以在圆柱体、孔、圆凸台或扫描体表面生成符号螺纹或细节螺纹;修剪实体特征是用实体表面、基准平面或片体修剪一个或多个目标实体,实体修剪后仍为参数化实体;分割实体与修剪实体的操作非常相似,区别仅在于实体分割后得到两个实体,并因此丢失所有的参数,原来的物体变为非参数化实体;比例缩放特征是对指定的物体(实体或片体)进行比例缩放。创建、查询和编辑其它操作特征的有关函数分别如表6.21、表6.22、表6.23所示,它们包含在头文件uf_modl.h中。

1.运行环境:新建一个零件文件。 2.程序代码及注释:

6.7 创建草图

草图是生成与部件相关的轮廓曲线的集合,轮廓可以用于拉伸或旋转特征,也可以用于定义自由形状特征的或过曲线片体截面。

6.7.1 相关函数

UG在头文件uf_sket.h中提供了如表6.24、6.25、6.26所示的函数用来对草图进行操作,包括:创建草图、草图对象的约束和定位及对草图对象进行管理的函数。

表6.24建立草图函数

函数名称 UF_SKET_initialize_sketch UF_SKET_create_sketch UF_SKET_terminate_sketch UF_SKET_update_sketch UF_SKET_ask_sketch_features UF_SKET_ask_sketch_info UF_SKET_ask_sketch_status UF_SKET_ask_geoms_of_sketch UF_SKET_add_conics 创建一个空草图 退出草图环境 更新草图 获得与一个草图相关的所有特性 获得一个草图的基本信息 获得草图的状态和自由度数 获得与草图上所有几何对象 在草图上产生二次曲线 函数功能及要点 进入草图环境,同时获得草图标识

表6.25约束与定位草图函数

函数名称 UF_SKET_create_dimension UF_SKET_create_dimensional_constraint 函数功能及要点 创建指定类型的草图尺寸 创建指定类型的草图尺寸约束,并不需要设置函数中所有的参数,根据所产生尺寸约束类型的不同而不同 UF_SKET_create_geometric_constraint UF_SKET_read_dimension UF_SKET_read_dimensional_constraint UF_SKET_read_geometric_constraint UF_SKET_ask_con_is_inferred UF_SKET_ask_constraint_class UF_SKET_ask_constraint_type UF_SKET_ask_constraints_of_geometry UF_SKET_ask_constraints_of_sketch UF_SKET_ask_dim_status 创建指定类型的几何约束,并不需要设置函数中所有的参数,根据所产生几何约束类型的不同而不同 查询草图尺寸 查询草图尺寸约束 查询草图几何约束 确定一个约束是否是推理约束 确定一个约束是几何约束或尺寸约束 确定一个几何约束具体的类型 获得指定类型的,与一个几何对象相关的所有约束 获得指定类型的,与草图相关的所有约束 通过尺寸标识,获得表达式标识、字符串、值、状态等 获得与草图相关的尺寸标识 获得草图的表达式 获得与一个几何对象相关的所有几何约束 获得与草图上所有几何约束 获得与草图上所有推理约束 删除指定的约束 删除指定的尺寸 UF_SKET_ask_dimensions_of_sketch UF_SKET_ask_exps_of_sketch UF_SKET_ask_geo_cons_of_geometry UF_SKET_ask_geo_cons_of_sketch UF_SKET_ask_inferred_cons_of_sketch UF_SKET_delete_constraints UF_SKET_delete_dimensions

表6.26草图管理函数

函数名称 UF_SKET_add_extracted_objects UF_SKET_add_objects UF_SKET_ask_face_sketches UF_SKET_ask_feature_sketches UF_SKET_ask_reference_status UF_SKET_attach_to_face UF_SKET_mirror_objects UF_SKET_set_reference_status

抽取对象到草图 增加几何对象(曲线等)到草图上 获得与面或基准面相关的所有草图 获得与特征相关的所有草图 查询一个草图曲线或尺寸的激活或参考状态 重新附着草图特征 草图环境中的镜像对象 设置一个草图曲线或尺寸的激活或参考状态 函数功能及要点 6.7.2 实例实践

1.运行环境:新建一个部件文件。 2.程序代码:

#include #include #include #include #include #include #include

#include #include #include #include

#define EPSILON 0.005 #define LAYER_BODY 1 #define LAYER_SKETCH 21 #define LAYER_CURVE 41

#define UF_CALL(X) ( report_error( __FILE__, __LINE__, #X, ( X ) ) ) static int report_error( char *file, int line, char *call, int irc); void create_part_tube( void ) {

/*******************************\\ * 变量定义区 * \\*******************************/ /* 定义视图设置参数 */ tag_t view_tag = NULL_TAG;

UF_VIEW_visualization_t view_data;

double view_rotate_axis[3] = { 0.0, 0.0, 1.0 }; double view_rotate_delta_angle = 1; int view_rotate_time = 45;

/* 定义草图线参数 */

UF_CURVE_line_t line_coords[4];

double line_vertex_postion_x[5] = { 0.0, 20.0, 20.0, 0.0, 0.0 }; double line_vertex_postion_y[5] = { 0.0, 0.0, 20.0, 20.0, 0.0 }; tag_t line_tag[32]; uf_list_p_t line_list; UF_CURVE_arc_t arc_coords; tag_t arc1_tag; tag_t arc2_tag;

double trim_ref_point[3] = { 20.0, 18.0, 0.0 }; double trim_int_point[3] = { 20.0, 2.0, 0.0 }; int trim_ext_ind = UF_CURVE_LINEAR_SHAPE;

/* 定义草图参数 */

char sketch_name[30] = \ tag_t sketch_tag;

double sketch_matrix[ 9 ] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }; tag_t sketch_object[ 2 ]; int sketch_reference[ 2 ];

int sketch_plane_dir = 1;

/* 定义约束参数 */

UF_SKET_con_geom_t con_geoms; tag_t con_tag;

/* 定义镜像特征参数 */ tag_t mirror_tags[ 32 ]; int mirror_num_new_objs;

tag_t *mirror_new_obj_tags = NULL; tag_t *mirror_con_tags = NULL;

/* 定义拉伸特征参数 */

char *extruded_taper_angle = \

char *extruded_limit[2] = { \ double extruded_point[3] = { 0.0, 0.0, 0.0 }; double extruded_direction[3] = { 0.0, 0.0, 1.0 }; uf_list_p_t extruded_list = NULL; tag_t extruded_tag;

uf_list_p_t extruded_face_list;

/* 定义孔特征参数 */

double hole_location[ 3 ] = { 0.0, 0.0, 0.0 }; double hole_direction[ 3 ] = { 0.0, 0.0, 1.0 }; char *hole_diame = \ char *hole_depth = \ char *hole_angle = \ tag_t hole_face_li; tag_t hole_face_t1; tag_t center_hole_tag; tag_t side_hole_tag;

/* 定义引用特征参数 */

int instance_method = 0; /* gerneral */ double instance_location[3] = { 0.0, 0.0, 0.0 }; double instance_axis[3] = { 0.0, 0.0, 1.0 }; char *instance_number_str = \ char *instance_angle_str = \ uf_list_p_t instance_feature_list = NULL; tag_t instance1_tag = NULL_TAG; tag_t instance2_tag = NULL_TAG;

/* 临时变量 */ int face_type; double face_point[3]; double face_dir[3];

double face_box[6]; double face_radius; double face_rad_data; int face_norm_dir; int i, j, count; tag_t object;

/*******************************\\ * 程序区 * \\*******************************/ /* 设置视图 */

UF_VIEW_ask_work_view( &view_tag );

UF_VIEW_ask_visualization( view_tag, &view_data ); view_data.display_mode = UF_VIEW_FULLY_SHADED; UF_VIEW_set_visualization( view_tag, &view_data );

/* 创建草图线 */

UF_LAYER_set_status( LAYER_SKETCH, UF_LAYER_WORK_LAYER ); UF_MODL_create_list( &line_list ); for( i = 0; i < 4; i++ ) {

line_coords[i].start_point[ 0 ] = line_vertex_postion_x[ i ]; line_coords[i].start_point[ 1 ] = line_vertex_postion_y[ i ]; line_coords[i].start_point[ 2 ] = 0;

line_coords[i].end_point[ 0 ] = line_vertex_postion_x[ i + 1 ]; line_coords[i].end_point[ 1 ] = line_vertex_postion_y[ i + 1 ]; line_coords[i].end_point[ 2 ] = 0;

UF_CURVE_create_line( &line_coords[i], &line_tag[i] ); UF_MODL_put_list_item( line_list, line_tag[i] ); }

arc_coords.arc_center[ 0 ] = 17.5; arc_coords.arc_center[ 1 ] = 17.5; arc_coords.arc_center[ 2 ] = 0; arc_coords.start_angle = 0; arc_coords.end_angle = PI; arc_coords.radius = 7.5; UF_CSYS_ask_wcs( &object );

UF_CSYS_ask_matrix_of_object( object, &arc_coords.matrix_tag ); UF_CURVE_create_arc( &arc_coords, &arc1_tag ); line_tag[4] = arc1_tag;

arc_coords.start_angle = 1.5 * PI; arc_coords.end_angle = 2 * PI;

UF_CURVE_create_arc( &arc_coords, &arc2_tag ); line_tag[5] = arc2_tag;

UF_CURVE_edit_trim_curve( line_tag[1], arc1_tag,

trim_ref_point, trim_int_point, trim_ext_ind ); trim_ref_point[ 0 ] = 18.0; trim_ref_point[ 1 ] = 20.0; trim_int_point[ 0 ] = 1.0; trim_int_point[ 1 ] = 20.0;

UF_CURVE_edit_trim_curve( line_tag[2], arc1_tag, trim_ref_point, trim_int_point, trim_ext_ind ); trim_ref_point[ 0 ] = 10.0; trim_ref_point[ 1 ] = 17.5; trim_int_point[ 0 ] = 17.5; trim_int_point[ 1 ] = 20.0;

trim_ext_ind = UF_CURVE_CIRCULAR_SHAPE;

UF_CURVE_edit_trim_curve( arc1_tag, line_tag[2], trim_ref_point, trim_int_point, trim_ext_ind ); trim_ref_point[ 0 ] = 17.0; trim_ref_point[ 1 ] = 10.0; trim_int_point[ 0 ] = 17.0; trim_int_point[ 1 ] = 10.0;

UF_CURVE_edit_trim_curve( arc2_tag, line_tag[1], trim_ref_point, trim_int_point, trim_ext_ind ); UF_MODL_put_list_item( line_list, arc1_tag ); UF_MODL_put_list_item( line_list, arc2_tag );

/* 把线加入到草图 */

UF_LAYER_set_status( LAYER_SKETCH, UF_LAYER_WORK_LAYER ); UF_SKET_initialize_sketch( sketch_name, &sketch_tag );

UF_SKET_create_sketch( sketch_name, 2, /* Specify sketch CSYS */ sketch_matrix, sketch_object, sketch_reference, sketch_plane_dir, &sketch_tag );

UF_SKET_add_objects( sketch_tag, 6, line_tag );

/* 添加约束 */

for ( i = 1; i < 3; i++ ) {

con_geoms.geom_tag = line_tag[ i ];

UF_SKET_create_geometric_constraint( sketch_tag, UF_SKET_constant_length, 1, &con_geoms, &con_tag ); }

UF_SKET_terminate_sketch();

/* 创建镜像特征 */

UF_SKET_initialize_sketch( sketch_name, &sketch_tag ); for ( i = 1, j = 0; i < 6; i++ ) {

if ( 3 == i ) continue;

mirror_tags[ j++ ] = line_tag[ i ]; }

UF_SKET_mirror_objects( sketch_tag, line_tag[ 3 ], 4, mirror_tags, &mirror_num_new_objs, &mirror_new_obj_tags, &mirror_con_tags ); for ( i = 0; i < mirror_num_new_objs; i++ ) {

mirror_tags[ i + 4 ] = mirror_new_obj_tags[ i ]; }

UF_SKET_mirror_objects( sketch_tag, line_tag[ 0 ], 8, mirror_tags, &mirror_num_new_objs, &mirror_new_obj_tags, &mirror_con_tags );

UF_MODL_delete_list( &line_list ); line_list = NULL;

UF_MODL_create_list( &line_list );

for ( i = 0; i < mirror_num_new_objs; i++ ) {

UF_MODL_put_list_item( line_list, mirror_new_obj_tags[ i ] ); UF_MODL_put_list_item( line_list, mirror_tags[ i ] ); }

/* 创建拉伸特征 */

UF_LAYER_set_status( LAYER_BODY, UF_LAYER_WORK_LAYER );

UF_MODL_create_extruded( line_list, extruded_taper_angle, extruded_limit, extruded_point, extruded_direction, UF_NULLSIGN, &extruded_list );

UF_MODL_ask_list_item( extruded_list, 0, &extruded_tag ); UF_MODL_ask_feat_faces( extruded_tag, &extruded_face_list ); UF_LAYER_set_all_but_work( UF_LAYER_INACTIVE_LAYER );

/* 创建中心孔 */

UF_MODL_ask_list_count( extruded_face_list, &count ); for ( i = 0; i < count; i++ ) {

UF_MODL_ask_list_item( extruded_face_list, i, &object ); UF_MODL_ask_face_data( object, &face_type, face_point, face_dir, face_box, &face_radius, &face_rad_data, &face_norm_dir ); if ( 22 == face_type

&& fabs( face_dir[ 2 ] + 1.0 ) < EPSILON ) hole_face_li = object; if ( 22 == face_type

&& fabs( face_dir[ 2 ] - 1.0 ) < EPSILON ) hole_face_t1 = object;

}

UF_MODL_create_simple_hole( hole_location, hole_direction, hole_diame, hole_depth, hole_angle, hole_face_li, hole_face_t1, ¢er_hole_tag );

/* 创建四边孔 */

hole_location[ 0 ] = 17.5; hole_location[ 1 ] = 17.5; hole_location[ 2 ] = 0;

hole_diame = \ hole_depth = \ hole_angle = \

UF_MODL_create_simple_hole( hole_location, hole_direction, hole_diame, hole_depth, hole_angle, hole_face_li, hole_face_t1, &side_hole_tag );

instance_number_str = \ instance_angle_str = \

UF_MODL_create_list( &instance_feature_list );

UF_MODL_put_list_item( instance_feature_list, side_hole_tag ); UF_MODL_create_circular_iset( instance_method, instance_location, instance_axis, instance_number_str, instance_angle_str, instance_feature_list, &instance1_tag );

/* 设置视图 */

UF_VIEW_ask_work_view( &view_tag );

UF_VIEW_ask_visualization( view_tag, &view_data ); UF_VIEW_fit_view( view_tag, 0.3 );

view_data.display_mode = UF_VIEW_FULLY_SHADED; UF_VIEW_set_visualization( view_tag, &view_data ); UF_VIEW_rotate_view( view_tag, view_rotate_axis, view_rotate_delta_angle, view_rotate_time ); view_rotate_axis[0] = -1.0; view_rotate_axis[2] = 0.0;

UF_VIEW_rotate_view( view_tag, view_rotate_axis, view_rotate_delta_angle, view_rotate_time ); UF_VIEW_fit_view( view_tag, 0.5 );

UF_LAYER_set_all_but_work( UF_LAYER_INACTIVE_LAYER );

/* 释放链表内存 */

UF_MODL_delete_list( &line_list ); line_list = NULL;

UF_free( mirror_new_obj_tags ); mirror_new_obj_tags = NULL; UF_free( mirror_con_tags );

mirror_con_tags = NULL; UF_SKET_terminate_sketch();

UF_MODL_delete_list( &extruded_list ); extruded_list = NULL;

UF_MODL_delete_list( &extruded_face_list ); extruded_face_list = NULL;

UF_MODL_delete_list( &instance_feature_list ); instance_feature_list = NULL;

UF_MODL_delete_list( &instance_feature_list ); instance_feature_list = NULL; }

extern void ufusr (char * param, int * retcod, int param_len ) {

UF_initialize( ); create_part_tube( );

UF_CALL( UF_PART_save() ); UF_terminate( ); }

3.运行结果:在编译连接后,通过File→Execute→User Function调用生成的动态链接库文件。其结果如图6-8所示。

图4-8 拉伸草图特征

6.8 综合实例

6.8.1 创建凸缘联轴器

本实例创建了一个YL2系列凸缘联轴器参数化设计系统,由于凸缘联轴器是标准件,联轴器的轴孔直径是主参数,轴孔直径决定联轴器的其它尺寸,本例将采用结构变量数组来存入YL2型凸缘联轴器的参数,当用户从“凸缘联轴器参数化设计对话框”中选择某种型号的联轴器后,即联轴器的轴孔直径,系统将自动调用相应的参数生成联轴器的零件实体模型。

1.运行环境设置

(1)在项目目录下新建三个目录:?\\coupling\\application用于存放对话框文件(*.dlg)和编译连接后生成的动态链接库文件(*.dll),?\\coupling\\startup用于存放菜单文件(*.men)和工具条文件(*.tbr),?\\coupling\\bitmap用于存放工具条和对话框的位图图标。

(2)设置两个环境变量:ugii_vendor_dir=?\\coupling使UG系统在启动后自动执行菜单和工具条文件,ugii_bitmap_path=?\\coupling\\bitmap使系统能找到设置工具条和对话框相应的位图文件。

2.流程图

开始创建一个圆柱体获取licence在圆柱体上创建凸台选择型号初始化各种型号的数据失败结束licence结束图4-9 凸缘联轴器系统流程图

成功创建轴孔创建倒圆角创建键槽创建螺栓孔调整视图并保存部件文件

3.资源文件

(1)菜单和工具条文件

本系统要在菜单栏菜单Help的右侧建立一个新的菜单栏菜单——综合实例,综合实例下将包含一个子菜单项——创建YL型凸缘联轴器...。在界面上出现一个工具条——创建YL型凸缘联轴器。本系统的菜单文件为coupling.men,工具条文件为coupling.tbr,其内容分别如下:

a.菜单文件coupling.men VERSION 120

!------------------------------ EDIT UG_GATEWAY_MAIN_MENUBAR

TOP_MENU

CASCADE_BUTTON CUSTOM_MYMENU LABEL 综合实例

END_OF_TOP_MENU MENU CUSTOM_MYMENU

b.工具条文件coupling.tbr TITLE 综合实例 VERSION 170

!------------------------------ BUTTON MAKE_COUPLING LABEL 创建YL型凸缘联轴器 BITMAP coupling_ico.bmp

(2)对话框文件

本例采用UG/open UIStyler创建对话框,以与UG系统本身的对话框风格相一致,建立的对话框如图4-11所示。

(3)程序代码及注释

/**************\\ * 创建联轴器 * \\**************/

#include #include #include

#include #include #include #include #include #include #include #include

BUTTON MAKE_COUPLING LABEL 创建YL型凸缘联轴器... BITMAP coupling_ico.bmp ACTIONS coupling.dlg

END_OF_MENU

#include #include #include #include #include

#define COUPLING_BITMAP_0 (\#define COUPLING_SEP_1 (\#define COUPLING_OPTION_CHOICE (\#define COUPLING_DIALOG_OBJECT_COUNT ( 3 )

#define LAYER_SOLID 1 #define LAYER_SKETCH 21 #define LAYER_CURVE 41

#define COUPLING_CB_COUNT ( 2 + 1 ) /* Add 1 for the terminator */

/*定义联轴器的数据结构*/ struct _coupling {

double coupling_diameter; double center_of_hole_diameter; double axis_diameter; double axis_length; int hole_num;

double coupling_length; };

typedef struct _coupling coupling_s;

/* 声明回调函数 */

int COUPLING_ok_cb( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data );

int COUPLING_cancel_cb( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data );

void create_coupling( int choose ); /*创建联轴器*/ void fitview( void ); /*调整视图*/

static UF_STYLER_callback_info_t COUPLING_cbs[COUPLING_CB_COUNT] = {

{UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, COUPLING_ok_cb}, {UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB , 0, COUPLING_cancel_cb}, {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 } };

static UF_MB_styler_actions_t actions[] = {

{ \ { 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;

if ( (error_code = UF_MB_add_styler_actions ( actions ) ) != 0 ) {

char fail_message[133];

UF_get_fail_message(error_code, fail_message); printf ( \ }

UF_terminate(); return; }

int COUPLING_ok_cb ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data) {

if ( UF_initialize() != 0)

return ( UF_UI_CB_CONTINUE_DIALOG );

tag_t is_part_opened;

is_part_opened = UF_PART_ask_display_part( ); if ( NULL_TAG == is_part_opened ) {

uc1601( \请先新建一个部件文件,然后再进行此项操作。\ return ( UF_UI_CB_EXIT_DIALOG ); }

/* 获取对话框信息 */

UF_STYLER_item_value_type_t data; data.item_id = COUPLING_OPTION_CHOICE; data.item_attr = UF_STYLER_VALUE;

UF_STYLER_ask_value( dialog_id, &data ); /* 创建联轴器 */

create_coupling( data.value.integer ); /* 调整视图 */ fitview( ); /* 保存文件 */

UF_PART_save( ); UF_terminate( );

return ( UF_UI_CB_EXIT_DIALOG ); }

int COUPLING_cancel_cb ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data ) {

if ( UF_initialize() != 0)

return ( UF_UI_CB_CONTINUE_DIALOG ); uc1601( \用户取消了本次操作!\ UF_terminate ();

return ( UF_UI_CB_EXIT_DIALOG ); }

void create_coupling( int choose ) {

/* 初始化联轴器数据 */ coupling_s coupling[ 7 ] = {

80.0, 64.0, 24.0, 32.0, 4, 34.0, 80.0, 64.0, 28.0, 32.0, 4, 34.0, 80.0, 64.0, 32.0, 42.0, 4, 44.0, 80.0, 64.0, 36.0, 42.0, 4, 44.0, 80.0, 64.0, 38.0, 42.0, 4, 44.0, 80.0, 64.0, 40.0, 52.0, 4, 54.0, 80.0, 64.0, 24.0, 52.0, 4, 54.0 };

/* 定义圆柱参数 */

double cyl_origin[ 3 ] = { 0.0, 0.0, 0.0 }; double cyl_direction[ 3 ] = { 0.0, 0.0, 1.0 }; char cyl_height[ 40 ]; char cyl_diameter[ 40 ]; tag_t tag_cyl;

uf_list_p_t cyl_face_list; uf_list_p_t cyl_edge_list;

/* 定义凸台参数 */

double boss_location[ 3 ] = { 0.0, 0.0, 0.0 }; double boss_direction[ 3 ] = { 0.0, 0.0, 1.0 }; char boss_diameter[ 40 ]; char boss_height[ 40 ]; tag_t boss_face; tag_t tag_boss;

uf_list_p_t boss_face_list; uf_list_p_t boss_edge_list;

/* 定义轴孔参数 */

double axis_hole_location[ 3 ] = { 0.0, 0.0, 0.0 }; double axis_hole_direction[ 3 ] = { 0.0, 0.0, 1.0 }; char axis_hole_diameter[ 40 ]; char axis_hole_depth[ 40 ]; tag_t axis_hole_face_li; tag_t axis_hole_face_t1; tag_t tag_axis_hole; tag_t tag_big_hole;

uf_list_p_t big_hole_face_list;

/* 定义键槽参数 */ tag_t tag_line; uf_list_p_t line_list;

UF_CURVE_line_t line_coords[ 4 ]; char *limit[ 2 ]; char *limit0 = \ char limit1[ 40 ];

uf_list_p_t extruded2_list;

/* 定义螺栓孔参数 */

double iset_location[ 3 ] = { 0.0, 0.0, 0.0 }; char number_str[ 40 ]; char angle_str[ 40 ]; uf_list_p_t iset_list; tag_t tag_iset;

/* 创建圆柱 */

sprintf( cyl_height, \ sprintf( cyl_diameter, \ UF_MODL_create_cyl1( UF_NULLSIGN, cyl_origin, cyl_height, cyl_diameter, cyl_direction, &tag_cyl );

/* 在圆柱体上创建凸台 */

boss_location[ 2 ] = coupling[ choose ].coupling_length / 4.0;

sprintf( boss_diameter, \ 2.0 - coupling[ choose ].coupling_diameter );

sprintf( boss_height, \ coupling[ choose ].coupling_length / 4.0 ); UF_MODL_ask_feat_faces( tag_cyl, &cyl_face_list ); UF_MODL_ask_list_item( cyl_face_list, 1, &boss_face );

UF_MODL_create_boss( boss_location, boss_direction, boss_diameter, boss_height, \

/*创建轴孔*/

sprintf( axis_hole_diameter, \

sprintf( axis_hole_depth, \ coupling[ choose ].axis_length );

UF_MODL_ask_list_item( cyl_face_list, 1, &axis_hole_face_li ); UF_MODL_create_simple_hole( axis_hole_location, axis_hole_direction, axis_hole_diameter, axis_hole_depth, \ NULL_TAG, &tag_big_hole );

sprintf( axis_hole_diameter, \ UF_MODL_ask_feat_faces( tag_big_hole, &big_hole_face_list ); UF_MODL_ask_list_item( big_hole_face_list, 0, &axis_hole_face_li ); UF_MODL_delete_list( &big_hole_face_list );

UF_MODL_ask_feat_faces( tag_boss, &boss_face_list );

UF_MODL_ask_list_item( boss_face_list, 0, &axis_hole_face_t1 ); UF_MODL_delete_list( &boss_face_list );

UF_MODL_create_simple_hole( axis_hole_location, axis_hole_direction, axis_hole_diameter, NULL, \ axis_hole_face_t1, &tag_axis_hole );

/*创建倒圆角*/

tag_t tag_blend, tag_temp; int count;

UF_MODL_ask_feat_edges( tag_cyl, &cyl_edge_list );

UF_MODL_ask_feat_edges( tag_boss, &boss_edge_list ); UF_MODL_ask_list_count( boss_edge_list, &count ); for ( int i = 0; i < count; i++ ) {

UF_MODL_ask_list_item( boss_edge_list, i, &tag_temp ); UF_MODL_put_list_item( cyl_edge_list, tag_temp ); }

UF_MODL_delete_list( &boss_edge_list );

UF_MODL_create_blend( \ UF_MODL_delete_list( &cyl_edge_list );

/* 创建键槽 */

UF_LAYER_set_status( LAYER_CURVE, UF_LAYER_WORK_LAYER );

line_coords[ 0 ].start_point[ 0 ] = 0.0;

line_coords[ 0 ].start_point[ 1 ] = -coupling[ choose ].axis_diameter / 8.0; line_coords[ 0 ].end_point[ 0 ] = coupling[ choose ].axis_diameter * 0.55; line_coords[ 0 ].end_point[ 1 ] = line_coords[ 0 ].start_point[ 1 ]; line_coords[ 1 ].start_point[ 0 ] = line_coords[ 0 ].end_point[ 0 ]; line_coords[ 1 ].start_point[ 1 ] = line_coords[ 0 ].end_point[ 1 ]; line_coords[ 1 ].end_point[ 0 ] = line_coords[ 1 ].start_point[ 0 ]; line_coords[ 1 ].end_point[ 1 ] = -line_coords[ 1 ].start_point[ 1 ]; line_coords[ 2 ].start_point[ 0 ] = line_coords[ 1 ].end_point[ 0 ]; line_coords[ 2 ].start_point[ 1 ] = line_coords[ 1 ].end_point[ 1 ];

line_coords[ 2 ].end_point[ 0 ] = line_coords[ 0 ].start_point[ 0 ]; line_coords[ 2 ].end_point[ 1 ] = line_coords[ 1 ].end_point[ 1 ]; line_coords[ 3 ].start_point[ 0 ] = line_coords[ 2 ].end_point[ 0 ]; line_coords[ 3 ].start_point[ 1 ] = line_coords[ 2 ].end_point[ 1 ]; line_coords[ 3 ].end_point[ 0 ] = line_coords[ 0 ].start_point[ 0 ]; line_coords[ 3 ].end_point[ 1 ] = line_coords[ 0 ].start_point[ 1 ]; UF_MODL_create_list( &line_list ); for ( i = 0; i < 4; i++ ) {

line_coords[ i ].start_point[ 2 ] = 0.0; line_coords[ i ].end_point[ 2 ] = 0.0;

UF_CURVE_create_line( &line_coords[ i ], &tag_line ); UF_MODL_put_list_item( line_list, tag_line ); }

UF_LAYER_set_status( LAYER_SOLID, UF_LAYER_WORK_LAYER );

sprintf( limit1, \ limit[ 0 ] = limit0; limit[ 1 ] = limit1;

UF_MODL_create_extruded2( line_list, \ axis_hole_direction, UF_NEGATIVE, &extruded2_list ); UF_MODL_delete_list( &extruded2_list); UF_MODL_delete_list( &line_list );

UF_LAYER_set_all_but_work( UF_LAYER_INACTIVE_LAYER );

/* 创建螺栓孔 */

axis_hole_location[ 0 ] = coupling[ choose ].center_of_hole_diameter / 2; sprintf( axis_hole_diameter, \ UF_MODL_ask_list_item( cyl_face_list, 0, &axis_hole_face_t1 ); UF_MODL_create_simple_hole( axis_hole_location, axis_hole_direction, axis_hole_diameter, NULL, \ axis_hole_face_t1, &tag_axis_hole ); UF_MODL_delete_list( &cyl_face_list );

sprintf( number_str, \ sprintf( angle_str, \ UF_MODL_create_list( &iset_list );

UF_MODL_put_list_item( iset_list, tag_axis_hole );

UF_MODL_create_circular_iset ( 0, iset_location, axis_hole_direction, number_str, angle_str, iset_list, &tag_iset ); UF_MODL_delete_list( &iset_list ); }

void fitview( void ) {

tag_t view_tag = NULL_TAG;

UF_VIEW_visualization_t view_data;

UF_VIEW_ask_work_view( &view_tag );

UF_VIEW_ask_visualization( view_tag, &view_data ); view_data.display_mode = UF_VIEW_FULLY_SHADED; UF_VIEW_set_visualization( view_tag, &view_data ); UF_VIEW_fit_view( view_tag, 0.7 ); }

4.运行结果

(1)设置运行环境后,将生成的动态链接库文件放到项目的application目录下,启动UG系统,新建一个部件文件,此时在界面会出现一个工具条文件,并在主菜单Help之后出现一个新的“综合实例”的菜单项。

图4-10 凸缘联轴器菜单及工具条

(2)点击工具条或菜单项“创建YL型凸缘联轴器...”将弹出YL型凸缘联轴器的参数化设计对话框,让用户选择需要的型号。

图4-11 凸缘联轴器对话框

(3)选择相应的凸缘联轴器型号后,点击OK按钮,此时系统将创建用户指定类型的凸缘联轴器。结果如图4-12所示。

图4-12 凸缘联轴器

如果用户启动UG系统后,没有新建一个部件文件,而直接通过对话框创建凸缘联轴器,此时系统将弹出一个警告信息,提示用户先新建一个部件文件。如图4-13所示。

图4-13 用户警告信息

6.8.2 创建六角头螺栓

本实例建立了标准件六角头螺栓参数化设计系统,六角头螺栓的参数是采用Access数据库来管理的,程序通过ODBC来访问数据库。

1.运行环境设置

(1)在项目目录下新建三个目录:?\\screw\\application用于存放对话框文件和编译连接后生成的动态链接库文件,?\\ screw \\startup用于存放菜单和工具条文件,?\\ screw \\bitmap用于存放工具条和对话框的位图图标。

(2)设置两个环境变量:ugii_vendor_dir=?\\ screw使UG系统在启动后自动执行菜单和工具条文件,ugii_bitmap_path=?\\ screw \\bitmap使系统能找到相应的位图文件。

(3)在数据库中建立建立存放六角头螺栓参数的表,表的结构如表6.27所示。

表6.27存放六角头螺栓参数表结构

字段名称 spec d b a e k r s l weight 数据类型 文本 数字 数字 数字 数字 数字 数字 数字 数字 数字 含义 螺纹规格 螺栓轴直径 螺纹长度 a(max) 螺栓帽外接圆直径 公称 r(min) 螺栓帽内接圆直径 螺栓轴长度 100mm长的重量(kg)

(4)设置ODBC链接。 2.流程图

开始创建六条直线并拉伸获取licence修剪拉伸体从数据库里读出型号数据并设置对话框里的选项失败选择型号在凸台上打螺纹从数据库里找出相应的记录结束licence结束图4-14 六角头螺栓系统流程图

成功在拉伸体上创建凸台调整视图并保存部件文件

3.资源文件

(1)菜单和工具条文件

本系统要在菜单栏菜单Help的右侧建立一个新的菜单栏菜单——综合实例,综合实例下将包含一个子菜单项——创建六角头螺栓...。在界面上出现一个工具条——创建六角头螺栓。本系统的菜单文件为screw.men,工具条文件为screw.tbr,其内容分别如下:

a.菜单文件screw.men VERSION 120

!------------------------------ EDIT UG_GATEWAY_MAIN_MENUBAR TOP_MENU

CASCADE_BUTTON CUSTOM_MYMENU LABEL 综合实例

END_OF_TOP_MENU MENU CUSTOM_MYMENU

b.工具条文件screw.tbr TITLE 综合实例 VERSION 170

!------------------------------ BUTTON MAKE_SCREW LABEL 创建六角头螺栓 BITMAP screw_ico.bmp

(2)对话框文件

本例采用UG/open UIStyler创建对话框,以与UG系统本身的对话框风格相一致,建立的对话框如图4-16所示。

(3)主程序代码

#include #include #include #include #include #include #include #include #include #include #include

BUTTON MAKE_SCREW LABEL 创建六角头螺栓... BITMAP screw_ico.bmp ACTIONS screw.dlg

END_OF_MENU

#include #include #include #include #include #include #include

#define SCREW_CB_COUNT ( 3 + 1 ) #define SCREW_BITMAP_SCREW (\#define SCREW_SEP_1 (\#define SCREW_OPTION_CHOICE (\#define SCREW_DIALOG_OBJECT_COUNT ( 3 ) #define SCREW_OPTION_CHOICE_COUNT 14 #define LAYER_SOLID 1 #define LAYER_SKETCH 21 #define LAYER_CURVE 41

class Cscrew : public CRecordset { public:

Cscrew( CDatabase* pDatabase = NULL ); DECLARE_DYNAMIC( Cscrew ) CString m_spec; //螺纹规格 double double double double double double double double double public:

virtual CString GetDefaultSQL( );

virtual void DoFieldExchange( CFieldExchange* pFX ); };

int SCREW_ok_cb ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data); int SCREW_cancel_cb ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data); int SCREW_constructor ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data); void fitview( void );

void create( Cscrew* ScrewSet ); IMPLEMENT_DYNAMIC( Cscrew, CRecordset )

m_d; //螺栓轴直径 m_b; //螺纹长度 m_a; //a(max)

m_e; //螺栓帽外接圆直径 m_k; //公称 m_r; //r(min)

m_s; //螺栓帽内接圆直径 m_l; //螺栓轴长度

m_weight; //100mm长的重量(kg)

static UF_STYLER_callback_info_t SCREW_cbs[SCREW_CB_COUNT] = {

{UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, SCREW_constructor}, {UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, SCREW_ok_cb}, {UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB , 0, SCREW_cancel_cb}, {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 } };

static UF_MB_styler_actions_t actions[] = {

{ \ { NULL, NULL, NULL, 0 } };

Cscrew::Cscrew( CDatabase* pdb ) : CRecordset( pdb ) {

m_spec = L\ m_d = 0.0; m_b = 0.0; m_a = 0.0; m_e = 0.0; m_k = 0.0; m_r = 0.0; m_s = 0.0; m_l = 0.0; m_weight = 0.0; m_nFields = 10;

m_nDefaultType = snapshot; }

CString Cscrew::GetDefaultSQL() {

return _T(\}

void Cscrew::DoFieldExchange(CFieldExchange* pFX) {

pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Text(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\ RFX_Double(pFX, _T(\

RFX_Double(pFX, _T(\}

extern void ufsta (char *param, int *retcode, int rlen) {

int error_code;

if ( (UF_initialize()) != 0) return;

if ( (error_code = UF_MB_add_styler_actions ( actions ) ) != 0 ) {

char fail_message[133];

UF_get_fail_message(error_code, fail_message); printf ( \ }

UF_terminate(); return; }

/* 构造函数 */

int SCREW_constructor ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data) {

if ( UF_initialize() != 0)

return ( UF_UI_CB_CONTINUE_DIALOG ); UF_STYLER_item_value_type_t data;

char *names[ SCREW_OPTION_CHOICE_COUNT ]; try {

CDatabase database;

database.OpenEx( \ Cscrew ScrewSet;

ScrewSet.Open( CRecordset::snapshot, \ int i = 0; do {

if( ScrewSet.IsEOF( ) ) break;

strcpy( names[ i++ ] = (char*)malloc( sizeof( char ) * 4 ), ScrewSet.m_spec ); ScrewSet.MoveNext( ); }while( 1 ); database.Close( );

data.item_id = SCREW_OPTION_CHOICE; data.item_attr = UF_STYLER_SUBITEM_VALUES; data.count = SCREW_OPTION_CHOICE_COUNT; data.value.strings = names;

UF_STYLER_set_value( dialog_id, &data ); data.item_attr = UF_STYLER_VALUE; data.value.integer = 0;

UF_STYLER_set_value( dialog_id, &data );

for ( i = 0; i < SCREW_OPTION_CHOICE_COUNT; i++ ) {

free( names[ i ] ); } }

catch( CDBException *pe ) {

AfxMessageBox( \ AfxMessageBox( pe->m_strError ); pe -> Delete( ); }

UF_terminate();

return ( UF_UI_CB_CONTINUE_DIALOG ); }

int SCREW_ok_cb( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data) {

if ( UF_initialize() != 0)

return ( UF_UI_CB_CONTINUE_DIALOG );

/*如果当前没有打开一个PART文件的话,退出*/ tag_t is_part_opened;

is_part_opened = UF_PART_ask_display_part( ); if ( NULL_TAG == is_part_opened ) {

AfxMessageBox( \请先新建一个部件文件,然后再进行此项操作。\ return ( UF_UI_CB_EXIT_DIALOG ); }

/*获取选择的项目,从数据库里找出相应的记录*/ UF_STYLER_item_value_type_t data0, data1; data0.item_id = SCREW_OPTION_CHOICE; data1.item_id = SCREW_OPTION_CHOICE; data0.item_attr = UF_STYLER_VALUE;

data1.item_attr = UF_STYLER_SUBITEM_VALUES; UF_STYLER_ask_value( dialog_id, &data0 ); UF_STYLER_ask_value( dialog_id, &data1 ); char buf[ 4 ];

strcpy( buf, data1.value.strings[ data0.value.integer ] ); UF_STYLER_free_value( &data1);

char sql[ 1000 ];

sprintf( sql, \

CDatabase database;

database.OpenEx( \ Cscrew ScrewSet;

ScrewSet.Open( CRecordset::snapshot, sql ); database.Close( );

/*创建螺栓*/ create( &ScrewSet ); /*调整视图显示模式及比例*/ fitview( ); /*保存部件文件*/ UF_PART_save( );

UF_terminate ();

return ( UF_UI_CB_EXIT_DIALOG ); }

int SCREW_cancel_cb ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data ) {

if ( UF_initialize( ) != 0)

return ( UF_UI_CB_CONTINUE_DIALOG ); AfxMessageBox( \用户取消了本次操作!\

UF_terminate( );

return ( UF_UI_CB_EXIT_DIALOG ); /* UF_UI_CB_CONTINUE_DIALOG */ }

/*调整视图显示模式及比例*/ void fitview( void ) {

tag_t view_tag = NULL_TAG;

UF_VIEW_visualization_t view_data;

UF_VIEW_ask_work_view( &view_tag );

UF_VIEW_ask_visualization( view_tag, &view_data ); view_data.display_mode = UF_VIEW_FULLY_SHADED; UF_VIEW_set_visualization( view_tag, &view_data ); UF_VIEW_fit_view( view_tag, 0.7 ); }

/*创建螺栓*/

void create( Cscrew* ScrewSet ) {

/*创建六条直线并拉伸*/

uf_list_p_t skt_line_list; UF_CURVE_line_t skt_lines[ 6 ]; tag_t skt_line_tags[ 6 ];

UF_LAYER_set_status( LAYER_SKETCH, UF_LAYER_WORK_LAYER ); skt_lines[ 0 ].start_point[ 0 ] = ScrewSet->m_e / 2.0; skt_lines[ 0 ].start_point[ 1 ] = 0.0;

skt_lines[ 0 ].end_point[ 0 ] = ScrewSet->m_e / 2.0 * cos( 60.0 * DEGRA ); skt_lines[ 0 ].end_point[ 1 ] = ScrewSet->m_e / 2.0 * sin( 60.0 * DEGRA ); skt_lines[ 1 ].start_point[ 0 ] = skt_lines[ 0 ].end_point[ 0 ]; skt_lines[ 1 ].start_point[ 1 ] = skt_lines[ 0 ].end_point[ 1 ]; skt_lines[ 1 ].end_point[ 0 ] = -skt_lines[ 1 ].start_point[ 0 ]; skt_lines[ 1 ].end_point[ 1 ] = skt_lines[ 1 ].start_point[ 1 ]; skt_lines[ 2 ].start_point[ 0 ] = skt_lines[ 1 ].end_point[ 0 ]; skt_lines[ 2 ].start_point[ 1 ] = skt_lines[ 1 ].end_point[ 1 ]; skt_lines[ 2 ].end_point[ 0 ] = -skt_lines[ 0 ].start_point[ 0 ]; skt_lines[ 2 ].end_point[ 1 ] = skt_lines[ 0 ].start_point[ 1 ]; skt_lines[ 3 ].start_point[ 0 ] = skt_lines[ 2 ].end_point[ 0 ]; skt_lines[ 3 ].start_point[ 1 ] = skt_lines[ 2 ].end_point[ 1 ]; skt_lines[ 3 ].end_point[ 0 ] = -skt_lines[ 0 ].end_point[ 0 ]; skt_lines[ 3 ].end_point[ 1 ] = -skt_lines[ 0 ].end_point[ 1 ]; skt_lines[ 4 ].start_point[ 0 ] = skt_lines[ 3 ].end_point[ 0 ]; skt_lines[ 4 ].start_point[ 1 ] = skt_lines[ 3 ].end_point[ 1 ]; skt_lines[ 4 ].end_point[ 0 ] = -skt_lines[ 4 ].start_point[ 0 ]; skt_lines[ 4 ].end_point[ 1 ] = skt_lines[ 4 ].start_point[ 1 ]; skt_lines[ 5 ].start_point[ 0 ] = skt_lines[ 4 ].end_point[ 0 ]; skt_lines[ 5 ].start_point[ 1 ] = skt_lines[ 4 ].end_point[ 1 ]; skt_lines[ 5 ].end_point[ 0 ] = skt_lines[ 0 ].start_point[ 0 ]; skt_lines[ 5 ].end_point[ 1 ] = skt_lines[ 0 ].start_point[ 1 ];

UF_MODL_create_list( &skt_line_list ); for ( int i = 0; i < 6; i++ ) {

skt_lines[ i ].start_point[ 2 ] = 0.0; skt_lines[ i ].end_point[ 2 ] = 0.0;

UF_CURVE_create_line( &skt_lines[ i ], &skt_line_tags[ i ] ); UF_MODL_put_list_item( skt_line_list, skt_line_tags[ i ] ); }

char skt_name[ 30 ] = \

double skt_matrix[ 9 ] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }; tag_t skt_tag;

UF_SKET_initialize_sketch( skt_name, &skt_tag ); UF_SKET_create_sketch( skt_name, 2, skt_matrix,

NULL, NULL, 1, &skt_tag );

UF_SKET_add_objects( skt_tag, 6, skt_line_tags ); UF_SKET_terminate_sketch( );

UF_LAYER_set_status( LAYER_SOLID, UF_LAYER_WORK_LAYER ); UF_LAYER_set_all_but_work( UF_LAYER_INACTIVE_LAYER );

char limit0[ 10 ]; char limit1[ 10 ];

char *limit[ 2 ] = { limit0, limit1 }; double point[ 3 ] = { 0.0, 0.0, 0.0 }; double direction[ 3 ] = { 0.0, 0.0, 1.0 }; uf_list_p_t feature_list; tag_t base_tag;

strcpy( limit0, \

sprintf( limit1, \

UF_MODL_create_extruded2( skt_line_list, \ point, direction, UF_NULLSIGN, &feature_list ); UF_MODL_ask_list_item( feature_list, 0, &base_tag ); UF_MODL_delete_list( &feature_list ); UF_MODL_delete_list( &skt_line_list );

/* 修剪拉伸体 */

UF_LAYER_set_status( LAYER_CURVE, UF_LAYER_WORK_LAYER ); skt_lines[ 0 ].start_point[ 0 ] = ScrewSet->m_e / 2.0; skt_lines[ 0 ].start_point[ 2 ] = 0.0;

skt_lines[ 0 ].end_point[ 0 ] = skt_lines[ 0 ].start_point[ 0 ] * 0.85; skt_lines[ 0 ].end_point[ 2 ] = skt_lines[ 0 ].start_point[ 2 ]; skt_lines[ 1 ].start_point[ 0 ] = skt_lines[ 0 ].end_point[ 0 ]; skt_lines[ 1 ].start_point[ 2 ] = skt_lines[ 0 ].end_point[ 2 ]; skt_lines[ 1 ].end_point[ 0 ] = skt_lines[ 0 ].start_point[ 0 ]; skt_lines[ 1 ].end_point[ 2 ] = ScrewSet->m_k * 0.2;

skt_lines[ 2 ].start_point[ 0 ] = skt_lines[ 1 ].end_point[ 0 ]; skt_lines[ 2 ].start_point[ 2 ] = skt_lines[ 1 ].end_point[ 2 ]; skt_lines[ 2 ].end_point[ 0 ] = skt_lines[ 0 ].start_point[ 0 ]; skt_lines[ 2 ].end_point[ 2 ] = skt_lines[ 0 ].start_point[ 2 ];

UF_MODL_create_list( &skt_line_list ); for ( i = 0; i < 3; i++ ) {

skt_lines[ i ].start_point[ 1 ] = 0.0; skt_lines[ i ].end_point[ 1 ] = 0.0;

UF_CURVE_create_line( &skt_lines[ i ], &skt_line_tags[ i ] ); UF_MODL_put_list_item( skt_line_list, skt_line_tags[ i ] ); }

UF_LAYER_set_status( LAYER_SOLID, UF_LAYER_WORK_LAYER ); UF_LAYER_set_all_but_work( UF_LAYER_INACTIVE_LAYER );

strcpy( limit0, \ strcpy( limit1, \ tag_t revolve_tag;

UF_MODL_create_revolved1( skt_line_list, limit, point, direction, UF_NEGATIVE, base_tag, &feature_list ); UF_MODL_ask_list_item( feature_list, 0, &revolve_tag ); UF_MODL_delete_list( &skt_line_list );

/*在拉伸体上创建凸台*/ uf_list_p_t base_face_list; char diame[ 10 ]; char height[ 10 ]; tag_t face_li; tag_t boss_tag;

UF_MODL_ask_feat_faces( base_tag, &base_face_list ); UF_MODL_ask_list_item( base_face_list, 7, &face_li ); point[ 2 ] = ScrewSet->m_k;

sprintf( diame, \ sprintf( height, \

UF_MODL_create_boss( point, direction, diame, height, \ UF_MODL_delete_list( &base_face_list );

/*在凸台上打螺纹*/

UF_MODL_symb_thread_data_t thread_parameters; tag_t symb_thread_tag; uf_list_p_t boss_face_list;

UF_MODL_ask_feat_faces( boss_tag, &boss_face_list );

UF_MODL_ask_list_item( boss_face_list, 1, &thread_parameters.cyl_face ); UF_MODL_ask_list_item( boss_face_list, 0, &thread_parameters.start_face ); UF_MODL_delete_list( &boss_face_list ); thread_parameters.axis_direction[ 0 ] = 0.0; thread_parameters.axis_direction[ 1 ] = 0.0; thread_parameters.axis_direction[ 2 ] = -1.0;

thread_parameters.include_instances = UF_MODL_INCL_INSTANCES; thread_parameters.rotation = UF_MODL_RIGHT_HAND; thread_parameters.length_flag = UF_MODL_FIXED_LENGTH; thread_parameters.tapered = UF_MODL_NON_TAPERED; thread_parameters.num_starts = 1; thread_parameters.form = \ thread_parameters.method = \ thread_parameters.callout = NULL; char major_dia[ 10 ];

char minor_dia[ 10 ]; char tapped_dia[ 10 ]; char length[ 10 ]; char pitch[ 10 ];

thread_parameters.major_dia = major_dia; thread_parameters.minor_dia = minor_dia; thread_parameters.tapped_dia = tapped_dia; thread_parameters.length = length; thread_parameters.pitch = pitch;

sprintf( major_dia, \ sprintf( minor_dia, \ sprintf( tapped_dia, \ sprintf( length, \ sprintf( pitch, \ thread_parameters.angle = \

UF_MODL_create_symb_thread(&thread_parameters, &symb_thread_tag );

}

4.运行结果

(1)设置运行环境后,将生成的动态链接库文件放到项目的application目录下,启动UG系统,新建一个部件文件,此时在界面会出现一个工具条文件,并在主菜单Help之后出现一个新的“综合实例”的菜单项。

图4-15 六角头螺栓菜单及工具条

(2)点击工具条或菜单项“创建六角头螺栓...”将弹出六角头螺栓的参数化设计对话框,让用户选择需要的型号。

图4-16 六角头螺栓系统对话框

(3)选择相应的六角头螺栓型号后,点击OK按钮,此时系统将创建用户指定类型的六角头螺栓。结果如图4-17所示。

图4-17 六角头螺栓

如果用户启动UG系统后,没有新建一个部件文件,而直接通过对话框创建六角头螺栓,此时系统将弹出一个警告信息,提示用户应先新建一个部件文件。如图4-18所示。

图4-18 用户警告信息