Creo二次开发:符号标注

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

选择瓶盖位置,可以自动标注一个带箭头的符号到瓶盖。

//创建符号
int UserSymbolCreate(ProDrawing drawing,ProName sym_name,ProVector pos)
{
    ProError status;
    ProDtlsymdef symdef;
    ProDtlsyminstdata sym_data;
    ProDtlsyminst sym_inst;
    ProDtlattach attach;
    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");

    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;
}
ProError SymbolMenuAction()
{
    ProError status;
    ProMdl drawing;
    ProVector pos;
    ProMouseButton button;
    ProName sym_name,name;
    ProStringToWstring(sym_name,"symbol");
    int pid;
    status=ProWindowCurrentGet(&pid);
    status=ProMdlCurrentGet(&drawing);
    if (status!=PRO_TK_NO_ERROR)
    {
        return status;
    }
    status=ProMdlNameGet(drawing,name);
    if (status!=NULL)
    {
        return status;
    }

    status=ProMdlInit(name,PRO_MDL_DRAWING,&drawing);
    if (status!=NULL)
    {
        return status;
    }

    status=ProMessageDisplay(L"MESSAGE.txt","user pick the symbol position");
    if (ProMousePickGet(PRO_ANY_BUTTON,&button,pos)!=PRO_TK_NO_ERROR)
    {
        return status;
    }
    UserSymbolCreate((ProDrawing)drawing,sym_name,pos);
    ProWindowActivate(pid);
    return PRO_TK_NO_ERROR;
}

void CPart2DDlg::OnBnClickedBtnSymbolAdd()
{
    // TODO: 在此添加控件通知处理程序代码
    ProError err;
    ProDrawing drawing=NULL;
    ProMouseButton button_pressed;
    ProVector position;
    ProModelitem modelitem;
    ProSelection* sel;
    int n_sel;

    //获取当前模型
    err=ProMdlCurrentGet((ProMdl*)&drawing);
    if (err!=PRO_TK_NO_ERROR)
    {
        return;
    }
    //获取用户单击鼠标后获得的坐标位置(即符号将要放置的位置)
    if (ProMousePickGet(PRO_ANY_BUTTON,&button_pressed,position)!=PRO_TK_NO_ERROR)
    {
        return;
    }
    //选择一个对象(符号所依附的对象)
    err=ProSelect((char*)"feature",1,NULL,NULL,NULL,NULL,&sel,&n_sel);
    if (err!=PRO_TK_NO_ERROR||n_sel<1)
    {
        return;
    }
    //从所选对象中获取模型项
    err=ProSelectionModelitemGet(sel[0],&modelitem);
    if (err!=PRO_TK_NO_ERROR)
    {
        return;
    }
    SymbolMenuAction();
}