一、前言 现在越来越多的人开始使用NX,并希望能够利用NX的开放性,开发出更适合自己公司的操作模式。 大部分人对计算机编程原理知之甚少,通常更愿意使用电脑作为一种工具来解决问题。为了满足用户易于使用的要求,程序越来越复杂。过去那种需要键入神秘指令,得到一 堆枯燥数据的日子已经一去不返了。今天的程序大都采用“用户友好界面”,其中包括多窗口、菜单、对话框以及非常形象的标识。 NX软件为用户提供可视化开发工具:NX/OPEN UIStler。用户可以方便地直接将对话框中的基本控件进行组合布局,创建不同功能需求的NX风格对话框与NX进行交互操作。 这篇内容主要是解决以下几个方面的问题: 1.NX对话框的建立; 2.控件的访问,属性参数设置; 3.经常使用到的数据类型和函数; 4.常用控件的程序写法。 一、NX对话框的建立 在NX启动后选择用户界面样式编辑器(Y)…,进入UIStyler 可视化界面。(如图1、2)
( _; T' Q3 u" N: I1 N' I+ _2 e: c! Z4 G* y/ _+ R4 _
% ^$ S0 Z; i9 N- G( |! I4 f% G
3 p8 S" U( p% p9 E0 O
3 U" R4 q' y4 @" i7 R% }, B8 A 二、控件的访问及属性参数设置 对话框控件的访问有询问控件属性和设置控件属性两种方式,UF 函数是:UF_STYLER_ask_value_()和UF_STYLER_set_value_()。语法结构如下: extern int UF_STYLER_ask_value_(int dialog_id,UF_STYLER_item_value_type_p_tvalue); extern int UF_STYLER_set_value_(int dialog_id,UF_STYLER_item_value_type_p_tvalue); dialog_id 表示该控件的标识,value 是控件属性信息的结构变量,通过结构类型:UF_STYLER_item_value_Type_p_t 来定义。 下表中是详细的说明:
6 T- `; v' \0 B) F) B9 A
1 x' \% P1 f3 ]7 h( |
下面通过实例介绍各控件的代码实现的方法: 之前必须了解UF_STYLER_item_value_type_p_t的结构定义; typedef stuct UF_STYLER_item_value_type_s { int reason; const char *item_id; int subitem_index; int count; int item_attr; int indicator; union { Char *string; Char **strings; int integer; int 8integers; double real; UF_UI_selection_p_t *selection; }value; }UF_STYLER_item_value_type_t,*UF_STYLER_item_value_type_t; 1.字符串输入框 //字符串控件,这段代码可以获取字符串控件的输入值 char sName[133]; UF_STYLER_item_value_type_p_t value; Value.item_attr=UF_STYLER_VALUE; value.item_id=item_id; //控件id UF_STYLER_ask_value(dialog_id,&value); strcpy(sName,value.value.string); UF_STYLER_free_value(&value); //字符串控件,这段代码可以获取字符串控件可见性 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_VISIBILITY value.item_id=item_id; //控件id value.value.integer =TURE; //TURE 为可见 UF_STYLER_set_value(dialog_id,&value); UF_STYLER_free_value(&value); 2.按钮控件 //按钮控件,这段代码可以设置控件的位图显示的功能 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_BITMAP; value.item_id=item_id; //控件id value.value.string = E:\\Application\\Test.bmp ; //位图文件的全部路径位图文件的全路径 UF_STYLER_set_value(dialog_id,&value); UF_STYLER_free_value(&value) //按按钮控件,这段控件可以设置代码的激活状态段代码可以设置控件的激活状态 UF_STYLER_item_value_type_p_t value; Value.item_attr=UF_STYLER_SENSITIVE; value.item_id=item_id; //控件id UF_STYLER_set_value(dialog_id,&value); if (value.value.integer)…; 3.单选按钮 //这段代码可以设置控件标签的功能 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_LABEL; value.item_id=item_id; //控件id strcpy(value.value.string, 标签名称 ); //标签名称 UF_STYLER_set_value(dialog_id,&value); UF_STYLER_free_value(&value); //这段代码可以单选按钮控件的值 Int iName=value.value.integer; UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_VALUE; value.item_id=item_id; //控件id UF_STYLER_ask_value(dialog_id,&value); UF_STYLER_free_value(&value); 4.下拉列表控件 //这段代码可以设置下拉列表框所有选项的功能 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_SUBITEM_VALUES; value.item_id=item_id; //控件id value.value.strings=asItem; //下拉列表框选项的字符串数组 value.count=iNumOfItem; //下拉列表框选项的数量下拉列表框选项的数量 UF_STYLER_set_value(dialog_id,&value); UF_STYLER_free_value(&value); //这段代码可以获得下拉列表框所有选项的功能 int iItemSelect=value.value.integer; UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_VALUE; value.item_id=item_id; //控件id UF_STYLER_ask_value(dialog_id,&value); UF_STYLER_free_value(&value); 5.单选列表框 //这段代码可以设置单选列表框所有选项的功能这段代码可以设置单选列表框所有选项的功能 UF_STYLER_item_value_type_p_t value; Value.item_attr=UF_STYLER_SUBITEM_VALUES; Value.item_id=item_id; //控件id value.value.strings=asItem; //单选列表框选项的字符串数组 Value.count=iNumOfItem; //单选列表框选项的数量 UF_STYLER_set_value(dialog_id,&value); UF_STYLER_free_value(&value); Int iItemSelect=value.value.integer; UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_VALUE; value.item_id=item_id; //控件id UF_STYLER_ask_value(dialog_id,&value); UF_STYLER_free_value(&value); //这段代码可以添加选项的功能 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_INSERT; value.item_id=item_id; //控件id Value.subitem_index=UF_STYLER_NO_SUB_INDEX; Value.indicator=UF_STYLER_STRING_VALUE; Value.value.string=data; UF_STYLER_set_value(dialog_id,&value); //这段代码可以删除选项的功能 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_DELETE; value.item_id=item_id; //控件id value.subitem_index=UF_STYLER_NO_SUB_INDEX; UF_STYLER_set_value(dialog_id,&value); 6.图形控件 //这段代码设置位图控件 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_BITMAP; value.item_id=item_id; //控件id value.value.string =flie_name; //位图文件名 UF_STYLER_set_value(dialog_id,&value); //这段代码设置Label 控件以图片形式显示的功能 UF_STYLER_item_value_type_p_t value; value.item_attr=UF_STYLER_BITMAP; value.item_id=item_id; //控件id value.value.string =flie_name; //位图文件名 UF_STYLER_set_value(dialog_id,&value); //设置Label 控件以图片形式显示的功能 代码基本相同,用户只要设对控件的id即可。 三、创建CAM 程序组的完整实例 第一步,建立dlg文件,进入用户界面编辑器,设计如图3的对话框。
3 _5 G. Y% d2 s2 U8 U
3 u! x) H# X9 K n9 V w 一个字符串输入框,一个整型输入框,为了美观,中间加一个分隔符,全部放在一个群组之中,设置属性和环境变量。 第二步,保存为 Creat_Group生成 3个文件: Creat_Group.dlg;Creat_Group_template.c;Creat_Group.h。 第三步,启动VC++新建NX工程,工程名Creat_Group. 第四步,在新建工程里删除 Creat_Group.cpp 文件,把第二步生成的Creat_Group_template.c;Creat_Group.h加入工程。 第五步,编写程序代码。 Creat_Group.h 的源码如下: #ifndef NCGROUP_H_INCLUDED #define NCGROUP_H_INCLUDED #include <uf.h> #include <uf_defs.h> #include <uf_styler.h> #ifdef __cplusplus extern "C" { #endif #define CH_STR_1 ("STR_1") #define CH_INT_1 ("INT_1") #define CH_DIALOG_OBJECT_COUNT ( 2 ) int CH_create_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data); int CH_del_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data); int CH_ok_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data); int CH_apply_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data); int CH_cancle_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data); #ifdef __cplusplus } #endif #endif Creat_Group_template.c 的源代码如下: #include <stdio.h> #include <uf.h> #include <uf_defs.h> #include <uf_exit.h> #include <uf_ui.h> #include <uf_styler.h> #include <uf_mb.h> #include <uf_ncgroup.h> #Include <uf_setup.h> #include <uf_part.h> #include <uf_obj.h> #include <uf_object_types.h> #include <uf_ui_ont.h> #include <iostream.h> #include "Creat_Group.h" #define CH_CB_COUNT ( 5 + 1 ) static UF_STYLER_callback_info_t CH_cbs[CH_CB_COUNT] = { {UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, CH_create_cb}, {UF_STYLER_DIALOG_INDEX, UF_STYLER_DESTRUCTOR_CB , 0, CH_del_cb}, {UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, CH_ok_cb}, {UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB , 0, CH_cancle_cb}, {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 } }; static UF_MB_styler_actions_t actions[] = { { "Creat_Group.dlg", NULL, CH_cbs, UF_MB_STYLER_IS_NOT_TOP }, { NULL, NULL, NULL, 0 } /* This is a NULL terminated list */ }; extern void ufsta (char *param, int *retcode, int rlen) { int error_code; if ( (UF_initialize()) != 0) return; if ( (error_code = UF_MB_add_styler_actions ( actions ) ) != 0 ) { char fail_message[133]; UF_get_fail_message(error_code, fail_message); Printf ( "%s\n", fail_message ); } UF_terminate(); return; } #ifdef DISPLAY_FROM_CALLBACK extern int <enter the name of your function> ( int *response ) { int error_code = 0; if ( ( error_code = UF_initialize() ) != 0 ) return (0) ; if ( ( error_code = UF_STYLER_create_dialog ( "Creat_Group.dlg", CH_cbs, /* Callbacks from dialog */ CH_CB_COUNT, /* number of callbacks*/ NULL, /* This is your client data */ response ) ) != 0 ) { char fail_message[133]; UF_get_fail_message(error_code, fail_message); UF_UI_set_status (fail_message); printf ( "%s\n", fail_message ); } UF_terminate(); return (error_code); } #Endif /* DISPLAY_FROM_CALLBACK */ extern void ufusr (char *param, int *retcode, int rlen) { int response = 0; Int error_code = 0; if ( ( UF_initialize() ) != 0 ) return; if ( ( error_code = UF_STYLER_create_dialog ( "Creat_Group.dlg", CH_cbs, /* Callbacks from dialog */ CH_CB_COUNT, /* number of callbacks*/ NULL, /* This is your client data */ &response ) ) != 0 ) { char fail_message[133]; UF_get_fail_message(error_code, fail_message); UF_UI_set_status (fail_message); printf ( "%s\n", fail_message ); } UF_terminate(); return; } Extern int ufusr_ask_unload (void) { return ( UF_UNLOAD_IMMEDIATELY ); } extern void ufusr_cleanup (void) { return; } int CH_create_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data) { if ( UF_initialize() != 0) return ( UF_UI_CB_CONTINUE_DIALOG ); UF_terminate (); return (UF_UI_CB_CONTINUE_DIALOG); } int CH_del_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data) { if ( UF_initialize() != 0) return ( UF_UI_CB_CONTINUE_DIALOG ); UF_terminate (); return (UF_UI_CB_CONTINUE_DIALOG); } int CH_ok_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data) { UF_STYLER_item_value_type_t data; Char *type_name="mill_planar"; char *subtype_name="program"; char group_name[132]="夏"; char buffer[200]; int min=1,max=5; int index1=3,i; tag_t ob_tag; tag_t setup_tag1; tag_t program_group; if ( uf_initialize() != 0) return ( uf_ui_cb_continue_dialog ); data.item_id=ch_str_1; Data.item_attr=uf_styler_value; UF_STYLER_ask_value(dialog_id,&data); strcpy(group_name, data.value.string); UF_STYLER_free_value( &data ); data.item_id=CH_INT_1; data.item_attr=UF_STYLER_VALUE; UF_STYLER_ask_value(dialog_id,&data); max=data.value.integer; UF_STYLER_free_value( &data ); UF_SETUP_ask_setup (&setup_tag1); UF_SETUP_ask_program_root (setup_tag1,&program_group); for (i=min;i<=max;i++) { if(i<10) { Sprintf( buffer, "%s0%d",group_name, i ); } else { sprintf( buffer, "%s%d",group_name, i ); } UF_NCPROG_create(type_name,subtype_name,&ob_tag); UF_OBJ_set_name(ob_tag,buffer); UF_NCGROUP_accept_member (program_group,ob_tag ); } UF_terminate (); return (UF_UI_CB_EXIT_DIALOG); } int CH_cancle_cb ( int dialog_id, void * client_data, UF_STYLER_item_value_type_p_t callback_data) { if ( UF_initialize() != 0) Return ( UF_UI_CB_CONTINUE_DIALOG ); UF_terminate (); return ( UF_UI_CB_EXIT_DIALOG ); } |