《NX二次開發(fā)習題及源碼.doc》由會員分享,可在線閱讀,更多相關《NX二次開發(fā)習題及源碼.doc(58頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、創(chuàng)建NXhello界面
代碼:
#include
//包含UF_initialize()和UF_terminate()函數(shù)原型的頭文件
#include //包含uc1601()函數(shù)原型的頭文件
extern void ufusr(char *param, int *retcode, int param_len)
{
if (UF_initialize()!=0)//獲取NX openapi的執(zhí)行權(quán)限
{
return;
uc1601("Hello NX",1);//彈出消息窗口,顯示“Hello NX”
UF_terminate();//釋放NX OPEN API的執(zhí)行權(quán)限
}
}
運行結(jié)果截圖:
2、創(chuàng)建一個模型,并在信息窗口顯示模型的tag值。
代碼:
#include
#include
#include
#include < uf_ui_ugopen.h>
#include
#include
static void do_ugopen_api(void)
{ typedef unsigned int tag_t;
UF_FEATURE_SIGN sign = UF_NULLSIGN;//無布爾運算
double cyl_orig[3] = {0,0,0};//圓柱的圓心坐標
char *cyl_height="100";
char *cyl_diam="40";
double direction[3]={0,0,1};//延Z軸正方向
tag_t obj=NULL_TAG;
UF_MODL_create_cyl1(sign, cyl_orig,cyl_height,cyl_diam,direction, &obj);
UF_UI_open_listing_window(); //顯示信息框:tag
/*Returns the tag of the current display part. In a non-assembly part, this is the
same as the work part. If there currently isnt a displayed part, a NULL_TAG is returned. */
obj=UF_PART_ask_display_part();
if(obj == NULL_TAG) //沒有部件的時候顯示的信息提示框
{
uc1601 ( "當前沒有任何文件可供操作!",1);
}
else
{
char s[10];
sprintf(s, "%d",obj); //sprinf()功能:把格式化的數(shù)據(jù)寫入某個字符串
UF_UI_write_listing_window(s);
return;
}
}
extern void ufusr( char *param, int *retcode, int rlen )//提供入口點
{
if((UF_initialize())!=0)
return;
do_ugopen_api ();
UF_terminate();
return;
}
extern int ufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
運行結(jié)果截圖:
(1)無部件時的輸出
(2)有部件時的輸出結(jié)果
3、open part 用戶入口實例
創(chuàng)建open part user exit
在用戶點擊“open”時創(chuàng)建新部件,在其中創(chuàng)建sphere
詳細說明user exit設置文件過程
代碼如下:
#include < uf_assem.h>
#include
#include
#include
#include
#include
#include
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf(" returned error %d: %s\n", irc, messg);
}
return(irc);
}
static void do_ugopen_api(void)
{
UF_FEATURE_SIGN sign = UF_NULLSIGN;
tag_t part=null_tag;//如果沒有賦值的話,直接就是"tag_t part",當你執(zhí)行.dll文件時,就直接跑到建模環(huán)境了,沒有信息提示框。當然你可以多申明幾個tag_t
char part_name[13] = "F:\\long.prt";//設置part名字以及存儲路徑
double center [ 3 ]={0,0,0};//球心坐標
char * diam="100";
int units =1;
uc1601("創(chuàng)建直徑為100的球",1);
UF_PART_new (part_name, units, &part);//在當前的會話框中創(chuàng)建新的part,并把其作為工作部件
//試比較下面兩個函數(shù)
UF_MODL_create_sphere(sign,part,center,diam, &part );
//UF_MODL_create_sphere1(sign,center,diam, &part);
}
extern void ufusr(char *param, int *retcode, int paramLen)
{ if (!UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
extern int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}
運行結(jié)果截圖:
4、創(chuàng)建一個block,并指定某一特定面高亮顯示。
代碼如下圖:
#include
#include
#include
#include
#include
#include
#include
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf(" returned error %d: %s\n", irc, messg);
}
return(irc);
}
static void do_ugopen_api(void)
{
UF_FEATURE_SIGN sign=UF_NULLSIGN;
tag_t obj=null_tag;
double center [3]={0,0,0} ;
char *edge_len[3]={"10","10","10"};
tag_t blk_feat;
int units=2;//此行代碼的賦值,經(jīng)過調(diào)試,貌似只有1和2可以,它們的區(qū)別就是生成模型的默認大小不同,可以自己調(diào)調(diào)看。
char part_name[13]="F:\\long.part";//此段代碼有點小重要,注意一定要保證完整性,不完整的話,估計會出現(xiàn)好多問題,繞好多路。
uc1601("創(chuàng)建一個正方體,并指定下表面高亮顯示",1);
UF_PART_new(part_name,units,&obj);
//UF_MODL_create_block(sign,obj,center,edge_len,&blk_feat);
UF_MODL_create_block1(sign,center,edge_len,&blk_feat);
uf_list_p_t face_list;//鏈表
UF_MODL_create_list(&face_list);//創(chuàng)建鏈表
UF_MODL_ask_feat_faces(blk_feat,&face_list);//獲取實體的個表面特征,并放入鏈表中
int count=0;
UF_MODL_ask_list_count(face_list,&count);
for(int i=0;i
#include
#include
#include
#include
#include
#include
#include
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf("returned error %d: %s\n", irc, messg);
}
return(irc);
}
static void do_ugopen_api(void)
{
UF_FEATURE_SIGN sign = UF_NULLSIGN;
double center [ 3 ] = {0,0,0};
char * edge_len [ 3 ]={"100","100","100"};
tag_t blk_feat =null_tag;
char * part_name="F:\\long";
int units=1;
tag_t part =NULL_TAG;
uc1601("創(chuàng)建一個block,并顯示每個面的tag",1);
UF_PART_new(part_name,units,&part);//在當前會話窗口中創(chuàng)建一個part,并使其成為工作部件
UF_CALL(UF_MODL_create_block1(sign,center,edge_len, &blk_feat));
if(blk_feat == NULL_TAG)
{
uc1601 ( "當前沒有任何文件可供操作!",1);
}
else
{
int type=70;
int subtype=2;
tag_t obj=null_tag;
tag_t display_part=UF_PART_ask_display_part();
UF_OBJ_cycle_objs_in_part(display_part,70,&obj);
while(obj!=null_tag)
{
UF_OBJ_ask_type_and_subtype(obj,&type,&subtype);//返回一個被標記的對象的對象類型和子類型
UF_OBJ_cycle_objs_in_part (display_part,UF_solid_type,&obj);//查詢遍歷對象
if(subtype== UF_solid_face_subtype)
{
char s[50];
sprintf(s, "%d", obj);
UF_CALL(UF_UI_open_listing_window());
UF_CALL(UF_UI_write_listing_window(s));
UF_CALL(UF_UI_write_listing_window("\n"));
}
}
}
}
void ufusr(char *param, int *retcode, int paramLen)
{
if (!UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}
運行結(jié)果截屏:
6、遍歷當前part中所有features,輸出其類型至listing window,UF_MODL_ask_feat_type()
代碼如下:
#include
#include
#include
#include
#include
#include
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf(" returned error %d: %s\n", irc, messg);
}
return(irc);
}
static void do_ugopen_api(void)
{
char * part_name="F:\\NX";
UF_FEATURE_SIGN sign = UF_NULLSIGN;
tag_t part=null_tag;
double center [ 3 ]={0,0,0};
char * diam="100";
int units =1;
uc1601("創(chuàng)建直徑為100的球,并顯示其實體特征。",1);
UF_PART_new (part_name, units, &part);//在當前的會話框中創(chuàng)建新的part,并把其作為工作部件
UF_MODL_create_sphere1(sign,center,diam, &part);
int count = 0;
char* solid_feature;
tag_t found = NULL_TAG;
tag_t display_part = UF_PART_ask_display_part();
UF_UI_open_listing_window();
UF_OBJ_cycle_objs_in_part(display_part,UF_feature_type,&found);
while( found != NULL_TAG )
{
count++;
UF_CALL(UF_MODL_ask_feat_type(found,&solid_feature));//獲取輸入的特征的類型
UF_CALL(UF_UI_write_listing_window("feature:"));
UF_CALL(UF_UI_write_listing_window(solid_feature));
UF_CALL(UF_UI_write_listing_window("\n"));
UF_CALL(UF_OBJ_cycle_objs_in_part(display_part,UF_feature_type,&found));
}
}
extern void ufusr(char *param, int *retcode, int paramLen)
{
if (!UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
extern int ufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
運行結(jié)果截屏:
6、創(chuàng)建人機交互界面新建圓柱體,并可以隨意選擇原點和矢量方向。
代碼如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "cylinder.h"
#define CHANGE_CB_COUNT ( 3 + 1 ) /* Add 1 for the terminator */
tag_t blk_tag= null_tag;
double blk_orig[] = {0,0,0};
double direction [ 3 ];
char * part_name="F:\\long";
int units=1;
static UF_STYLER_callback_info_t CHANGE_cbs[CHANGE_CB_COUNT] =
{
{UF_STYLER_DIALOG_INDEX, UF_STYLER_APPLY_CB , 0, CHANGE_apply_cb},
{CHANGE_ACTION_2 , UF_STYLER_ACTIVATE_CB , 1, CHANGE_action_2_act_cb},
{CHANGE_ACTION_3 , UF_STYLER_ACTIVATE_CB , 1, CHANGE_action_3_act_cb},
{UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }
};
static UF_MB_styler_actions_t actions[] = {
{ "cylinder.dlg", NULL, CHANGE_cbs, UF_MB_STYLER_IS_NOT_TOP },
{ NULL, NULL, NULL, 0 } /* This is a NULL terminated list */
};
static int init_proc(UF_UI_selection_p_t select,void *user_data);
extern void ufusr (char *param, int *retcode, int rlen)
{
uc1601("創(chuàng)建一個圓柱,并指明原點和矢量",1);
UF_PART_new(part_name,units,&blk_tag);
int response = 0;
int error_code = 0;
if ( ( UF_initialize() ) != 0 )
return;
if ( ( error_code = UF_STYLER_create_dialog ( "cylinder.dlg",
CHANGE_cbs, /* Callbacks from dialog */
CHANGE_CB_COUNT, /* number of callbacks*/
NULL, /* This is your client data */
&response ) ) != 0 )
{
char fail_message[133];
/* Get the user function fail message based on the fail code.*/
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 CHANGE_apply_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 );
//直徑的相關參數(shù)
UF_STYLER_item_value_type_t data;
data.item_id = "REAL_0";
data.item_attr = UF_STYLER_VALUE;
data.indicator = UF_STYLER_REAL_VALUE;
UF_STYLER_ask_value(dialog_id,&data);//用來查詢對話框控件的屬性值。
char diameter[133];
sprintf(diameter,"%f",data.value.real);
//高度的相關參數(shù)
data.item_id = "REAL_1";
data.item_attr = UF_STYLER_VALUE;
data.indicator = UF_STYLER_REAL_VALUE;
UF_STYLER_ask_value(dialog_id,&data);
char height[133];
sprintf(height,"%f",data.value.real);
UF_FEATURE_SIGN sign = UF_NULLSIGN;
//tag_t blk_tag= null_tag;
//UF_PART_new(part_name,units,&blk_tag);
UF_MODL_create_cyl1(sign,blk_orig,diameter,height,direction , &blk_tag);
UF_STYLER_free_value(&data);//釋放字符串或數(shù)組申請的內(nèi)存
UF_STYLER_ask_value(dialog_id,&data);
UF_MODL_update();
UF_STYLER_free_value(&data);
UF_terminate ();
return (UF_UI_CB_CONTINUE_DIALOG);
}
//選擇圓柱中心點,選用點構(gòu)造器UF_UI_point_construct()
int CHANGE_action_2_act_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 );
char *cue = "點構(gòu)造器";
UF_UI_POINT_base_method_t method = UF_UI_POINT_INFERRED;
tag_t point_tag = NULL_TAG;
//double sBasePoint[3];;
int response;
int error = UF_UI_point_construct(cue,
&method,
&point_tag,
blk_orig,
&response);
UF_terminate ();
return (UF_UI_CB_CONTINUE_DIALOG);
}
//選擇圓柱方向(拾取向量對話框)
int CHANGE_action_3_act_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 );
double vec[3], pnt[3];
int mode = UF_UI_ZC_AXIS;//默認矢量方向
int disp_flag = UF_UI_DISP_NO_VECTOR;//顯示臨時坐標,是比較UF_UI_DISP_NO_VECTOR
int response = 0;
int ifail;
UF_initialize();
ifail = UF_UI_specify_vector( "選擇一個矢量",
&mode,
disp_flag,
vec,
pnt,
&response );
if ( ifail != 0 || response != UF_UI_OK )
printf( "No vector selected \n" );
else
printf( "Vect base (%f, %f, %f), direction (%f, %f, %f) \n",
pnt[0], pnt[1], pnt[2], vec[0], vec[1], vec[2] );
fflush( stdout );
UF_terminate ();
//double direction[3];
for(int i=0;i<3;i++)
{
direction[i]=vec[i]-pnt[i];
}
/* Callback acknowledged, do not terminate dialog */
return (UF_UI_CB_CONTINUE_DIALOG);
}
static int init_proc(UF_UI_selection_p_t select,void* user_data)
{
//指明了mask_triple數(shù)組的長度
int num_triples = 1;
UF_UI_mask_t mask_triples[] = {UF_solid_type, 0, UF_UI_SEL_FEATURE_SOLID_BODY};
if((UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,
num_triples,
mask_triples)) == 0)
{
return (UF_UI_SEL_SUCCESS);
}
else
{
return (UF_UI_SEL_FAILURE);
}
}
運行結(jié)果截屏
7、(1)新建一個對象,選擇對象的面,返回這個面的tag值。
代碼如下:
#include
#include
#include
#include
#include
static int sel_init_proc(UF_UI_selection_p_t select,void *user_data);
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf(" returned error %d: %s\n", irc, messg);
}
return(irc);
}
static void do_ugopen_api(void)
{
//類選擇對話框相關變量
char cue[] = "Select Objects";
char title[] = "Select faces";
int scope=UF_UI_SEL_SCOPE_NO_CHANGE;
int response, count, i;
tag_p_t objects;
int error_code = 0;
char* str = (char*)UF_allocate_memory(sizeof(unsigned int)+1,&error_code);
UF_UI_open_listing_window();
if((UF_CALL(UF_UI_select_with_class_dialog(
cue, title, scope,sel_init_proc, NULL, &response, &count, &objects))) == 0)
{
printf("object count = %d\n",count);
if (response == UF_UI_OK && count > 0)
{
for (i=0; i
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "Multiple_text.h"
using namespace std;
#define CHANGE_CB_COUNT ( 3 + 1 ) /* Add 1 for the terminator */
char prompt_string[133]="請選取文本文件";
char title_string[133]="選取文本文件";
char filter_string[133] = "文本文件";
char default_name[133]=" ";
char filename[133];
int response=0;
static UF_STYLER_callback_info_t CHANGE_cbs[CHANGE_CB_COUNT] =
{
{UF_STYLER_DIALOG_INDEX, UF_STYLER_APPLY_CB , 0, CHANGE_apply_cb},
{CHANGE_ACTION_1 , UF_STYLER_ACTIVATE_CB , 1, CHANGE_action_1_act_cb},
{CHANGE_ACTION_2 , UF_STYLER_ACTIVATE_CB , 1, CHANGE_action_2_act_cb},
{UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }
};
static UF_MB_styler_actions_t actions[] = {
{ "Multiple_text.dlg", NULL, CHANGE_cbs, UF_MB_STYLER_IS_NOT_TOP },
{ NULL, NULL, NULL, 0 } /* This is a NULL terminated list */
};
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 ( "Multiple_text.dlg",
CHANGE_cbs, /* Callbacks from dialog */
CHANGE_CB_COUNT, /* number of callbacks*/
NULL, /* This is your client data */
&response ) ) != 0 )
{
char fail_message[133];
/* Get the user function fail message based on the fail code.*/
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)
{
/* unload immediately after application exits*/
return ( UF_UNLOAD_IMMEDIATELY );
/*via the unload selection dialog... */
/*return ( UF_UNLOAD_SEL_DIALOG ); */
/*when UG terminates... */
/*return ( UF_UNLOAD_UG_TERMINATE ); */
}
extern void ufusr_cleanup (void)
{
return;
}
int CHANGE_apply_cb ( int dialog_id,
void * client_data,
UF_STYLER_item_value_type_p_t callback_data)
{
/* Make sure User Function is available. */
if ( UF_initialize() != 0)
return ( UF_UI_CB_CONTINUE_DIALOG );
/* ---- Enter your callback code here ----- */
UF_terminate ();
/* Callback acknowledged, do not terminate dialog */
/* A return value of UF_UI_CB_EXIT_DIALOG will not be accepted */
/* for this callback type. You must respond to your apply button.*/
return (UF_UI_CB_CONTINUE_DIALOG);
}
int CHANGE_action_1_act_cb ( int dialog_id,
void * client_data,
UF_STYLER_item_value_type_p_t callback_data)
{
/* Make sure User Function is available. */
if ( UF_initialize() != 0)
return ( UF_UI_CB_CONTINUE_DIALOG );
/* ---- Enter your callback code here ----- */
UF_UI_create_filebox ( prompt_string,
title_string,
filter_string,
default_name,
鏈接地址:http://www.820124.com/p-6525041.html