首先创建一个长方体,然后利用函数UF_MODL_ask_exps_of_feature访问长方体特征中的所有表达式的个数和标识,利用函数UF_MODL_ask_exp_tag_string获得表达式字符串,并用函数UF_MODL_dissect_exp_string分离表达式的名称和数值,最后利用函数UF_MODL_rename_exp对表达式重命名,并利用函数UF_MODL_eval_exp计算表达式的值;通过函数UF_MODL_edit_exp修改表达式的值,然后利用函数UF_MODL_update来更新模型。
int modelTe::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
try
{
if(block == button0)
{
char *block_len[3] = {"1", "2", "3"}; //长宽高
double block_orig[3] = {0.0, 0.0, 0.0}; //原点
tag_t blk_obj; //长方体特征的标识
int number_of_exps = 0, i; //部件中所有表达式的个数
tag_t *exps; //部件中所有表达式的标识
char buffer[MAX_STRING_LEN];
char *string; //表达式的字符串
char *lhs_str, *rhs_str; //表达式中等号左边的字符串和右边的字符串
tag_t exp_tag; //对应的表达式的标识
char *name[3]; //新的表达式的名称
name[0] = "l";
name[1] = "w";
name[2] = "h";
double exp_value; //表达式等号右边的值
UF_UI_open_listing_window(); //打开文本
//第一个参数:创建新的几何实体
//第二个参数:长方体的原点
//第三个参数:长宽高
//第四个参数:输出参数,长方体的特征标识
UF_MODL_create_block1(UF_NULLSIGN, block_orig, block_len, &blk_obj); //创建一个长方体
//第一个参数:长方体特征标识
//第二个参数:输出参数,返回查询到的特征表达式的个数
//第三个参数:输出参数,当前特征的所有表达式的标识,最后需要UF_free释放
UF_MODL_ask_exps_of_feature(blk_obj, &number_of_exps, &exps); //获得长方体特征所包含的表达式的个数及标识
sprintf(buffer, "number_of_exps = %d\n", number_of_exps);
UF_UI_write_listing_window(buffer); //显示文本
//表达式的操作
for (i = 0; i < number_of_exps; i++)
{
//第一个参数:表达式标识的值
//第二个参数:输出参数,查询到的表达式字符串,需要UF_free释放
UF_MODL_ask_exp_tag_string(exps[i], &string); //利用表达式的标识获得表达式的字符串
//第一个参数:表达式的字符串
//第二个参数:输出参数,表达式的左值,即名称,需UF_free释放
//第三个参数:输出参数,表达式的右值,需UF_free释放
//第四个参数:输出参数,表达式的标识
UF_MODL_dissect_exp_string(string, &lhs_str, &rhs_str, &exp_tag); //分离表达式,得到等号左边和右边的字符串,并得到表达式的标识
//第一个参数:表达式的旧名称
//第二个参数:表达式的新名称
UF_MODL_rename_exp(lhs_str, name[i]); //表达式重命名
UF_UI_write_listing_window(lhs_str); //显示文本
UF_UI_write_listing_window("="); //显示文本
//第一个参数:表达式的名称
//第二个参数:输出参数,表达式的值
UF_MODL_eval_exp(name[i], &exp_value); //计算表达式的值
sprintf(buffer, "%f\n", exp_value);
UF_UI_write_listing_window(buffer); //显示文本
buffer[0] = '\0'; //清空
UF_free(lhs_str);
UF_free(rhs_str);
UF_free(string);
}
UF_free(exps);
string = "\0"; //清空
UF_MODL_ask_exps_of_feature(blk_obj, &number_of_exps, &exps); //获得长方体特征所包含的表达式的个数及标识
//修改表达式
for (i = 0; i < number_of_exps; i++)
{
UF_MODL_ask_exp_tag_string(exps[i], &string); //利用表达式的标识获得表达式的字符串
UF_UI_write_listing_window(string); //显示文本
UF_UI_write_listing_window("\n"); //显示文本
if (strcmp(string, "l=1") == 0)
{
strcpy(string, "l=5");
UF_MODL_edit_exp(string);
}
else if (strcmp(string, "w=2") == 0)
{
strcpy(string, "w=5");
UF_MODL_edit_exp(string);
}
else if (strcmp(string, "h=3") == 0)
{
strcpy(string, "h=5");
UF_MODL_edit_exp(string);
}
UF_free(string);
}
UF_free(exps);
UF_MODL_update(); //更新模型
}
}
catch(exception& ex)
{
modelTe::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
}
return 0;
}