手把手教你开发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。
  • 17
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值