NX二次开发习题及源码.docx
《NX二次开发习题及源码.docx》由会员分享,可在线阅读,更多相关《NX二次开发习题及源码.docx(79页珍藏版)》请在冰豆网上搜索。
NX二次开发习题及源码
1、创建NXhello界面
代码:
#include//包含UF_initialize()和UF_terminate()函数原型的头文件
#include//包含uc1601()函数原型的头文件
externvoidufusr(char*param,int*retcode,intparam_len)
{
if(UF_initialize()!
=0)//获取NXopenapi的执行权限
{
return;
uc1601("HelloNX",1);//弹出消息窗口,显示“HelloNX”
UF_terminate();//释放NXOPENAPI的执行权限
}
}
运行结果截图:
2、创建一个模型,并在信息窗口显示模型的tag值。
代码:
#include
#include
#include
#include
#include
#include
staticvoiddo_ugopen_api(void)
{typedefunsignedinttag_t;
UF_FEATURE_SIGNsign=UF_NULLSIGN;//无布尔运算
doublecyl_orig[3]={0,0,0};//圆柱的圆心坐标
char*cyl_height="100";
char*cyl_diam="40";
doubledirection[3]={0,0,1};//延Z轴正方向
tag_tobj=NULL_TAG;
UF_MODL_create_cyl1(sign,cyl_orig,cyl_height,cyl_diam,direction,&obj);
UF_UI_open_listing_window();//显示信息框:
tag
/*Returnsthetagofthecurrentdisplaypart.Inanon-assemblypart,thisisthe
sameastheworkpart.Iftherecurrentlyisn'tadisplayedpart,aNULL_TAGisreturned.*/
obj=UF_PART_ask_display_part();
if(obj==NULL_TAG)//没有部件的时候显示的信息提示框
{
uc1601("当前没有任何文件可供操作!
",1);
}
else
{
chars[10];
sprintf(s,"%d",obj);//sprinf()功能:
把格式化的数据写入某个字符串
UF_UI_write_listing_window(s);
return;
}
}
externvoidufusr(char*param,int*retcode,intrlen)//提供入口点
{
if((UF_initialize())!
=0)
return;
do_ugopen_api();
UF_terminate();
return;
}
externintufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
运行结果截图:
(1)无部件时的输出
(2)有部件时的输出结果
3、openpart用户入口实例
创建openpartuserexit
在用户点击“open”时创建新部件,在其中创建sphere
详细说明userexit设置文件过程
代码如下:
#include
#include
#include
#include
#include
#include
#include
#defineUF_CALL(X)(report(__FILE__,__LINE__,#X,(X)))
staticintreport(char*file,intline,char*call,intirc)
{
if(irc)
{
charmessg[133];
printf("%s,line%d:
%s\n",file,line,call);
(UF_get_fail_message(irc,messg))?
printf("returneda%d\n",irc):
printf("returnederror%d:
%s\n",irc,messg);
}
return(irc);
}
staticvoiddo_ugopen_api(void)
{
UF_FEATURE_SIGNsign=UF_NULLSIGN;
tag_tpart=null_tag;//如果没有赋值的话,直接就是"tag_tpart",当你执行.dll文件时,就直接跑到建模环境了,没有信息提示框。
当然你可以多申明几个tag_t
charpart_name[13]="F:
\\long.prt";//设置part名字以及存储路径
doublecenter[3]={0,0,0};//球心坐标
char*diam="100";
intunits=1;
uc1601("创建直径为100的球",1);
UF_PART_new(part_name,units,&part);//在当前的会话框中创建新的part,并把其作为工作部件
//试比较下面两个函数
UF_MODL_create_sphere(sign,part,center,diam,&part);
//UF_MODL_create_sphere1(sign,center,diam,&part);
}
externvoidufusr(char*param,int*retcode,intparamLen)
{if(!
UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
externintufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
运行结果截图:
4、创建一个block,并指定某一特定面高亮显示。
代码如下图:
#include
#include
#include
#include
#include
#include
#include
#defineUF_CALL(X)(report(__FILE__,__LINE__,#X,(X)))
staticintreport(char*file,intline,char*call,intirc)
{
if(irc)
{
charmessg[133];
printf("%s,line%d:
%s\n",file,line,call);
(UF_get_fail_message(irc,messg))?
printf("returneda%d\n",irc):
printf("returnederror%d:
%s\n",irc,messg);
}
return(irc);
}
staticvoiddo_ugopen_api(void)
{
UF_FEATURE_SIGNsign=UF_NULLSIGN;
tag_tobj=null_tag;
doublecenter[3]={0,0,0};
char*edge_len[3]={"10","10","10"};
tag_tblk_feat;
intunits=2;//此行代码的赋值,经过调试,貌似只有1和2可以,它们的区别就是生成模型的默认大小不同,可以自己调调看。
charpart_name[13]="F:
\\long.part";//此段代码有点小重要,注意一定要保证完整性,不完整的话,估计会出现好多问题,绕好多路。
uc1601("创建一个正方体,并指定下表面高亮显示",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_tface_list;//链表
UF_MODL_create_list(&face_list);//创建链表
UF_MODL_ask_feat_faces(blk_feat,&face_list);//获取实体的个表面特征,并放入链表中
intcount=0;
UF_MODL_ask_list_count(face_list,&count);
for(inti=0;i{
UF_MODL_ask_list_item(face_list,i,&obj);//从链表中取出对象
inttype;
doublepoint[20];
doubledir[20];
doublebox[6];
doubleradius;
doublerad_data;
intnorm_dir;
UF_MODL_ask_face_data(obj,&type,point,dir,box,&radius,&rad_data,&norm_dir);//这个函数非常重要,可以说是本段代码中最核心的部分。
if(dir[0]==0&&dir[1]==0&&dir[2]==-1)//确定高亮显示的那个面的法向量
{
UF_DISP_set_highlight(obj,1);
//UF_OBJ_set_color(obj,186);
break;
}
}
}
/*ARGSUSED*/
externvoidufusr(char*param,int*retcode,intparamLen)
{
if(!
UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
externintufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
运行结果截图:
注:
和高亮显示还有一个类似的设置,就是给实体上色,所用到的函数是:
UF_OBJ_set_color(obj,186);
上面的这个函数是把对象显示成红色,如下图:
“186”是红色的代号。
这些数字可以在UG交互模式下的对象显示里查到,如下图:
5、用遍历的形式输出当前part所有面的tag至listingwindow
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#defineUF_CALL(X)(report(__FILE__,__LINE__,#X,(X)))
staticintreport(char*file,intline,char*call,intirc)
{
if(irc)
{
charmessg[133];
printf("%s,line%d:
%s\n",file,line,call);
(UF_get_fail_message(irc,messg))?
printf("returneda%d\n",irc):
printf("returnederror%d:
%s\n",irc,messg);
}
return(irc);
}
staticvoiddo_ugopen_api(void)
{
UF_FEATURE_SIGNsign=UF_NULLSIGN;
doublecenter[3]={0,0,0};
char*edge_len[3]={"100","100","100"};
tag_tblk_feat=null_tag;
char*part_name="F:
\\long";
intunits=1;
tag_tpart=NULL_TAG;
uc1601("创建一个block,并显示每个面的tag",1);
UF_PART_new(part_name,units,&part);//在当前会话窗口中创建一个part,并使其成为工作部件
UF_CALL(UF_MODL_create_block1(sign,center,edge_len,&blk_feat));
if(blk_feat==NULL_TAG)
{
uc1601("当前没有任何文件可供操作!
",1);
}
else
{
inttype=70;
intsubtype=2;
tag_tobj=null_tag;
tag_tdisplay_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)
{
chars[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"));
}
}
}
}
voidufusr(char*param,int*retcode,intparamLen)
{
if(!
UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
intufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
运行结果截屏:
6、遍历当前part中所有features,输出其类型至listingwindow,UF_MODL_ask_feat_type()
代码如下:
#include
#include
#include
#include
#include
#include
#defineUF_CALL(X)(report(__FILE__,__LINE__,#X,(X)))
staticintreport(char*file,intline,char*call,intirc)
{
if(irc)
{
charmessg[133];
printf("%s,line%d:
%s\n",file,line,call);
(UF_get_fail_message(irc,messg))?
printf("returneda%d\n",irc):
printf("returnederror%d:
%s\n",irc,messg);
}
return(irc);
}
staticvoiddo_ugopen_api(void)
{
char*part_name="F:
\\NX";
UF_FEATURE_SIGNsign=UF_NULLSIGN;
tag_tpart=null_tag;
doublecenter[3]={0,0,0};
char*diam="100";
intunits=1;
uc1601("创建直径为100的球,并显示其实体特征。
",1);
UF_PART_new(part_name,units,&part);//在当前的会话框中创建新的part,并把其作为工作部件
UF_MODL_create_sphere1(sign,center,diam,&part);
intcount=0;
char*solid_feature;
tag_tfound=NULL_TAG;
tag_tdisplay_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));
}
}
externvoidufusr(char*param,int*retcode,intparamLen)
{
if(!
UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
externintufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
运行结果截屏:
6、创建人机交互界面新建圆柱体,并可以随意选择原点和矢量方向。
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"cylinder.h"
#defineCHANGE_CB_COUNT(3+1)/*Add1fortheterminator*/
tag_tblk_tag=null_tag;
doubleblk_orig[]={0,0,0};
doubledirection[3];
char*part_name="F:
\\long";
intunits=1;
staticUF_STYLER_callback_info_tCHANGE_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}
};
staticUF_MB_styler_actions_tactions[]={
{"cylinder.dlg",NULL,CHANGE_cbs,UF_MB_STYLER_IS_NOT_TOP},
{NULL,NULL,NULL,0}/*ThisisaNULLterminatedlist*/
};
staticintinit_proc(UF_UI_selection_p_tselect,void*user_data);
externvoidufusr(char*param,int*retcode,intrlen)
{
uc1601("创建一个圆柱,并指明原点和矢量",1);
UF_PART_new(part_name,units,&blk_tag);
intresponse=0;
interror_code=0;
if((UF_initialize())!
=0)
return;