ug二次开发怎么把不同数据写在一起
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ug二次开发怎么把不同数据写在一起相关的知识,希望对你有一定的参考价值。
如果是大量的数据,可以采用KF,如果数据小,可以采用属性的方式。
与表达时候相关的部分函数:
UF_MODL_ask_exp。
UF_MODL_ask_exp_desc_of_feat。
UF_MODL_ask_exp_desc_of_frec。
UF_MODL_ask_exp_tag_string。
UF_MODL_ask_exp_tag_value。
UF_MODL_ask_exps_of_feature。
UF_MODL_ask_exps_of_part。
UF_MODL_create_exp。
UF_MODL_create_exp_tag。
软件简介:
其从18版本开始提供二次开发功能,即支持编程扩展系统功能实现用户特殊需求。
较为普遍的使用Open API系统,又被称为UFUN,支持C、C++语言。
新版NX支持NXOpen系统,支持.net、C++、Java语言。
NX4及以下支持.net 1.1,NX5以上支持.net2.0及以上。
美国UGS公司的Unigraphics(UG)软件是一套优秀的以机械产品为主的CAD/CAE/CAM一体化软件,应用范围非常广泛,在引入国内不到十年的时间内,就拥有了几百家用户,其发展势头非常强劲。
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的一些安装上的文件与这有一点不同。
以上是关于ug二次开发怎么把不同数据写在一起的主要内容,如果未能解决你的问题,请参考以下文章