以创建一个矿泉水瓶组件为例,实现参数化设计,包括瓶身和瓶盖两部分,其中参数和关系在Creo中已经定义好了。代码如下:
//自定义函数 ProError action(ProParameter *parm, ProError status, ProAppData appdata) { vector<ProParameter>* pf = (vector<ProParameter>*)appdata; pf->push_back(*parm); return PRO_TK_NO_ERROR; } //按钮:打开瓶子装配模型 void CPart3DDlg::OnBnClickedBtnOpenPart0001() { // TODO: 在此添加控件通知处理程序代码 ProErr status; ProMdl mdl; ProFamilyName name; //转换成宽字符 ProStringToWstring(name,"D:\\demo\\bottle_asm.asm"); //从磁盘中读取模型 status = ProMdlRetrieve(name,PRO_MDL_ASSEMBLY,&mdl); if (status!=PRO_TK_NO_ERROR) { return; } //显示模型 ProMdlDisplay(mdl); ProParamvalue proval; ProModelitem item; status=ProMdlToModelitem(mdl,&item); vector<ProParameter> dims; status=ProParameterVisit(&item,NULL,(ProParameterAction)action,&dims); if (status!=PRO_TK_NO_ERROR) { return; } for (unsigned int i=0;i<dims.size();i++) { status=ProParameterValueGet(&dims[i],&proval); if (status!=PRO_TK_NO_ERROR) { return; } CString dimension,dimensionName; dimensionName.Format(_T("%ws"),dims[i].id); switch (proval.type) { case PRO_PARAM_DOUBLE: dimension.Format(_T("%f"),proval.value.d_val); break; case PRO_PARAM_INTEGER: dimension.Format(_T("%d"),proval.value.i_val); default: break; } m_Part0001DataList.InsertItem(0,dimensionName); m_Part0001DataList.SetItemText(0,1,dimension); } //激活当前窗口 int windId; ProWindowCurrentGet(&windId); ProWindowActivate(windId); } //自定义函数:设置参数值 ProError UserSetParamValue(ProModelitem owner, char* name, double value) { ProError status; ProParameter param; ProName param_name; ProStringToWstring(param_name, name); status = ProParameterInit(&owner, param_name, ¶m); if(status != 0) { return status; } ProParamvalue proval; proval.type = PRO_PARAM_DOUBLE; proval.value.d_val = value; status = ProParameterValueSet(¶m, &proval); if(status != 0) { return status; } return PRO_TK_NO_ERROR; } //按钮:重生装配模型 void CPart3DDlg::OnBnClickedBtnRegenerate() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); ProError status; ProMdl p_handle; ProModelitem p_modelitem; //获取当前模型 status=ProMdlCurrentGet(&p_handle); if (status!=PRO_TK_NO_ERROR) { return; } //获得用户编辑框中输入的尺寸值 status = ProMdlToModelitem(p_handle, &p_modelitem); UserSetParamValue(p_modelitem, "DIA_UP", m_dDia1); UserSetParamValue(p_modelitem, "DIA_DOWN", m_dDia2); UserSetParamValue(p_modelitem, "HEIGHT", m_dHeight); UserSetParamValue(p_modelitem, "CAP_DEPTH", m_dCapDepth); if (m_dCapDepth<=m_dHeight) { //重生模型 status=ProSolidRegenerate((ProSolid)p_handle, PRO_REGEN_NO_FLAGS); } else{ AfxMessageBox(_T("瓶盖深度应该小于瓶口高度!请重新输入!")); } //显示 status = ProMdlDisplay(p_handle); //刷新列表框中的数据 CString m_strDia1,m_strDia2,m_strHeight,m_strCapDepth; m_strDia1.Format(_T("%f"),m_dDia1); m_strDia2.Format(_T("%f"),m_dDia2); m_strHeight.Format(_T("%f"),m_dHeight); m_strCapDepth.Format(_T("%f"),m_dCapDepth); m_Part0001DataList.SetItemText(0,1,m_strDia1); m_Part0001DataList.SetItemText(1,1,m_strDia2); m_Part0001DataList.SetItemText(2,1,m_strHeight); m_Part0001DataList.SetItemText(3,1,m_strCapDepth); //激活当前窗口 int window; ProMdlWindowGet(p_handle, &window); ProWindowActivate(window); UpdateData(FALSE); }
