获得偏置基准面到创建块的最小距离:
难点在如何获得创建的基准面的tag,
创建的偏置基准面为feature特征,不能直接使用它的tag去查询距离,
这一步找函数费了很大劲,一直在兜圈子,通过这个过程也更加清楚了feature和object的区别
所以后面才知道要用UF_MODL_ask_feat_object函数去实现,
对于查询距离这个函数很好实现。
另外对于指针的指针也更加清楚了,使用起来就是不清楚数据长度时用的,可以实现动态分配
后面使用数据直接就同数组关联在一起了。
通过这个案例,更清楚了如何去搜寻对应功能的函数,以及如何实现这个函数。这也是ufun的难点和费事的地方,这需要反复去读帮助里的信息,一定要有耐心,一条路不行就要换其他的路径。
接下来要实现:创建体的包容块,面的包容面?对比二者大小以做后续的筛选。
距离代码实现如下:(1创建块,2创建偏置基准面,3查询块和基准面距离)
UF_FEATURE_SIGN sign1;
tag_t block_tag;
block_tag = NULL_TAG;
tag_t body_tag = NULL_TAG;
double corner_point1[3] = { 0.0, 0.0, 0.0 };
char* edge_len[3] = { "200.0", "100.0","100.0" };
sign1 = UF_NULLSIGN;
tag_t blk_tag1 = NULL_TAG; // 现在是指针类型
//创建块
UF_MODL_create_block(sign1, block_tag, corner_point1, edge_len, &blk_tag1); // 不再需要取地址符号
//遍历面
UF_MODL_ask_feat_body(blk_tag1, &body_tag);//获得块的标识号,通过特征获得
uf_list_p_t face_list;//定义链表变量
UF_MODL_create_list(&face_list);//初始化链表
UF_MODL_ask_body_faces(body_tag, &face_list);//通过体特征获得面的链表
//获得基准面到体的距离,变量创建及初始化
double douPointOnObj1[3] = { 0 };//对象1上的点
double douPointOnObj2[3] = { 0 };//对象2上的点
double douDis = 0.0;
//创建偏置基准面
tag_t tagObj1 = body_tag, tagObj2 ;
int pt_select[3] = { 0,0,-1 };
double reference_point[3] = { 0,0,0 };
char * angle_string = "0"; char * offset_string = "201.0";
int num_dplanes = 1;
tag_t dplane_tag[2];
tag_t object_tags[3];
object_tags[2] = NULL_TAG;
object_tags[1] = NULL_TAG;
int i = 0;//面链表的序号值
tag_t current_face = NULL_TAG;
UF_MODL_ask_list_count(face_list, &i);//获得面组的总数量
UF_MODL_ask_list_item(face_list, 0, ¤t_face);//获得具体面的标识号
tag_t face_tag = current_face;
object_tags[0] = current_face;
UF_OBJ_set_color(face_tag, 1);//设定面颜色
/*char buf[256];
sprintf(buf, "已选择的整数变量的值为%d\n", face_tag);
uc1601(buf, 1);*/
UF_MODL_create_relative_dplane
(
1,
object_tags,
pt_select,
0,
NULL,
NULL,
offset_string,
&num_dplanes,
dplane_tag
);
//获得基准面的tag
int n_eids;
tag_t * eids;
UF_MODL_ask_feat_object
(
dplane_tag[0],
&n_eids,
& eids
);
tagObj2 = eids[0];
UF_MODL_ask_minimum_dist(tagObj1, tagObj2, 0, NULL, 0, NULL,
&douDis, douPointOnObj1, douPointOnObj2);
char buf1[256];
sprintf(buf1, "体到新建基准面的最小距离为%f\n", douDis);
uc1601(buf1, 1);
// 释放内存
UF_MODL_delete_list(&face_list);
UF_free(eids);