以创建一个矿泉水瓶组件为例,实现参数化设计,包括瓶身和瓶盖两部分,其中参数和关系在Creo中已经定义好了。代码如下:
//自定义函数
ProError action(ProParameter *parm, ProError status, ProAppData appdata)
{
vector
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
status=ProParameterVisit(&item,NULL,(ProParameterAction)action,&dims);
if (status!=PRO_TK_NO_ERROR)
{
return;
}
for (unsigned int i=0;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);
}