最近学习NX二次开发发现有一些函数经常使用,俗话说得好,好记性不如烂笔头,现在做一下笔记,帮助理解。
UF_MODL_ask_feat_......在头文件uf_modl.h中
1、UF_MODL_ask_feat_direction (查询特征的方向)
概述:获得特征的方向,特征的方向取决于特性类型。有的特征有一个或两个方向,有些则一个都没有。
适用环境:内部或者外部模式
参考:列表 list特征和他们的方向
tag_t (tag_t类型) feature_obj_id Input(输入) 特征对象的TAG值
double (实数型) dir_x [ ] Output(输出) X方向
double (实数型) dir_y [ ] Output(输出) Y方向
实例:通过特征找X、Y的方向,并打印特征的方向值
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//查找特征的X,Y方向(可能一个或两个,也可能一个都没有)
tag_t dirTag = BlkTag;
double dir_x[3], dir_y[3];
UF_MODL_ask_feat_direction(dirTag, dir_x, dir_y);
//打印坐标
char msg[256];
sprintf(msg, "dir_x:%f,%f,%f\n", dir_x[0], dir_x[1], dir_x[2]);
print(msg);
char msg1[256];
sprintf(msg1, "dir_y:%f,%f,%f\n", dir_y[0], dir_y[1], dir_y[2]);
print(msg1);
UF_terminate();
块有X、Y坐标
2、UF_MODL_ask_feat_name (查询特征的名字)
概述:返回包含特征类型和时间戳的字符串。例如,如果你创建了两个块,它们会
时间戳为BLOCK(0)和BLOCK(1)。
适用环境:内部或者外部模式
参考:example
tag_t (tag_t类型) feature_tag Input(输入) 特征的TAG值
char * * feature_name Output to be freed(输出) 包含特征名称(特征类型和时间戳),并使用UF_free释放内存
实例:通过特征找名字,并打印特征的名字
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//查找特征名字
char *feature_name = NULL;
UF_MODL_ask_feat_name(BlkTag, &feature_name);
//打印名字
print(feature_name);
//释放内存
UF_free(feature_name);
UF_terminate();
3、UF_MODL_ask_feat_display_name (查询特征的名字)
概述:获取给特征的显示名称。
适用环境:内部或者外部模式
tag_t (tag_t类型) feature_tag Input(输入) 特征的TAG值
char * * feature_name Output to be freed(输出) 获得特征的显示名称,并使用UF_free释放内存
实例:通过特征找名字,并打印特征的名字
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//查找特征名字
char *feature_name = NULL;
UF_MODL_ask_feat_name(BlkTag, &feature_name);
//打印名字
print(feature_name);
//释放内存
UF_free(feature_name);
UF_terminate();
4、UF_MODL_ask_feat_location (查询特征在绝对坐标系下的位置)
概述:查询单个特征对象并检索该特征在绝对坐标系中的位置。特征的位置取决于特征类型。
适用环境:内部或者外部模式
tag_t (tag_t类型) feature_obj_id Input(输入) 特征对象的TAG值
double (实数型) location [ ] Output(输出) 特征在绝对坐标系下的位置
实例:通过特征找特征的位置,并打印特征的位置坐标
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//查找特征在绝对坐标系下的位置
double location[3];
UF_MODL_ask_feat_location(BlkTag, location);
//打印特征在绝对坐标系下的位置
char msg[256];
sprintf(msg, "location:%f,%f,%f\n", location[0], location[1], location[2]);
print(msg);
UF_terminate();
5、UF_MODL_ask_feat_object (根据特征查询对象,一个特征可能对应多个对象)
概述:根据特征获取对象的TAG值,函数返回类型对于平面返回UF_datum_plane_type对象标识符,对于轴返回UF_datum_axis_type的对象标识符,对于曲线返回UF_sketch_type类型的对象标识符,曲线特征(如投影曲线,提取…)返回对象曲线标识符。
适用环境:内部或者外部模式
tag_t (tag_t类型) feature Input(输入) 特征对象的TAG值
int * (整数型指针) n_eids Output(输出) 对象的数量
tag_t * * eids Output to be freed(输出) 对象数组并释放内存
实例:通过特征找对象的TAG值,并打印特征tag值和对象tag值,以及通过特征找体将实体进行染色
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//特征查询对象,一个特征可能对应多个对象
int n_eids = 0;
tag_t *eids = NULL;
UF_MODL_ask_feat_object(BlkTag, &n_eids, &eids);
for (int i = 0; i < n_eids; i++)
{
//打印特征tag值和对象tag值
char msg[256];
sprintf(msg, "FeatureTAG:%d\n", BlkTag);
print(msg);
char msg1[256];
sprintf(msg1, "objectTAG:%d\n", eids[i]);
print(msg1);
//将对象染色
tag_t bodyTAG = NULL_TAG;
UF_MODL_ask_feat_body(eids[i], &bodyTAG);
UF_OBJ_set_color(bodyTAG, 186);
}
UF_terminate();
6、UF_MODL_ask_feat_relatives (根据特征查询与特征相关的联系)
概述:获取特征的亲属(父母和孩子)。这个函数适用于所有功能,包括基准,草图和投影曲线。
适用环境:内部或者外部模式
参考: example
tag_t (tag_t类型) feature_tag Input(输入) 特征的tag值
int * (整数型指针) num_parents Output(输出) 关联父亲的TAG值的数量
tag_t * * parent_array Output to be freed输出并释放 存储父亲TAG值的组数,使用UF_free释放
int * (整数型指针) num_children Output(输出) 关联儿子的TAG值的数量
tag_t * * children_array Output to be freed输出并释放 存储儿子TAG值的组数,使用UF_free释放
实例遍历当前工作部件的特征及关系
try
{
UF_initialize();
//获得当前工作坐标系的部件TAG
tag_t part_tag = UF_ASSEM_ask_work_part();
遍历工作坐标系的所有对象
int enttype = UF_feature_type;
tag_t feat1 = NULL_TAG;
char *feat_type;
int index = 0;
tag_t master_feature = NULL_TAG;
int num_parents = 0, num_children = 0;
tag_t * parent_array, *children_array;
do
{
UF_OBJ_cycle_objs_in_part(part_tag, enttype, &feat1);
if (feat1 == NULL_TAG) break;
/* 获得特征类型 */
UF_MODL_ask_feat_type(feat1, &feat_type);
char msg[256];
sprintf(msg, "feature %d = %u is of type %s\n", index, feat1, feat_type);
print(msg);
++index;
/* If the feature is an INSTANCE(instance), then get the master feature and its type */
if (feat_type!="INSTANCE")
{
UF_MODL_ask_master(feat1, &master_feature);
UF_MODL_ask_feat_type(master_feature, &feat_type);
char msg1[256];
sprintf(msg1, "master feature %u is of type = %s\n", master_feature, feat_type);
print(msg1);
}
//特征查询与特征相关的联系
UF_MODL_ask_feat_relatives(feat1, &num_parents,&parent_array, &num_children, &children_array);
char msg2[256];
sprintf(msg2,"parent array for %u contains %d members:\n",feat1, num_parents);
print(msg2);
if (num_parents > 0)
{
for (int i = 0; i < num_parents; i++)
{
UF_MODL_ask_feat_type(parent_array[i],&feat_type);
char msg3[256];
sprintf(msg3,"parent id %d = %u is of feature type %s\n",i, parent_array[i], feat_type);
print(msg3);
}
}
char msg4[256];
sprintf(msg4,"children array for feature %u contains %d members:\n",feat1, num_children);
print(msg4);
if (num_children > 0)
{
for (int j = 0; j < num_children; j++)
{
UF_MODL_ask_feat_type(children_array[j], &feat_type);
char msg5[256];
sprintf(msg5,"child id %d = %u is of feature type %s\n", j, children_array[j], feat_type);
print(msg5);
}
}
UF_free(parent_array);
UF_free(children_array);
}while (feat1);
UF_free(feat_type);
UF_terminate();
}
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
7、UF_MODL_ask_feat_sysname(根据特征查询特征的系统名字)
概述:返回特征的全名(类型和时间戳)。这个名字是NX系统定义的名称,并不能反映重命名用户除非该功能是UDF可能应用到的功能。如果输入功能是用户定义特征(UDF)系统功能名称相比于任何名称“用户定义特征”被认为是微不足道的由用户施加。 UDF功能将返回用户应用功能名称。在一些情况下,特征类型的进一步改进时,只需要区分哪些功能是一个给定的功能使用。 例如,UF_MODL_ask_feat_type将表明一个特点是横扫,但进一步的需要的特征的细化知道UF_MODL_ask_extrusion或所述UF_MODL_ask_sweep...功能可以用于检索参数对于给定的横扫
对于给定的SWEEP。
适应环境:内部和外部环境
参考:UF_MODL_ask_feat_name
UF_MODL_ask_feat_type
tag_t (tag_t类型) feature_eid Input(输入) 特征的TAG值
char * * feature_name Output to be freed输出并释放 特征的全名,并使用UF_free释放内存
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//查找特征全名sysname
char *sysname_name = NULL;
UF_MODL_ask_feat_sysname(BlkTag, &sysname_name);
//打印名字
print(sysname_name);
//释放内存
UF_free(sysname_name);
UF_terminate();
8、UF_MODL_ask_feat_tolerance(查询特征的公差)
概述:获得特征的公差
适用环境:内部和外部
tag_t (tag_t类型) feature_obj_id Input(输入) 特征的TAG值
logical * tolerance_exists Output(输出) 返回TRUE表示特征存在距离公差
double * (实数型指针) tolerance Output(输出) 特征距离公差
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//查找特征公差
logical tolerance_exists;
double tolerance = 0;
UF_MODL_ask_feat_tolerance(BlkTag, &tolerance_exists,&tolerance);
//打印名字
char msg[256];
sprintf(msg, "feature_tolerance %f", tolerance);
print(msg);
UF_terminate();
这里试了好几次公差都为零,个人人为公差没有问题,当时人为是建模公差等同不过最后为0,如果有知道的可以交流,一般也用不到这个函数,这里只是个人学习笔记。
9、UF_MODL_ask_feature_sign查询特征的符号(是否求布尔)
概述;获取特性的符号。输入特征的对象标识符,这个例程检索“符号”。“符号”是表示所执行布尔运算类型的数值。
适用环境:内部和外部
tag_t (tag_t类型) feature_obj_id Input(输入) 特征的TAG值
UF_FEATURE_SIGN * sign Output(输出) 特征的符号标识
//符号表标识如下:
UF_NULLSIGN = 0, create new target solid
UF_POSITIVE = 1, add to target solid
UF_NEGATIVE = 2, subtract from target solid
UF_UNSIGNED = 3, intersect with target solid
UF_DEFORM_POSITIVE = 9, deform on the positive side of target
UF_DEFORM_NEGATIVE = 10 deform on the negative side of target
10、UF_MODL_ask_feature_boolean(查询特征的布尔)
概述:返回关于实体特征的布尔状态的信息。
适用环境:内部和外部
参考:UF_MODL_ask_feat_name
feature_name_test.c
tag_t (tag_t类型) feature_obj_id Input(输入) 特征的TAG值
UF_FEATURE_SIGN * boolean_status Output(输出) 特征的布尔状态
//特征的布尔状态
UF_NO_BOOLEAN - feature has not been booleaned.
UF_TOP_TARGET - feature is not booleaned into any other features but has at least one tool as a child.
UF_UNITE - feature has been united to a target solid.
UF_SUBTRACT - feature has been subtracted from a target solid.
UF_INTERSECT - feature has been intersected with a target solid.
UF_DEFORM_POSITIVE - feature used to deform the positive side of the target sheet.
UF_DEFORM_NEGATIVE - feature used to deform the negative side of the target sheet.
11、UF_MODL_ask_features_of_mirror_set (查询特征镜像)
概述、这个函数要求镜集内的所有特征。例程将只返回输入特征,以请求输出特性使用UF_MODL_ask_all_members_of_set()。
适用环境:内部和外部
参考:UF_MODL_ask_all_members_of_set
12、UF_MODL_ask_features_of_exp (查询特征的使用的表达式)
概述:获取使用所提供表达式的所有特性
适用环境:内部和外部
参考:UF_MODL_ask_exps_of_feature
UF_MODL_ask_exps_of_part
please refer to example
13、UF_MODL_ask_feat_type (查询特征的类型)
概述、获得特征类型
适用环境:内部和外部
参考:UF_MODL_ask_feat_name
feature_name_test.c
tag_t (tag_t类型) feature_obj_id Input(输入) 特征的TAG值
char * * feature_type Output to be freed 输出并释放 特征的类型,适用UF_free释放内存
UF_initialize();
//创建块
UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
tag_t BlkTag = NULL_TAG;
UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
//创建圆柱
UF_FEATURE_SIGN sign = UF_NULLSIGN;//布尔方式 : 布尔 无
//UF_NULLSIGN //布尔 无
//UF_POSITIVE //布尔 求和
//UF_NEGATIVE //布尔 求差
//UF_UNSIGNED //布尔 求交
double dPoint1[3] = { 0,0,0 }; //圆柱底面圆心
char charH[256] = "100"; //第一次做圆柱的高度
char charD[256] = "100"; //直径
double dVector[3] = { 0,0,1 }; //圆柱方向
tag_t CylTag = NULL_TAG; //圆柱特征标签
UF_MODL_create_cylinder(sign, NULL_TAG, dPoint1, charH, charD, dVector, &CylTag);
//查找特征类型
char *feature_blocktype = NULL;
UF_MODL_ask_feat_type(BlkTag, &feature_blocktype);
char *feature_cyltype = NULL;
UF_MODL_ask_feat_type(CylTag, &feature_cyltype);
//打印名字
print(feature_blocktype);
print(feature_cyltype);
UF_terminate();