通过参数遍历函数ProParameterVisit获取模型的所有参数,然后将编辑框中输入的参数与之比较,相等则找到对应模型,显示到列表控件中。
代码如下:
//动作函数
ProError UserSearchMdlParamVisitAct(ProParameter *param,ProError status,ProAppData data)
{
vector<ProParameter> *pf=(vector<ProParameter>*)data;
pf->push_back(*param);
return PRO_TK_NO_ERROR;
}
void CSearchMdl::OnBnClickedBtnSearchMdlByParam()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
ProError status;
ProName name;
ProStringToWstring(name,"D:\\demo\\test");
ProPath *file_list,*dir_list;
status=ProArrayAlloc(0,sizeof(ProPath),1,(ProArray*)&file_list);
status=ProArrayAlloc(0,sizeof(ProPath),1,(ProArray*)&dir_list);
status=ProFilesList(name,L"*.prt",PRO_FILE_LIST_LATEST,&file_list,&dir_list);
if (PRO_TK_NO_ERROR!=status)
{
return;
}
m_MdlList.DeleteAllItems();
ProMdl mdl;
int size=0,num=0;
ProArraySizeGet((ProArray)file_list,&size);
for (int i=0;i<size;i++)
{
ProMdlLoad(file_list[i],PRO_MDL_PART,PRO_B_FALSE,&mdl);
ProMdlDisplay(mdl);
//遍历参数
ProParamvalue proval;
ProModelitem item;
status=ProMdlToModelitem(mdl,&item);
vector<ProParameter> dims;
status=ProParameterVisit(&item,NULL,(ProParameterAction)UserSearchMdlParamVisitAct,&dims);
ProName mdl_name;
for (unsigned j=0;j<dims.size();j++)
{
//获得参数的值
status=ProParameterValueGet(&dims[j],&proval);
if (PRO_TK_NO_ERROR!=status)
{
return;
}
CString ParamName;
CStringW ParamValue;
int temp=0;
ParamName.Format(_T("%ws"),dims[j].id);
//根据参数的不同类型转换成CString
switch(proval.type)
{
//实数
case PRO_PARAM_DOUBLE:
temp=proval.value.d_val;
ParamValue.Format(_T("%d"),temp);
break;
//整数
case PRO_PARAM_INTEGER:
ParamValue.Format(_T("%d"),proval.value.i_val);
break;
//字符串
case PRO_PARAM_STRING:
ParamValue.Format(_T("%ws"),proval.value.s_val);
default:
break;
}
if (m_strParamName==ParamName)
{
if (m_strParamValue==ParamValue)
{
status=ProMdlNameGet(mdl,mdl_name);
m_MdlList.InsertItem(0,mdl_name);
num++;
break;
}
else{
continue;
}
}
else{
continue;
}
}
}
if (0==num)
{
AfxMessageBox(_T("不存在含有该参数的模型!"));
}
ProArrayFree((ProArray*)&file_list);
ProArrayFree((ProArray*)&dir_list);
}
运行结果: