Creo二次开发:参数化设计

以创建一个矿泉水瓶组件为例,实现参数化设计,包括瓶身和瓶盖两部分,其中参数和关系在Creo中已经定义好了。代码如下:

//自定义函数
ProError action(ProParameter *parm, ProError status, ProAppData appdata)
{
    vector* pf = (vector*)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 dims;
    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);
}


你可能感兴趣的:(Creo二次开发:参数化设计)