首先,简单介绍一下UG二次开发。

UG原来是由工作站上移植过来的,GRIP就是它原来的二次开发工具,(本人对GRIP并不熟悉,哪位朋友如果使用GRIP开发,可以介绍一下),目前WINDOWS下的开发工具为UG/OPEN和UG/OPEN++,故在此我们主要针对这两种开发方法介绍一下。

1、UG/OPEN 是一系列UG开发工具的总称。它们随UG一起发布,以开放性架构面向不同的软件平台提供灵活的开发支持。它使第三软件商和UG用户能在其提供的平台上开发出适合自己需要的CAD产品。

UG/Open 套件组成:API, Grip, Menus cript ,UIStyler。

API:

UG/Open API也称User Function,通过它可以在C程序和C++程序中以库函数的形式调用UG内部的近2000个操作。

Grip语言:

GRIP(Graphics Interactive Programming)是一种专用的图形交互编程语言,开发者可以用GRIP编程的方法自动实现在UG下进行的绝大部分操作。GRIP命令很像英语单词,语法与BASIC 和FORTRAN相似,有某些情况下对于一些高级操作,用GRIP编程的方法比用UG交互的方法更有效,在UG交互环境下可以实现的功能用GRIP几乎全都可以实现。UG提供了一个名叫UG Open GRIP的GRIP语言编辑器,用这个工具可以编辑、修改、编译、连接程序。

Menus cript:

此项功能使用户或第三方软件商通过文本编辑器编辑UG菜单文件,以生成用户化的菜单进而集成他们的特殊应用。UG/Open Menus cript支持UG主菜单和快速弹出式下拉菜单的修改,通过它可以改变UG菜单的布局、添加新的菜单项以执行用户二次开发程序、User Tools文件及操作系统命令等。UG/Open Menus cript的使用需专门授权。运用UG/OpenMenus cript可以完全改变UG软件的主界面,需谨慎使用以防出现混乱。

UIStyler:

是用户或第三方软件商开发UG对话框的可视化工具,它比User Tools具有更强的功能。使用这个工具可以避免复杂的图形用户接口GUI(Graphics User Interface)编程。其设计的对话框的方式与Visual C++很相似。即利用对话框中基本控件的组合生成不同的对话框,对话框中所有控件都是实时可见的。

UG/Open 的主要功能实现就是利用UG/OPEN API,实质上就是UG提供的访问UG内部对象或核心的一个函数库。

UG/Open API(Application Programming Interface, 应用编程接口),使用户可以使用标准的C语言编译器,以习惯的格式编写出面向UG的二次开发程序。此时可以充分地发挥C语言编译和运行效率高,功能强大的特点。实践证明,这些API函数也可以无缝地集成到C++程序中,并利用强大的Microsoft Visual C++ 集成环境进行编译。这样,我们就可以充分地发挥出VC强大的功能和极其丰富的资源,包括MFC类库,使用面向对象的软件工程方法,高效高质地进行软件的开发。同时,也保证了对企业已有的各种源代码资源(通常使用C语言编写)的利用。

UG/Open API 函数能在两种不同的环境下运行,根据编译链接情况的不同,UG/Open API 二次开发程序又具有两种形式:

a. 外部式(External):此时UG/Open API程序可以脱离UG环境,在操作系统下单独运行,或者作为UG的一个子进程独立运行。

特点:调用灵活,用途广泛。

无法利用UG的交互界面。

b. 内部式(Internal):此时UG/Open API程序在UG环境下运行,与程序相关的各种事务通过UG代理执行。这样做的一个好处是可执行程序更小,同时链接的速度也更快。另外,一旦程序被装入,它将驻留在内存中,下次使用时不需重新加载,这样也节省了时间。而且这种方式下用户可与计算机交互,开发的程序能与UG无缝集成。

特点:直接控制UG的行为。

和用户交互。

2、UG/Open++提供了一个面向对象的UG开发接口。使用这些接口可以通过C++类的层次关系访问UG的对象和功能。这个类层次结构提供了许多功能,例如,创建,读取,修改UG对象,以及控制UG软件的运行。此外,通过继承UG标准类,用户可以定义自己的新类,从而拓展了原来的类层次结构。

UG/Open++实质上是在UG/Open基础上,提供了C++开发接口。实际上,UG/Open++由两个库组成:Openpp库提供了UG对象和功能;Vmathpp库提供了一些通用的向量代数操作。 但目前看来UG/OPEN++提供的功能实现起来过于繁琐,许多功能还不完善,有待于进一步提高。

UG/Open++应用程序也可以分为内部应用程序和外部应用程序两种。内部应用程序事实上是一个UNIX的共享库或WINDOWS NT下的动态连接库。内部应用程序必须运行在UG软件中。外部应用程序是一个可以独立执行的文件,无须UG软件同时运行。

开发工具的安装:

