手把手教你開發Pro/TOOLKIT應用程序(一)

前言

本教程採用VS2008 + Pro/E Wildfire5.0來講解怎樣開發Pro/TOOLKIT應用程序。
開發Pro/TOOLKIT應用程序時,Pro/E和Visual Studio的版本需對應,否則很難搭建開發
環境,其對應關係如下:
* Wildfire 4.0 <> VS2008
* Wildfire 5.0 <> VS2008
* Creo 1.0 <> VS2010
* Creo 2.0 <> VS2010
本教程所述的方法完全適用於Wildfire4.0 + VS2008、Creo1.0 + VS2010、Creo2.0 + V
S2010。

一、準備

1.Pro/TOOLKIT

在安裝Pro/E時,默認是不安裝Pro/TOOLKIT的,必須選中【API工具包】節點下的Pro/T
OOLKIT選項。
可以通過運行:[Pro/E安裝目錄]/bin/ptcsetup.bat 查看有無安裝Pro/TOOLKIT。
這裏寫圖片描述

2.VS2008

最好安裝下VS2008 SP1補丁,否則編譯Debug版本時常會報錯。
如果你需要開發64位的Pro/TOOLKIT程序,請確保安裝X64 Compilers and Tools,如下
圖所示:
這裏寫圖片描述

二、新建工程

點擊【文件】->【新建】->【項目】菜單命令,創建MFC DLL工程。
輸入工程名稱:test_wf5。
這裏寫圖片描述
單擊【確定】,然後在彈出的對話框中單擊【下一步 >】
DLL類型:使用共享 MFC DLL
這裏寫圖片描述
單擊【完成】完成創建工程。

三、配置工程屬性

1.新增64位編譯平臺

注意:如果只編譯32位程序,請跳過此步驟。
單擊【生成】->【配置管理器】菜單命令,然後依照下圖操作。
這裏寫圖片描述
這裏寫圖片描述
如果沒有x64選項,那說明安裝VS2008時,沒有安裝X64 Compilers and Tools,重新安
裝此選項即可。

2.新增頭文件路徑

單擊【項目】->【屬性】菜單命令,添加如下頭文件路徑。
【Pro/E安裝目錄】\prodevelop\includes
【Pro/E安裝目錄】\protoolkit\includes
注意:請先選擇平臺是Win32還是x64。
這裏寫圖片描述

3.新增庫文件路徑

  • 32位:
    【Pro/E安裝目錄】\prodevelop\i486_nt\obj
    【Pro/E安裝目錄】\protoolkit\i486_nt\obj
    這裏寫圖片描述
  • 64位:
    【Pro/E安裝目錄】\prodevelop\x86e_win64\obj
    【Pro/E安裝目錄】\protoolkit\x86e_win64\obj
    這裏寫圖片描述

4.添加附加依賴項

mpr.lib
wsock32.lib
psapi.lib
protk_dllmd.lib
prodev_dllmd.lib
netapi32.lib
這裏寫圖片描述

5.設置工程字符集

推薦優先採用Unicode。
這裏寫圖片描述

四、添加Pro/TOOLKIT代碼

在test_wf5.cpp文件的最後添加以下Pro/TOOLKIT代碼。
該段代碼的功能是:
在Pro/E的【幫助】菜單後新增一個菜單【TestMenu】,然後在【Te
stMenu】下新增兩個菜單項【Test】和【ShowCurrModelName】。分別實現彈出測試
對話框和獲取當前模型的名稱並彈窗顯示。
注意:先只要大體理解代碼的整體思路即可,本教程會在第三篇:手把手教你開發Pro/TO
OLKIT應用程序(三) 中具體闡明代碼的所有細節,在學習完本篇和第二篇後,再去學習第
三篇會比較好。

// 包含常用頭文件
#include <ProToolkit.h>
#include <ProUtil.h>
#include <ProMenuBar.h>
#include <ProMenu.h>
#include <ProMode.h>
#include <ProMdl.h>
#include <ProSolid.h>
#include <ProAsmcomp.h> 
#include <ProArray.h>
#include <ProModelitem.h>
#include <ProLayer.h>

// 函數聲明
uiCmdAccessState TestAccess(uiCmdAccessMode access_mode);
uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode access_mode);

int Test(uiCmdCmdId  command,
         uiCmdValue *p_value,
         void       *p_push_command_data);
int ShowCurrModelName(uiCmdCmdId  command,
                      uiCmdValue *p_value,
                      void       *p_push_command_data);

