基于MFC的UG二次开发方法的研究

2010-11-29 09:25
中国重型装备 2010年3期
关键词:工具栏二次开发对话框

陈 科 张 斌

(合肥工业大学机械与汽车工程学院,安徽230009)

基于MFC的UG二次开发方法的研究

陈 科 张 斌

(合肥工业大学机械与汽车工程学院,安徽230009)

介绍了三维绘图软件UGNX6.0的二次开发工具。针对UG/Open API在开发过程中的不足,分析了如何应用MFC对UG进行二次开发的方法,并以具体实例说明如何利用MFC和UG/Open API开发CAD系统。

UGNX6.0;MFC;UG/Open API;二次开发

UnigraphicsNX6.0(简称UGNX6.0)是通用的大型三维绘图软件,是计算机辅助设计、辅助制造、辅助工程和产品数据管理(CAD/CAM/CAE/PDM)一体化的软件系统之一,拥有强大的实体造型、曲面造型、虚拟装配和生成工程图等设计功能。但UG是通用支撑软件系统,没有提供专用产品所需要的完整的计算机辅助设计和制造功能。由于机械产品种类很多,需要对具体产品在UG软件平台上进行适当的二次开发,设计友好的交互界面、实用的功能模块和方便的专用产品CAD/CAM系统。本文主要介绍如何利用MFC对UG进行二次开发的方法,并以实例说明[1]。

1 UG二次开发工具

1.1 组成部分

UG软件的二次开发模块提供了较为完整的开发工具集,可对UG系统进行用户化裁剪和开发,以满足实际的应用需求。UG/Open是一系列UG开发工具的总称,是UG软件为用户提供的最主要的开发工具,主要由UG/Open API、UG/Open GRIP、UG/Open MenuScript和UG/Open UIStyler 4个部分组成[2]。

(1)UG/Open API(又称User Function)是一个允许程序访问并改变UG对象模型的程序集。UG/Open API封装了近2 000个UG操作的函数,可以方便地对UG的图形终端、文件管理系统和数据库进行操作,绝大多数的UG操作都可以用UG/Open API函数实现。

(2)在UG/Open API工具发布之前,UG的二次开发工具是UG/Open GRIP(Graphics Interactive Programming)。GRIP是一种专用的图形交互编程语言,它与UG系统集成,可以实现UG环境中的大部分应用操作。

(3)UG/Open MenuScript是创建用户化菜单的工具。MenuScript支持UG主菜单和快速弹出式菜单的设计和修改,通过它可以改变UG菜单的布局,添加新的菜单项以执行用户应用开发程序。

(4)UG/Open UIStyler是开发UG对话框的可视化工具,其生成的对话框与UG集成,用户可以方便、高效地与UG进行交互操作。但UIStyler中包含的控件较少,功能有限。

1.2 UG/Open API的使用

UG/Open API(UF)是Unigraphics与外部应用程序之间的接口,其程序的源代码不能被UG直接执行,需要通过编译形成动态链接库或可执行文件后才能发挥作用。程序使用了UG/Open API函数在Internal环境下运行的情况。内部UF的优点是能处理UG的UI对象接口,实现和UG界面的无缝集成并扩充UG的特定功能,而且它执行时每个步骤都能从UG的客户窗口中得到动态反映,方便地实现与用户的交互、屏幕选取等复杂操作。

1.3 MFC的使用

MFC(Microsoft Fundament Class)是VC++的一个重要的软件资源,利用MFC可以方便地实现程序的可视化设计。与UG自带的界面开发工具UIStyler相比,利用MFC设计对话框更容易,修改和调试也更方便、快捷。

利用UG/Open API进行开发有很多好处,但也有一些不足,主要表现在下面两个方面:

(1)字符串处理

UG/Open API基本上采用的是标准C的字符串函数,使用麻烦,容易出现错误。使用MFC中提供的CString等类,可大大降低开发周期。

(2)数据结构的实现

UG/Open API中实现复杂的数据结构很困难。使用MFC提供的CList、CMap和CArray等类,对于实现复杂的数据结构非常方便。

1.4 UG调用方式与工程目录结构

UG二次开发程序采用了动态链接库(DLL)技术,UG内部应用程序开发规定以动态链接库方式对其进行功能扩展和应用开发。动态链接库被映射到其他应用程序空间中执行,与链接它的应用程序可以看成是一体的。在Visual C++中将应用程序编译链接生成动态链接库文件(*.dll),UG启动时会自动加载供用户菜单调用,从而实现二次开发程序与UG平台的无缝集成。在UG进程中,采用菜单触发方式调用DLL的过程如图1所示。