1、UG本身提供了UG/Open API、UG/OPEN GRIP的GRIP语言编辑器和UIStyler可视化开发工具,而UG/Open Menus cript的使用通过文本编辑器就可完成。

2、UG/OPEN 是在Microsoft Visual C++ 集成环境下开发编译的,所以需要额外安装Microsoft Visual C++。

如果先安装VC,后安装UG,则在VC新建工程选项里会自动添加UG/OPEN AppWizard;否则,如果先安装UG,再安装VC则需手动将"

...UGS160UGOPEN"下的UgOpen.awx拷贝到"D:Microsoft Visual StudioCommonMSDev98BinIDE"下,在VC的IDE中添加UG/OPEN开发向导。

第一个UG/OPEN程序 "hello world"

第一步:

利用刚才教的方法,新建工程hello,进入如下界面。

第一个问题是要你确定建立程序的类型,是内部还是外挂式的,外挂式无法利用UG的交互界面;第二个问题是UG的版本;第三个是使用的语言,C或C++,USE/OPEN ++ CALLS意思是是否使用USE/OPEN++回调函数

第二步:

第一个问题确定激活应用程序的方法。

第二个是卸载程序的方法。

Finish,此时框架创建完成。生成hello.cpp和hellp.h两个文件,还有ufsta( char *param, int *returnCode, int rlen )、ufusr_ask_unload( void )函数,还有一个PrintErrorMessage( int errorCode )错误处理函数。其中ufsta( )是UG的入口函数,主要工作在此完成。

下面简单介绍一下程序

/*下面三个为UG/OPEN自己的头文件,是最基本的头文件,这个由向导自动添加,针对不同的开发,加入不同的头文件,也就是不同的API 函数库*/

#include

#include

#include

#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )

# include

using std::ostrstream;

using std::endl;

using std::ends;

#else

# include

#endif

#include

#include "hello.h"

extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )

{

/* Initialize the API environment */

int errorCode = UF_initialize(); /////初始化UG环境

if ( 0 == errorCode )

{

/* TODO: Add your application code here */

/*添加的UG OPEN API函数,也可在此添加自定义函数,然后在入口函数外定义,注意必须设定好VC中的开发环境,有关设定见附件*/

uc1601("hello world!",1);

/* Terminate the API environment */

errorCode = UF_terminate(); ////退出UG环境

}

/* Print out any error messages */

PrintErrorMessage( errorCode );

}

将程序编译好,利用UG FILE->Execute UG/OPEN->user function,运行刚才编译通过的DLL文件,就可看到结果了。

附件为开发环境设定和入门材料

涉及到UG开发问题的文件路径有以下这些,大家可以根据里面的内容好好熟悉一下:

1、ug open 库文件及一些不错的例子

UGS160\ugopen

2、ug open puls puls 库文件及例子

UGS160\ugopenpp

3、UG系统设定

UGS160\ugII

4、UG菜单和工具条

D:UGS160UGIImenus

5、存放开发程序

UGS160UGALLIANCE

6、UG OPEN开发文档,内有较详细的函数说明,是主要参考资料。

UGS160UGDOCHTML_FILES\ugopen_doc

7、UG OPEN++开发文档

UGS160UGDOCHTML_FILES\ugopen++

8、UISTYLER开发文档

UGS160UGDOCHTML_FILES\uistyler.chm

下面讲讲如何用UISTYLER制作界面,以及如何提取和保存相应的数据~

如图有如下界面~开发形式有些象VB或DEPHI,但比其烦琐不方便,相对VC而言则较简单~

如下图的dialog是UG自带的例子,在~UGS160UGOPEN下可找到~

关于控件的一些属性,在这里就不具体详谈了,大家可在UISTYLER开发文档 (UGS160UGDOCHTML_FILES\uistyler.chm )中找到详细说明~唯一要提一点的是,并不是所有的属性都是可以在程序中设定它的值的,也就是说有些属性的值只能读,不能写~

我们主要介绍UISTYLER的属性设定对话框~当选定如上图界面2区域中最上面的dialog-demo时,3区域为三个page~为方便起见,只介绍比较重要的地方~

第一个page中"prefix name "为后面生成的所有控件的前缀,"launch dialog from "为对话框的加载方式;"Navigation Buttons"为对话框的样式

第二个page控制能否进行选择、选择方式和选择范围;

第三个page为响应函数,其中constructor_cb为对话框的初始化函数,destructor_cb为对话框的卸载函数,有点类似C++中的构造函数和析构函数

当选定如上图界面2区域中的一个控件时,区域3随控件类型不同而变化~

attributes中的Identifier为唯一的标识符;Attachments控制控件与相邻的上、左、右控件的位置关系;Callbacks为响应函数或回调函数,(注意:如果控件动作需要生成新的dialog,则将Create dialog选上,也可在程序中修改~)

将所有需要动作的控件回调函数或属性设定好了后,特别是那些不能动态设定的完成后,保存,UG会生成*.dlg,*.c,*.h三个文件~其中后两个是我们编程所需要的~

