您的当前位置:首页正文

Proe应用ProTOOLKIT二次开发

来源:画鸵萌宠网
 .

手把手教你开发Pro/TOOLKIT应用程序

1 前言

本教程采用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 + VS2010。

2 一、准备

1.Pro/TOOLKIT

在安装Pro/E时,默认是不安装Pro/TOOLKIT的,必须选中【API工具包】节点下的Pro/TOOLKIT选项。

可以通过运行:[Pro/E安装目录]/bin/ptcsetup.bat 查看有无安装

Word 资料

.

Pro/TOOLKIT。

2.VS2008

VS2008中文版下载地址:http://pan.baidu.com/s/1ntt7PH3 最好安装下VS2008 SP1补丁,否则编译Debug版本时常会报错。 VS2008 SP1中文版下载地址:

http://www.microsoft.com/zh-CN/download/details.aspx?id=13276

如果你需要开发64位的Pro/TOOLKIT程序,请确保安装X64 Compilers and

Word 资料

.

Tools,如下图所示:

3 二、新建工程

点击【文件】->【新建】->【项目】菜单命令,创建MFC DLL工程。 输入工程名称:test_wf5。

Word 资料

.

单击【确定】,然后在弹出的对话框中单击【下一步 >】 DLL类型:使用共享 MFC DLL

Word 资料

.

单击【完成】完成创建工程。

4 三、配置工程属性

1.新增64位编译平台

注意:如果只编译32位程序,请跳过此步骤。

单击【生成】->【配置管理器】菜单命令,然后依照下图操作。

Word 资料

.

如果没有x64选项,那说明安装VS2008时,没有安装X64 Compilers and Tools,重新安装此选项即可。

2.新增头文件路径

单击【项目】->【属性】菜单命令,添加如下头文件路径。 【Pro/E安装目录】\\prodevelop\\includes 【Pro/E安装目录】\\protoolkit\\includes 注意:请先选择平台是Win32还是x64。

Word 资料

.

3.新增库文件路径

32位:

【Pro/E安装目录】\\prodevelop\\i486_nt\\obj 【Pro/E安装目录】\\protoolkit\\i486_nt\\obj

Word 资料

.

64位:

【Pro/E安装目录】\\prodevelop\\x86e_win64\\obj 【Pro/E安装目录】\\protoolkit\\x86e_win64\\obj

Word 资料

.

4.添加附加依赖项

mpr.lib wsock32.lib psapi.lib

protk_dllmd.lib prodev_dllmd.lib netapi32.lib

Word 资料

.

5.设置工程字符集

推荐优先采用Unicode。

Word 资料

.

5 四、添加Pro/TOOLKIT代码

在test_wf5.cpp文件的最后添加以下Pro/TOOLKIT代码。

该段代码的功能是:在Pro/E的【帮助】菜单后新增一个菜单【TestMenu】,然后在【TestMenu】下新增两个菜单项【Test】和【ShowCurrModelName】。分别实现弹出测试对话框和获取当前模型的名称并弹窗显示。

注意:先只要大体理解代码的整体思路即可,本教程会在第三篇:手把手教你开发Pro/TOOLKIT应用程序(三) 中具体阐明代码的所有细节,在学习完本篇和第二篇后,再去学习第三篇会比较好。

// 包含常用头文件#include #include #include #include #include Word 资料

.

1 // 包含常用头文件

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include

11 #include 12 #include 13

14 // 函数声明

15 uiCmdAccessState TestAccess(uiCmdAccessMode access_mode); 16 uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode 17 access_mode); 18

19 int Test(uiCmdCmdId command, 20 uiCmdValue *p_value,

21 void *p_push_command_data);

22 int ShowCurrModelName(uiCmdCmdId command, 23 uiCmdValue *p_value,

24 void *p_push_command_data); 25

26 // Pro/TOOLKIT入口函数

27 extern \"C\" int user_initialize() 28 {

29 ProError err; 30

31 // 信息文件名称

32 ProFamilyName MsgFile;

33 ProStringToWstring(MsgFile, \"Test_Msg.txt\"); 34

35 // 添加菜单:TestMenu

36 err = ProMenubarMenuAdd(\"TestMenu\\"TestMenu\\"Help\PRO_B_TRUE, 37 MsgFile); 38

39 // 添加命令和菜单项 40 // 测试命令

41 uiCmdCmdId cmd_id1;

42 err = ProCmdActionAdd(\"Test\43 PRO_B_FALSE, PRO_B_FALSE, &cmd_id1);

44 err = ProMenubarmenuPushbuttonAdd(\"TestMenu\

Word 资料

.

45 \"Test_Help\

46 NULL, PRO_B_TRUE, cmd_id1, MsgFile); 47

48 // 显示并输出当前模型的名称 49 uiCmdCmdId cmd_id2;

50 err = ProCmdActionAdd(\"ShowCurrModelName\51 uiCmdPrioDefault,

52 ShowCurrModelName_Access,

53 PRO_B_FALSE, PRO_B_FALSE, &cmd_id2);

54 err = ProMenubarmenuPushbuttonAdd(\"TestMenu\55 \"ShowCurrModelName\

56 \"ShowCurrModelName_Help\57

58 return 0; 59 } 60

61 // Pro/TOOLKIT结束时调用的函数 62 extern \"C\" void user_terminate() 63 { 64 } 65

66 // 测试命令响应函数

67 int Test(uiCmdCmdId command, 68 uiCmdValue *p_value,

69 void *p_push_command_data) 70 {

71 AfxMessageBox(_T(\"Just For Test\")); 72 return 0; 73 } 74

75 // 命令:获取当前模型的名称并显示

76 int ShowCurrModelName(uiCmdCmdId command, 77 uiCmdValue *p_value,

78 void *p_push_command_data) 79 {

80 ProError err; 81

82 // 获取当前模型 83 ProMdl mdl;

84 err = ProMdlCurrentGet(&mdl); 85 if (PRO_TK_NO_ERROR != err) 86 {

87 return -1; 88 }

Word 资料

.

89

90 // 获取当前模型名称并显示 91 ProName name;

92 err = ProMdlNameGet(mdl, name);

93 MessageBoxW(NULL, name, L\"wf5 test\94

95 return 0; 96 } 97

98 // 测试命令 菜单权限函数 99 // 任何情况下菜单都有效 100 uiCmdAccessState TestAccess(uiCmdAccessMode access_mode) 101 { 102 return ACCESS_AVAILABLE; 103 /* 104 ProError err; 105 ProMode mode; 106 107 err = ProModeCurrentGet(&mode); 108 if (err != PRO_TK_NO_ERROR) 109 { 110 return ACCESS_UNAVAILABLE; 111 } 112 113 if (mode == PRO_MODE_PART 114 || mode == PRO_MODE_ASSEMBLY) 115 { 116 return ACCESS_AVAILABLE; 117 } 118 else 119 { 120 return ACCESS_UNAVAILABLE; 121 } 122 */ 123 } 124 125 // 获取当前模型名称并显示 菜单权限函数 126 // 只有在当前打开的模型为PART档,ASM档或Drawing档时菜单才有效 127 uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode 128 access_mode) 129 { 130 ProError err; 131 ProMode mode; 132

Word 资料

.

133 err = ProModeCurrentGet(&mode); 134 if (PRO_TK_NO_ERROR != err) 135 { 136 return ACCESS_UNAVAILABLE; 137 } 138 139 if (mode == PRO_MODE_PART 140 || mode == PRO_MODE_ASSEMBLY 141 || mode == PRO_MODE_DRAWING) 142 { 143 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 --- 获取当前模型的名称并显示。

6 五、编译程序

1.选择需要编译Win32还是x64版本,以及Debug还是Release版本。

2.单击【生成】->【生成解决方案】即可编译生成DLL文件:test_wf5.dll。 注意:如果你的VS2008没有安装SP1补丁,编译Debug版本时常会报错,即使编译成功,Pro/E也无法加载生成的test_wf5.dll。

Word 资料

.

在编写信息文件前,首先在工程文件夹下新建Bin文件夹,然后将第五步生成的test_wf5.dll拷贝到Bin文件夹下。

6.1 六、编写信息文件

信息文件是用来定义Pro/TOOLKIT程序菜单及菜单项显示信息的文本文件。其内容以四行为一组,每行代表的意义如下:

   

菜单或菜单项的名称 菜单或菜单项的英文显示

菜单或菜单项的中文显示或其他语言版本的显示 #

加载Pro/TOOLKIT程序时,会读取信息文件,并根据菜单或菜单项的名称,匹配出菜单或菜单项的显示字符串。 信息文件必须位于text目录下。 操作步骤如下:

1. 首先在Bin文件夹下新建text文件夹。

2. 然后在text文件夹下新建两个子文件夹:chinese_cn、usascii,分别代表当Pro/E的语言版本为简体中文时,会读取chinese_cn文件夹下的信息文件。当Pro/E的语言版本为英文时,会读取usascii文件夹下的信息文件。 3. 在chinese_cn文件夹下新建如下内容的文本文件:Test_Msg.txt。

TestMenuTest测试菜单#TestTest 1 TestMenu 2 Test 3 测试菜单 4 # 5 Test 6 Test 7 测试 8 #

Word 资料

.

9 Test_Help 10 Just For Test 11 测试 12 # 13 ShowCurrModelName 14 ShowCurrModelName 15 显示模型名称 16 # 17 ShowCurrModelName_Help 18 Show Current Model Name 19 显示模型名称 20 #

4. 在usascii文件夹下新建如下内容的文本文件:Test_Msg.txt。

TestMenuTest##TestTest 1 TestMenu 2 Test 3 # 4 # 5 Test 6 Test 7 # 8 #

9 Test_Help 10 Just For Test 11 # 12 # 13 ShowCurrModelName 14 ShowCurrModelName 15 # 16 # 17 ShowCurrModelName_Help 18 Show Current Model Name 19 # 20 #

Word 资料

.

6.2 七、编写注册文件

注册文件包含Pro/TOOLKIT应用程序的路径,text文件夹的路径等信息,Pro/E通过注册文件中包含的信息,找到Pro/TOOLKIT程序并加载。 在Bin文件夹下新建文本文件protk.dat,并输入如下内容。

name Test_wf5startup dllexec_file .\\Test_wf5.dlltext_dir .\\revision Wildfireallow_stop TRUE 1 name Test_wf5 2 startup dll 3 exec_file .\\Test_wf5.dll 4 text_dir .\\ 5 revision Wildfire 6 allow_stop TRUE 7 end

含义如下:

o name:Pro/TOOLKIT应用程序标识名称

o startup:Pro/TOOLKIT应用程序与Pro/E的交互方式,一般为dll o exec_file:Pro/TOOLKIT程序的路径,可以是绝对路径,也可以使相对路o o o o

text_dir:text文件夹路径 revision:版本

allow_stop:是否允许手动终止Pro/TOOLKIT程序 end:结束标志

6.3 八、自动加载Pro/TOOLKI程序

在Bin文件夹下新建一批处理文件GoProE.bat,输入命令:call [Pro/E全路径] 例如在我的电脑上输入以下命令即可:

call \"C:\\PTC\\proeWildfire 5.0\\b 1 call \"C:\\PTC\\proeWildfire 5.0\\bin\\proe1.bat\"

Word 资料

.

双击GoProE.bat运行,将会启动Pro/E并自动加载我们编写的Pro/TOOLKIT程序。

这是因为我们通过GoProE.bat来启动Pro/E,那么Pro/E的启动目录就为当前的Bin文件夹,Pro/E启动时,会自动读取启动目录下,名为protk.dat的注册文件,来加载Pro/TOOLKIT程序。

6.4 九、测试程序

1.单击【测试】菜单项,会弹出以下对话框。

2.新建一档案:零件档、组立档或工程图。单击【显示模型名称】菜单项,会弹出窗口,显示当前模型的名称。

Word 资料

.

6.5 十、手动加载Pro/TOOLKIT程序

我们也可以手动加载Pro/TOOLKIT程序。

在手动加载Pro/TOOLKIT程序之前,我们需要先修改之前创建的注册文件

protk.dat。将exec_dir和text_dir指定的相对路径改为绝对路径,否则手动加载时会由于找不到相对路径指定的文件而报错的。 示例如下:

name Test_wf5startup dllexec_file D:\\WangYao\\Test_wf5\ext_dir D:\\WangYao\\Test_wf5\\revision Wildfireallow_stop TRUE 1 name Test_wf5 2 startup dll 3 exec_file D:\\WangYao\\Test_wf5\\Bin\\Test_wf5.dll 4 text_dir D:\\WangYao\\Test_wf5\\Bin\\ 5 revision Wildfire 6 allow_stop TRUE 7 end

通过桌面上的快捷方式来启动Pro/E。单击【工具】->【辅助应用程序】

1.单击【注册】,在弹出的对话框中选择Bin文件夹下的protk.dat文件。 2.选中加载进来的Pro/TOOLKIT程序。 3.单击【启动】。

这篇主要讲解第一篇中Pro/TOOLKIT代码的具体含义。

Line 1~12

包含Pro/TOOLKIT常用的头文件。

Word 资料

.

Line 15~24

函数声明。

Line 26~55 user_initialize

user_initialize为Pro/TOOLKIT程序的初始化函数,每个Pro/TOOLKIT程序(DLL)都必须定义该函数。一般在该函数中添加菜单和菜单项。

Line 30~32

定义了宽字符数组变量MsgFile用于存储信息文件的名称:Test_Msg.txt。 ProFamilyName为宽字符(wchar_t)数组。

ProStringToWstring函数将char字符串转换为wchar_t字符串。

Line 35

在Pro/E【帮助】菜单之后添加菜单【TestMenu】。

ProError ProMenubarMenuAdd(ProMenuItemName menu_naProMenuItemLabel untranProMenuItemName neighboProBoolean add_after_neProFileName filename); 1 ProError ProMenubarMenuAdd( 2 ProMenuItemName menu_name, 3 ProMenuItemLabel untranslated_menu_label, 4 ProMenuItemName neighbor, 5 ProBoolean add_after_neighbor, 6 ProFileName filename);

    

menu_name:菜单名称,必须唯一。

untranslated_menu_label:菜单文本,该文本用于匹配信息文件中的内容。

neighbor:相邻的菜单名。\"Help\"为【帮助】菜单。

add_after_neighbor:是否位于相邻菜单的右侧。PRO_B_TRUE表明位于右侧,否则位于左侧。 filename:信息文件名。

Line 39~41

Word 资料

.

添加命令:Test。

ProError ProCmdActionAdd(char *actio uiCmdCmdActFn action_cb uiCmdPriority priority, uiCmdAccessFn access_fu ProBoolean allow_in_ 1 ProError ProCmdActionAdd( 2 char *action_name, 3 uiCmdCmdActFn action_cb, 4 uiCmdPriority priority, 5 uiCmdAccessFn access_func, 6 ProBoolean allow_in_non_active_window, 7 ProBoolean allow_in_accessory_window, 8 uiCmdCmdId *action_id);

action_name:命令名称,必须唯一。  action_cb:命令的响应函数。

 priority:命令的优先级,一般为uiCmdPrioDefault。

 access_func:命令的访问权限函数。该函数的返回值关系到和命令关联的菜单项的状态,具体如下:

typedef enum{ ACCESS_REMOVE = -1, // 移除 ACCESS_INVISIBLE, // 菜单 ACCESS_UNAVAILABLE, // 菜单 ACCESS_DISALLOW, // 菜单 1 typedef enum 2 { 3 ACCESS_REMOVE = -1, // 移除菜单项 4 ACCESS_INVISIBLE, // 菜单项不可见 5 ACCESS_UNAVAILABLE, // 菜单项灰化不可选 6 ACCESS_DISALLOW, // 菜单项不可选 7 ACCESS_AVAILABLE // 菜单项可选 8 } uiCmdAccessState;

allow_in_non_active_window:是否在非激活窗口中显示命令关联的菜单

项,一般为PRO_B_FALSE。  allow_in_accessory_window:是否在附属窗口中显示命令关联的菜单项,一般为PRO_B_FALSE。  action_id:命令ID。

Line 42~43

Word 资料

.

添加菜单按钮:Test。

ProError ProMenubarmenuPushbuttProMenuItemName ProMenuItemName pus ProMenuItemLabel pus ProMenuLineHelp one ProMenuItemName nei 1 ProError ProMenubarmenuPushbuttonAdd( 2 ProMenuItemName parent_menu, 3 ProMenuItemName push_button_name, 4 ProMenuItemLabel push_button_label, 5 ProMenuLineHelp one_line_help, 6 ProMenuItemName neighbor, 7 ProBoolean add_after_neighbor, 8 uiCmdCmdId action_id, 9 ProFileName filename);

       

parent_menu:父菜单名。

push_button_name:菜单按钮名。

push_button_label:菜单按钮文本,用于匹配信息文件中的内容。 one_line_help:菜单按钮提示文本,用于匹配信息文件中的内容。 neighbor:相邻菜单项名,若为NULL,则添加到父菜单的最后。

add_after_neighbor:是否位于相邻菜单项的后面。PRO_B_TRUE表明位于后面,否则位于前面。 action_id:关联的命令ID。 filename:信息文件名。

Line 46~51

添加命令和菜单按钮:获取当前模型的名称并弹窗显示。 同前,略。

Line 57~59 user_terminate

user_terminate函数为Pro/TOOLKIT应用程序退出时被执行的函数,每个Pro/TOOLKIT程序(DLL)都必须定义该函数。

Line 62~68

命令响应函数:弹出测试对话框。

Word 资料

.

Line 71~92

命令响应函数:获取当前模型的名称并弹出显示。

ProMdlCurrentGet:获取当前模型,Pro/E中的任何模型,例如:零件档、组立档、工程图、钣金件等,都可以用ProMdl类型来表示。 ProMdlNameGet:获取模型的名称。

Line 96~119

命令访问权限函数。该函数始终返回ACCESS_AVAILABLE,所以菜单项【Test】始终是可见并可执行的。

Line 123~143

命令访问权限函数。

首先通过ProModeCurrentGet获取当前Pro/E的模式,后面的语句表明只有在零件档、组立档或工程图模式下才返回 ACCESS_AVAILABLE;也就是说菜单项【ShowCurrModelName】只有在Pro/E有打开零件档、组立档或工程图的情况下才是可 见并可选的,否则菜单项会变灰

Word 资料

因篇幅问题不能全部显示,请点此查看更多更全内容

Top