tag_t CreateLinkedBody(tag_t fromBodyTag, tag_t toPartOccTag, tag_t &linkedBodyTag)
{
if (!fromBodyTag)
{
linkedBodyTag = NULL_TAG;
return NULL_TAG;
}
tag_t toPartTag = NULL_TAG;
if (NULL_TAG == toPartOccTag)
{
toPartTag = UF_PART_ask_display_part();
}
else
{
toPartTag = UF_ASSEM_ask_prototype_of_occ(toPartOccTag);
}
tag_t xForm = NULL_TAG, featTag = NULL_TAG;
UF_CALL(UF_SO_create_xform_assy_ctxt(toPartTag, UF_ASSEM_ask_part_occurrence(fromBodyTag), toPartOccTag, &xForm));
UF_CALL(UF_WAVE_create_linked_body(UF_ASSEM_ask_prototype_of_occ(fromBodyTag), xForm, toPartTag, true, &featTag));
UF_MODL_ask_feat_body(featTag, &linkedBodyTag);
return featTag;
}
int LinkAllBodiedOfChildOcc(tag_t parentOcc, tag_t toPartOcc, uf_list_p_t linkBodyList)
{
if (NULL_TAG == parentOcc)
{
return 0;
}
char partName[256] = { 0 };
UF_PART_ask_part_name(UF_ASSEM_ask_prototype_of_occ(parentOcc), partName);
CString cstrName(partName);
tag_t objOcc = NULL_TAG;
objOcc = UF_ASSEM_cycle_ents_in_part_occ(parentOcc, objOcc);
int type = 0, subType = 0;
tag_t linkBody = NULL_TAG;
while (objOcc)
{
type = 0, subType = 0;
UF_OBJ_ask_type_and_subtype(objOcc, &type, &subType);
if (UF_solid_type == type && UF_solid_body_subtype == subType)
{
UF_MODL_ask_body_type(objOcc, &type);
if (UF_MODL_SOLID_BODY == type)
{
linkBody = NULL_TAG;
CreateLinkedBody(objOcc, toPartOcc, linkBody);
UF_MODL_put_list_item(linkBodyList, linkBody);
}
}
objOcc = UF_ASSEM_cycle_ents_in_part_occ(parentOcc, objOcc);
}
tag_t* childOccs;
int nChild = UF_ASSEM_ask_part_occ_children(parentOcc, &childOccs);
for (int i = 0; i < nChild; ++i)
{
LinkAllBodiedOfChildOcc(childOccs[i], toPartOcc, linkBodyList);
}
UF_free(childOccs);
return linkBody;
}
//使用一个组件内所有体,对另一个(目标)体(可以是当前工作部件的体,也可以是另一个组件内的体)进行求差。
void main()
{
tag_t toPartOcc = NULL_TAG;
if (UF_ASSEM_is_occurrence(bodyTag))//bodyTag被求差的体、toolPart用于求差的工具体(组件part)
{
toPartOcc = UF_ASSEM_ask_part_occurrence(bodyTag);
}
uf_list_p_t linkBodyList;
UF_MODL_create_list(&linkBodyList);
LinkAllBodiedOfChildOcc(UF_ASSEM_ask_part_occ_of_inst(UF_ASSEM_ask_root_part_occ(UF_PART_ask_display_part()), toolPart), toPartOcc, linkBodyList);
int count = 0;
UF_MODL_ask_list_count(linkBodyList, &count);
if (count)
{
tag_t featTag = NULL_TAG;
if (UF_ASSEM_is_occurrence(bodyTag))
{
bodyTag = UF_ASSEM_ask_prototype_of_occ(bodyTag);
tag_t partTag;
UF_OBJ_ask_owning_part(bodyTag, &partTag);
UF_ASSEM_set_work_part(partTag);
//CreateBoolean//求差函数,自己写
UF_ASSEM_set_work_part(dispPartTag);
}
else
{
//求差函数,自己写
}
UF_MODL_put_list_item(linkBodyList, bodyTag);
}
UF_MODL_delete_body_parms(linkBodyList);
UF_MODL_delete_list(&linkBodyList);
}
【UG\NX二次开发】组件之间求差例子(SEL_set_default_scope)
于 2024-07-20 12:24:25 首次发布