UGOPENAPI.docx
- 文档编号:15217129
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:26
- 大小:26.64KB
UGOPENAPI.docx
《UGOPENAPI.docx》由会员分享,可在线阅读,更多相关《UGOPENAPI.docx(26页珍藏版)》请在冰点文库上搜索。
UGOPENAPI
UG/OpenAPI基础知识
●UG/OpenAPI介绍
●UF程序的基本概念
●UF的对象模型与常用函数
●编写UF程序的基础知识
●UF工程的编译链接
●UIStyler
●UF程序示例
UG/OpenAPI介绍
UG/OpenAPI的概念
UG/OpenAPI(UG开放应用程序接口),也称作UserFunction(用户函数)。
它是UG/Open二次开发软件包的一个重要组成部分。
其核心包括了约2000个C函数,分别用来实现大部分的UG操作。
通过调用这些C函数,用户自编的程序能查询并修改UG对象模型,处理使用者和UG界面的交互,控制UG的行为等。
另外,工作站版的UG/OpenAPI工具中还包含了工作站平台开发所需的编译和链接工具。
在以下的段落中,UG/OpenAPI均简写为UF。
UF的常用功能
能实现用户和UG对象模型(UnigraphicsObjectModel)之间的交互
能创建和编辑用户自定义对象(UDO)
处理各种UG对象之间的联系,并为它们的显示和更新提供了完整的手段
借助UG菜单脚本(UG/OpenMenuScript)和用户接口设计师(UIStyler),UF能让第三方开发者定制UG的用户界面,把用户开发的程序集成入UG的菜单和对话框之中UF能让用户程序自行构造Part文件,查询UG对象的参数,创建装配图或平面图等
微机版UF开发包的组成
UF作为UG/OpenKit的一部分提供,安装在UG主目录的UGOpen子目录下
UF的头文件(UF_*.h)
静态库文件(ug*.lib)
大量的UF示例程序(*.c)
UF程序的基本概念
外部UF和内部UF
UF程序的源代码并不能被UG直接执行,和C程序一样必须通过编译形成动态链接库或可执行文件后才能发挥作用。
针对程序运行的环境不同,UF程序又分为外部UF和内部UF两种形式。
所有的UF函数都可用于内部UF方式,但不一定能用于外部UF方式。
如许多对屏幕显示特性操作的UF函数就只能用在内部UF方式下,在脱离UGGateway的外部UF方式下运行时就会出错。
区别UF函数适用的方式可以参考UG/OpenAPIReference,其中对每个函数都有Internal和External的指明。
外部UF
外部UF程序是可执行程序(*.dll)
特点:
运行时只要有Licence的支持,就可以由操作系统直接执行,不须启动UGGateway
优点:
在UGGateway之外运行,适用环境广泛
缺点:
不能和UGGateway发生联系,因而不能利用UG的显示窗口动态反馈操作结果
适用范围:
多用于Part数据的创建、存取和管理或控制出图,而不是交互性的几何形体的修改。
内部UF
内部UF是以动态链接库的形式创建并编译的。
特点:
结合UGGateway运行
形式:
UserExit\ufusr\ufsta
优点:
采用动态链接库的形式,内部UF的代码长度很短,能处理UG的UI对象接口,实现和UG的界面的无缝集成并扩充UG的特定功能等。
内部UF执行时每个步骤都能从UG的客户窗口中得到动态反映,因此它能方便地通过UI对象实现与用户的交互,屏幕选取等的复杂操作。
UF程序的执行方法
外部UF:
外部UF程序可以看作普通的可执行文件在操作系统中执行。
内部UF:
File->ExecuteUG/Open->UserFunction下运行
在UG启动时自动执行
在UG运行到某UserExit时自动运行
UserExit
UserExit是UF中的一个重要概念。
定义:
UG运行中的某些特定的地点存在特定的入口,执行到这些特定入口时UG就会检查是否在此已定义了指向内部UF程序位置的环境,若有则让指向的程序映象从此进入并运行。
这个过程叫做UserExit。
功能:
利用不同的UserExit能让用户自己的内部UF程序在UG运行到特定点时被自动执行.举例:
ufsta\ufcre\ufusr
1
UF函数命名法
标准命名法:
UF_模块名_实现的功能
说明:
不同级的字串间用“_”分开
示例:
UF_PART_new()
UF_ASSEM_ask_work_part()
固定命名法:
ucXXX
说明:
为与老版本的UG程序兼容而保留
示例:
uc6411()
uc6490()
1
UF的数据结构标识
UF中大量运用了C的结构、枚举、指针和预定义常数。
这些特定的数据结构都在头文件中有定义,用户可以使用它们来声明自己的变量。
由于这样的结构很多,应用时不易区分,UF从后缀上对它们的类型进行了明确的标识:
_t原始数据结构类型
_p_t指向该数据结构的指针类型
_s结构类型
_u_t联合类型
_u_p_t指向联合的指针
_f_t指向函数的指针
1
幻灯片14
TAG
简介:
对象标识,是UF中使用最多的数据类型
定义:
typedefunsignedinttag_t,*tag_p_t;
作用:
建立了UF和UG对象模型间的桥梁,可以把它看作是任何确实存在的UG对象的唯一标识。
大部分的UF函数都需要操作对象的标识即tag_t型参数,或指向对象tag_t的指针tag_p_t作为输入。
1
幻灯片15
UF的参数类型
UF使用手册中对函数参数的输入输出意义用‘I’或‘O’指出
‘I’表示输入值
‘O’表示输出值
‘I/O’表示输入的同时又做输出
‘F‘需要用户在适当的时候手工释放内存。
UF_free
UF_free_string_array
1
幻灯片16
UF的对象模型与常用函数
1
幻灯片17
TAG
所有的UG对象都是通过Tag被标识和被访问的,因此Tag也被称为对象标识符。
Tag物理上是无符号的整型量,每个UG对象在创建时或从文件读入内存时自动地获得一个Tag,每个Tag都唯一地标识着一个UG对象,直至对象从内存中消亡。
UF中保留了一个特殊的Tag——NULL_TAG表示暂时不标识任何对象的Tag。
在不同的UG会话中同一对象的Tag值是不同的,哪怕对象的Part在关闭后马上载入,对象的Tag也会发生变化,但是同固定Tag相连的对象却是恒定的。
Tag所标识的对象可分为三类:
UFObjects,Expressions,Parts。
1
幻灯片18
UFObjects的共有属性
UFObjects指的是在uf_object_types.h中定义的各种对象,它包含了UG中的所有基本实体。
同作为Object,它们有许多共有的属性,如类型,子类型,状态等。
下面逐一介绍:
1
幻灯片19
--TYPE&SUBTYPE
type:
类型
实体对象的type都在uf_object_types.h中定义,如圆、多义线、B-曲面、尺寸标注等,限定了对象大致可具有的属性。
subtype:
子类型
也在uf_object_types.h中定义,和对象的type一起具体限定了对象。
通过以下的函数可以获取对象的类型:
UF_OBJ_ask_type_and_subtype
1
幻灯片20
--status
对象的status标志对象的状态,它可以用以下的函数来查询:
UF_OBJ_ask_status
对象可以有以下几种状态:
UF_OBJ_DELETED
UF_OBJ_TEMPORARY
UF_OBJ_CONDEMNED
UF_OBJ_ALIVE
1
幻灯片21
UFObjects的共有方法
UFObjects指的是在uf_object_types.h中定义的各种对象,它包含了UG中的所有基本实体。
这些对象各自有着一定的数据结构,也允许对它们进行一定的操作。
同作为Object,它们有一些共有的操作方法。
下面逐一介绍:
1
幻灯片22
--naming
naming:
关于对象名操作的函数
UF_OBJ_ask_name
UF_OBJ_set_name
UF_OBJ_delete_name
1
幻灯片23
--cycling
cycling:
在Part中对象查询操作的函数
UF_OBJ_cycle_by_name
UF_OBJ_cycle_objs_in_part
UF_OBJ_cycle_all
上述的三个函数在调用时只从输入的Object开始,查找到下一个符合要求的Object并将ObjectTag输出
查询函数往往和循环语句联合使用,循环前用NULL_TAG作为ObjectTag的输入初值,直到输出的ObjectTag再次为NULL_TAG。
UF_OBJ_cycle_objs_in_part是最有效率的。
1
幻灯片24
--assign&accessattrs
assigningandaccessingattributes:
指定或获取属性的函数
不同对象可以自由地具有不同的属性,每个属性由属性名和属性值组成。
根据属性值的类型这些属性共分六大类,整型、浮点型、无类型、字符串型、日期型和引用型。
创建和编辑这些属性的函数参见UF_ATTR.H
1
幻灯片25
DisplayableUFObjects
DisplayableUFObjects特指那些能显示在屏幕上的UF对象,由于它们的显示特性使得它们具有很多特点,如有层的归属,有颜色,有线型和字体,有高亮和隐藏方式等.
显示属性可用如下的函数查询:
UF_OBJ_ask_display_properties
显示属性的设置可采用以下的函数实现:
UF_OBJ_set_layer
UF_OBJ_set_color
UF_OBJ_set_blank_status
UF_DISP_set_highlight
幻灯片26
UFObjectsInAssembly
装配图是一类特殊的Part,它本身由多个Part所组成。
装配图中的各个子图称为组件,组件本身也可以是装配图。
装配图中并不包含子图,而是子图的再现。
子图的所有再现都来自子图的原形,子图的每个再现都叫做子图的实例。
专有名词:
Occurrences:
子图的再现
Prototype:
子图的原形
Instance:
子图的实例
幻灯片27
Assembly常用函数
在复杂的装配图中,处理各个Part之间的装配关系和同一Part的原形、实例、再现的关系是很重要的。
这将用到以下的函数:
UF_ASSEM_ask_child_of_instance
UF_ASSEM_ask_parent_of_instance
UF_ASSEM_ask_part_occurrence
UF_ASSEM_ask_prototype_of_occ
UF_ASSEM_ask_inst_of_part_occ
1
幻灯片28
Expression简介
表达式是UG中特为实现参数化而引入的机制,UF所操作的表达式与在UG信息窗口中看见的表达式一致。
表达式用来控制对象的参数化尺寸,修改对象的参数其实就是修改控制参数的表达式。
与对象参数直接关联的表达式是在参数化对象创建时创建的,手工建立的表达式并不直接表示参数尺寸。
UG中一个表达式甚至可以控制多个参数化的对象,当这个表达式更动时,它所控制的所有对象也被更新。
并非所有的零件参数都能借助表达式来访问,如曲线的参数、拉伸体的参数、自由建模生成的实体等,它们也具有参数。
但说的确切一些,它们的参数其实是它们特定的属性。
下文中所提到的参数均指和表达式相关的参数。
1
幻灯片29
Expression结构
UF表达式的结构由左值,等号和右值组成。
左值表示的是表达式的名称,可以看作是具有值的变量名;右值则是一个有确定值的通常意义的表达式,其中还能包含逻辑表达式,示例如下:
Length=0.5+2*cos(angle)
position=if(width<=2)(0.5*width)else
(2)
表达式的左值前可以添上Part文件名,以唯一地在UG会话中表示某表达式,文件名和传统左值间用':
:
'连接,这种方法将在以后的算例中广泛使用,如:
sample:
:
position=15+subsample:
:
x
1
幻灯片30
Expression常用函数
●对表达式的操作也有许多常用的函数
●UF_MODL_dissect_exp_string
●UF_MODL_ask_exp
●UF_MODL_eval_exp
●UF_MODL_edit_exp
●UF_MODL_rename_exp
1
幻灯片31
Part简介
Part也是对象,一旦Part被新建或打开,也会动态地分得一个Tag。
不管这个Part有多少打开的实例,PartTag都唯一地标识这个Part文件。
Part储存了其余UF对象的全部信息,在装配环境中Part之间的关系不亚于UGObjects的复杂程度。
1
幻灯片32
Part常用函数
●Part的函数见
●下面列出常见的函数:
●UF_PART_new
●UF_PART_open
●UF_PART_save
●UF_PART_close
●UF_PART_ask_display_part
●UF_PART_set_display_part
●UF_ASSEM_ask_work_part
●UF_ASSEM_set_work_part
1
幻灯片33
编写UF程序的基础知识
1
幻灯片34
内部UF程序的基本结构
内部UF按结构特点可以分为两类,一类是不与任何UI对象关联的简单UF,另一类是与UIDialog关联的复合UF。
1
幻灯片35
简单UF
●简单UF所完成的是一个面向过程的程序处理任务,近似于一般的C程序,它有唯一的运行起止点,所有程序代码在起止点间顺序运行。
●简单的内部UF不借助UI对象与用户交互,常常用于机械地创建UF实体,查询并处理Part数据。
1
幻灯片36
简单UF的框架
●假定此UF从菜单方式下执行,使用ufusr的UserExit
●/*头文件包含段与UF_CALL宏声明*/
●staticvoiddo_ugopen_api(void)
●{/*可以把do_ugopen_api()看作main()函数*/
●/*变量声明、初始化*/
●/*可以自由调用UF的主程序段*/
●}
●voidufusr(char*param,int*retcode,intparam_len)
●{/*选择ufusr()作UserExit*/
●if(!
UF_CALL(UF_initialize()))
●{/*内部UF的初始化,获取运行License*/
●do_ugopen_api();/*程序的主体其实包含在do_ugopen_api()中*/
●UF_CALL(UF_terminate());/*终止内部UF并释放License*/
●}
●}
●intufusr_ask_unload(void)/*设置UF程序运行后立刻从内存中卸除*/
●{return(UF_UNLOAD_IMMEDIATELY);}
1
幻灯片37
复合UF
●复合UF程序并没有明显的执行过程,整个程序除回调函数的注册过程外,都是纯粹事件驱动的。
具体地说在ufsta()的UserExit过程中,内部UF程序仅调用了UF_MB_add_styler_actions()函数完成回调函数的注册。
至于各个回调函数体等到用户与相应的UI对象发生交互时才被执行
●复合UF程序的框架可以借助UIStyler在保存对话框时自动生成的C程序模板编辑而成
1
幻灯片38
复合UF的框架
/*头文件包含段与UF_CALL宏定义*/
/*各UI对话框中包含的控件数定义*/
/*对话框级全局变量声明与初始化*/
/*初始化各UI对话框回调函数信息结构数组*/
/*由回调函数信息结构组成的回调行为结构*/
externvoidufsta(char*param,int*retcode,intrlen)
{interror_code;
if((UF_initialize())!
=0)return;/*内部UF初始化*/
if((error_code=UF_MB_add_styler_actions(actions))!
=0)
{/*按全局回调行为结构向UG注册与对话框关联的全部回调函数*/
charfail_message[133];
UF_get_fail_message(error_code,fail_message);
printf("%s\n",fail_message);
}
UF_terminate();
return;
}
/*用户自定义函数实现段*/
/*回调函数实现段,包括UIStyler自动生成的回调函数框架,由用户自行完善。
*/
/*不同回调,响应不同的UI事件。
*/
1
幻灯片39
UF程序的输出
●UF程序运行时常用的输出数据的途径共有两种,一种使用标准的C输出函数,另一种是使用UF_UI_write_listing_window()。
两种途径的输出方向不同,前者向标准输出设备输出,后者向UG信息窗口输出。
●标准C函数输出如printf(),用在内部UF时,所有的信息都输出到启动UG时的命令行控制台上。
●在内部UF方式下也可以使用UF函数,直接向UG信息窗口输出信息:
●UF_UI_write_listing_window
●UF_UI_open_listing_window
●UF_UI_close_listing_window
●运行在外部UF中的这两种输出方式均把信息输出到启动外部UF程序的控制台上。
●在V16及以后的微机版UG中,控制台已失去了作用,因此只能使用ListingWindow.
1
幻灯片40
UF程序的Debug方法
●外部UF程序的输入输出行为完全遵循一般Windows程序的规则,而内部UF程序则有不同。
在内部UF程序中可以使用printf()函数向控制台输出数据。
输出的数据不影响UG图形界面的运行,用这种方法输出内部UF的调试信息是很方便的。
●直接在某个集成环境下调试以动态链接库的方式通过UG的UserExit运行的内部UF程序太过繁复,所以在UF程序中利用控制台输出调试信息也是调试内部UF的主要手段。
●标准命名的所有UF函数都是过程型的,它们基本都把程序运行时的出错代号作为返回值,非零的返回值则对应一条出错信息。
UF中专门提供了函数用来从出错代号获取相应出错信息,如:
UF_get_fail_message。
1
幻灯片41
捕捉错误信息函数实例
staticintreport(char*file,intline,char*call,intirc)
{
if(irc)
{
charmessg[133];
printf("%s,line%d:
%s\n",file,line,call);
(UF_get_fail_message(irc,messg))?
printf("returneda%d\n",irc):
printf("returnederror%d:
%s\n",irc,messg);
}
return(irc);
}
1
幻灯片42
report函数使用
●在程序开头,创建如下的基于report函数的宏:
●#defineUF_CALL(X)(report(__FILE__,__LINE__,#X,(X)))
●只要把原UF函数原封不动地作为UF_CALL宏的参数,UF出错时就能自动实现错误捕捉\错误信息的转换\输出.如:
●UF_CALL(UF_ASSEM_set_work_part(Part_Tag));
●UF_CALL(UF_STYLER_ask_value(dialog_ID,&Data));
●内部UF程序一旦出错,轻者引发UG警告终止当前程序,重者直接使UG挂起,因此依靠UG系统的警告并不能完全指出程序的错误。
而外部UF运行时出错则直接回到操作系统控制下,系统给出的警告信息就更笼统了。
考虑到这一点,调用所有含参数的内部UF时,都应该使用UF_CALL。
只是对于无输入参数的UF函数或返回值不是整型的UF函数使用UF_CALL会使宏代换出错,如:
●UF_CALL(UF_PART_save_())/*错误*/
●使用UF_CALL宏只是为调试除错服务的,正式程序中应该把它去掉,以获得更好的运行性能。
1
幻灯片43
licence
●所有的UF程序在运行时都需要UG/OpenAPILicence的支持。
因此程序必须正确地初始以获得一个UG/OpenAPILicence,在终止时也要归还曾占用的Licence供下次使用。
初始和终止的操作使用以下的函数完成:
●intUF_initialize()/*UF初始化*/
●intUF_terminate()/*UF终止*/
●UF_initialize()函数的调用应该紧跟程序中的变量声明部分,而UF_terminate()则应在程序最后才调用。
对于外部UF和内部UF都是如此。
1
幻灯片44
UF工程的编译链接
1
幻灯片45
外部/内部UF的编译运行条件
●外部UF和内部UF的应用条件有所不同,而它们在编写时的程序结构和编译的步骤也不同。
大部分的UF函数应用在外部UF程序中时其书写格式和应用在内部UF程序时是一样的。
●外部UF程序基于普通的Windows应用程序,并在应用程序中调用了UF函数,因此在编写程序时只要将UF的各头文件和uguser.lib库包含进工程,就可以在应用程序中调用UF了,外部UF在运行时需要uguser.dll位于系统路径下。
内部UF程序书写格式可以参考UgOpen目录下的示例程序,除了包含头文件和库外,在编译时还要指明按多线程动态链接库编译,而且动态链接库的入口点必须是UF的某个UserExit的名字,实际应用中对从RunAPIProgram菜单中手动运行的内部UF以ufusr()作入口点,对随UG启动时自动运行的内部UF以ufsta()作入口点。
1
幻灯片46
在NT平台上编译链接UF程序
UF源程序必须经过编译链接才能运行。
在工作站上可以在UFMENU工具下完成编译和连接工作,在基于微机的NT平台上就必须手工编译。
不过基于微机的NT平台远比工作站来得普及,在NT下的集成开发环境下编制并建立程序也比工作站上更简易。
1
幻灯片47
UF工程的设定
●头文件与库文件路径设定:
●在Tools->Options->Direct
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UGOPENAPI