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

时间:2021-10-18 05:38:10

类似之前的注释的查找和替换,主要是对符号的遍历,使用函数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);
}

运行结果:

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

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);
}

运行结果:

替换前

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

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

替换后:

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