Creo二次开发——遍历装配体,获取面要素

        装配体的每个组件也是该装配体的一个特征。因此,要访问组件,须使用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);
}

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值