1、查找
查找工程图中的注释文本主要涉及到注释的遍历函数ProDrawingDtlNoteVisit,通过动作函数将遍历到的注释存入向量容器中,再通过循环获取注释的文本,与需要查找的注释文本进行比较,相等即可找到,并且将该注释所在的工程图名称显示在列表框中,运行结果如图所示:
代码如下:
//动作函数 ProError UserNoteVisitAct(ProDtlitem *note,ProError status,ProAppData data) { vector<ProDtlitem>* p_note=(vector<ProDtlitem>*)data; p_note->push_back(*note); return PRO_TK_NO_ERROR; } void CSearchAndReplace::OnBnClickedBtnSearchNext() { // 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); //将路径下所有drw格式的文件存入file_list中 status=ProFilesList(name,L"*.drw",PRO_FILE_LIST_LATEST,&file_list,&dir_list); if (PRO_TK_NO_ERROR!=status) { return; } int size=0; //获取数组大小(即工程图的个数) ProArraySizeGet((ProArray)file_list,&size); //清空列表框 m_listBox.ResetContent(); int num=0; ProMdl mdl; ProName mdl_name; //在工程图之间循环 for (int j=0;j<size;j++) { //加载第j个工程图 status=ProMdlLoad(file_list[j],PRO_MDL_DRAWING,PRO_B_FALSE,&mdl); status=ProMdlDisplay(mdl); /*status=ProMdlCurrentGet((ProMdl*)&mdl); if (PRO_TK_NO_ERROR!=status) { return; }*/ ProDtlnotedata notedata; vector<ProDtlitem> noteItem; //遍历该工程图中的全部注释 status=ProDrawingDtlnoteVisit((ProDrawing)mdl,NULL,1,(ProDtlitemVisitAction)UserNoteVisitAct,NULL,¬eItem); if (PRO_TK_NO_ERROR!=status) { return ; } //在该工程图中的所有注释之间循环 for (unsigned int i=0;i<noteItem.size();i++) { status=ProDtlnoteDataGet((ProDtlnote*)¬eItem[i],NULL,PRODISPMODE_NUMERIC,¬edata); if (PRO_TK_NO_ERROR!=status) { return; } ProDtlnoteline *lines; status=ProDtlnotedataLinesCollect(notedata,&lines); int lcount; status=ProArraySizeGet(lines,&lcount); for (int m=0;m<lcount;m++) { ProDtlnotetext* texts; status=ProDtlnotelineTextsCollect(lines[m],&texts); int tcount; status=ProArraySizeGet(texts,&tcount); for (int n=0;n<tcount;n++) { ProLine lstring; ProDtlnotetextStringGet(texts[n],lstring); CString str,strMdlName; str.Format(_T("%s"),lstring); if (str==m_strSearchText) { //AfxMessageBox(_T("找到注释!")); num++; status=ProMdlNameGet(mdl,mdl_name); strMdlName.Format(_T("%ws"),mdl_name); m_listBox.AddString(strMdlName); } } status=ProArrayFree((ProArray*)&texts); } status=ProArrayFree((ProArray*)&lines); status=ProDtlnotedataFree(notedata); } } if (0==num) { AfxMessageBox(_T("找不到该注释!")); } status=ProArrayFree((ProArray*)&file_list); status=ProArrayFree((ProArray*)&dir_list); }
2、替换
void CSearchAndReplace::OnBnClickedBtnReplace() { // 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); if (PRO_TK_NO_ERROR!=status) { return; } ProMdl mdl; int size=0; ProArraySizeGet((ProArray)file_list,&size); for (int j=0;j<size;j++) { status=ProMdlLoad(file_list[j],PRO_MDL_DRAWING,PRO_B_FALSE,&mdl); status=ProMdlDisplay(mdl); int window_id; status=ProWindowCurrentGet(&window_id); ProLine string; wcscpy_s(string,m_strReplace); ProDtlnotedata notedata; vector<ProDtlitem> noteItem; status=ProDrawingDtlnoteVisit((ProDrawing)mdl,NULL,1,(ProDtlitemVisitAction)UserNoteVisitAct,NULL,¬eItem); if (PRO_TK_NO_ERROR!=status) { return ; } ProDtlnotetext* texts; ProDtlnoteline *lines; for (unsigned int i=0;i<noteItem.size();i++) { status=ProDtlnoteDataGet((ProDtlnote*)¬eItem[i],NULL,PRODISPMODE_NUMERIC,¬edata); if (PRO_TK_NO_ERROR!=status) { return; } status=ProDtlnotedataLinesCollect(notedata,&lines); int lcount; ProArraySizeGet(lines,&lcount); for (int m=0;m<lcount;m++) { status=ProDtlnotelineTextsCollect(lines[m],&texts); int tcount; status=ProArraySizeGet(texts,&tcount); for (int n=0;n<tcount;n++) { ProLine lstring; status=ProDtlnotetextStringGet(texts[n],lstring); CString str; str.Format(_T("%s"),lstring); //判断是否为需要替换的注释文本 if (str==m_strSearchText) { //设置替换文本的内容 status=ProDtlnotetextStringSet(texts[n],string); } } status=ProDtlnotelineTextsSet(lines[m],texts); } status=ProDtlnoteldataLinesSet(notedata,lines); //擦除原来注释文本的内容 status=ProDtlnoteErase((ProDtlnote*)¬eItem[i]); //用需要添加的注释文本修改原来的注释 status=ProDtlnoteModify((ProDtlnote*)¬eItem[i],NULL,notedata); //显示 status=ProDtlnoteShow((ProDtlnote*)¬eItem[i]); } //status=ProWindowRefresh(window_id); status=ProSolidRegenerate((ProSolid)mdl,PRO_REGEN_FORCE_REGEN); status=ProArrayFree((ProArray*)&texts); status=ProArrayFree((ProArray*)&lines); status=ProDtlnotedataFree(notedata); } status=ProArrayFree((ProArray*)&file_list); status=ProArrayFree((ProArray*)&dir_list); }
运行结果:
替换前:
替换后: