创建圆柱1,创建圆柱2并与圆柱1求差,将体的所有边倒角。
效果:
源码:
int getBodyEdges(tag_t tagBodyIn, int iType, vector<tag_t> *vecEdges) { vector<tag_t> vecFaces; uf_list_p_t list1 = NULL;//定义链表 UF_MODL_create_list(&list1); //创建链表 double object_box_face[6]; //面的边界。返回曲面包围盒的空间对角线角点坐标 double object_radius_face; //曲面大半径! double object_rad_data_face; //曲面小半径! int object_norm_dir_face; int object_type_face; //曲面类型 22有界平面 double object_point_face[3]; //返回一个点 double object_dir_face[3]; //方向! UF_MODL_ask_body_faces(tagBodyIn, &list1); int count = 0; UF_MODL_ask_list_count(list1, &count);//链表计数 for (int i = 0; i < count; i++) { tag_t tagPlane = NULL_TAG; UF_MODL_ask_list_item(list1, i, &tagPlane); //接收链表数据 UF_MODL_ask_face_data(tagPlane, &object_type_face, object_point_face, object_dir_face, object_box_face, &object_radius_face, &object_rad_data_face, &object_norm_dir_face); vecFaces.push_back(tagPlane); } UF_free(list1); //释放链表指针 list1 = NULL; for (int n = 0; n < vecFaces.size(); n++) { uf_list_p_t list2 = NULL;//定义链表 UF_MODL_create_list(&list2); //创建链表 int iEdgeType = 0; tag_t tagFaceIn = vecFaces[n]; UF_MODL_ask_face_edges(tagFaceIn, &list2); count = 0; UF_MODL_ask_list_count(list2, &count);//链表计数 for (int i = 0; i < count; i++) { tag_t tagEdge = NULL_TAG; UF_MODL_ask_list_item(list2, i, &tagEdge); //接收链表数据 UF_MODL_ask_edge_type(tagEdge, &iEdgeType); if ((iType == 0) || (iEdgeType == iType)) { (*vecEdges).push_back(tagEdge); } } UF_free(list2); //释放链表指针 list2 = NULL; } return 0; } extern DllExport void ufsta(char *param, int *returnCode, int rlen) { UF_initialize(); //创建第一个圆柱 UF_FEATURE_SIGN cy1 = UF_NULLSIGN; //布尔方式 : 布尔 无 double origin1[3] = { 0.0,0.0,0.0 }; //WCS坐标点 UF_CSYS_map_point(UF_CSYS_ROOT_WCS_COORDS, origin1, UF_CSYS_WORK_COORDS, origin1);// 绝对坐标系转工作坐标系 char *H1 = "20"; //高度 char *D1 = "10"; //直径 double v1[3] = { 0,0,1 }; //矢量方向 tag_t cy1TAG = NULL_TAG; ////圆柱特征 UF_MODL_create_cyl1(cy1, origin1, H1, D1, v1, &cy1TAG); //创建第二个圆柱并求差 UF_FEATURE_SIGN cy2 = UF_NEGATIVE; //UF_NEGATIVE 布尔 求差 char *H2 = "20"; //高度 char *D2 = "6"; //直径 double v2[3] = { 0,0,1 }; //矢量方向 tag_t cy2TAG = NULL_TAG; ////圆柱特征 UF_MODL_create_cyl1(cy2, origin1, H2, D2, v2, &cy2TAG); //cy2TAG是特征,下面获取特征的体 tag_t tagBody = NULL_TAG; UF_MODL_ask_feat_body(cy2TAG, &tagBody); vector<tag_t> vecEdge; getBodyEdges(tagBody, 0,&vecEdge); uf_list_p_t list1 = NULL;//定义链表 UF_MODL_create_list(&list1); //创建链表 for (int i = 0; i < vecEdge.size(); i++) { UF_MODL_put_list_item(list1, vecEdge[i]); } //------------------------------------------ //倒角的边都在list1里面了,下面开始倒角,倒角0.2吧 //创建倒角 //(倒角类型:1==单个偏置,2==双偏置,3==偏置角度,4=自由曲面单偏置,5=自由曲面双偏置) //第一偏置距离 //第二偏置距离 //倒角角度 tag_t ChamferTag; UF_MODL_create_chamfer(1, "0.2", "0", "45", list1, &ChamferTag); //------------------------------------------ UF_free(list1); list1 = NULL; UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }