UG_OPEN_API
UGOPENAPI教程

UGOPENAPI教程UG/OPEN API简明教程User Functions培训简明教程第一章绪论1 User Function是什么定义:在UG中用C语言开发应用程序的一个工具 2 User Function 的两种形式External λ菜单λ(执行程序)Internal (动态连接库)3 User Function的组成与相互关系User Function可以分为以下几个部分:C语言库函数(1) 创建与查询几何实体(2) 分析几何实体(3) 创建与编辑特征(4) 创建与编辑表达式(5)λ应用程序(回调函数)λ对话框数据管理这几部分的关系可以作如下的描述:User Functions的菜单和对话框是程序与用户交互的工具,从菜单可以起动应用程序,对话框等,在对话框激活控件时,将调用相应的回调函数,回调函数和控件的关系在UIStyler 中定义。
应用程序和回调函数用基本的C语言和User Functions的库函数编码。
4 User Functions的执行User User Functions?Execute UG/OPEN?Functions的执行包括四种形式:(1) File 选取该菜单将出现一个文件打开对话框,选取相应用应用程序即可。
(2) Menu ACTION (3) UIStyler 回调函数(2)和(3)将在后面的章节中作详细描述(4) 将应用程序COPY到UGII_USER_DIR\startup子目录下,应用程序将在UG启动时自动运行。
5 User Functions的开发步骤有关软件工程方面的内容,不是我们要介绍的内容,要讲的是User Functions有关的开发步骤。
在下面讲述的内容是以NT下的Visual C++ 5.0和UG15.0为支持环境。
具体的开发步骤如。
(1) 建立C源程序Win32?project?New ?(2) 在Visual C++中建立一个project (a).Create new project Filesetting?Dynamic-Link Library 此时还要输入project的名称。
VC++的UG二次开发技术

基于VC++的UG二次开发技术胡道钟(东风汽车模具厂)摘要本文叙述了如何在以Windows NT 4.0为操作系统的微机工作站上进行基于VC++6 0的UG(V14.0)二次开发,并对UG的开发模块和UG/Open API的编程方法作了介绍。
关键词 VC++UG UG/Open API 二次开发编程1 概述UG是一个功能强大的通用3D机械CAD/CAM软件系统,用户若要以它为平台进行二次开发,实现大型的机械设计系统(如模具智能化专家系统CAD软件),就必须利用UG的开发模块,借助C/C++,在以UNIX为操作系统的工作站上或以Windows为操作系统的微机工作站上编写C程序,进而生成可执行文件。
本文的目的就在于叙述如何在以Windows NT 4 0为操作系统的微机工作站上进行基于VC++6 0的UG(V14 0)二次开发,并对UG的开发模块和UG/Open API的编程方法作了介绍。
1.1 UG/Open它通过一个开放的平台包含一系列的基于UG的应用软件的柔性集成。
其目的是为了计算机集成应用,支持第三方和UG的应用,使基于不同的计算机平台从不同的场所(不同的网络)实现数据共享,甚至通过Internet访问它的内容。
它在注重于集成化和本地化的软件应用的同时,还致力建立一个能供各方利用的开放体系机构。
UG/Open提供了一种使顾客能够完成下列工作的应用软件和工具:(1)通过UG/Open API 或UG/Open GRIP 提供了与UG对象模型(UG Object Model)的接口;(2)生成和管理用户自定义对象(User Defined Objects或Custom Objects),包括管理它们与U对象的相关性,提供一种刷新和显示用户自定义对象的方法;(3)提供反映第三方应用软件的UG图形界面本地化方法;(4)利用相关产品如 IMAN ITK和Parasolid;(5)利用和集成新的UG/Open技术并使之成为应用可能。
UG API-2

