2UG二次开发应用框架.docx
- 文档编号:29911659
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:21
- 大小:404.99KB
2UG二次开发应用框架.docx
《2UG二次开发应用框架.docx》由会员分享,可在线阅读,更多相关《2UG二次开发应用框架.docx(21页珍藏版)》请在冰豆网上搜索。
2UG二次开发应用框架
第2章二次开发应用框架
2.1二次开发工程项目的创建
二次开发工程的创建常用有3种:
UG/OpenAppWizard、Win32应用程序向导和MFC应用程序向导。
UG应用开发程序采用了动态链接库(DLL,DynamicLinkLibrary)技术,使用上述任何一种应用向导开发程序,最终生成的结果都是DLL文件,提供UG进程加载。
UG内部应用程序开发规定以动态链接库方式对其进行功能扩展和应用开发。
动态链接库被映射到其他应用程序空间中执行,与链接它的应用程序可以看成是一体的。
在VisualS中将应用程序编译链接生成动态链接库文件(后缀名为.dll),UG启动时会自动加载动态链接库文件供用户调用,从而实现了应用开发程序与UG平台的无缝集成。
1、利用UG/OpenAppWizard向导
1.4节已经详细介绍了使用UG/OpenAPPwizard创建一个简单的FirstProject程序。
该向导是UG软件本身提供的应用向导,随着UG版本和开发环境的升级而升级。
该向导操作简便,运行稳定,可以快速构建开发体系,但通常不支持MFC类库,因此常常应用于辅助工具的开发。
2、利用Win32应用程序向导(DLL)
应用开发程序框架还可以采用Win32DLL向导创建。
Win32DLL向导创建Windows常规DLL,它只能导出C样式函数,不能导出C++类、成员函数和重载函数,同UG/OpenAppWizard向导创建工程项目一样不支持MFC。
利用Win32应用程序向导创建工程项目,包括两个步骤:
新建项目和设置项目属性。
步骤一:
新建项目
打开VisualStudio.NET,选择新建项目菜单项,将显示如图2-5所示的新建项目对话框。
在项目类型框中选择VisualC++项目下的Win32选项,在模板框中选择Win32项目选项,在名称框中输入项目名称,在位置框中设置合适的路径,单击确定按钮接受输入。
图2-5新建项目对话框
这时将显示如图2-6所示的Win32应用程序向导-UFSolution对话框,选择应用程序设置属性页,在其中选择Dll,直接单击完成按钮建立新项目。
图2-6Win32应用程序向导-UFSolution对话框
新建的项目中将会有一些向导默认添加的文件,如图2-7所示。
图中列出了新建项目中已有的文件。
图2-7 解决方案资源管理器图
步骤二:
设置项目属性
选择项目菜单下的属性项,将显示如图2-8所示的UFSolution属性页。
图2-8 项目属性页-常规
在图2-8中要确认项目默认值框中配置类型为动态库(.dll),然后,选择调试选项,将显示图2-9。
在图2-9中,将操作框中的命令项设置为系统中的UG执行文件,即ugraf.exe,设置这一项的目的是为了便于程序的调试。
图2-9项目属性页-调试
接下来,选择C/C++项中的常规选项,将附加包含目录设置为$UGII_BASE_DIR\UGOPENPP;$UGII_BASE_DIR\UGOPEN,如图2-10所示。
设置这一项的目的是为了包含UF的一些头文件。
图2-10项目属性页-C/C++-常规
选择C/C++项中的代码生成选项,将运行库设置为多线程调试DLL(/MDd),如图2-11所示。
图2-11项目属性页-C/C++-代码生成
选择链接器项中的常规选项,设置输出文件,将附加库目录设置为$UGII_BASE_DIR\UGOPEN;$UGII_BASE_DIR\UGOPENPP,如图2-12所示。
图2-12项目属性页-链接器-常规
选择链接器项中的输入选项,设置附加依赖项为libufun.liblibugopenint.lib。
这两个文件是在进行UG二次开发时必需的库载入文件,如图2-13所示。
图2-13项目属性页-链接器-输入
设置好以上选项后,按应用按钮,将所设置的属性应用于项目。
(3)利用MFC应用程序向导(DLL)
UG应用程序项目也可以利用MFC应用程序向导(DLL)创建。
UG应用程序开发可以方便地调用MFC类库中的资源,丰富应用程序界面。
项目创建过程与Win32应用程序向导(DLL)项目创建过程基本相同。
同流行的windows应用程序开发工具相比,UG/Open提供的工具及对话框所包含的控件较少,功能有限,因此界面开发在一定程度上受到限制,有的功能甚至难以实现。
为了避免这个缺陷,可以采用MFC应用向导(MFCAppwizard)建立系统框架,在该框架下可以方便地调用MFC类库中的资源。
MFC(MicrosoftFoundationClass)类库是Windows下C++编程使用最广泛的类库。
MFC封装了WIN32API函数,并设计了一套方便的消息映射机制。
VisualC++及其MFC的界面灵活性和表达能力均优于UIstyler的功能。
有效灵活的MFC框架结构大大方便了开发者的编程工作,达到事半功倍的效果。
在UG开发中使用MFC库,一般调用的是MFC42.DLL库(MFC核心类库)。
由于不能保证用户机器都安装了MFC类库,所以在编译时应静态链接到MFC库,此时DLL文件包含所有需要的MFC代码的一份拷贝,即成为自包含的库。
与动态链接到MFC方式相比,静态方式创建的DLL文件占用了更多空间,但确保了DLL在不同目标机器上的正确运行。
当UG执行用户的开发程序时会把MFC42.DLL作为进程的一部分装入。
MFC42.DLL把数据存放在一些可靠的全局变量内。
由于在正规的MFCDLL中调用MFC42.DLL时,全局变量可能会不同步而导致编译出错,所以应在UserExit函数的开头插入宏语句:
AFX_MANAGE_STATE(AfxGetstaticModuleState());
2.2应用程序框架
2.2.1程序的组成
UG/OpenAPI应用程序一般包括菜单、对话框、应用程序(DLL)和UG/OpenAPI库函数四部分,其中菜单和对话框是程序与用户交互的工具,从菜单可以启动应用程序、对话框等,在对话框激活控件时,将调用相应的回调函数,应用程序(回调函数)用基本的C/C++语言和的库函数编码。
菜单:
UG/Open提供了菜单开发工具MenuScript,它提供用户创建并编辑UG的下拉菜单及工具条。
菜单文件扩展名为.men,工具条文件扩展名为.tbr,这两类文件放在应用程序目录的startup子目录中。
对话框:
UG/OpenUIStyler模块提供了强大的制作UG风格窗口的功能。
对话框文件扩展名为.dlg,这类文件放在程序目录的application子目录中。
应用程序(回调函数):
C/C++语言程序,在C/C++集成开发环境中创建、编译连接并运行,生成.dll文件,放在程序目录的startup或udo子目录中。
UG/OpenAPI库函数:
默认存放在“$UGII_BASE_DIR\ugopen”目录中。
在创建应用程序时需要配置。
应用程序开发流程如图2-14所示。
图2-14UG/OpenAPI应用程序开发流程
2.2.2工程目录结构
在用户设定的工程路径下需要建立UG系统规定的工程目录结构。
UG启动时会在规定目录中寻找并加载相应的程序和资源。
UG规定的目录有startup、application和Udo。
UG对它们存放的文件做了如下的规定:
(1)Startup目录存放UG启动时需加载的动态链接库文件(*.dll)、菜单脚本文件(*.men)和用户工具栏脚本文件(*.tbr)。
(2)Apphcation目录存放具体的功能扩展程序文件,如UIstyler对话框文件(*.dlg)、工具图标文件(*.bmp)和位图调色板文件(*.ubm)。
(3)Udo目录存放用户定义的数据和链接等。
考虑到项目开发的需要和文档的完整性,除了UG系统规定的目录外,还需要建立一些自定义目录(仅供参考)。
这些目录有Code、Configure和Document。
这些目录中存放的文件类型有如下规定:
(1)Code目录存放具体的程序代码,该目录在新建工程时创建。
(2)Configure目录存放开发中所必需的配置文件,如文本文件(*.txt)、自定义配置文件(*.cfg)和电子表格Excel文件(*.xls)等。
Configure目录的名称可以根据具体的编程需要由开发者选定,例如Excel、Temp等。
(3)Document目录存放用户的文档文件,如视频演示文件(*.avi)、安装使用说明书(*.doc)和软件开发说明书(*.doc)等。
图2-25所示给出了一个应用开发程序的目录结构,开发者可以根据实际情况做适当调整。
图2-14工程目录结构
2.3工程路径设置
工程路径是指安装在目标硬盘的用户工程的路径,工程路径设置的目的是让UG软件在启动运行时能找到应用程序的物理位置,自动加载应用程序。
例如,1.4节实例的工程路径是E:
\ucocs。
工程路径下至少存在UG规定的资源文件夹Startup和Application,用户可以将相关的资源文件放入这些文件夹中。
注册工程路径有两种方法:
配置文件法和环境变量法。
2.4.1配置文件法
在默认情况下,UG规定了配置文件custom_dirs.dat用于指明用户的工程路径,该文件位于路径“$UGII_BASE_DIR\ugii\menus\”。
当UG启动时,系统检查该文件中注册的工程路径并自动加载该路径下的所有资源,包括用户菜单、对话框和动态链接库等。
配置文件custom_dirs.dat的基本语法如下:
(1)文件中允许使用注释,注释是以注释符“#”开头的一行文字。
(2)每一行只能写一条工程路径,要确保路径的正确。
(3)custom_dirs.dat允许添加多个文件路径,UG在启动时将按照先后顺序依次载入。
1.4节的实例采用修改配置文件法注册工程路径,该方法操作简便,并且可以同时载入多个工程,因此得到广泛使用。
值得注意的是,在多工程载入的情况下,应避免工程间DLL文件重名的情况发生。
如果发生重名,系统会认为是重复注册现象,并且只载入注册靠前的工程而忽略其他的工程。
例如,custom_dirs.dat按照先后顺序注册了两个工程路径Path1和Path2,但它们的DLL文件名称相同。
此时无论激发哪个工程,都将执行路径Path1下的工程应用。
2.4.2修改环境变量法
UG环境配置文件ugii_env.dat中存在3个用于注册工程路径的环境变量,如表2-1所示。
去掉环境变量前的注释符“#",在等号后写入具体的工程路径,则在UG启动的同时会将这些环境变量所指定的工程路径中的资源按照优先级的顺序加载。
注册工程路径的环境变量
环境变量名
工程路径
优先级
UG_VENDOR_DIR
存放UG指定开发商应用开发产品的工程路径
最高
UG_SITE_DIR
存放其余开发商应用开发产品的工程路径
其次
UG_USER_DIR
存放用户自己应用开发产品的工程路径
最低
下面在1.4节的实例中使用修改环境变量法来注册工程路径。
(1)取消原有注册。
打开文件custom_dirs.dat,删除或注释掉工程路径E:
\ucocs(在路径前加上“#")并保存文件。
此时打开UG将找不到工程的菜单命令。
(2)修改ugii_env.dat中UG_SITE_DIR的值为“UG_SITE_DIR=E:
\ucocs”并保存文件。
注意,语句前不能有注释符“#”。
此时打开UG,将恢复FileNew工程的使用。
2.4UG/OpenAPI运行模式
利用UG/OpenAPI编写的程序源代码并不能被UG直接执行,它和C/C++程序一样必须通过编译形成动态链接库或可执行文件后才能发挥作用。
UG/OpenAPI程序可以在两种不同的环境下(内部和外部两种模式)运行,这取决于程序的连接方式。
2.4.1内部模式
内部模式(Internal开发模式)的程序只能在UG的界面环境下运行。
在运行内部程序时,它们以.dll(动态链接库)的方式被调到UG的进程空间中。
内部程序有下列特点:
执行代码小,连接快;内部程序一旦被加载到内存中,只能通过UG/OpenAPI的卸载功能才能从UG运行功能中卸载它;运行结果在UG的界面图形环境中可见;入口函数是ufusr或ufsta;最大的优点是能处理UG的UI的对象接口,实现和UG界面的无缝集成并能扩充UG的特定功能,而且它执行时每个步骤都能从UG的客户窗口得到动态反映,因此能方便的通过UI界面对象来实现与用户的交互、屏幕选取等复杂操作。
内部程序是以动态链接库的形式创建并编译的。
它必须启动UG/gateway才能运行。
内部模式的应用程序,可以通过下列几种方式执行:
●直接激活方式
该方式不用设置环境变量,程序编译连接后即可执行。
在UG环境中选择菜单:
File->Execute->NXOpen…,将出现一个文件打开对话框,选取相应应用程序(.dll)即可。
●用户菜单调用方式
使用该方式必须设置环境变量UG_USER_DIR,将环境变量UG_USER_DIR指向应用程序主目录,将应用程序(.dll)放置到主目录的$UGII_USER_DIR\application或$UGII_USER_DIR\startup子目录下。
●UIStyler回调函数方式
由UIStyler创建的对话框回调函数中激活应用程序(.dll)
●通过用户出口
根据用户出口不同,设置相应的环境变量,激活对应入口函数应用程序.dll。
内部程序的一般格式如下:
#include
voidufusr()
{
/*申明变量*/
UF_initiialize();
/*用户代码*/
UF_terminate();
}
2.4.2外部模式
外部模式下的程序可以在操作系统下运行,不必在UG环境中作为UG的子程序运行。
外部程序是可执行程序,运行时只要有UGLicense的支持,就可以由操作系统直接执行,不需要启动UG/Gateway。
它的优点是不必启动UG,属于后台执行,这样可以节约运行时间,其缺点在于它不能和UG/Gateway发生联系,因而不能利用UG的显示窗口动态反馈操作结果,同时也不能实现一些用户的交互操作和管理或控制出图,所以它一般用于part零件文件大量创建,而不适用于用户交互性的几何建模和修改、存取外部程序在操作系统平台的命令行直接执行即可。
外部程序的一般格式如下:
#include
intmain(intargc,char**argv)
{
/*申明变量*/
UF_initiialize();
/*用户代码*/
UF_terminate();
}
2.5程序的初始化及终止
所有UG/OpenAPI程序的使用,必须及时进行初始化和终止,以确保获取或释放UG/openAPI的执行许可权限。
在调用UG/OpenAPI的函数前,应先调用UF_initialize()来获得执行许可权限。
一般来说,第一个调用的UG/openAPI函数就是UF_initialize()。
当不再调用API函数的时候,必须调用UF_terminate()来释放执行许可权限。
UF_initialize()函数的调用应该紧跟程序中的变量声明部分,而intUF_terminate()则应在程序最后才被调用,对于外部UF和内部UF都是如此,这说明外部UF的运行虽然脱离UGGateway,但仍离不开API执行许可权限的支持。
实例
intDQXSJ_ok_cb(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data)
{
charstep_id[]="11";
charstep_status[]="1";
chardsn_name[]="dqxsj";
chartable_name[]="exp_know",table_name1[]="condition_data";
intflag;
if(UF_initialize()!
=0)
return(UF_UI_CB_CONTINUE_DIALOG);
UG_OPEN_dqxsj_accept_data(dialog_id,&flag);
if(flag==1)
{
UG_OPEN_dqxsj_explain_data(dialog_id);
UG_OPEN_delet_instance(step_id);
UG_OPEN_add_part_to_product(dsn_name,step_id);
UG_OPEN_edit_expression(dsn_name,table_name,table_name1);
UG_OPEN_set_order_knowledge(step_id,step_status);
}
UF_terminate();
return(UF_UI_CB_EXIT_DIALOG);
}
2.6用户入口
2.6.1UserExit概述
UserExit是UG/OpenAPI中的一个重要概念。
UG在运行过程中某些特定的地点存在着规定的入口,当进程执行到这些入口时,UG会自动检查用户是否在此处已定义了指向内部UF程序位置的环境。
若没有定义则以UG默认的方式继续运行下去;若已定义则从该处自动运行用户开发程序,这个过程被称为UserExit。
利用不同的UserExit能让用户程序在UG运行到特定点时被自动执行。
不同的入口具有不同的UserExit名称,用户程序以不同的UserExit作为入口点,就能决定该程序在UG进程的哪个阶段被自动激活并运行。
每个UserExit都有唯一的入口名称,以便用户在子程序中调用,当UG执行到某个入口时,便会在用户程序中寻找对应的UserExit函数名称,若存在则调用该函数并执行函数体,若不存在则继续UG默认进程。
不同的UserExit使用不同的入口函数,最常用的UserExit是ufsta()与ufusr(),ufsta()是UG启动时的UserExit,ufusr()是直接激活的UserExit。
通常情况下,UserExit函数的参数和返回值都相同。
UserExit函数的定义如下:
voidentry_point(char*param,int*retcode,intrlen);
其中param和retcode是输出参数,rlen指参数param的长度,由UG系统处理。
2.6.2ufusr()
1.4节的FirstProject程序采用了直接激活(ExplicitActivation)的userExit,其入口函数为ufusr()。
直接激活的操作方式如下:
选择菜单命令File→ExeeuteUG/OPEN→UserFunction(或按快捷键Ctrl+U),在弹出的ExecuteUserFunction对话框中选择DLL文件,即可执行应用开发程序中的ufusr()函数。
这种UserExit只是一个面向过程的程序处理任务,它有唯一的运行起止点,程序码在起止点间顺序进行。
ufusr()的函数体如下所示:
extern“C”DllExportvoidufusr(char*param,int*retcod,intparm_len)
{
/*InitializetheAPIenvironment*/
interrorCode=UF_initialize();
if(0==errorCode)
{
/*TODO:
Addyourapplicationcodehere*/
/*TerminatetheAPIenvironment*/
errorCode=UF_terminate();
}
/*Printoutanyerrormessages*/
PrintErrorMessage(errorCode);
}
2.6.3ufsta()
ufsta()是最常用的入口函数,当UG启动时激活该UserExit并执行函数中的内容,如1.4节的实例就采用了UG启动(UGstartup)的UserExit。
为了实现用户菜单的调用功能,通常的做法是在UG启动时注册用户菜单的信息,当UG启动后选择菜单命令时即可调用指定的应用程序。
注册方法有两种:
UF_MB_add_style_actions()和UF_MB_add_actions(),将在3.5节详细介绍。
也可以直接在该入口函数中写入一个应用,当UG启动时执行。
ufsta()的函数体如下所示:
extern"C"DllExportvoidufsta(char*param,int*returnCode,intrlen)
{
/*InitializetheAPIenvironment*/
if((UF_initialize())!
=O)return;//初始化
/*TODO:
Addyourapplicationcodehere*/
/*TerrninatetheAPIenvironment*/
UF_terminate();
return;
}
下面的例子很好地说明了ufsta()函数的功用。
在1.4节实例的ufsta()函数体中添加一行代码,实现弹出一个消息对话框的功能。
编译完成后,打开UG,会发现UG启动过程被一个消息对话框中断,即当UG启动时执行了ufsta()函数中的内容。
extern"C"DllExportvoidufsta(char*param,int*returnCode,intrlen)
{
if((UF_initialize())!
=0)return;//初始化
AfxMessageBox(“ufsta”);//添加的一行代码
UF_terminate();//终止
return;
}
2.6.4其它UserExit
每个UserExit都有唯一的环境变量相对应。
这些环境变量在UG环境配置文件ugii_env.dat(位于UG根目录下的UGII文件夹中)中定义。
表2-4所示列出了UG软件提供的38个UserExit,具体说明可参考OpenCReferenceManual或头文件UGOPEN\uf_exit.h。
表2-4其它UserExit
UserExit
环境变量名
入口函数
OpenPart
USER_RETRIEVE
ufget
NewPart
USER_CREATE
ufcre
SavePart
USER_FILE
ufput
SavePartAs
USER_SAVEAS
ufsvas
ImportPart
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UG 二次开发 应用 框架