请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
# \: D0 E1 C9 s. |, a+ O
UG二次开发经典实例教程 第三章 UG OPEN API编程基础- v O' f! a. z7 Z( d. o
3 p% P8 C( m$ ^5 f0 |" G! B3 F- [
& s& B4 X/ {, G; }1 P: z, ^% [
2 w- w2 Y$ D3 n1 e1 h0 b. u7 ?" M; `
& N, m* ]5 V3 Q3 C2 y( O$ A5 p第3章 编程基础 3.1 UG/Open API函数3.1.1函数名称的约定UG/OpenAPI 共有两类名称约定。一个是标准的UG/OpenAPI的函数名称约定;另一个是以前版本原有的名称约定。 1、标准名称约定 格式:UF_<area>_<name> 说明: l UF_,user funciton的简写,表示该函数为UG/Open API函数; l <area>,应用或模块的名称缩写。例如modl和disp分别是Modeling模块和Display功能的名称缩写; l <name>,表示其实现功能的语言描述,一般由下划线分开的动词和名词(或词组)组成。常用的动词有:ask(查询)、create(创建)、edit(编辑)、set(设置)、delete(删除)等。 例如: UF_MODL_create_block1()为创建立方体的函数; UF_DISP_set_highlight()是高亮显示对象的函数; (2)非标准名称约定 格式:uc<xxxx> 和uf<xxxx> 说明:代表UG/Open API C程序,<xxxx>通常是四位数或三位数接一个字母。 例如:uc1601是一个提示信息函数。 3.1.2 函数参数的约定UG/OpenAPI提供的函数遵守ANSI/ISO C的标准,并以下列格式在头文件中提供函数原型: <返回数据类型><函数名>(变量列表); 返回数据类型通常是C数据类型或UG/Open API自定义数据类型。参数的输入输出方式有3种:I(Input)、O(Output)或OF(Output Free),说明见表3-1。 表3-1 参数输入方式说明 | | | | | | | 表示参数为输出方式,且使用后需要释放内存。UG/Open API提供的常用释放内存函数有UF_free()、UF_free_string()和UF_STYLER_free_value()等,至于选择哪种释放函数需视具体情况而定。 |
例如:函数UF_PART_open() 名称:UF_PART_open 使用环境: internal & external 语法格式: intUF_PART_open( char*part_name, tag_t*part, UF_PART_load_status_t*error_status ); 描述:加载一个UG部件文件到UG的界面环境中,并把它设为工作和当前显示部件,该函数的描述见表3-2。 表3-2函数UF_PART_open()参数描述 | | | | | | | | | | | 打开部件的标识,当打开部件文件失败时为NULL_TAG | | | | 当加载部件失败时该结构中将包含错误代码和部件文件名称,使用结束后应使用函数UF_free_string_arry()和UF_free()释放内存 | | | | |
3.2 UG/Open API的数据类型除了C语言标准的数据类型外,UG/Open API还提供了一些自定义的数据类型,如tag_t类型、结构类型(structure type)、枚举类型(enum type)、联合类型(union type)与指针类型(pointer type)等,它们统一用后缀“_t”表示,且这些数据类型的指针用反缀“_p_t”命名表示。数据类型约定如表3-3所示: 表3-3数据类型约定 | | | | | 数据类型的指针(pointer to data type) | | | | | | 联合类型的指针(pointer to a union type) | | 函数指针(pointer to a function) |
3.2.1 tag_t类型UG/OpenAPI 使用最多的数据类型是tag_t ,在UG/Open API的uf_defs.h中定义如下: typedefunsigned int tag_t ,*tag_p_t; 在UG环境中,tag_t 是UG对象的句柄,即UG对象模型的唯一标识。它是一种不重复的无符号整型数值,主要用于标识应用程序中的对象,如部件、草图、曲线、属性和表达式等。UG应用程序只能访问句柄,而不能直接访问句柄所指示的实际对象。程序一般通过调用API函数获取句柄,并且在其他API函数中使用这个句柄,以引用它指示的对象。在此过程中,句柄的实际值对程序来说是无关紧要的。此外,tag_p_t是指向tag_t数据类型的指针。 以部件对象为例,下面的代码首先获取工作部件的tag_t值,然后获取该句柄所引用部件对象的文件名。 tag_t tWorkPart; tWorkPart= UF_ASSEM_ask_work_part(); 3.2.2 结构类型UG/OpenAPI采用C语言的语法定义了一些常用的结构类型,将相应联系的不同类型数据封装在一起使用,这些结构类型用后缀“_s”表示,例如: structUF_STYLER_item_value_type_s{ intreason; intsubitem_index; intcount; intitem_attr; intindicator; UF_STYLER_value_tvalue; } typedefstruct UF_STYLER_item_value_type_s UF_STYLER_item_value_type_t,*UF_STYLER_item_value_type_p_t; 结构体UF_STYLER_item_value_type_s封装了对话框控件的基本属性,如reason、item_id和value等。UG/Open API使用关键词typedef将该结构类型定义为新类型UF_STYLER_item_value_type_t,用户可以使用它定义结构变量,然后引用结构体内的数据成员,例如: UF_STYLER_item_value_type_tdata; UF_STYLER_ask_value(dialog_id,&data); … UF_STYLER_free_value(&data ); 3.2.3 枚举类型枚举类型将变量的值一一列举出来,变量的值只限于列举出来的值的范围。UG/Open API采用C语言的语法定义了一些常用的枚举类型,使用后缀“_e”表示。以枚举类型UF_ASSEM_load_status_e为例,下面给出其详细定义: enumUF_ASSEM_load_status_e{ UF_ASSEM_ok, UF_ASSEM_suppressed, UF_ASSEM_not_loaded, UF_ASSEM_instance_suppressed }; typedefenum UF_ASSEM_load_status_e UF_ASSEM_load_status_t; 枚举类型UF_ASSEM_load_status_e表示部件在装配体中的状态。UG/OpenAPI使用typedef关键词将该枚举类型定义为新类型UF_ASSEM_load_status_t,例如: charsPartPath[] = “E:\\Example\\part.prt”; tag_t tPart = NULL_TAG; UF_PART_load_status_terror_status; UF_PART_open(sPartPath,&tPart, &error_status); 3.2.4 联合类型有时需要将不同数据类型的变量放在同一段内存单元中,这种使不同变量占用同一段内存的结构类型称为联合类型。联合类型与结构类型的定义形式相似,但含义不同。联合类型变量所占的内存长度等于其内部最长数据成员的长度,而结构类型变量所占的内存长度则是其各数据成员所占内存长度之和。 UG/OpenAPI采用C语言的语法定义了一些常用的联合类型,使用后缀“_u”表示。以联合类型UF_STYLER_value_u为例,下面给出其详细定义: unionUF_STYLER_value_u{ char *string; char **strings; int integer; int *integers; double real; double *reals; UF_UI_selection_p_t selection; UF_STYLER_notification_p_tnotify; UF_UI_attachment_tattach; UF_UI_option_toggle_toption_toggle; }; typedefunion UF_STYLER_value_u UF_STYLER_value_t; 联合体UF_STYLER_value_u封装了对话框对话框控件的属性值,如string、integer和real等。UG/OpenAPI使用typedef关键词将该联合类型定义为新类型UF_STYLER_value_t,它是UF_STYLER_item_value_type_t中的数据成员value的类型,例如: UF_STYLER_item_value_type_tdata; doublerValue; sel_data.item_id= REAL_BUTTOM_DIAMETER; UF_STYLER_ask_value( dialog_id, &sel_data ); rValue = data.value.real; 3.3 UG对象类型及基本操作UG中的所有对象都是通过唯一的tag_t值进行标识,这些对象大致可以分为部件对象、UF对象、表达式、链表和属性。 3.3.1 部件对象部件对象是UG最基本的操作对象之一,不仅包含了零件的几何信息,而且更包含了大量的非几何信息,非几何信息包括:创建部件的计算机类型;保存部件的UG版本;部件的历史信息(例如部件文件的保存记录等);状态、描述和用户区的可永久保存在部件文件中的信息。 UG/OpenAPI提供的访问和操作部件文件的函数包括部件文件的创建、打开、关闭、保存和信息的查询等。 表3-4对部件对话操作的函数 | | UF_OBJ_cycle_objs_in_part() | | | | UF_PART_close() UF_PART_reopen() | | | | UF_PART_ask_customer_area() UF_PART_ask_description() UF_PART_ask_status() | 查询其他信息,包括:查询用户定义的数据、部件文件的描述信息,部件文件的状态信息 | UF_PART_ask_part_history() | | UF_PART_ask_compression_flags() UF_PART_set_compression_flags() | |
部件对象基本操作涉及的函数主要有UF_PART_new、UF_PART_open、UF_PART_close_all、UF_PART_save和UF_PART_close。 (1) UF_PART_new externint UF_PART_new ( char* part_name, intunits, tag_t* part ); 参数part_name是指向保存被创建文件路径和名称的字符串指针,units是输入参数,表示被创建文件使用的单位制,1表示米制,0表示英制。part是输出参数,是指向新创建部件文件的tag_t。该函数的返回值是错误代码,可以利用函数UF_get_fail_message得到其所对应的错误信息。 (2) UF_PART_open externint UF_PART_open ( char* part_name, tag_t* part, UF_PART_load_status_t* error_status ); 参数part_name是指向保存被创建文件路径和名称的字符串指针,是输入参数。error_status是输出参数,表示打开文件的操作是否产生错误。 (3) UF_PART_close_all externint UF_PART_close_all ( ) 将当前会话中的所有部件文件关闭。对于被修改的部件文件,UF_PART_close_all并不会导致这些文件被存盘,也不会提示用户存盘。UG仅仅向用户确认是否将当前部件文件关闭。 (4) UF_PART_save externint UF_PART_save ( ) 将当前会话中显示的部件文件存盘。由于UG本身并不对部件文件自动存盘,所以存盘需求都需要户进行维护。 (5) UF_PART_close externint UF_PART_close ( tag_tpart, intscope, intmode ) 其中参数part是输入参数,表示关闭操作的部件的标识。参数scope是输入参数,表示被关闭文件涉及的范围。scope=1表示关闭部件文件和其所有子装配;scope=0表示仅仅关闭部件文件本身。参数mode是输入参数,表示是否请求用户确认。当mode=0时,如果被关闭的部件文件被修改过,则询问用户是否关闭;mode=1表示即使文件被修改了,也要执行关闭操作;mode=2时表示如果部件文件被修改了,则放弃关闭操作。 3.3.2 UF对象UF对象是那些具有标识的实体、包括几何对象和非几何对象。几何对象包括点、线、面、实体等;非几何对象有坐标系、矩阵、尺寸等。UG中所有具有标识的实体,如点、线、面、基准等,都可以称为对象。模型中包含的对象包括几何实体对象、非几何对象。其中几何实体又可细分为实体、点、直线、圆弧等。非几何实体对象则有坐标系对象、尺寸对象、颜色、线性等。UF利用类型与子类型来区别部件文件中不同对象。每个UF对象都有一种类型,在头文件uf_object_types.h中详细定义了这些对象的类型(type)和子类型(subtype),子类型可以更加精确地描述UF对象,但是不是所有的对象都拥有子类型,例如: #define UF_group_type 15 …… #define UF_dimension_type 26 #define UF_dim_horizontal_subtype 1 #define UF_dim_vertical_subtype 2 #define UF_dim_parallel_subtype 3 #define UF_dim_cylindrical_subtype 4 #define UF_dim_perpendicular_subtype 5 #define UF_dim_angular_minor_subtype 6 #define UF_dim_angular_major_subtype 7 #define UF_dim_arc_length_subtype 8 #define UF_dim_radius_subtype 9 #define UF_dim_diameter_subtype 10 #define UF_dim_hole_subtype 11 #define UF_dim_conc_circle_subtype 12 #define UF_dim_ordinate_horiz_subtype 13 #define UF_dim_ordinate_vert_subtype 14 #define UF_dim_assorted_parts_subtype 15 #define UF_dim_folded_radius_subtype 16 #define UF_dim_chain_dimensions_subtype 17 #define UF_dim_ordinate_origin_subtype 18 #define UF_dim_perimeter_subtype 19 #define UF_dim_chamfer_subtype 20 其中,UF_group_type表示组类型,类型值为15,无子类型; UF_dimension_type表示尺寸类型,类型值为26,1~20表示它的子类型的值,分别表示为垂直尺寸、水平尺寸、平等尺寸等。 UG/OpenAPI提供的访问和操作UF对象的函数包括UF对象的查询、遍历、等。对象操作函数请参考头文件uf_obj.h中的定义。 表3-5UF对象基本操作函数 | | UF_OBJ_set_name() UF_OBJ_ask_name() UF_OBJ_delete_name() | | UF_OBJ_cycle_objs_in_part() UF_OBJ_cycle_all() UF_OBJ_cycle_by_name() UF_LAYER_cycle_by_layer() | 查询遍历对象,可以在指定部件中遍历对象,在当前工作部件中遍历对象,通过对象名称和图层查询对象 | UF_MODL_delete_exp() UF_MODL_delete_feature() UF_OBJ_delete_object() UF_OBJ_delete_array_of_objects() | | UF_UI_select_single() UF_UI_select_by_class() UF_UI_select_feature() UF_UI_select_sketch() | |
1、对象状态 对象的状态可通过使用函数UF_0BJ_ask_status()来查询。对象共有下列几种状态: 表3-6 UF对象状态标识 | | | | | 临时状态。例如临时坐标系由UF_CSYS_create_temp_csys函数创建,不会被保存 | | 不正常状态。一般由于对象被删除,但它是其它对象的参考,只有所有的这些参考被删除后,该对象才从模型中被删除,该状态的对象永远不被显示 | | |
2、对象访问 在创建对象时,可以直接得到对象标识。但是,多数情况下需要访问已经在部件文件中存在的对象。一般可能通过以下两种方法来确定UF对象的标识: 一是循环法。即可在获取目标体上面标识的循环过程中,插入下段程序。该段程序会高亮显示目标体上表面并弹出一个需用户确认的对话框,对话框中显示该对象的标识号。其中tem_tag为目标体上表面的标识。 UF_DISP_set_highlight(tem_tag,1); Sprintf(mess,"The object is %d!", i); uc1601(mess,1); UF_DISP_set_highlight(tem_tag,0); 二是参数法。即可利用函数UF_MODL_ask_face_data获得目标体上表面的参数,包括表面的类型、表面的法向和表面的原点等信息。比如下面一段程序是为了获得圆柱体的圆柱表面。 //通过圆柱特征标识,获得圆柱表面的链表 UF_MODL_ask_feat_faces(cyl_eid, &face_list); UF_MODL_ask_list_count(face_list,&num); for( i = 0; i < num; i ++ ) { UF_MODL_ask_list_item(face_list, i,&face); //获得每个圆柱表面的参数 UF_MODL_ask_face_data(face, &type,point, face_dir, box, &radius,&rad_data, &sense); //将类型为的16(圆柱表面)表面取出赋给变量tem_tag并退出循环 if (type == 16 ) { tem_tag = face; break; } } //删除链表,释放内存 UF_MODL_delete_list(&face_list) 3、设置可显示的UF对象信息的函数。 UG/OpenAPI提供了对可显示的UF对象的层、颜色、线型等属性进行设置和查询的接口。注意除了高亮状态外,其他信息都可以保存到part文件中。 表3-7设置可显示UF对象函数 | | UF_OBJ_ask_display_properties() | | | | | | UF_0BJ_set_blank_status() | | | | | | | 用于设置可显示UF对象的高亮(highlight)状态 | 3.3.4 表达式3.3.4.1 表达式的定义UG/OpenAPI创建的表达式和UG的交互界面产生的表达式同样在“表达式编辑器”中可见。 表达式提供UG中的参数化建模的机制,表达式能控制特征,特征也随表达式的变化而改变。—个表达式可在多个特征中使用,这样它的变化将能改变多个特征。 表达式的形式一般是: “name = value”。 表达式名的首字符必须是字母,其他字符可以是数字、字母、下划线等。表达式名是大小写敏感的,一个部件文件中的表达式名应唯—。表达式值可以是数字和条件等式,表达式名可以用于表达式值中。 3.3.4.2表达式的使用UF函数允许用户创建、查询和编辑表达式和几何表达式,对表达式进行各种操作的函数包含在头文件uf_modl.h中,对几何表达式进行各种操作的函数包含在头文件uf_gexp.h中。 如果表达式串中,仅仅提供表达式值,UG软件会自动给它—个名字。如表达式串定义如下: “diameter/2” UG会赋给它一个类似“p0”的名字。建议按下列形式赋值 “radius= diameter/2 ” 可以用函数UF_MODL_create_exp()创建表达式;当需要得到创建的表达式的标签时,使用函数UF_MODL_create_exp_tag()。常用表达式操作函数如表3-8所示: 表3-8常用表达式操作函数 | | | | | | | 从文件输入表达式,即可引用其它部件的表达式文件,操作完成后必须用函数UF_MODL_update()更新数据库 | UF_MODL_dissect_exp_string() | | | | | 用新的值替换表达式中原有的值。使用后应用函数UF_MODL_update()来更新模型 | | | | | UF_MODL_ask_exps_of_feature() | | UF_MODL_ask_exps_of_part() | | UF_MODL_ask_exp_tag_string() | | UF_MODL_ask_exp_tag_value() | |
下面举例说明函数UF_MODL_edit_exp()的使用方法,代码实现的功能是将表达式p1的值改为20。注意:函数UF_MODL_edit_exp()的输入参数必须为整个表达式,并且编辑表达式后,必须更新模型才能及时反映其变化。 charsExp[] = “p1=20”; UF_MODL_edit_exp(sExp); UF_MODL_update(); 3.3.5链表对象为了提高编程的灵活性,UG/Open API提供了对象链表。它使用来存放对象或特征的标识,链表的每个节点保存一个对象或特征的标识。与链表有关的操用函数如表3-9所示,它们包含在头文件uf_modl.h中。 表3-9链表操作函数 | | | | | 插入元素到链表中。该函数只将对象加入到链表的尾部,不校验链表中是否有重复对象 | | 获取链表中元素的个数。该函数计算从链表的头开始到第一个出现NULL_TAG节点之间的节点个数。因此,如果链表中包含NULL_TAG,那么得不到链表的真实长度。 | | 查询链表中的对象标识。该函数通过标识在链表中的位置返回对象标识 | UF_MODL_delete_list_item() | | | |
下面举例说明链表的使用方法,代码实现的功能是利用曲线数组创建曲线链表,需要注意的是链表使用完后,需要利用UF_MODL_delete_list()删除不需要的链表。 uf_list_p_tcurves_list = NULL; inti = 0, irc =0; UF_MODL_create_list(&curves_list); for(i=0;i<n_curves; i++) UF_MODL_put_list_item(curves_list,curves); … UF_MODL_delete_list(&curves_list); List两种应用场合。 3.3.6 属性对象UG环境下的属性是用户附加到部件或对象上的字符串、整形数值、实型数值的字段,用于对部件或对象进行说明或做标记。UG/Open API在头文件uf_attr.h中提供了与部件或对象属性的接口。与属性对象有关的操用函数如表3-10所示。 部件属性对象是UF_part_attribute_type类型,它是关于整个部件的信息对象,例如模型的材料等属性。在每个UG部件中都有—个部件属性对象,在单个的部件属性对象上可以附加多个属性项。 UG提供了7种属性类型:UF_ATTR_any、UF_ATTR_string、UF_ATTR_integer、UF_ATTR_real、UF_ATTR_null、UF_ATTR_time、UF_ATTR_reference。UF_ATTR_any表示所有属性类型。 表3-10 链表操作函数 | | UF_ATTR_ask_part_attribute() | | | | UF_ATTR_ask_part_attrs_in_file() | 用于从磁盘文件中抽取部件的属性对象的属性,而不用把该部件加载到UG中 | | | UF_ATTR_count_attributes() | | | 遍历对象某一类型的所有属性项,返回下一个属性标题及属性值 | | | | | | | | |
任何确定存在的UG对象都具有唯一的标识,这里对象是指UG的part、object、Feature、Expression等。 - O) ?! x0 C( A" U5 Y% \, d
|