Displayable UF Objects
Displayable UF Objects特指那些能显示在屏幕上的UF 对象,由于它们的显示特性使得它们具有很多特点, 如有层的归属,有颜色,有线型和字体,有高亮和隐 藏方式等. 显示属性可用如下的函数查询: UF_OBJ_ask_display_properties 显示属性的设置可采用以下的函数实现: UF_OBJ_set_layer UF_OBJ_set_color UF_OBJ_set_blank_status UF_DISP_set_highlight
UF Objects的共有属性
UF Objects指的是在uf_object_types.h中定义的各种对 象,它包含了UG中的所有基本实体。同作为Object,它 们有许多共有的属性,如类型,子类型,状态等。下面 逐一介绍:
TYPE & SUBTYPE
type: 类型 实体对象的type都在uf_object_types.h中定义,如圆、 多义线、B-曲面、尺寸标注等,限定了对象大致可具 有的属性。 subtype: 子类型 也在uf_object_types.h中定义,和对象的type一起具 体限定了对象。 通过以下的函数可以获取对象的类型: UF_OBJ_ask_type_and_subtype
11.1 ODBC注册
编程注册 OBBC数据源管理器
编程注册
OBBC数据源管理器
OBBC数据读取
#include <afxdb.h> CDatabase *m_pdatabase; CRecordset *m_pset; CRecordset m_pset1; m_pdatabase=new CDatabase; m_pdatabase->Open(_T("gear"),FALSE,FALSE,_T("ODBC;DSN=gear"),FALSE); m_pset=new CRecordset(); m_pset->m_pDatabase=m_pdatabase; m_pset->Open(CRecordset::dynaset,strSQL); m_pset->MoveFirst(); int nFieldCount=m_pset->GetODBCFieldCount(); CODBCFieldInfo fieldinfo; for(int n=0;n<nFieldCount;n++) m_pset->GetODBCFieldInfo(n,fieldinfo); m_pset->MoveFirst(); int nCount=0; while(!m_pset->IsEOF()){ ctrlList.InsertItem(nCount,strValue); for(int j=0;j<nFieldCount;j++){ m_pset->GetFieldValue(j,strValue); } m_pset->MoveNext(); nCount++; }
UG-NX二次开发基础-OpenAPI

22.1.1 概述
作为 UG NX 5.0 与外部应用程序之间的接口,UG/Open API 是一系列函数的集合。通过 UG/ Open API 的编程,用户几乎能够实现所有的 UG NX 5.0 功能。开发者可以通过用 C++语言编程来调 用这些函数,从而实现用户的需求。
(1)对 UG part 文件及相应模型进行操作,包括建立 UG NX 5.0 模型、查询模型对象、建立并 遍历装配体及创建工程图等。
22
CHAPTER
UG NX 5.0 二次开发基础
内容提要 ➢ UG/Open API 基础概念和语法知识 ➢ UG/Open API 常用对话框及其应用 ➢ 提示消息的发布与获取 Open/API(用户函数)是一个程序集合,使得程序员能够访问和操作 NX 对象模型。除此之外, Open/API 还提供了工具用来编辑和连接与 UG NX 5.0 风格一致的程序。UG/Open 二次开发模块是 UG NX 5.0 软件的二次开发工具集,可用于各种二次开发工作。利用该模块可对 UG NX 5.0 系统进 行用户化剪裁和开发,满足用户的开发需求。使用 UG NX 5.0 的二次开发时,用户需要具有一定的 C 语言基础。 UG/Open 包括以下几个部分。 (1)UG/Open API 开发工具:提供 UG NX 5.0 软件直接编程接口,支持 C、C++、Fortran 和 Java 等主要高级语言。 (2)UG/Open UIStyle 开发工具:是一个可视化编辑器,用于创建类似于 UG NX 5.0 的交互界面。 利用该工具,用户可为 UG/Open 应用程序开发独立于硬件平台的交互界面。 (3)UG/Open Menuscript 开发工具:对 UG NX 5.0 软件操作界面进行用户化开发,使得用户无 须编程即可对 UG NX 5.0 标准菜单进行添加、重组、剪裁或在 UG NX 5.0 中集成自己开发的软件功 能。 (4)UG/Open GRIP 开发工具:是一个类似于 APT 的 UG NX 5.0 内部开发语言,用户可利用该 工具生成 NC 自动化或自动建模等特殊应用。
UG_OPEN_API