*.h文件是对话框的声明文件

//////////////

声明格式为

#define 某类型控件变量 ("控件标识")

#define DEMO_SELECT_LABEL ("SELECT_LABEL")

#define DEMO_SEP_1 ("SEP_1")

、、、

、、、

////////下面为总控件数

#define DEMO_DIALOG_OBJECT_COUNT ( 18 )

//////下面为对话框的响应函数和回调函数声明

int DEMO_constructor_cb ( int dialog_id,

void * client_data,

UF_STYLER_item_value_type_p_t callback_data);

、、、、

、、、、

现在用VC中的UG/OPEN AppWizard建立一个工程Test;将*.c和*.h包含到工程中,其中*.c为对话框的模版文件,也可直接copy到Test.cpp下~

1、首先介绍一下*.c中的关键内容

/*

响应函数总数,添加或删除了函数时,注意要修改这个值

*/

#define DEMO_CB_COUNT ( 10 + 1 ) /* Add 1 for the terminator */

/*

函数声明,注意如果想让控件动作激活另一个dialog,则将第三个参数由"0"改为"1"

*/

static UF_STYLER_callback_info_t DEMO_cbs[DEMO_CB_COUNT] =

{

{UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, DEMO_constructor_cb},

{UF_STYLER_DIALOG_INDEX, UF_STYLER_DESTRUCTOR_CB , 0, DEMO_destructor_cb},

{UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, DEMO_ok_callback},

{UF_STYLER_DIALOG_INDEX, UF_STYLER_BACK_CB , 0, DEMO_back_cb},

{DEMO_FILTER_TOGGLE , UF_STYLER_VALUE_CHANGED_CB, 0, DEMO_filter_toggle_callback},

{DEMO_ADD_PUSH_BUTTON , UF_STYLER_ACTIVATE_CB , 0, DEMO_add_activate_cb},

{DEMO_NEXT_ACTION , UF_STYLER_ACTIVATE_CB , 0, DEMO_next_cb},

{DEMO_BUTTON_LAYOUT , UF_STYLER_ACTIVATE_CB , 0, DEMO_blo_6_act_cb},

{DEMO_EDGES_RADIO_BOX , UF_STYLER_VALUE_CHANGED_CB, 0, DEMO_edges_radio_vc_cb},

{DEMO_FIELDS_OPTIONS , UF_STYLER_ACTIVATE_CB , 0, DEMO_fields_options_act_cb},

{UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }

};

/*

加载dialog的两种方式,剩下的就是具体的响应函数和回调函数的定义

*/

extern void ufsta (char *param, int *retcode, int rlen)

extern void (char *param, int *retcode, int rlen)

2、根据选择的工程方式,添加creat dialog的函数

例如,可用

extern void (char *param, int *retcode, int rlen) 函数中的内容完全覆盖

extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )中的内容,当然return就不要了,还有其他的函数变量声明必须在入口函数前。

3、在消息响应函数中添加相应代码,这是主要工作了,要熟悉ug open API才行~

4、最后将工程编译,生成test.dll文件。将*.dlg拷贝到~UGS160UGALLIANCEsiteapplication下,然后打开UG,打开或新建文件后,用file->Execute UG/OPEN->user function调用test.dll,就可调入自己设定的对话框。

示例工程附件

UG16的版本,WIN2000的系统,VC6。0,不同版本可能要重新编译一下

1、控件属性的设定

UF_STYLER_item_value_type_t list_data; ////////声明控件变量类型

char * strings[] = {"list item #1",

"list item #2",

"list item #3",

"list item #4"};

///////////下面语句的含义,是对item_id控件的item_attr属性设定新数据,数据为string数组(以指针地址给出),4个字符串,控件所在dialog为dialog_id,最后用UF_STYLER_set_value ()设定。

list_data.item_id = DEMO_MULTI_LIST;

list_data.item_attr = UF_STYLER_SUBITEM_VALUES;

list_data.count = 4;

list_data.indicator = UF_STYLER_STRING_PTR_VALUE;

list_data.value.strings = strings;

if ( UF_CALL ( UF_STYLER_set_value ( dialog_id, &list_data ) ) )

{

return (UF_UI_CB_CONTINUE_DIALOG);

}

2、控件属性的读取

和上面类似,最后用UF_STYLER_ask_value()取出控件的某一属性值或状态

UF_STYLER_item_value_type_t sel_data;

/* Get the selection structure from the dialog.*/

sel_data.item_id = UF_STYLER_DIALOG_INDEX;

sel_data.item_attr = UF_STYLER_SELECTION;

if ( UF_CALL ( UF_STYLER_ask_value( dialog_id, &sel_data ) ) )

{

return (UF_UI_CB_CONTINUE_DIALOG);

}

nx2的一些安装上的文件与这有一点不同。