注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

NXOpen C表达式相关函数  

2014-05-17 09:03:31|  分类: UG NX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

NXOpen中头文件uf_modl_expressions.h下提供了关于表达式操作的函数,包括创建、删除、编辑、查询表达式等的函数,通过对这些函数的使用,能够很方便地对部件、特征等的表达式进行管理。

1.创建表达式

可以使用UF_MODL_create_exp或者UF_MODL_create_exp_tag创建表达式,函数原型分别如下:

/*
New expression. The maximum number of 
characters for an expression name (lhs or left hand 
side) is 130 characters. The maximum length for 
the entire expression is UF_MAX_EXP_LENGTH + 1. This 
includes all three pieces: lhs, equal sign, and rhs.
*/
int UF_MODL_create_exp(char * expr_str);

/*
much the same as UF_MODL_create_exp
const char * string Input The string for the expression
tag_t * new_exp Output The tag of the new expression
*/
int UF_MODL_create_exp_tag(const char * string, tag_t * new_exp);
第一个函数简单创建一个表达式,而对于第二函数,则是在创建表达式之后将表达式的Tag传递给第二个参数,以供后期使用。注意,创建的表达式,最好包含三个部分,左值(left hand side,lhs,这个是表达式的名称),等号(=)和右值(rhs,right hand side,这个是表达式的计算式),左值不得长于130个字符,而整个表达式字符串的长度不得大于UF_MAX_EXP_LENGTH + 1,如果不包括左值,则NX会自动提供一个,通常是以p开头+一个数字,右值可以是数值,也可以是现有表达式的代数运算,最后在右值之后还可以包括C++风格的用//引出的注释。另外,表达式右侧可以是现有表达式的代数运算。下面这段代码将演示如何创建表达式,并说明了几个小问题。

void XDExpTest()
{
    //create a exp
    UF_MODL_create_exp("XDEXP=21//这是注释");
    UF_MODL_create_exp("xdExp=12//表达式名称区分大小写");
    //create a exp and get its tag
    tag_t te;
    UF_MODL_create_exp_tag("anotherExp=XDEXP*3",&te);
    //create a exp,leave nx to set its name
    UF_MODL_create_exp("86");
}
上面的代码创建了四个表达式,其中前两个表明表达式名是区分大小写的,并且可以带有注释,而第三个表达式的值是对第一个表达式的值的计算式,最后一个表达式没有提供左值,由NX提供一个名称。

2.删除表达式

同创建表达式类似,使用UF_MODL_delete_exp或者UF_MODL_delete_exp_tag删除表达式,注意删除的时候只需要提供表达式的名称,而不用提供右值,例如删除上面创建的第二个表达式xdExp,可以使用语句:
UF_MODL_delete_exp("xdExp");
即可完成操作。但是注意,并不是每次都能成功,例如去删除XDEXP就会失败,原因是XDEXP被anotherExp所引用,因此不能删除。

3.编辑表达式

表达式的编辑,可以分为两个部分,即左值的编辑和右值的编辑,左值相当于表达式的名称,因此使用UF_MODL_rename_exp函数,而右值相当于是表达式的计算式,需要使用UF_MODL_edit_exp。重命名表达式测试示例如下:
UF_MODL_rename_exp("anotherExp","NEWNAME");
这个语句将表达式“anotherExp”重命名为“NEWNAME”,注意操作成功的前提是原表达式存在,而新表达式名称合法,不与现有表达式名称相同,下面的操作会导致函数调用失败。
    UF_MODL_rename_exp("anotherExp","213");//bad exp name
    UF_MODL_rename_exp("anotherExp","XDEXP");//XDEXP already exists
需要修改表达式的右值使用UF_MODL_edit_exp。测试代码如下:
UF_MODL_edit_exp("XDEXP=3");
修改表达式的值和创建表达式类似,但是前提是表达式要存在。

4.查询函数

获取表达式的字符串,UF_MODL_ask_exp函数根据所提供的表达式名称,获取“名称=数值”对字符串,而UF_MODL_ask_exp_tag_string则是利用表达式的标识获得表达式字符串。UF_MODL_dissect_exp_string将表达式的名称和数值分离,并得到表达式的标识,UF_MODL_eval_exp计算表达式的值。
和建模相关的有UF_MODL_ask_exps_of_feature 和UF_MODL_ask_exps_of_part,分别查询特征相关的表达式和部件相关的表达式,同时一个表达式可能被多个特征所使用,因此还有函数UF_MODL_ask_features_of_exp。下面的代码演示列举当前显示部件中的所有表达式。
#include <uf.h>
#include <uf_part.h>
#include <uf_ui.h>
#include <uf_ui_ugopen.h>
#include <uf_modl_expressions.h>
#include <uf_exit.h>
#include <string>

void XDExpTest()
{
    UF_UI_open_listing_window();
    tag_t disPart=UF_PART_ask_display_part();
    int cnt;
    char* expStr=nullptr;
    tag_t* exps=nullptr;
    UF_MODL_ask_exps_of_part(disPart,&cnt,&exps);
    for(int i=0;i<cnt;i++)
    {
        UF_MODL_ask_exp_tag_string(exps[i],&expStr);
        UF_UI_write_listing_window(expStr);
        UF_UI_write_listing_window("\n");
    }
    UF_free(expStr);
    UF_free(exps);
}
//入口函数
extern DllExport void ufsta( char *param, int *returnCode, int rlen)
{
    if(UF_initialize()) 
        return;
    //Add your code here
    XDExpTest();

    UF_terminate();
}
//退出函数
extern int ufusr_ask_unload()
{
    return UF_UNLOAD_IMMEDIATELY;
}
程序运行之后,将打开信息窗口,然后将显示部件下的表达式都列举出来,如下图所示:
image

  评论这张
 
阅读(669)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016