在瓶底可以点选放置一个时间标签(标签可以是零件)
代码如下:
//创建坐标系UDF
void putcsys(ProMdl mdl,double x,double y,double z)
{
ProError err=PRO_TK_NO_ERROR;
ProUdfdata data;
err=ProUdfdataAlloc(&data);
ProPath path=L"udf_def_csys.gph";
err=ProUdfdataPathSet(data,path);
ProSelection ref_item_csy;
ProModelitem mdl_itm_top;
err=ProModelitemByNameInit(mdl,PRO_CSYS,_T("ASM_DEF_CSYS"),&mdl_itm_top);
err=ProSelectionAlloc(NULL,&mdl_itm_top,&ref_item_csy);
ProUdfreference reference_csy;
err=ProUdfreferenceAlloc(_T("csys"),ref_item_csy,PRO_B_FALSE,&reference_csy);
err=ProUdfdataReferenceAdd(data,reference_csy);
ProUdfvardim vardim_x;
err=ProUdfvardimAlloc(_T("d9"),x,PROUDFVARTYPE_DIM,&vardim_x);
err=ProUdfdataUdfvardimAdd(data,vardim_x);
ProUdfvardim vardim_y;
err=ProUdfvardimAlloc(_T("d10"),y,PROUDFVARTYPE_DIM,&vardim_y);
err=ProUdfdataUdfvardimAdd(data,vardim_y);
ProUdfvardim vardim_z;
err=ProUdfvardimAlloc(_T("d11"),z,PROUDFVARTYPE_DIM,&vardim_z);
err=ProUdfdataUdfvardimAdd(data,vardim_z);
err=ProUdfdataScaleSet(data,PROUDFSCALETYPE_USER,2.0);
err=ProUdfdataDimdisplaySet(data,PROUDFDIMDISP_NORMAL);
err=ProUdfdataDependencySet(data,PROUDFDEPENDENCY_INDEPENDENT);
ProUdfCreateOption op={PROUDFOPT_FIX_MODEL_UI_OFF};
ProGroup udf;
err=ProUdfCreate((ProSolid)mdl,data,NULL,&op,1,&udf);
if(err!=PRO_TK_NO_ERROR)
{
AfxMessageBox(_T("Udf创建失败"));
}
ProUdfdataFree(data);
ProUdfvardimFree(vardim_x);
ProUdfvardimFree(vardim_y);
ProUdfvardimFree(vardim_z);
ProUdfreferenceFree(reference_csy);
ProSelectionFree(&ref_item_csy);
int wid=0;
err=ProWindowCurrentGet(&wid);
err=ProWindowRefresh(wid);
}
//通过坐标系自动装配
ProError UserAssembleByCsys(ProAssembly asm_mdl,ProSolid comp_mdl)
{
ProErr err;
ProName asm_csys_name, comp_csys_name;
ProModelitem asm_csys, comp_csys;
ProSelection asm_sel, comp_sel;
ProMatrix identity_matrix = {{1.0, 0.0, 0.0, 0.0},
{ 0.0,1.0, 0.0, 0.0},
{ 0.0, 0.0,1.0, 0.0},
{ 0.0, 0.0, 0.0, 1.0}};
//保存添加入组件中的元件
ProAsmcomp asmcomp;
//装配约束数组
ProAsmcompconstraint* constraints;
//装配约束
ProAsmcompconstraint constraint;
ProAsmcomppath comp_path;
ProIdTable c_id_table;
c_id_table[0] = -1;
//装配体中的装配参照
ProStringToWstring(asm_csys_name,"ACS0");
//元件的装配参照
ProStringToWstring(comp_csys_name, "PRT_CSYS_DEF");
//将零件添加到组件的初始位置
err=ProAsmcompAssemble(asm_mdl,comp_mdl, identity_matrix, &asmcomp);
//初始化数组constraints
err=ProArrayAlloc(0,sizeof(ProAsmcompconstraint), 1, (ProArray*)&constraints);
//得到组件基准或者组件中用于定位的元件基准
err = ProModelitemByNameInit(asm_mdl, PRO_CSYS,asm_csys_name,&asm_csys );
//得到元件基准
err = ProModelitemByNameInit(comp_mdl,PRO_CSYS,comp_csys_name,&comp_csys);
//选中组件中的参照,注意此处的comp_path
err=ProAsmcomppathInit(asm_mdl, c_id_table, 0, &comp_path);
err=ProSelectionAlloc(&comp_path, &asm_csys, &asm_sel);
//选中元件中的 参照
err=ProSelectionAlloc(NULL, &comp_csys, &comp_sel);
//设定参照组, 包含有参照类型以及各自的约束对象
err=ProAsmcompconstraintAlloc(&constraint);
err=ProAsmcompconstraintTypeSet(constraint, PRO_ASM_CSYS);
err=ProAsmcompconstraintAsmreferenceSet(constraint, asm_sel, PRO_DATUM_SIDE_YELLOW);
err=ProAsmcompconstraintCompreferenceSet(constraint, comp_sel, PRO_DATUM_SIDE_YELLOW);
//将参照添加入参照集合中
err=ProArrayObjectAdd((ProArray*)&constraints, -1,1, &constraint);
//设置参照集合
err = ProAsmcompConstraintsSet(NULL, &asmcomp,constraints);
ProSolidRegenerate((ProSolid)asmcomp.owner, PRO_REGEN_NO_FLAGS);
return PRO_TK_NO_ERROR;
}
void CPart3DDlg::OnBnClickedBtnTabAdd()
{
// TODO: 在此添加控件通知处理程序代
ProMdl asm_mdl=NULL;
ProMdl comp_mdl=NULL;
ProError err=ProMdlCurrentGet(&asm_mdl);
ProPoint3d position;
int pid;
ProSelection* sels=NULL;
int n_sels;
err=ProWindowCurrentGet(&pid);
err=ProSelect("prt_or_asm",1,NULL,NULL,NULL,NULL,&sels,&n_sels);
if (err!=PRO_TK_NO_ERROR)
{
return;
}
ProSelectionPoint3dGet(sels[0],position);
//放置坐标系udf
putcsys((ProSolid)asm_mdl,position[0],position[1],position[2]);
//读出要添加的零件模型
ProMdlRetrieve(L"comp.prt",PRO_MDL_PART,&comp_mdl);
//自动装配
UserAssembleByCsys((ProAssembly)asm_mdl,(ProSolid)comp_mdl);
ProWindowActivate(pid);
}
运行结果