装配体的每个组件也是该装配体的一个特征。因此,要访问组件,须使用ProSolidFeatVisit()访问特征 ,并使用函数ProFeatureTypeGet()查找类型为PRO_FEAT_COMPONENT的特征。
在遍历获取所有面要素碰到的主要问题是:
使用ProSolidFeatVisit遍历组件,输出的数据类型为<ProFeature>。但我在获取面要素时,涉及到坐标系的矩阵变换,用ProAsmcomppathTrfGet获取转换矩阵,需要输入<ProAsmcomppath>,我无法将<ProFeature>转换成<ProAsmcomppath>。现在的问题是我不知道这么获取<ProAsmcomppath>。
解决思路:
1.Toolkit中ProSelectionAsmcomppathGet可以获得ProAsmcomppath,这需要手动选取,这不符合我的需求。
2.Toolkit中ProSolidDispCompVisit同样可以访问组件,它的输出是ProAsmcommpath,但我在遍历时碰到一些问题,就没实现,可以试试。
3.Toolkit中ProAsmcomppathInit初始化,它的输出同样是ProAsmcomppath,最终我使用这种方式。它的结构:
owener: 根装配体的标识符
comp_id_table:组件标识符表,由组件id组成的数组
table_num:指定comp_id_table数组中组件标识符的数量
1. 遍历装配体,获取各组件:
结构体定义:
typedef struct user_appdata
{
ProMdl mdl;int level;
ProAsmcomppath comppath;
} UserAppdata;
char type[PRO_MDLEXTENSION_SIZE];
ProError status;
UserAppdata appdate{};
ProMdl p_asm;
ProMdlExtension modelExtension;
//获取根路径的模型类型
status=ProMdlCurrentGet(&p_asm);
status=ProMdlExtensionGet(p_asm,modelExtension);
ProWstringToString(type,modelExtension);
//初始化装配体路径
ProAsmcomppath comppath;
ProIdTable comp_id_table;comp_id_table[0]=-1;
status=ProAsmcomppathInit((ProSolid)p_asm,comp_id_table,0,&comppath);
//初始化appdata
appdata.level=1;
appdata.mdl=p_sam;
appdata.comppath=comppath;
//遍历装配体,获取各组件
status=ProSolidFeatVisit((ProSolid)p_asm,AsmVisitFunction,AsmVisitFilter,&appdata);
2.过滤函数AsmVisitFilter
ProError AsmVisitFilter(ProFeature* feature,ProError status,ProAppData appdate)
{
ProError status;
ProFeattype ftype;
status = ProFeatureTypeGet(feature, &ftype);
if (ftype == PRO_FEAT_COMPONENT)
return (PRO_TK_NO_ERROR);
return (PRO_TK_CONTINUE);
}
3.访问函数AsmVisitFunction
ProError AsmVisitFunction(Feature* feature,ProError status,ProAppData appdate)
{
char name[PRO_MDLNAME_SIZE];
int level;
ProError status;
ProMdl mdl;
UserAppdata* appd, appd1{};
ProAsmcomppath comppath;
ProMdlExtension modelExtension;
status = ProAsmcompMdlGet(feature, &mdl); //为组件引用的零件或装配体提供ProMdl句柄
status = ProMdlExtensionGet(mdl, modelExtension);
ProWstringToString(type, modelExtension);
appd = (UserAppdata*)appdata;
level = appd->level;
comppath = appd->comppath;
//如果组件类型是零件
if(strncmp(type,"PRT",3)==0)
{
appd1.level =level;
ProTKFprintf(fp, "\n");
appd1.mdl = mdl;
appd1.comppath =comppath;
//增加组件路径
//先执行赋值:comppath.comp_id_table[0]=feature.id;再自增:table_num+1;
appd1.comppath.comp_id_table[appd1.comppath.table_num++] = feature->id;
appd1.comppath.comp_id_table[appd1.comppath.table_num] = -1;
//访问该实体中的所有曲面
ProSolidSurfaceVisit((ProSolid)mdl, UsrSurfAction, SurfaceFilterAction, &appd1);
}
//如果组件是装配体,则递归调用ProSolidFeatVisit来遍历每个组件
if (strncmp(type,"ASM",3)==0)
{
appd1.level = appd->level + 1;
appd1.comppath.comp_id_table[appd1.comppath.table_num++] = feature->id;
appd1.comppath.comp_id_table[appd1.comppath.table_num] = -1;
status = ProSolidFeatVisit((ProSolid)mdl, user_action, UserAsmCompFilter, &appd1);
}
if (feature != nullptr) return (PRO_TK_NO_ERROR);
return (PRO_TK_CONTINUE);
}