Creo二次开发:查找和替换指定文件夹下所有工程图中的符号

    xiaoxiao2026-03-11  9

    类似之前的注释的查找和替换,主要是对符号的遍历,使用函数ProDrawingDtlsyminstVisit,代码如下:

    ProError UserSymbolVisitAct(ProDtlitem *symitem,ProError status,ProAppData data) {     vector<ProDtlitem> *pf=(vector<ProDtlitem>*)data;     pf->push_back(*symitem);     return PRO_TK_NO_ERROR; } void CSearchAndReplace::OnBnClickedBtnSearchSymbol() {     // TODO: 在此添加控件通知处理程序代码     //获取用户编辑框中输入的内容     UpdateData(TRUE);     ProError status;     ProName name;     ProStringToWstring(name,"D:\\demo");     ProPath *file_list,*dir_list;     status=ProArrayAlloc(0,sizeof(ProPath),1,(ProArray*)&file_list);     status=ProArrayAlloc(0,sizeof(ProPath),1,(ProArray*)&dir_list);     //将指定路径下的文件存入file_list中     status=ProFilesList(name,L"*.drw",PRO_FILE_LIST_LATEST,&file_list,&dir_list);     int size=0;     status=ProArraySizeGet((ProArray)file_list,&size);     int num=0;     //清空列表框     m_listBox.ResetContent();     ProMdl mdl;     for (int i=0;i<size;i++)     {         //加载模型         status=ProMdlLoad(file_list[i],PRO_MDL_DRAWING,PRO_B_FALSE,&mdl);         //显示         status=ProMdlDisplay(mdl);         vector<ProDtlitem> syms;         //遍历当前工程图中的所有符号         status=ProDrawingDtlsyminstVisit((ProDrawing)mdl,1,(ProDtlitemVisitAction)UserSymbolVisitAct,NULL,(ProAppData)&syms);         ProDtlsyminstdata sym_data;         ProDtlsymdef sym_def;         ProDtlsymdefdata def_data;         ProName inst_name,mdl_name;         for (unsigned int j=0;j<syms.size();j++)         {             //获取符号实例的数据             status=ProDtlsyminstDataGet((ProDtlsyminst*)&syms[j],PRODISPMODE_NUMERIC,&sym_data/*输出项*/);             //获得符号定义             status=ProDtlsyminstdataDefGet(sym_data,&sym_def/*输出项*/);             //获得符号定义的数据             status=ProDtlsymdefDataGet(&sym_def,&def_data/*输出项*/);             //获得符号定义的名称             status=ProDtlsymdefdataNameGet(def_data,inst_name/*输出项*/);             CString strName,strMdlName;             strName.Format(_T("%ws"),inst_name);             if (m_strSymbolName==strName)             {                 //AfxMessageBox(_T("找到符号!"));                 num++;                 status=ProMdlNameGet(mdl,mdl_name);                 strMdlName.Format(_T("%ws"),mdl_name);                 m_listBox.AddString(strMdlName);             }         }     }     if (0==num)     {         AfxMessageBox(_T("找不到该符号!"));     }     status=ProArrayFree((ProArray*)&file_list);     status=ProArrayFree((ProArray*)&dir_list); }

    运行结果:

    2、符号替换

    //创建符号 int UserSyminstCreate(ProDrawing drawing,ProName sym_name,ProDtlattach attach,ProVector pos) {     ProError status;     ProDtlsymdef symdef;     ProDtlsyminstdata sym_data;     ProDtlsyminst sym_inst;     ProDtlvartext vartext;     ProPath sym_def_path;     ProLine var_text_prompt;     ProLine var_text_replace;     //符号存储的路径     ProStringToWstring(sym_def_path,"C:\\Users\\Public\\Documents\\symbol");     ProStringToWstring(var_text_prompt,"CAP");     ProStringToWstring(var_text_replace,"DCG");     //加载需要创建的符号     status=ProDrawingDtlsymdefRetrieve(drawing,sym_def_path,sym_name,PRO_VALUE_UNUSED,PRO_B_TRUE,&symdef);     //分配data     status=ProDtlsyminstdataAlloc(drawing,&sym_data);     status=ProDtlsyminstdataDefSet(sym_data,&symdef);     //分配attach     status=ProDtlattachAlloc(PRO_DTLATTACHTYPE_FREE,NULL,pos,NULL,&attach);     status=ProDtlsyminstdataAttachtypeSet(sym_data,PROSYMDEFATTACHTYPE_FREE);     status=ProDtlsyminstdataAttachmentSet(sym_data,attach);     //分配text     status=ProDtlvartextAlloc(var_text_prompt,var_text_replace,&vartext);     status=ProDtlsyminstdataVartextAdd(sym_data,vartext);     //创建该符号     status=ProDtlsyminstCreate(drawing,sym_data,&sym_inst);     status=ProDtlsyminstShow(&sym_inst);     ProDtlattachFree(attach);     ProDtlvartextFree(vartext);     ProDtlsyminstdataFree(sym_data);     return PRO_TK_NO_ERROR; } void CSearchAndReplace::OnBnClickedBtnReplaceSymbol() {     // TODO: 在此添加控件通知处理程序代码     UpdateData(TRUE);     ProError status;     ProName name;     ProStringToWstring(name,"D:\\demo");     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"*.drw",PRO_FILE_LIST_LATEST,&file_list,&dir_list);     int size=0;     status=ProArraySizeGet((ProArray)file_list,&size);     ProName string;     //将编辑框的值(替换符号名称)赋给string     wcscpy_s(string,m_strReplaceSymbol);     ProMdl mdl;     for (int i=0;i<size;i++)     {         status=ProMdlLoad(file_list[i],PRO_MDL_DRAWING,PRO_B_FALSE,&mdl);         status=ProMdlDisplay(mdl);         int window_id;         status=ProWindowCurrentGet(&window_id);         vector<ProDtlitem> syms;         status=ProDrawingDtlsyminstVisit((ProDrawing)mdl,1,(ProDtlitemVisitAction)UserSymbolVisitAct,NULL,(ProAppData)&syms);         ProDtlsyminstdata sym_data;         ProDtlsymdef sym_def;         ProDtlsymdefdata def_data;         ProName inst_name;         ProDtlattach attach;         ProDtlattachType type;         ProView view;         ProVector location;         ProSelection attach_point;         for (unsigned int j=0;j<syms.size();j++)         {             status=ProDtlsyminstDataGet((ProDtlsyminst*)&syms[j],PRODISPMODE_NUMERIC,&sym_data);             status=ProDtlsyminstdataDefGet(sym_data,&sym_def);             status=ProDtlsymdefDataGet(&sym_def,&def_data);             status=ProDtlsymdefdataNameGet(def_data,inst_name);             CString strName;             strName.Format(_T("%ws"),inst_name);             if (m_strSymbolName==strName)             {                 //获得当前符号(即将被替换的符号)的依附项                 status=ProDtlsyminstdataAttachmentGet(sym_data,&attach/*输出项*/);                 //获得详细的依附项数据                 status=ProDtlattachGet(attach,&type,&view,location,&attach_point/*后四个参数均为输出项*/);                 //将替换符号的名称,被替换符号的依附和位置作为输入参数,完成在被替换符号处创建替换符号                 UserSyminstCreate((ProDrawing)mdl,string,attach,location);                 //删除被替换符号定义,完成替换                 status=ProDtlsymdefDelete(&sym_def);             }         }         //status=ProWindowRefresh(window_id);         status=ProSolidRegenerate((ProSolid)mdl,PRO_REGEN_FORCE_REGEN);     }     status=ProArrayFree((ProArray*)&file_list);     status=ProArrayFree((ProArray*)&dir_list); }

    运行结果:

    替换前

    替换后:

    转载请注明原文地址: https://ju.6miu.com/read-1307836.html
    最新回复(0)