UG二次开发.docx
《UG二次开发.docx》由会员分享,可在线阅读,更多相关《UG二次开发.docx(43页珍藏版)》请在冰豆网上搜索。
![UG二次开发.docx](https://file1.bdocx.com/fileroot1/2023-5/17/3e4a7789-f038-459d-84a0-d806389d77dd/3e4a7789-f038-459d-84a0-d806389d77dd1.gif)
UG二次开发
UG二次开发模板
第一章技巧规则
(2)
第二章函数模板(4)
第三章功能模板(11)
第四章udop(24)
注:
连接:
Ctrl+单击鼠标左键
第一章技巧规则
1,内存原则:
【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。
防止使用指针值为NULL的内存。
【规则2】不要忘记为数组和动态内存赋初值。
防止将未被初始化的内存作为右
值使用。
【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”
操作。
【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产
生“野指针”。
2,
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。
指针远比数组灵活,但也更危险。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘
汰出局呢?
这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
2,分配空间
double(*point)[3];
point=newdouble[count][3];
delete[]point;//正确的用法
/*deletepoint;//错误的用法=deletepoint[0]*/
3,
UF_MODL_update();//使用UF_MODL_edit时用来刷新
4UF_UI_ONT_refresh();//刷新导航器
头文件#include
UF_DISP_refresh();//去除临时文件
#include
5调试工具
1)uc1601//显示消息对话框
头文件:
#include
用法1:
charinf[100];
sprintf(inf,"%f",);
uc1601(inf,1);
用法2:
uc1601("",1);
2)UF_UI_write_listing_window//显示文本框
头文件:
#include
charinf[100];
UF_UI_open_listing_window();
sprintf(inf,"%",);
UF_UI_write_listing_window(inf);
6,隐藏中间过程
#include
UF_DISP_set_display(UF_DISP_SUPPRESS_DISPLAY);//打开隐藏
UF_DISP_set_display(UF_DISP_UNSUPPRESS_DISPLAY);//关闭隐藏
第二章函数模板
1,uc1600//获取字符串
头文件:
#include
intres=0;
intlen=0;
charstring[100]="";
res=uc1600("",string,&len);//string:
Input/Output
if(res==5||(res==3&&len>0))
{
}
else
{
}
2,uc1603//
头文件:
#include
用法1:
chartitle[100]="菜单";
charitems[3][38]={"选项1","选项2","选项3"};
choice=uc1603(title,0,items,3);
if(choice==1||choice==2)
{
UF_terminate();
}
else
{
if(choice==)
{
}
}
用法2:
charitems[3][38]={"选项1","选项2","选项3"};
response=uc1603("菜单",0,items,3);
switch(response)
{
case1:
case2:
break;
case4:
case5:
}
3,选择对话框头文件
头文件1:
init_proc_face
staticintinit_proc_face(UF_UI_selection_p_tselect,void*user_data)
{
intnums=1;
UF_UI_mask_tmasks[]={
UF_solid_type,0,UF_UI_SEL_FEATURE_ANY_FACE};
if((UF_UI_set_sel_mask(select,
UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,
nums,masks))==0)
{
return(UF_UI_SEL_SUCCESS);
}
else
{
return(UF_UI_SEL_FAILURE);
}
}
头文件2:
init_proc_body
staticintinit_proc_body(UF_UI_selection_p_tselect,void*user_data)
{
intnum_triples=1;
UF_UI_mask_tmask_triples[]={UF_solid_type,0,UF_UI_SEL_FEATURE_BODY};
/*enableonlylinesandedges*/
if((UF_CALL(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);
}
}
4,UF_UI_select_with_single_dialog
头文件:
#include
chartitle[]="";
charcue[]="";
intresponse=0;
doublecursor[3];
tag_tface=NULL;
tag_tview=NULL;
if(!
UF_CALL(UF_UI_select_with_single_dialog(cue,title,UF_UI_SEL_SCOPE_NO_CHANGE,init_proc_face,NULL,
&response,&face,cursor,&view)))
{
if(response==UF_UI_OBJECT_SELECTED||
response==UF_UI_OBJECT_SELECTED_BY_NAME)
{
printf("objecttag=%d\n",face);
}
UF_DISP_set_highlight(face,0);//关高亮
}
5,UF_UI_select_with_class_dialog
头文件:
#include
voidclass_sel_dlg(int*count,tag_p_t*objects)
{
charcue[]="";
chartitle[]="";
intresponse,sel_count,i;
tag_p_tsel_objects;
if((UF_CALL(UF_UI_select_with_class_dialog(
cue,title,UF_UI_SEL_SCOPE_NO_CHANGE,
init_proc_face,NULL,&response,&sel_count,&sel_objects)))==0)
{
printf("objectcount=%d\n",sel_count);
if(response==UF_UI_OK&&sel_count>0)
{
*objects=sel_objects;
*count=sel_count;
for(i=0;i{
printf("objecttag=%d\n",sel_objects[i]);
UF_DISP_set_highlight(sel_objects[i],0);
}
UF_free(objects);
}
}
}
6,UF_MODL_delete_object_parms//消参
头文件:
#include
#include
uf_list_p_tobj_list;
UF_CALL(UF_MODL_create_list(&obj_list));
UF_CALL(UF_MODL_put_list_item(obj_list,));
UF_CALL(UF_MODL_put_list_item(obj_list,));
UF_MODL_delete_object_parms(obj_list);
UF_MODL_delete_list(&obj_list);
UF_OBJ_delete_object();
7,UF_CURVE_create_arc//通过圆心,半径画圆
头文件:
#include
#include
tag_tarc,wcs_tag;
UF_CSYS_ask_wcs(&wcs_tag);
UF_CURVE_arc_tarc_coords;
UF_CSYS_ask_matrix_of_object(wcs_tag,&wcs_tag);
arc_coords.matrix_tag=wcs_tag;
arc_coords.start_angle=0.0;
arc_coords.end_angle=360.0*DEGRA;
arc_coords.arc_center[0]=center[0];//
arc_coords.arc_center[1]=center[1];//
arc_coords.arc_center[2]=center[2];//
arc_coords.radius=500;
UF_CURVE_create_arc(&arc_coords,&arc_id);
8,UF_OBJ_set_name(tag,name);//设置名字
头文件#include
9,name开关
intname_status;
UF_DISP_ask_name_display_status(&name_status);
if(name_status==UF_DISP_NAME_DISPLAY_OFF)
{
name_status=UF_DISP_NAME_DISPLAY_ON;
}
else
{
name_status=UF_DISP_NAME_DISPLAY_OFF;
}
UF_DISP_set_name_display_status(name_status);
10,UF_OBJ_set_color(tag,color);//设置颜色
头文件#include
11,UF_OBJ_set_layer(tag,layer);//设置层
头文件#include
12,UF_CALL
头文件#include
intUF_CALL(interrorCode)
{
if(errorCode)
{
charmessage[133]="";
UF_get_fail_message(errorCode,message);
uc1601(message,1);
}
return(errorCode);
}
13,UF_PART_ask_display_part
头文件#include
tag_tpart=UF_PART_ask_display_part();
if(NULL==part)
{
uc1601("",1);
return;
}
14,UF_OPER_create
头文件#include
tag_tOper_id=NULL;
UF_OPER_create("mill_contour","ZLEVEL_PROFILE_YBC",&GZM_Oper_id);
15,UF_MODL_ask_face_data//查询面的信息
头文件#include
tag_tface;//面的ID
inttype;//面的类型
doublebox[6];//x,y,z向最大,最小值
doubleradius;
doublerad_data;
intnorm_dir;//法向
UF_MODL_ask_face_data(face,&type,center,
dir,box,&radius,&rad_data,&norm_dir);
16,UF_MODL_ask_minimum_dist_2//查询两物体间距离
doubledis,accuracy;//accuracy:
准确度
doublepoint1[3]={0};
doublepoint2[3]={0};
UF_CALL(UF_MODL_ask_minimum_dist_2(obj1,obj2,0,NULL,0,NULL,
&dis,point1,point1,&accuracy));
第三章功能模板
1,制作对话框
1)进入UserInterfaceStyler,设计好对话框,将LaunchDialogFrom改为Callback保存
2)将生成的对话框文件放在模板文件夹下,以记事本格式打开XX._template.C文件,将externint(int*response)改为externintXXX(int*response)后保存。
3)打开VC的Templet,依次点击Tools->options->directories,将XX.h所在的文件夹包含进去。
4)在Templet.cpp中加入#include"XX_template.c"
#include"XX.h"
5)在程序内写入intresponse;
XXX(&response);点击F7,编译成功。
2,对话框求值,设值
UF_STYLER_item_value_type_tvalue;
value.item_attr=UF_STYLER_VALUE;
value.item_id=XXX;//在.h文件中定义的ID
UF_STYLER_ask_value(dialog_id,&value);//读值
/*赋值到变量中,变量在.h文件中定义,根据对话框定义不同类型:
real,string,strings,integer,integers,real,reals*/
XXX=value.value.real;//赋值
value.item_id=XXX;//在.h文件中定义的ID
value.count=1;//拉伸条移动
UF_STYLER_set_value(dialog_id,&value);//设值
UF_STYLER_free_value(&value);//释放空间
3,
1),设置控件的激活状态
UF_STYLER_item_value_type_tvalue;
value.item_attr=UF_STYLER_SENSITIVITY;//指定设置控件的激活状态
value.item_id=XXX;//在.h文件中定义的ID
value.value.integer=FALSE;//FALSE为不激活,TRUE为激活
UF_STYLER_set_value(dialog_id,&value);
2),设置对话框是否能选择物体
UF_UI_mask_tall_mask[]={
UF_circle_type,0,0,
UF_cylinder_type,0,0,
UF_line_type,0,0
};
UF_STYLER_item_value_type_tvalue;
value.item_attr=UF_STYLER_SELECTION;
value.item_id=UF_STYLER_DIALOG_INDEX;
UF_STYLER_ask_value(dialog_id0,&value);
UF_UI_set_sel_type(value.value.selection,UF_UI_SEL_TYPE_INACTIVE_SELECTION);//不能选择
//UF_UI_SEL_TYPE_SINGLE_SELECTION
//UF_UI_SEL_TYPE_SINGLE_DESELECTION
//UF_UI_SEL_TYPE_ROBUST_SELECTION能选择
//UF_UI_SEL_TYPE_SINGLE_POSITION
//UF_UI_SEL_TYPE_RECTANGLE_POSITION
if((UF_UI_set_sel_mask(value.value.selection,
UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,2,all_mask)))
{
return(UF_UI_CB_CONTINUE_DIALOG);
}
2,查询选择物体
UF_STYLER_item_value_type_tvalue;
value.item_attr=UF_STYLER_SELECTION;
value.item_id=UF_STYLER_DIALOG_INDEX;
UF_STYLER_ask_value(dialog_id0,&value);
UF_UI_ask_sel_object_list(value.value.selection,&count,&objects);
4,求三面交点
头文件
voidchange(doubleAB[3][4],intline);
voidrow_change(doubleAB[3][4],introw);
doublexyz[3];///交点坐标
doubleAB[3][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0}};
doubledot_product;
UF_VEC3_dot(dir,center,&dot_product);
AB[0][0]=dir[0];AB[0][1]=dir[1];
AB[0][2]=dir[2];AB[0][3]=dot_product;
doubledot_product1;
UF_VEC3_dot(dir1,center1,&dot_product1);
AB[1][0]=dir1[0];AB[1][1]=dir1[1];
AB[1][2]=dir1[2];AB[1][3]=dot_product1;
doubledot_product2;
UF_VEC3_dot(dir2,floor_center,&dot_product2);
AB[2][0]=dir2[0];AB[2][1]=dir2[1];
AB[2][2]=dir2[2];AB[2][3]=dot_product2;
for(intj=0;j<3;j++)
{
change(AB,j);
row_change(AB,j);
}
xyz[2]=AB[2][3];
xyz[1]=AB[1][3]-AB[1][2]*xyz[2];
xyz[0]=AB[0][3]-AB[0][2]*xyz[2]-AB[0][1]*xyz[1];
子函数:
voidchange(doubleAB[3][4],intline)
{
doublemax=0;
doublebuffer=0;
intbj=-1;
doublemax_x=0;
for(inti=line;i<3;i++)
{
max_x=fabs(AB[i][line]);
if(max_x>max)
{
max=max_x;
bj=i;
}
}
for(intj=0;j<4;j++)
{
buffer=AB[bj][j];
AB[bj][j]=AB[line][j];
AB[line][j]=buffer;
}
}
//初等行变换
voidrow_change(doubleAB[3][4],introw)
{
for(intj=row;j<3;j++)
{
doubledivisor