头文件中添加如下变量声明:
HTREEITEM hRoot; HTREEITEM hPrt; HTREEITEM hFea;
//动作函数
ProError UserFeatVisitAct(ProFeature* p_feature,ProError status,ProAppData data) { //向数组的特定位置或尾部添加对象 ProArrayObjectAdd((ProArray*)data,PRO_VALUE_UNUSED/*在数组尾部添加对象*/,1/*添加至数组中对象的个数*/,p_feature); return PRO_TK_NO_ERROR; } //过滤函数 ProError UserFeatVisitFilt(ProFeature* p_feature,ProAppData data) { if (p_feature->id>=0) { return PRO_TK_NO_ERROR; } else{ return PRO_TK_CONTINUE/*跳过此特征,访问下一个*/; } } void CPart3DDlg::UserLoadAllFeatureInPart(ProMdl mdl,HTREEITEM hitem) { ProError status; ProArray id_array; ProModelitem mdlitem; //分配一个对象数组 status=ProArrayAlloc(0/*数组中初始对象的个数*/,sizeof(ProFeature)/*数组中每个对象的大小*/,1/*对象最小个数*/,&id_array/*输出分配的数组*/); if (PRO_TK_NO_ERROR!=status) { AfxMessageBox(_T("内存错误")); return ; } //遍历指定实体的所有特征(包括内部特征) status=ProSolidFeatVisit((ProSolid)mdl,(ProFeatureVisitAction)UserFeatVisitAct, (ProFeatureFilterAction)UserFeatVisitFilt,(ProAppData)&id_array); if (PRO_TK_NO_ERROR!=status) { AfxMessageBox(_T("遍历失败!")); return; } int array_size; //获取数组大小,存入变量array_size ProArraySizeGet(id_array,&array_size); if (0==array_size) { AfxMessageBox(_T("No FeatID was found!")); return; } //通过循环将遍历到的特征写入树型控件中 for (int i=0;i<array_size;i++) { ProFeature feature; feature=((ProFeature*)id_array)[i]; int temp=feature.id; ProName name; ProLine line; char value[20]={0}; ProMdl mdl_prt; ProFeattype p_type; //获取特征的类型 ProFeatureTypeGet(&feature,&p_type); if (1000==p_type) { status=ProAsmcompMdlGet((ProAsmcomp*)&feature,&mdl_prt); status=ProMdlNameGet(mdl_prt,name); sprintf_s(value/*输出项*/,"|%d",temp); ProStringToWstring(line,value); //字符串连接 wcscat_s(name,line); hPrt=m_tree.InsertItem(name/*插入节点的字符串*/,NULL/*图标索引*/,NULL/*图标索引*/,hRoot/*插入节点的父节点句柄*/,TVI_LAST/*插入到树型控件的最后面*/); UserLoadAllFeatureInPart(mdl_prt,hPrt); } else{ status=ProModelitemNameGet(&feature,name); sprintf_s(value,"|%d",temp); ProStringToWstring(line,value); wcscat_s(name,line); ProMdlToModelitem(mdl,&mdlitem); if (mdlitem.type==PRO_ASSEMBLY) { hFea=m_tree.InsertItem(name,NULL,NULL,hRoot,TVI_LAST); } else{ hFea=m_tree.InsertItem(name,NULL,NULL,hPrt,TVI_LAST); } } } ProArrayFree(&id_array);}
void CPart3DDlg::OnBnClickedBtnModelLayer() { // TODO: 在此添加控件通知处理程序代码 ProMdl mdl; ProName name; ProMdlCurrentGet(&mdl); ProMdlNameGet(mdl,name); hRoot=m_tree.InsertItem(name,NULL,NULL); UserLoadAllFeatureInPart(mdl,hPrt); }
运行结果:
