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

来源:互联网 发布:oracle rowid修改数据 编辑:程序博客网 时间:2024/06/05 15:49

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,&noteItem);
    if (PRO_TK_NO_ERROR!=status)
    {
        return ;
    }
    //在该工程图中的所有注释之间循环
    for (unsigned int i=0;i<noteItem.size();i++)
    {
        status=ProDtlnoteDataGet((ProDtlnote*)&noteItem[i],NULL,PRODISPMODE_NUMERIC,&notedata);
        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,&noteItem);
    if (PRO_TK_NO_ERROR!=status)
    {
        return ;
    }
    ProDtlnotetext* texts;
    ProDtlnoteline *lines;
    for (unsigned int i=0;i<noteItem.size();i++)
    {
        status=ProDtlnoteDataGet((ProDtlnote*)&noteItem[i],NULL,PRODISPMODE_NUMERIC,&notedata);
        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*)&noteItem[i]);
        //用需要添加的注释文本修改原来的注释
        status=ProDtlnoteModify((ProDtlnote*)&noteItem[i],NULL,notedata);
        //显示
        status=ProDtlnoteShow((ProDtlnote*)&noteItem[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);
}

运行结果:

替换前:

替换后:


0 0