U G/O p e n A P I基础知识●U G/O p e n A P I介绍●U F程序的基本概念●U F的对象模型与常用函数●编写U F程序的基础知识●U F工程的编译链接●U I S t y l e r●U F程序示例U G/O p e n A P I介绍U G/O p e n A P I的概念U G/O p e n A P I(U G开放应用程序接口),也称作U s e r F u n c t i o n(用户函数)。
它是U G/O p e n二次开发软件包的一个重要组成部分。
其核心包括了约2000个C 函数,分别用来实现大部分的U G操作。
通过调用这些C函数,用户自编的程序能查询并修改U G对象模型,处理使用者和U G界面的交互,控制U G的行为等。
另外,工作站版的U G/O p e n A P I工具中还包含了工作站平台开发所需的编译和链接工具。
在以下的段落中,U G/O p e n A P I均简写为U F。
U F的常用功能能实现用户和U G对象模型(U n i g r a p h i c s O b j e c t M o d e l)之间的交互能创建和编辑用户自定义对象(U D O)处理各种U G对象之间的联系,并为它们的显示和更新提供了完整的手段借助U G菜单脚本(U G/O p e n M e n u S c r i p t)和用户接口设计师(U I S t y l e r),U F能让第三方开发者定制U G的用户界面,把用户开发的程序集成入U G的菜单和对话框之中U F能让用户程序自行构造P a r t文件,查询U G对象的参数,创建装配图或平面图等微机版U F开发包的组成U F作为U G/O p e n K i t的一部分提供,安装在U G主目录的U G O p e n子目录下U F的头文件(U F_*.h)静态库文件(u g*.l i b)大量的U F示例程序(*.c)U F程序的基本概念外部U F和内部U FU F程序的源代码并不能被U G直接执行,和C程序一样必须通过编译形成动态链接库或可执行文件后才能发挥作用。
ug二次开发介绍

ug二次开发介绍————————————————————————————————作者:————————————————————————————————日期:UG二次开发功能简介Unigraphics(UG)是美国UGS公司的集CAD/CAM/CAE于一体的软件集成系统,功能覆盖整个产品的开发过程:从概念设计、功能工程、功能分析到制造,在航空航天、汽车、机械、模具和家用电器等工业领域的应用非常广泛。
UG软件提供了功能强大的二次开发(应用开发)模块,利用该模块可对UG系统进行用户化裁减和开发。
UG/Open是一系列UG开发工具的总称,主要由UG/Open API、UG/Open GRIP、UG/Open MenuScript和UG/Open UIStyler四部分组成。
UG/Open API (又称User Function ),是一个允许程序访问并改变UG对象模型的程序集。
UG/Open API 封装了近2000个UG操作的函数,它可以对UG的图形终端、文件管理系统和数据库进行操作,几乎所有能在UG界面上的操作都可以用UG/Open API 函数实现。
UG/Open API程序按其连接方式分为两种,内部模式(Internal环境) 和外部模式(External 环境)。
采用内部模式开发的程序只能在UG 的界面环境(Session)下运行,其优点是可以连接的更快且程序更小并能与用户交互;采用外部模式开发的程序能在操作系统中独立执行,其缺点是无法实时显示图形与用户交互,值得注意的是部分函数只能在内部模式下执行。
UG/Open API 程序使用的是C 或C + + 编程语言。
基于Windows操作系统的UG二次开发可以在VC + + 6.0或环境下进行,VC提供的各类库函数和丰富的编程资源进一步提升了UG/Open API的功能,同时也为集成企业原有的C/C++语言程序提供了方便。
UG/Open GRIP ( Graphics Interactive Programming) 是一种专用的图形交互编程语言,与UG系统集成,可以实现UG环境下的大多数应用操作。
UGOPEN API教程

UG/OPEN API简明教程User Functions培训简明教程第一章绪论1 User Function是什么定义:在UG中用C语言开发应用程序的一个工具 2 User Function的两种形式External λ菜单λ(执行程序)Internal (动态连接库)3 User Function的组成与相互关系User Function可以分为以下几个部分:C语言库函数(1) 创建与查询几何实体(2) 分析几何实体(3) 创建与编辑特征(4) 创建与编辑表达式(5)λ应用程序(回调函数)λ对话框数据管理这几部分的关系可以作如下的描述:User Functions的菜单和对话框是程序与用户交互的工具,从菜单可以起动应用程序,对话框等,在对话框激活控件时,将调用相应的回调函数,回调函数和控件的关系在UIStyler 中定义。
应用程序和回调函数用基本的C语言和User Functions的库函数编码。
4 User Functions的执行User User Functions◊Execute UG/OPEN◊Functions的执行包括四种形式:(1) File 选取该菜单将出现一个文件打开对话框,选取相应用应用程序即可。
(2) Menu ACTION (3) UIStyler 回调函数(2)和(3)将在后面的章节中作详细描述(4) 将应用程序COPY到UGII_USER_DIR\startup子目录下,应用程序将在UG启动时自动运行。
5 User Functions的开发步骤有关软件工程方面的内容,不是我们要介绍的内容,要讲的是User Functions有关的开发步骤。
在下面讲述的内容是以NT下的Visual C++ 5.0和UG15.0为支持环境。
具体的开发步骤如。
(1) 建立C源程序Win32◊project◊New ◊(2) 在Visual C++中建立一个project (a).Create new project Filesetting◊Dynamic-Link Library 此时还要输入project的名称。
UG-二次开发作业代码