图1 DLL调用过程Figure 1 DLL calling process

在用户设定的工程路径下需要建立UG系统规定的工程目录结构。UG启动时会在规定目录中寻找并加载相应的程序和资源。UG规定的目录有Startup、Application和Udo。Startup目录存放UG启动时需加载的动态链接库文件(*.dll)、菜单脚本文件(*.men)和用户工具栏脚本文件(*.tbr)。Application目录存放具体的功能扩展程序文件,如UIStyle对话框文件(*.dlg)、工具图标文件(*.bmp)和位图调色板文件(*.ubm)。Udo目录存放用户定义的数据和链接等。目录结构如图2所示。

图2 目录结构Figure 2 Catalog structure

2 UG二次开发程序示例

UG应用程序调用MFC,其实质是利用MFC创建动态链接库并被UG调用。下面以MFC和UG/Open API的协同开发为例讲述UG二次开发的一般过程。由于本例需要UG Gateway的支持,因此使用了UG/Open API的Internal环境。开发流程如图3所示。

图3 开发流程图Figure 3 Flow chart of development

2.1 搭建二次开发平台

2.1.1 创建工程目录

新建工程目录E:UGSecond,并在该路径下新建文件夹Startup和Application。前者用来存放.dll文件、.men文件和.tbr文件,后者存放.bmp文件。 这两个文件夹为UG规定文件夹,应确保其名称拼写无误。

2.1.2 注册工程路径

利用配置文件法注册工程路径。UG规定了配置文件custom_dirs.dat用于指明用户的工程路径,该文件位于路径“${UGII_BASE_DIR}UGIImenus”。在配置文件中添加工程路径“E:UGSecond”,当UG启动时,系统检查该文件中注册的工程路径并自动加载该路径下的所有资源,包括用户菜单、对话框和动态链接库等。

2.1.3 设置VC++环境

打开Visual C++ 6.0,选择菜单命令File→New,工程取名为Code,选择对话框中的Projects选项卡和项目列表框中的MFC AppWizard(dll)项。选择Regular DLL with MFC statically linked方式创建静态链接MFC方式的DLL。进入VC主界面后,在菜单中选择Project→Settings...,在Link项Object/library module中加入“libufun.lib”和“libugopenint.lib”两个库文件。选择Tool→Options,在Directories项中将“$UGII_BASE_DIRUGOPEN”分别加入到include files和library files条目中。UGOPEN文件夹存放了UG头文件和程序在编译过程中所需要的库函数文件。

2.2 创建菜单栏和工具栏

2.2.1 菜单栏

UG/OPEN MenuScript提供了一套用于定义UG菜单的脚本语言。在工程路径下的Startup文件夹下创建菜单脚本文件DataExtractor.men,并输入以下代码:

VERSION 170 (版本号)

EDIT UG_GATEWAY_MAIN_MENUBAR (编辑UG主菜单)

AFTER UG_HELP (第一级菜单位于Help菜单之后)

CASCADE_BUTTON UG_DATAEXTRACTOR (定义第一级菜单ID,下拉菜单)

LABEL 空调配管数据提取 (定义第一级菜单标题)

END_OF_AFTER (结束第一级菜单编辑)

...

2.2.2 工具栏

工具栏文件是以.tbr为扩展名的文本文件。在工程路径下的Startup文件夹下创建菜单脚本文件DataExtractor.tbr,并输入以下代码:

TITLE 空调配管数据提取(工具栏标题)

VERSION 170(版本号)

DOCK TOP(定义工具栏被导入时的起始位置为顶部)

BUTTON UG_DATAEXTRACTOR_PREPROHELP(工具栏按钮名称,与菜单脚本文件中相应菜单命令的名称相同)

LABEL 预处理帮助(工具按钮的标题)

BITMAP prepro_help.bmp(工具按钮图标的文件名,位于工程路径下Application文件夹)

...

UG启动加载后如图4所示。

图4 菜单栏和工具栏Figure 4 Menu bar and tool bar

2.3 MFC对UG/Open API的开发

2.3.1 添加UG/Open入口函数

ufsta()是最常用的入口函数,当UG启动时激活该User Exit并执行函数中的内容。在Main.cpp文件中添加以下代码:

extern“C”DllExport void ufsta(char *param,int *returnCord,int rlen)

