函数UF_DRF_ask_dimension_text和UF_DRF_ask_dim_info都能获取尺寸的值,网上有作者提到两者之间有区别,后者在有附加文本的时候仅提取附加文本,我两个函数都使用了一下,代码及结果如下,UG工程图参考上篇图示。对比结果,UF_DRF_ask_dimension_text更适合提取尺寸值。我们可以通过尺寸值所在的尺寸段,按HB5800为自由尺寸自动添加不同的公差。原理就是用函数UF_DRF_ask_object_preferences( tagObj, mpi, mpr, radius_value, diameter_value )来设置公差,其中mpi[6]用来设置公差,=4为等值双向公差,=5不等值双向公差,=6单向上公差 =7单向下公差 =1无公差。mpr[24] 用来设置上公差值,mpr[25] 设置下公差值。下面以长度尺寸为例(即mpi[6]=4:等值双向公差。)代码见第二个代码段
//遍历所有尺寸
tag_t object_tag = NULL_TAG; //尺寸object_tag初始化
UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_dimension_type, &object_tag); // 遍历尺寸,获取TAG值
//打开文件
int fwl_file = uc4504("C:\\Users\\xiao'fan\\Desktop\\a.txt", 4, 79);
while (object_tag != NULL_TAG)//循环遍历
{
//获取尺寸值 ,方法一
char msg[256];
int dim_subtype = 0; //尺寸类型
double dim_origin[3]; //尺寸坐标点
UF_DRF_dim_info_p_t dim_info;
UF_DRF_ask_dim_info(object_tag, &dim_subtype, dim_origin, &dim_info);
uc4524(fwl_file,dim_info->text_info->text->string);//尺寸文本写入TXT文件
/* //获取尺寸值 ,方法二
int num_main_text = 0;
char** main_text;
int num_dual_text = 0;
char** dual_text;
UF_DRF_ask_dimension_text(object_tag, &num_main_text, &main_text, &num_dual_text, &dual_text);
uc4524(fwl_file,main_text[0]);//尺寸文本写入TXT文件
*/
UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_dimension_type, &object_tag); //再次遍历,获取TAG值
}
uc4540(fwl_file,0);//关闭文件
为长度尺寸自动添加公差代码如下:
//假定只选择一个对象
tag_t *tagObjects; //选定对象的TAG
int num_objects = 0; //选定的对象初始值
UF_UI_ask_global_sel_object_list(&num_objects, &tagObjects); //查询选定对象数量级TAG值
tag_t tagObj = tagObjects[0]; //选定一个尺寸
//获取选定自由尺寸的尺寸值
double fwl_chicun;
int num_main_text = 0;
char** main_text;
int num_dual_text = 0;
char** dual_text;
UF_DRF_ask_dimension_text(tagObj, &num_main_text, &main_text, &num_dual_text, &dual_text);
//字符串转换为double值
fwl_chicun = atof(main_text[0]);
//针对选定的尺寸,确定尺寸段的公差值,更改它的设置
double fwl_gc;
int mpi [100] ;
double mpr [70] ;
char radius_value [27];
char diameter_value [27] ;
UF_DRF_ask_object_preferences( tagObj, mpi, mpr, radius_value, diameter_value );
if ( mpi[6] == 1 ) //mpi[6] = 1 时无公差
{if (fwl_chicun>0.1&&fwl_chicun<=0.3)
{fwl_gc=0.05;}
else if (fwl_chicun>0.3&&fwl_chicun<=0.6)
fwl_gc=0.1;
else if (fwl_chicun>0.6&&fwl_chicun<1)
fwl_gc=0.1;
else if (fwl_chicun>=1&&fwl_chicun<=3)
fwl_gc=0.12;
else if (fwl_chicun>3&&fwl_chicun<=6)
fwl_gc=0.15;
else if (fwl_chicun>6&&fwl_chicun<=10)
fwl_gc=0.18;
else if (fwl_chicun>10&&fwl_chicun<=18)
fwl_gc=0.21;
else if (fwl_chicun>18&&fwl_chicun<=30)
fwl_gc=0.26;
else if (fwl_chicun>30&&fwl_chicun<=50)
fwl_gc=0.31;
else if (fwl_chicun>50&&fwl_chicun<=80)
fwl_gc=0.37;
else if (fwl_chicun>80&&fwl_chicun<=120)
fwl_gc=0.43;
else if (fwl_chicun>120&&fwl_chicun<=180)
fwl_gc=0.5;
else if (fwl_chicun>180&&fwl_chicun<=250)
fwl_gc=0.57;
else if (fwl_chicun>250&&fwl_chicun<=315)
fwl_gc=0.65;
else if (fwl_chicun>315&&fwl_chicun<=400)
fwl_gc=0.7;
else if (fwl_chicun>400&&fwl_chicun<=500)
fwl_gc=0.77;
else if (fwl_chicun>500&&fwl_chicun<=630)
fwl_gc=0.87;
else if (fwl_chicun>630&&fwl_chicun<=800)
fwl_gc=1.00;
else if (fwl_chicun>800&&fwl_chicun<=1000)
fwl_gc=1.15;
else if (fwl_chicun>1000&&fwl_chicun<=1250)
fwl_gc=1.30;
else if (fwl_chicun>1250&&fwl_chicun<=1600)
fwl_gc=1.55;
else if (fwl_chicun>1600&&fwl_chicun<=2000)
fwl_gc=1,85;
else if (fwl_chicun>2000&&fwl_chicun<=2500)
fwl_gc=2.2;
else if (fwl_chicun>2500&&fwl_chicun<=3150)
fwl_gc=2.7;
mpi[6] = 4 ; //长度尺寸设置公差为双向等值公差
mpr[24] = fwl_gc ; //根据尺寸段结果设置公差值
UF_DRF_set_object_preferences(tagObj, mpi, mpr, radius_value, diameter_value );//对尺寸公差进行设置,从而添加公差
UF_free(tagObjects);
}
else
{uc1601("尺寸有公差或者尺寸超出范围",1);}
效果如下:为尺寸135及70添加了公差,并在有公差的情况下再次执行代码时会提示