首先,简单介绍一下UG二次开发。
UG原来是由工作站上移植过来的,GRIP就是它原来的二次开发工具,(本人对GRIP并不熟悉,哪位朋友如果使用GRIP开发,可以介绍一下),目前WINDOWS下的开发工具为UG/OPEN和UG/OPEN++,故在此我们主要针对这两种开发方法介绍一下。
1、UG/OPEN是一系列UG开发工具的总称。它们随UG一起发布,以开放性架构面向不同的软件平台提供灵活的开发支持。它使第三软件商和UG用户能在其提供的平台上开发出适合自己需要的CAD产品。
UG/Open套件组成:API,Grip,Menuscript,UIStyler。
API:
UG/OpenAPI也称UserFunction,通过它可以在C程序和C++程序中以库函数的形式调用UG内部的近个操作。
Grip语言:
GRIP(GraphicsInteractiveProgramming)是一种专用的图形交互编程语言,开发者可以用GRIP编程的方法自动实现在UG下进行的绝大部分操作。GRIP命令很像英语单词,语法与BASIC和FORTRAN相似,有某些情况下对于一些高级操作,用GRIP编程的方法比用UG交互的方法更有效,在UG交互环境下可以实现的功能用GRIP几乎全都可以实现。UG提供了一个名叫UGOpenGRIP的GRIP语言编辑器,用这个工具可以编辑、修改、编译、连接程序。
Menuscript:
此项功能使用户或第三方软件商通过文本编辑器编辑UG菜单文件,以生成用户化的菜单进而集成他们的特殊应用。UG/OpenMenuscript支持UG主菜单和快速弹出式下拉菜单的修改,通过它可以改变UG菜单的布局、添加新的菜单项以执行用户二次开发程序、UserTools文件及操作系统命令等。UG/OpenMenuscript的使用需专门授权。运用UG/OpenMenuscript可以完全改变UG软件的主界面,需谨慎使用以防出现混乱。
UIStyler:
是用户或第三方软件商开发UG对话框的可视化工具,它比UserTools具有更强的功能。使用这个工具可以避免复杂的图形用户接口GUI(GraphicsUserInterface)编程。其设计的对话框的方式与VisualC++很相似。即利用对话框中基本控件的组合生成不同的对话框,对话框中所有控件都是实时可见的。
UG/Open的主要功能实现就是利用UG/OPENAPI,实质上就是UG提供的访问UG内部对象或核心的一个函数库。
UG/OpenAPI(ApplicationProgrammingInterface,应用编程接口),使用户可以使用标准的C语言编译器,以习惯的格式编写出面向UG的二次开发程序。此时可以充分地发挥C语言编译和运行效率高,功能强大的特点。实践证明,这些API函数也可以无缝地集成到C++程序中,并利用强大的MicrosoftVisualC++集成环境进行编译。这样,我们就可以充分地发挥出VC强大的功能和极其丰富的资源,包括MFC类库,使用面向对象的软件工程方法,高效高质地进行软件的开发。同时,也保证了对企业已有的各种源代码资源(通常使用C语言编写)的利用。
UG/OpenAPI函数能在两种不同的环境下运行,根据编译链接情况的不同,UG/OpenAPI二次开发程序又具有两种形式:
a.外部式(External):此时UG/OpenAPI程序可以脱离UG环境,在操作系统下单独运行,或者作为UG的一个子进程独立运行。
特点:调用灵活,用途广泛。
无法利用UG的交互界面。
b.内部式(Internal):此时UG/OpenAPI程序在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的共享库或WINDOWSNT下的动态连接库。内部应用程序必须运行在UG软件中。外部应用程序是一个可以独立执行的文件,无须UG软件同时运行。
开发工具的安装:
1、UG本身提供了UG/OpenAPI、UG/OPENGRIP的GRIP语言编辑器和UIStyler可视化开发工具,而UG/OpenMenuscript的使用通过文本编辑器就可完成。
2、UG/OPEN是在MicrosoftVisualC++集成环境下开发编译的,所以需要额外安装MicrosoftVisualC++。
如果先安装VC,后安装UG,则在VC新建工程选项里会自动添加UG/OPENAppWizard;否则,如果先安装UG,再安装VC则需手动将
...UGSUGOPEN下的UgOpen.awx拷贝到D:MicrosoftVisualStudioCommonMSDev98BinIDE下,在VC的IDE中添加UG/OPEN开发向导。
第一个UG/OPEN程序helloworld
第一步:
利用刚才教的方法,新建工程hello,进入如下界面。
第一个问题是要你确定建立程序的类型,是内部还是外挂式的,外挂式无法利用UG的交互界面;第二个问题是UG的版本;第三个是使用的语言,C或C++,USE/OPEN++CALLS意思是是否使用USE/OPEN++回调函数
第二步:
第一个问题确定激活应用程序的方法。
第二个是卸载程序的方法。
Finish,此时框架创建完成。生成hello.cpp和hellp.h两个文件,还有ufsta(char*param,int*returnCode,intrlen)、ufusr_ask_unload(void)函数,还有一个PrintErrorMessage(interrorCode)错误处理函数。其中ufsta()是UG的入口函数,主要工作在此完成。
下面简单介绍一下程序
/*下面三个为UG/OPEN自己的头文件,是最基本的头文件,这个由向导自动添加,针对不同的开发,加入不同的头文件,也就是不同的API函数库*/
#include
#include
#include
#if!defined(__hps)!defined(__sgi)!defined(__sun)
#include
usingstd::ostrstream;
usingstd::endl;
usingstd::ends;
#else
#include
#endif
#include
#includehello.h
externCDllExportvoidufsta(char*param,int*returnCode,intrlen)
{
/*InitializetheAPIenvironment*/
interrorCode=UF_initialize();/////初始化UG环境
if(0==errorCode)
{
/*TODO:Addyourapplicationcodehere*/
/*添加的UGOPENAPI函数,也可在此添加自定义函数,然后在入口函数外定义,注意必须设定好VC中的开发环境,有关设定见附件*/
uc1(helloworld!,1);
/*TerminatetheAPIenvironment*/
errorCode=UF_terminate();////退出UG环境
}
/*Printoutanyerrormessages*/
PrintErrorMessage(errorCode);
}
将程序编译好,利用UGFILE-ExecuteUG/OPEN-userfunction,运行刚才编译通过的DLL文件,就可看到结果了。
附件为开发环境设定和入门材料
涉及到UG开发问题的文件路径有以下这些,大家可以根据里面的内容好好熟悉一下:
1、ugopen库文件及一些不错的例子
UGS\ugopen
2、ugopenpulspuls库文件及例子
UGS\ugopenpp
3、UG系统设定
UGS\ugII
4、UG菜单和工具条
D:UGSUGIImenus
5、存放开发程序
UGSUGALLIANCE
6、UGOPEN开发文档,内有较详细的函数说明,是主要参考资料。
UGSUGDOCHTML_FILES\ugopen_doc
7、UGOPEN++开发文档
UGSUGDOCHTML_FILES\ugopen++
8、UISTYLER开发文档
UGSUGDOCHTML_FILES\uistyler.chm
下面讲讲如何用UISTYLER制作界面,以及如何提取和保存相应的数据~
如图有如下界面~开发形式有些象VB或DEPHI,但比其烦琐不方便,相对VC而言则较简单~
如下图的dialog是UG自带的例子,在~UGSUGOPEN下可找到~
关于控件的一些属性,在这里就不具体详谈了,大家可在UISTYLER开发文档(UGSUGDOCHTML_FILES\uistyler.chm)中找到详细说明~唯一要提一点的是,并不是所有的属性都是可以在程序中设定它的值的,也就是说有些属性的值只能读,不能写~
我们主要介绍UISTYLER的属性设定对话框~当选定如上图界面2区域中最上面的dialog-demo时,3区域为三个page~为方便起见,只介绍比较重要的地方~
第一个page中prefixname为后面生成的所有控件的前缀,launchdialogfrom为对话框的加载方式;NavigationButtons为对话框的样式
第二个page控制能否进行选择、选择方式和选择范围;
第三个page为响应函数,其中constructor_cb为对话框的初始化函数,destructor_cb为对话框的卸载函数,有点类似C++中的构造函数和析构函数
当选定如上图界面2区域中的一个控件时,区域3随控件类型不同而变化~
attributes中的Identifier为唯一的标识符;Attachments控制控件与相邻的上、左、右控件的位置关系;Callbacks为响应函数或回调函数,(注意:如果控件动作需要生成新的dialog,则将Createdialog选上,也可在程序中修改~)
将所有需要动作的控件回调函数或属性设定好了后,特别是那些不能动态设定的完成后,保存,UG会生成*.dlg,*.c,*.h三个文件~其中后两个是我们编程所需要的~
*.h文件是对话框的声明文件
//////////////
声明格式为
#define某类型控件变量(控件标识)
#defineDEMO_SELECT_LABEL(SELECT_LABEL)
#defineDEMO_SEP_1(SEP_1)
、、、
、、、
////////下面为总控件数
#defineDEMO_DIALOG_OBJECT_COUNT(18)
//////下面为对话框的响应函数和回调函数声明
intDEMO_constructor_cb(intdialog_id,
void*client_data,
UF_STYLER_item_value_type_p_tcallback_data);
、、、、
、、、、
现在用VC中的UG/OPENAppWizard建立一个工程Test;将*.c和*.h包含到工程中,其中*.c为对话框的模版文件,也可直接copy到Test.cpp下~
1、首先介绍一下*.c中的关键内容
/*
响应函数总数,添加或删除了函数时,注意要修改这个值
*/
#defineDEMO_CB_COUNT(10+1)/*Add1fortheterminator*/
/*
函数声明,注意如果想让控件动作激活另一个dialog,则将第三个参数由0改为1
*/
staticUF_STYLER_callback_info_tDEMO_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的两种方式,剩下的就是具体的响应函数和回调函数的定义
*/
externvoidufsta(char*param,int*retcode,intrlen)
externvoid(char*param,int*retcode,intrlen)
2、根据选择的工程方式,添加creatdialog的函数
例如,可用
externvoid(char*param,int*retcode,intrlen)函数中的内容完全覆盖
externCDllExportvoidufsta(char*param,int*returnCode,intrlen)中的内容,当然return就不要了,还有其他的函数变量声明必须在入口函数前。
3、在消息响应函数中添加相应代码,这是主要工作了,要熟悉ugopenAPI才行~
4、最后将工程编译,生成test.dll文件。将*.dlg拷贝到~UGSUGALLIANCEsiteapplication下,然后打开UG,打开或新建文件后,用file-ExecuteUG/OPEN-userfunction调用test.dll,就可调入自己设定的对话框。
示例工程附件
UG16的版本,WIN的系统,VC6。0,不同版本可能要重新编译一下
1、控件属性的设定
UF_STYLER_item_value_type_tlist_data;////////声明控件变量类型
char*strings[]={listitem#1,
listitem#2,
listitem#3,
listitem#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_tsel_data;
/*Gettheselectionstructurefromthedialog.*/
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的一些安装上的文件与这有一点不同。