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

1、查找

查找工程图中的注释文本主要涉及到注释的遍历函数ProDrawingDtlNoteVisit,通过动作函数将遍历到的注释存入向量容器中,再通过循环获取注释的文本,与需要查找的注释文本进行比较,相等即可找到,并且将该注释所在的工程图名称显示在列表框中,运行结果如图所示:

Creo二次开发:查找和替换指定文件夹下的所有工程图中的注释文本_第1张图片

代码如下:

//动作函数
ProError UserNoteVisitAct(ProDtlitem *note,ProError status,ProAppData data)
{
    vector* p_note=(vector*)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     {
    //加载第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 noteItem;
    //遍历该工程图中的全部注释
    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 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     {
        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);
}

运行结果:

替换前:

Creo二次开发:查找和替换指定文件夹下的所有工程图中的注释文本_第2张图片

Creo二次开发:查找和替换指定文件夹下的所有工程图中的注释文本_第3张图片

替换后:

Creo二次开发:查找和替换指定文件夹下的所有工程图中的注释文本_第4张图片

你可能感兴趣的:(Creo二次开发:查找和替换指定文件夹下的所有工程图中的注释文本)