[转载自]: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中的手动操作过程。

posted on 2013-06-08 11:20  ThinkAndDoEx  阅读(1050)  评论(0)    收藏  举报