// Pro/TOOLKIT入口函數
extern "C" int user_initialize()
{
    ProError err;

    // 信息文件名稱
    ProFamilyName MsgFile;
    ProStringToWstring(MsgFile, "Test_Msg.txt");

    // 添加菜單:TestMenu
    err = ProMenubarMenuAdd("TestMenu", "TestMenu", "Help", PRO_B_TRUE, MsgFile);

    // 添加命令和菜單項
    // 測試命令
    uiCmdCmdId cmd_id1;
    err = ProCmdActionAdd("Test", Test, uiCmdPrioDefault, TestAccess, 
        PRO_B_FALSE, PRO_B_FALSE, &cmd_id1);
    err = ProMenubarmenuPushbuttonAdd("TestMenu", "Test", "Test", "Test_Help",
        NULL, PRO_B_TRUE, cmd_id1, MsgFile);

    // 顯示並輸出當前模型的名稱
    uiCmdCmdId cmd_id2;
    err = ProCmdActionAdd("ShowCurrModelName", ShowCurrModelName, uiCmdPrioDefault, 
        ShowCurrModelName_Access, 
        PRO_B_FALSE, PRO_B_FALSE, &cmd_id2);
    err = ProMenubarmenuPushbuttonAdd("TestMenu", "ShowCurrModelName", "ShowCurrModelName", 
        "ShowCurrModelName_Help", NULL, PRO_B_TRUE, cmd_id2, MsgFile);

    return 0;
}

// Pro/TOOLKIT結束時調用的函數
extern "C" void user_terminate()
{     
}

// 測試命令響應函數
int Test(uiCmdCmdId  command,
         uiCmdValue *p_value,
         void       *p_push_command_data)
{
    AfxMessageBox(_T("Just For Test"));
    return 0;
}

// 命令:獲取當前模型的名稱並顯示
int ShowCurrModelName(uiCmdCmdId  command,
                      uiCmdValue *p_value,
                      void       *p_push_command_data)
{
    ProError err;

    // 獲取當前模型
    ProMdl mdl;
    err = ProMdlCurrentGet(&mdl);
    if (PRO_TK_NO_ERROR != err)
    {
        return -1;
    }

    // 獲取當前模型名稱並顯示
    ProName name;
    err = ProMdlNameGet(mdl, name);
    MessageBoxW(NULL, name, L"wf5 test", MB_OK);

    return 0;
}

// 測試命令 菜單權限函數
// 任何情況下菜單都有效
uiCmdAccessState TestAccess(uiCmdAccessMode access_mode)
{
    return ACCESS_AVAILABLE;
    /*
    ProError err;
    ProMode  mode;

    err = ProModeCurrentGet(&mode);
    if (err != PRO_TK_NO_ERROR)
    {
    return ACCESS_UNAVAILABLE;
    }

    if (mode == PRO_MODE_PART 
    || mode == PRO_MODE_ASSEMBLY)
    {
    return ACCESS_AVAILABLE;
    }
    else
    {
    return ACCESS_UNAVAILABLE;
    }
    */
}

// 獲取當前模型名稱並顯示 菜單權限函數
// 只有在當前打開的模型爲PART檔,ASM檔或Drawing檔時菜單纔有效
uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode access_mode)
{
    ProError err;
    ProMode  mode;

    err = ProModeCurrentGet(&mode);
    if (PRO_TK_NO_ERROR != err)
    {
        return ACCESS_UNAVAILABLE;
    }

    if (mode == PRO_MODE_PART 
        || mode == PRO_MODE_ASSEMBLY
        || mode == PRO_MODE_DRAWING)
    {
        return ACCESS_AVAILABLE;
    }
    else
    {
        return ACCESS_UNAVAILABLE;
    }
}

代碼說明:
1. user_initialize()爲Pro/TOOLKIT應用程序的入口函數,每個Pro/TOOLKIT程序在被Pro/E加載時,首先執行此函數。
2. user_terminate()是Pro/TOOLKIT程序被Pro/E卸載時執行的函數。
3. ProMenubarMenuAdd爲Pro/TOOLKIT程序添加菜單。
4. ProCmdActionAdd爲Pro/TOOLKIT程序添加一個命令,一般在添加菜單項時會將命令和菜單項關聯,這樣在單擊菜單項時,就會執行對應的命令。
5. ProMenubarmenuPushbuttonAdd爲菜單添加菜單項。
6. 以上代碼添加了兩個命令:
test — 直接彈出測試對話框。
ShowCurrModelName — 獲取當前模型的名稱並顯示。

五、編譯程序

  1. 選擇需要編譯Win32還是x64版本,以及Debug還是Release版本。
    這裏寫圖片描述
  2. 單擊【生成】->【生成解決方案】即可編譯生成DLL文件:test_wf5.dll。
    注意:如果你的VS2008沒有安裝SP1補丁,編譯Debug版本時常會報錯,即使編譯成功,Pro/E也無法加載生成的test_wf5.dll。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章