1、查找
查找工程图中的注释文本主要涉及到注释的遍历函数ProDrawingDtlNoteVisit,通过动作函数将遍历到的注释存入向量容器中,再通过循环获取注释的文本,与需要查找的注释文本进行比较,相等即可找到,并且将该注释所在的工程图名称显示在列表框中,运行结果如图所示:
代码如下:
//动作函数
ProError UserNoteVisitAct(ProDtlitem *note,ProError status,ProAppData data)
{
vector
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
//加载第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
//遍历该工程图中的全部注释
status=ProDrawingDtlnoteVisit((ProDrawing)mdl,NULL,1,(ProDtlitemVisitAction)UserNoteVisitAct,NULL,¬eItem);
if (PRO_TK_NO_ERROR!=status)
{
return ;
}
//在该工程图中的所有注释之间循环
for (unsigned int i=0;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
ProDtlnotetext* texts;
status=ProDtlnotelineTextsCollect(lines[m],&texts);
int tcount;
status=ProArraySizeGet(texts,&tcount);
for (int n=0;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
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
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
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
status=ProDtlnotelineTextsCollect(lines[m],&texts);
int tcount;
status=ProArraySizeGet(texts,&tcount);
for (int n=0;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);
}
运行结果:
替换前:
替换后: