iCAx开思工具箱

标题: 颖悟分享之二--表达式 [打印本页]

作者: wanxin9999    时间: 2005-6-9 22:14
标题: 颖悟分享之二--表达式
恩,看到很多朋友们在问表达式的问题。
我最近做的工作全部都是和导入函数再刷新表达式有关的。
所以,简单讲讲一些体会。
  
下面首先罗列一下和表达式相关的函数,大家当然也可以参考董正卫的书。
1.UF_MODL_ask_exp (
char * exp_name,  
char exp_defn[ 133 ] );
由表达式名称获得表达式
  
2.UF_MODL_ask_exps_of_feature (
tag_t feature,  
int * number_of_exps,  
tag_t ** exps );
当前特征的所有表达式
  
3. UF_MODL_ask_exps_of_part (
tag_t part_tag,  
int * number_of_exps,  
tag_t ** exps );
当前part中所有表达式
注意:是当前的part!!一定好好理解一下这个当前的意思。
  
4.UF_MODL_ask_features_of_exp (
tag_t exp,  
int * number_of_features,  
tag_t ** features );
由表达式的tag值,得到表达式字符串。
  
上面这些是查询的相关的比较有用的函数,
一定提醒大家,看清楚那个是表达式的tag,哪个是字符串、
另外,分清楚每个函数的作用范围。
  
值得注意的,大家常常想查找某个body等等general objects的表达式。
从上面这些函数看,肯定是没有直接的办法的。
那么关键就是如何查询表达式,并筛选要修改的表达式。
这需要配合其他的一些函数使用,或者想一点办法。
作者: wanxin9999    时间: 2005-6-9 22:21
查询到了目标修改的表达式,那么就是要分离表达式。
  
这里补充一点表达式的相关知识。
表达式本身有tag值,一个表达式的tag指向一个表达式字符串。
字符串的构成形式是:“名称=数值”。左边是名称,右边是数值。
所以分离表达式,就是把表达式的左边和右边分开。
呵呵,这么简单的东西还在这里再三唠叨^_^
  
一个函数就可以手起刀落了。
UF_MODL_dissect_exp_string (
char * exp_str,  
char ** lhs_str,  
char ** rhs_str,  
tag_t * exp_tag );
  
分离以后,如果要修改表达式的数值,那么就是把右边的数值改改哦。
改完了,用下面的两个函数,才能真正起作用。
UF_MODL_edit_exp (
char * expr_str );
  
UF_MODL_update ( );
作者: wanxin9999    时间: 2005-6-9 22:51
下面谈谈导入函数和表达式之间的一些问题。
在当前零件中多次导入零件后,
原来的零件表达式已经不是我们先前在单独使用他时候的样子了。
系统会在后面自动添加‘0,’1,’2等等
  
下面给个例子代码吧。
data.item_id=TUTAI_REC_HEIGHT;
   UF_STYLER_ask_value(dialog_id,[$data)]
   rec_heit=data.value.real;
    
   sprintf(REC_LEN,"%f",0.5*rec_leng);
   //uc1601(REC_LEN,1);
   sprintf(REC_WID,"%f",rec_width);
  
   sprintf(REC_HEIT,"%f",rec_heit);
  
   sprintf(rechi,"%s%c%d","rec_heigth",'\'',num);
   sprintf(recle,"%s%c%d","rec_length",'\'',num);
   sprintf(recwid,"%s%c%d","rec_width",'\'',num);
    
   ///////////////查询导入凸台的表达式////////////////////
   UF_CALL(UF_OBJ_cycle_by_name ("TUTAI",[$tt_tag))]
//   sprintf(temp,"%d",tt_tag);
//   uc1601(temp,1);
  
   UF_CALL(UF_OBJ_ask_owning_part (tt_tag, [$part_tag))]
//   sprintf(temp,"%d",part_tag);
//   uc1601(temp,1);
  
   UF_CALL(UF_MODL_ask_exps_of_part (part_tag,[$number_of_exps,&exps))]
//   sprintf(temp,"%d",number_of_exps);
//   uc1601(temp,1);
    
   for(int i=0;i<number_of_exps;i++)
   {
         //UF_CALL(UF_MODL_ask_exp (heit,heit_k));
      
     UF_CALL(UF_MODL_ask_exp_tag_string (*exps,[$string))]
      
     UF_CALL(UF_MODL_dissect_exp_string(string,
       [$lhs_str_exp,&rhs_str_exp,&temp_tag_exp))]
      
     if(strcmp(rechi,lhs_str_exp)==0)
     {  
       sprintf(string,"%s%s%s",rechi,"=",REC_HEIT);
//            uc1601(string,1);
     }
     if(strcmp(recle,lhs_str_exp)==0)
     {  
       sprintf(string,"%s%s%s",recle,"=",REC_LEN);
//              uc1601(string,1);
     }        
     if(strcmp(recwid,lhs_str_exp)==0)
     {    
       sprintf(string,"%s%s%s",recwid,"=",REC_WID);
//              uc1601(string,1);
     }
     UF_MODL_edit_exp (string);
     UF_MODL_update ();
     exps++;
   }
    
  num++;
作者: answer1977    时间: 2005-7-6 11:20
好贴,顶
作者: wanxin9999    时间: 2005-7-6 21:09
这位兄弟,真是辛苦阿,
我的帖子都不知道沉到哪里去了。
居然被你找到了
谢谢!
作者: yuwan    时间: 2005-7-11 10:38
有帮助!




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3