UG 二次开发作业代码供参考学习。
第一题球体打孔#include <stdio.h>#include <uf.h>#include <uf_modl.h>#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))static int report( char *file, int line, char *call, int irc){if (irc){char messg[133];printf("%s, line %d: %s\n", file, line, call);(UF_get_fail_message(irc, messg)) ?printf(" returned a %d\n", irc) :printf(" returned error %d: %s\n", irc, messg);}return(irc);}static void do_ugopen_api(void){UF_FEATURE_SIGN sign=UF_NULLSIGN;tag_t targ_tag;double center[ 3 ]={0.0,0.0,0.0};char* diam="100";tag_t sphere_obj_id;UF_CALL(UF_MODL_create_sphere(sign,targ_tag,center,diam,&sphere_obj_id));UF_FEATURE_SIGN sign_cyl=UF_NEGATIVE;double origin1 [ 3 ]={0.0,0.0,-100};double origin2 [ 3 ]={0.0,-100,0.0};double origin3 [ 3 ]={-100,0.0,0.0};char* height="200";char* diam_cyl="30";double direction1 [ 3 ]={0.0,0.0,1.0};double direction2 [ 3 ]={0.0,1.0,0.0};double direction3 [ 3 ]={1.0,0.0,0.0};tag_t cyl1_tag;tag_t cyl2_tag;tag_t cyl3_tag;UF_CALL(UF_MODL_create_cyl1(sign_cyl,origin1,height,diam_cyl,direction1,&cyl1_tag));UF_CALL(UF_MODL_create_cyl1(sign_cyl,origin2,height,diam_cyl,direction2,&cyl2_tag));UF_CALL(UF_MODL_create_cyl1(sign_cyl,origin3,height,diam_cyl,direction3,&cyl3_tag)); }void ufusr(char *param, int *retcode, int paramLen) {if (!UF_CALL(UF_initialize())){do_ugopen_api();UF_CALL(UF_terminate());}}int ufusr_ask_unload(void){return (UF_UNLOAD_IMMEDIATEL Y);}第二题螺帽static void do_ugopen_api_ (void){int i;uf_list_p_t list;char * taper_angle="0" ;char * limit [ 2 ]={"0","10"};double point [ 3 ];double direction [ 3 ]={0.0,0.0,1.0};UF_FEATURE_SIGN sign=UF_NULLSIGN;uf_list_p_t features;UF_CURVE_line_t line1_coords;line1_coords.start_point[0]=15;line1_coords.start_point[1]=8.66;line1_coords.start_point[2]=0;line1_coords.end_point[0]=15;line1_coords.end_point[1]=-8.66;line1_coords.end_point[2]=0;UF_CURVE_line_t line2_coords;line2_coords.start_point[0]=15;line2_coords.start_point[1]=-8.66;line2_coords.start_point[2]=0;line2_coords.end_point[0]=0;line2_coords.end_point[1]=-17.32;line2_coords.end_point[2]=0;UF_CURVE_line_t line3_coords;line3_coords.start_point[0]=0;line3_coords.start_point[1]=-17.32;line3_coords.start_point[2]=0;line3_coords.end_point[0]=-15;line3_coords.end_point[1]=-8.66;line3_coords.end_point[2]=0;UF_CURVE_line_t line4_coords;line4_coords.start_point[0]=-15;line4_coords.start_point[1]=-8.66;line4_coords.start_point[2]=0;line4_coords.end_point[0]=-15;line4_coords.end_point[1]=8.66;line4_coords.end_point[2]=0;UF_CURVE_line_t line5_coords;line5_coords.start_point[0]=-15;line5_coords.start_point[1]=8.66;line5_coords.start_point[2]=0;line5_coords.end_point[0]=0;line5_coords.end_point[1]=17.32;line5_coords.end_point[2]=0;UF_CURVE_line_t line6_coords;line6_coords.start_point[0]=0;line6_coords.start_point[1]=17.32;line6_coords.start_point[2]=0;line6_coords.end_point[0]=15;line6_coords.end_point[1]=8.66;line6_coords.end_point[2]=0;tag_t line[6];UF_CALL(UF_CURVE_create_line(&line1_coords,&line[1]));UF_CALL(UF_CURVE_create_line(&line2_coords,&line[2]));UF_CALL(UF_CURVE_create_line(&line3_coords,&line[3]));UF_CALL(UF_CURVE_create_line(&line4_coords,&line[4]));UF_CALL(UF_CURVE_create_line(&line5_coords,&line[5]));UF_CALL(UF_CURVE_create_line(&line6_coords,&line[6]));UF_CALL(UF_MODL_create_list(&list));for (i=1;i<=6;i++){UF_CALL(UF_MODL_put_list_item(list,line[i]));}UF_CALL(UF_MODL_create_extruded(list,taper_angle,limit,point,direction,sign,&features));//UF_FEATURE_SIGN sign_cone=UF_UNSIGNED; //conedouble origin [ 3 ]={0,0,0};char * height={"10"};char * diam [ 2 ]={"60.64","30"};tag_t cone_obj_id ;UF_CALL(UF_MODL_create_cone1(sign_cone,origin,height,diam,direction,&cone_obj_id)); }第三题环形阵列static int report( char *file, int line, char *call, int irc){if (irc){char messg[133];printf("%s, line %d: %s\n", file, line, call);(UF_get_fail_message(irc, messg)) ?printf(" returned a %d\n", irc) :printf(" returned error %d: %s\n", irc, messg);}return(irc);}static void do_ugopen_api (void){UF_FEATURE_SIGN sign=UF_NULLSIGN;tag_t targ_tag;double origin [ 3 ]={0.0,0.0,0.0};char * height="10";char * diam="100";double direction [ 3 ]={0.0,0.0,1.0};tag_t cyl_tag ;UF_FEATURE_SIGN sign1=UF_NEGATIVE;double origin1 [ 3 ]={30,0,16};char * height1="10";char * diam1="10";double direction1 [ 3 ]={0.0,0.0,-1.0};tag_t cyl1_obj_id ;UF_FEATURE_SIGN sign2=UF_NEGATIVE;double origin2 [ 3 ]={30,0,2};char * height2="4";char * diam2 [ 2 ]={"6","10"};double direction2 [ 3 ]={0.0,0.0,1.0};tag_t cone_obj_id;const char * part_name="cover";int units=2;tag_t part;UF_CALL(UF_PART_new(part_name, units, &part));UF_CALL(UF_MODL_create_cylinder(sign,targ_tag,origin,height,diam,direction,&cyl_tag));UF_CALL(UF_MODL_create_cyl1(sign1,origin1,height1,diam1,direction1,&cyl1_obj_id));UF_CALL(UF_MODL_create_cone1(sign2,origin2,height2,diam2,direction2,&cone_obj_id));uf_list_p_t list ;tag_t obj_id ;UF_CALL(UF_MODL_create_list(&list));UF_CALL(UF_MODL_put_list_item(list,cyl1_obj_id));UF_CALL(UF_MODL_put_list_item(list,cone_obj_id));int method=0;double location [3]={0.0,0.0,0.0};double axis [ 3 ]={0.0,0.0,1.0};char * number_str="6";char * angle_str="60";tag_t feature_obj_id ;UF_CALL(UF_MODL_create_circular_iset(method,location,axis,number_str,angle_str,list,&feature_obj_i d));UF_CALL(UF_MODL_delete_list(&list));UF_CALL(UF_PART_save());}第四题(此题键槽可用块和圆柱体实现,下面的代码是用直线拉上实现的键槽长方体部分)static void do_ugopen_api_(void){int i;uf_list_p_t list;char * taper_angle="0" ;char * limit [ 2 ]={"-10","30"};double point [ 3 ];double direction [ 3 ]={0.0,0.0,1.0};UF_FEATURE_SIGN sign=UF_NEGA TIVE;uf_list_p_t features;UF_FEATURE_SIGN block_sign=UF_NULLSIGN;double corner_pt [ 3 ]={0.0,0.0,0.0};char * edge_len [ 3 ] ={"100","80","30"} ;tag_t blk__obj_id ;double pt1 [ 3 ]={25,60,30};double pt2 [ 3 ]={75,60,30};double pt3 [ 3 ]={75,40,30};double pt4 [ 3 ]={25,40,30};UF_CURVE_line_t line1_coords, line2_coords,line3_coords,line4_coords;tag_t line[4];UF_FEATURE_SIGN sign1=UF_POSITIVE ,sign2=UF_NEGATIVE;double origin1 [ 3 ] ={0.0,25.0,0};double origin2 [ 3 ]={100,25,0};double origin3 [ 3 ]={0,25,30};double origin4 [ 3 ]={100,25,30};double origin5 [3]={25,50,20};double origin6 [3]={75,50,20};char * height1="30";char * height2="10";char * height3="40";char * height4="10";char * diam1="80";char * diam2="30";char * diam3="20";char * diam4="20";tag_tcyl1_obj_id ,cyl2_obj_id,cyl3_obj_id ,cyl4_obj_id,cyl5_obj_id ,cyl6_obj_id,cyl7_obj_id ,cyl8_obj_id;line1_coords.start_point[0]=pt1[0];line1_coords.start_point[1]=pt1[1];line1_coords.start_point[2]=pt1[2];line2_coords.start_point[0]=pt3[0];line2_coords.start_point[1]=pt3[1];line2_coords.start_point[2]=pt3[2];line3_coords.start_point[0]=pt1[0];line3_coords.start_point[1]=pt1[1];line3_coords.start_point[2]=pt1[2];line4_coords.start_point[0]=pt2[0];line4_coords.start_point[1]=pt2[1];line4_coords.start_point[2]=pt2[2];line1_coords.end_point[0]=pt2[0];line1_coords.end_point[1]=pt2[1];line1_coords.end_point[2]=pt2[2];line2_coords.end_point[0]=pt4[0];line2_coords.end_point[1]=pt4[1];line2_coords.end_point[2]=pt4[2];line3_coords.end_point[0]=pt4[0];line3_coords.end_point[1]=pt4[1];line3_coords.end_point[2]=pt4[2];line4_coords.end_point[0]=pt3[0];line4_coords.end_point[1]=pt3[1];line4_coords.end_point[2]=pt3[2];UF_CALL(UF_CURVE_create_line(&line1_coords,&line[0]));UF_CALL(UF_CURVE_create_line(&line2_coords,&line[1]));UF_CALL(UF_CURVE_create_line(&line3_coords,&line[2]));UF_CALL(UF_CURVE_create_line(&line4_coords,&line[3]));UF_CALL(UF_MODL_create_block1(block_sign,corner_pt,edge_len,&blk__obj_id));UF_CALL(UF_MODL_create_cyl1(sign1,origin1,height1,diam1,direction,&cyl1_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign1,origin2,height1,diam1,direction,&cyl2_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign1,origin3,height2,diam2,direction,&cyl3_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign1,origin4,height2,diam2,direction,&cyl4_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign2,origin1,height3,diam3,direction,&cyl5_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign2,origin2,height3,diam3,direction,&cyl6_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign2,origin5,height4,diam3,direction,&cyl5_obj_id)); UF_CALL(UF_MODL_create_cyl1(sign2,origin6,height4,diam3,direction,&cyl6_obj_id)); UF_CALL(UF_MODL_create_list(&list));for (i=0;i<4;i++){UF_CALL(UF_MODL_put_list_item(list,line[i]));}UF_CALL(UF_MODL_create_extruded(list,taper_angle,limit,point,direction,sign,&features)); }。