一、前言
現在越來越多的人開始使用NX,并希望能夠利用NX的開放性,開發出更適合自己公司的操作模式。 大部分人對計算機編程原理知之甚少,通常更愿意使用電腦作為一種工具來解決問題。為了滿足用戶易于使用的要求,程序越來越復雜。過去那種需要鍵入神秘指令,得到一 堆枯燥數據的日子已經一去不返了。今天的程序大都采用“用戶友好界面”,其中包括多窗口、菜單、對話框以及非常形象的標識。
NX軟件為用戶提供可視化開發工具:NX/OPEN UIStler。用戶可以方便地直接將對話框中的基本控件進行組合布局,創建不同功能需求的NX風格對話框與NX進行交互操作。
這篇內容主要是解決以下幾個方面的問題:
1.NX對話框的建立;
2.控件的訪問,屬性參數設置;
3.經常使用到的數據類型和函數;
4.常用控件的程序寫法。
一、NX對話框的建立
在NX啟動后選擇用戶界面樣式編輯器(Y)…,進入UIStyler 可視化界面。(如圖1、2)/ u. B" q k) g; `( K& T/ I7 Y
4 ?; b% O9 b- u+ Z; x0 |
二、控件的訪問及屬性參數設置
對話框控件的訪問有詢問控件屬性和設置控件屬性兩種方式,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 來定義。
下表中是詳細的說明:
9 K/ q' V ]( G* x8 _; m0 }
下面通過實例介紹各控件的代碼實現的方法:
之前必須了解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的對話框。
0 h: ~, ^' ^5 Q
一個字符串輸入框,一個整型輸入框,為了美觀,中間加一個分隔符,全部放在一個群組之中,設置屬性和環境變量。
第二步,保存為 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 );
}