您的位置:首页 > 其它

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

2016-08-16 10:46 1051 查看
类似之前的注释的查找和替换,主要是对符号的遍历,使用函数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);

}

运行结果:



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

}

运行结果:

替换前





替换后:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ProE 二次开发 遍历 mfc