[转载自]:http://www.kongmishu.com/
过UG开发的人都知道,在利用UGopen获取UG中选中面的面积时,ugopen并没有提供这样的函数,但是我们还是可以通过下面的方法获取到面的面积:
<code>UF_CALL(UF_MODL_extract_face(plane,0,&sheet_body));
//立刻隐藏
UF_CALL(UF_OBJ_set_blank_status(sheet_body,UF_OBJ_BLANKED));
solbody = (tag_t*)malloc(count*sizeof(tag_t));
solbody[0] = sheet_body;、
UF_CALL(UF_MODL_ask_mass_props_3d(solbody,
count,
type,
unit,
density,
accuracy,
acc_val,
massprop,
massprop_stat));
*area = massprop[0];
//立刻删除片体
UF_OBJ_delete_object(sheet_body);</code>
<!--more-->
但是上面的方法有一个问题就是:对于每一个需要获取面积的曲面,都要进行曲面抽取的操作,并且该操作有时还比较耗费时间。
最近了解到可以通过KF来获取其中曲面的面积,所以花了点时间将其实现,下面只讨论思路,具体细节可自己动手实现:
1. 先通过选中的面获取到该part的tag值,并将该part完全加载在UG中;
2.
<code>UF_KF_instance_p_t *instances = NULL;
char *nameChain = NULL;
char *pValue = NULL;
char nameChainArea[128] = {0};
char part_fspec[ 256 + 1 ];
UF_PART_load_status_t error_status;
tag_t ugObjects[1] = {UF_ASSEM_is_occurrence(face)?UF_ASSEM_ask_prototype_of_occ(face):face};
//需要完全加载part
tag_t partObject = NULL_TAG;
UF_OBJ_ask_owning_part(ugObjects[0],&partObject);
partObject = UF_ASSEM_is_occurrence(partObject)?UF_ASSEM_ask_prototype_of_occ(partObject):partObject;
UF_PART_ask_part_name(partObject,part_fspec);
if (1 != UF_PART_is_loaded(part_fspec))
{
UF_PART_open_quiet(part_fspec,&partObject,&error_status);
UF_PART_free_load_status(&error_status);
}
UF_KF_adopt_ug_objects(ugObjects,1,&instances);
UF_KF_ask_name_chain_of_instance(instances[0],(const char**)&nameChain);
//UF_KF_ask_name_chain_of_instance(instance,(const char**)&nameChain);
sprintf(nameChainArea,"%s",nameChain);
strcat(nameChainArea,"area:");
UF_KF_evaluate_rule_to_string(nameChainArea,&pValue);
uc1601(pValue,1);
//删除新创建的rule
UF_free(instances);
UF_free(pValue);</code>
3.这样在pValue中存储的就是该面的面积;
4.最后要利用UGopen将新生成的rule删除即可。
总结:
之前也一直尝试,但是对于非display part中的曲面进行面积获取时总是出错,经多次实验发现,需要注意如下两点:
1.在调用UF_KF_adopt_ug_objects时,必须使用原型tag,而不能使用事例;
2.必须将该曲面所在的part完全加载,才能正确获取到曲面的面积。
至于为什么会想到是这两方面的问题,一切均需参考UG中的手动操作过程。
浙公网安备 33010602011771号