{

//指明MFC对话框使用DLL本身资源

AFX_MANAGE_STATE(AfxGetStaticModuleState());

if(UF_initialize()!=0) return;

int error_code=0;

...

UF_terminate(); //退出UG环境

return;

}

2.3.2 MFC与UG应用程序接口

由于用户功能模块是利用MFC开发的,因此MFC开发的程序与UG的应用程序之间的接口是必须要解决的问题。但UG/Open API没有公开提供对MFC的接口,因此要添加回调函数和消息映射代码:

(1)在Main.h中声明一个激活应用的列表结构,该结构的实例与用户菜单文件中激活的应用相匹配:

static UF_MB_action_t action_table[ ]={

{“Application_Extractor”,Application_Extractor,NULL},

{NULL,NULL,NULL} };

(2)在App.h中声明应用函数:

UF_MB_cb_status_t Application_Extractor(UF_MB_widget_t widget, UF_MB_data_t client_data, UF_MB_activated_button_p_t button);

(3)在App.cpp中加入回调函数的定义体:

UF_MB_cb_status_t Application_Extractor(UF_MB_widget_t widget,

UF_MB_data_t client_data,

UF_MB_activated_button_p_t button)

{

if(UF_initialize() != 0)

{

return (UF_MB_CB_CONTINUE); //确认UG/Open API函数可用

}

/*---enter your callback code here---*/

//加入callback code (MFC和UG/Open API开发的用户功能模块)

UF_terminate();//终止

return(UF_MB_CB_CONTINUE);

}

2.3.3 用户功能模块

用户功能模块是基于MFC对UG/Open API进行的开发,使用了MFC的CString、CList、CMap等类协助处理数据,使用了UG/Open API的一些函数来实现特定的功能。其中实现数据提取的函数有:int UF_CURVE_ask_line_data (),int UF_CURVE_ask_point_data ()等。实现遍历装配树所需函数有:获得当前工作部件的标识UF_ASSEM_ask_work_part(),获得装配根节点文件的事件标识UF_ASSEM_ask_root_part_occ()等。

3 结束语

本文探讨了利用MFC对三维绘图软件UGNX6.0进行二次开发的方法。通过一个完整的例子,介绍了如何利用MFC和UG/Open API开发一个有菜单、对话框界面等交互环境的CAD系统。MFC大大扩展了UG/Open API的开发功能,实现了多种类型的人机交互界面设计,并充分利用了VC++的资源,能满足用户二次开发CAD系统的需要。

[1] 赵韩,张冰战.UG二次开发CAD系统MFC的调用方法研究[J].现代制造工程,2007,(2):52-54.

[2] 黄翔,李迎光.UG应用开发教程与实例精解[M].北京:清华大学出版社,2005.

[3] 郑战光,潘淑琴,等.利用MFC进行UG二次开发的研究[J].计算机工程与设计,2007,28(23):5787-5791.

[4] 吴占阳,侯忠滨,等.UG二次开发技术研究[J].现代机械,2005,(5):48-50.

[5] 应建勇.UG二次开发中MFC调用方法的研究[J].机电产品开发与创新,2005,18(6):102-103.

[6] 刘雅博,陈拂晓,等.MFC在UG二次开发CAD系统中的应用[J].金属成形工艺,2004,22:39-41.

Research for UG Secondary Development Method based on MFC

ChenKe,ZhangBin

The secondary development tool of 3D drawing software UGNX6.0 is introduced in this paper. For the inadequateness of UG/Open API during development, a method how to use MFC in the secondary development of UG is analyzed, and a concrete example is given to explain how to develop a CAD system by MFC and UG/Open API.

UGNX6.0;MFC;UG/Open API;the secondary development

TP291.7

A

2010—03—15

陈科,男,教授,博士生导师,从事现代设计理论、机械CAD/CAE和人工神经网络等方面研究。

张斌,男,硕士研究生,研究方向为数字化设计与制造。

编辑 杜青泉

猜你喜欢
工具栏二次开发对话框
“玩转”西沃白板
正常恢复虚拟机
西门子Operate高级编程的旋转坐标系二次开发
浅谈Mastercam后处理器的二次开发
Bootlace Worms’Secret etc.
What Is Beauty?
西门子Easy Screen对倒棱机床界面二次开发
浅谈VB的通用对话框《CommonDialog》控件的使用
ANSYS Workbench二次开发在汽车稳定杆CAE分析中的应用
设计一种带工具栏和留言功能的记事本