NX二次开发习题及源码.docx
- 文档编号:14084525
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:79
- 大小:1.45MB
NX二次开发习题及源码.docx
《NX二次开发习题及源码.docx》由会员分享,可在线阅读,更多相关《NX二次开发习题及源码.docx(79页珍藏版)》请在冰点文库上搜索。
NX二次开发习题及源码
1、创建NXhello界面
代码:
#include
#include
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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NX 二次开发 习题 源码