2024年1月8日发(作者:)

手把手教你开发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 一、准备

/TOOLKIT

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

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

Pro/TOOLKIT。

2。VS2008

VS2008中文版下载地址: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

Tools,如下图所示:

3 二、新建工程

点击【文件】—〉【新建】—〉【项目】菜单命令,创建MFC DLL工程.

输入工程名称:test_wf5。

单击【确定】,然后在弹出的对话框中单击【下一步 〉】

DLL类型:使用共享 MFC DLL

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

4 三、配置工程属性

1。新增64位编译平台

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

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

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

2。新增头文件路径

单击【项目】-〉【属性】菜单命令,添加如下头文件路径。

【Pro/E安装目录】prodevelopincludes

【Pro/E安装目录】protoolkitincludes

注意:请先选择平台是Win32还是x64。

3.新增库文件路径

32位:

【Pro/E安装目录】prodevelopi486_ntobj

【Pro/E安装目录】protoolkiti486_ntobj

64位:

【Pro/E安装目录】prodevelopx86e_win64obj

【Pro/E安装目录】protoolkitx86e_win64obj

4。添加附加依赖项

mpr。lib

protk_

prodev_

5。设置工程字符集

推荐优先采用Unicode.

5 四、添加Pro/TOOLKIT代码

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

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

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

// 包含常用头文件#include #include #include #include #include

1 // 包含常用头文件

2 #include

3 #include

4 #include 〈ProMenuBar.h>

5 #include 〈ProMenu.h>

6 #include

7 #include

8 #include

9 #include 〈ProAsmcomp。h>

10 #include 〈ProArray。h〉

11 #include

12 #include

13

14 // 函数声明

15 uiCmdAccessState TestAccess(uiCmdAccessMode access_mode);

16 uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode access_mode);

17

18 int Test(uiCmdCmdId command,

19 uiCmdValue *p_value,

20 void *p_push_command_data);

21 int ShowCurrModelName(uiCmdCmdId command,

22 uiCmdValue *p_value,

23 void *p_push_command_data);

24

25 // Pro/TOOLKIT入口函数

26 extern ”C” int user_initialize()

27 {

28 ProError err;

29

30 // 信息文件名称

31 ProFamilyName MsgFile;

32 ProStringToWstring(MsgFile, ”Test_");

33

34 // 添加菜单:TestMenu

35 err = ProMenubarMenuAdd("TestMenu", "TestMenu", ”Help", PRO_B_TRUE,

36 MsgFile);

37

38 // 添加命令和菜单项

39 // 测试命令

40 uiCmdCmdId cmd_id1;

41 err = ProCmdActionAdd(”Test", Test, uiCmdPrioDefault, TestAccess,

42 PRO_B_FALSE, PRO_B_FALSE, &cmd_id1);

43 err = ProMenubarmenuPushbuttonAdd("TestMenu", ”Test”, "Test",

44 "Test_Help”,

45 NULL, PRO_B_TRUE, cmd_id1, MsgFile);

46

47 // 显示并输出当前模型的名称

48 uiCmdCmdId cmd_id2;

49 err = ProCmdActionAdd("ShowCurrModelName", ShowCurrModelName,

50 uiCmdPrioDefault,

51 ShowCurrModelName_Access,

52 PRO_B_FALSE, PRO_B_FALSE, &cmd_id2);

53 err = ProMenubarmenuPushbuttonAdd(”TestMenu”,

54 "ShowCurrModelName", ”ShowCurrModelName",

55 "ShowCurrModelName_Help”, NULL, PRO_B_TRUE, cmd_id256

57 return 0;

58 }

59

60 // Pro/TOOLKIT结束时调用的函数

61 extern ”C" void user_terminate()

62 {

63 }

64

65 // 测试命令响应函数

66 int Test(uiCmdCmdId command,

67 uiCmdValue *p_value,

68 void *p_push_command_data)

69 {

70 AfxMessageBox(_T(”Just For Test"));

71 return 0;

72 }

73

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

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

77 void *p_push_command_data)

78 {

79 ProError err;

80

81 // 获取当前模型

82 ProMdl mdl;

83 err = ProMdlCurrentGet(&mdl);

84 if (PRO_TK_NO_ERROR != err)

85 {

86 return -1;

87 }

88

,); MsgFile

89 // 获取当前模型名称并显示

90 ProName name;

91 err = ProMdlNameGet(mdl, name);

92 MessageBoxW(NULL, name, L"wf5 test", MB_OK);

93

94 return 0;

95 }

96

97 // 测试命令 菜单权限函数

98 // 任何情况下菜单都有效

99 uiCmdAccessState TestAccess(uiCmdAccessMode access_mode)

100 {

101 return ACCESS_AVAILABLE;

102 /*

103 ProError err;

104 ProMode mode;

105

106 err = ProModeCurrentGet(&mode);

107 if (err != PRO_TK_NO_ERROR)

108 {

109 return ACCESS_UNAVAILABLE;

110 }

111

112 if (mode == PRO_MODE_PART

113 || mode == PRO_MODE_ASSEMBLY)

114 {

115 return ACCESS_AVAILABLE;

116 }

117 else

118 {

119 return ACCESS_UNAVAILABLE;

120 }

121 */

122 }

123

124 // 获取当前模型名称并显示 菜单权限函数

125 // 只有在当前打开的模型为PART档,ASM档或Drawing档时菜单才有效

126 uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode access_mode)

127 {

128 ProError err;

129 ProMode mode;

130

131 err = ProModeCurrentGet(&mode);

132 if (PRO_TK_NO_ERROR != err)

133 {

134 return ACCESS_UNAVAILABLE;

135 }

136

137 if (mode == PRO_MODE_PART

138 || mode == PRO_MODE_ASSEMBLY

139 || mode == PRO_MODE_DRAWING)

140 {

141 return ACCESS_AVAILABLE;

142 }

143 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。

在编写信息文件前,首先在工程文件夹下新建Bin文件夹,然后将第五步生成的test_拷贝到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_。

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

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

6.2 七、编写注册文件

注册文件包含Pro/TOOLKIT应用程序的路径,text文件夹的路径等信息,Pro/E通过注册文件中包含的信息,找到Pro/TOOLKIT程序并加载。

在Bin文件夹下新建文本文件,并输入如下内容。

name Test_wf5startup dllexec_file .Test_t_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

text_dir:text文件夹路径

o

revision:版本

o

allow_stop:是否允许手动终止Pro/TOOLKIT程序

o

end:结束标志

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

在Bin文件夹下新建一批处理文件,输入命令:call [Pro/E全路径]

例如在我的电脑上输入以下命令即可:

call "C:PTCproeWildfire 5.0b

1 call

”C:PTCproeWildfire 5。"

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

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

6.4 九、测试程序

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

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

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

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

在手动加载Pro/TOOLKIT程序之前,我们需要先修改之前创建的注册文件.将exec_dir和text_dir指定的相对路径改为绝对路径,否则手动加载时会由于找不到相对路径指定的文件而报错的.

示例如下:

name Test_wf5startup dllexec_file D:WangYaoTest_wf5text_dir D:WangYaoTest_wf5revision Wildfireallow_stop TRUE

1 name Test_wf5

2 startup dll

3 exec_file D:WangYaoTest_wf5BinTest_

4 text_dir D:WangYaoTest_wf5Bin

5 revision Wildfire

6 allow_stop TRUE

7 end

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

1。单击【注册】,在弹出的对话框中选择Bin文件夹下的文件。

2.选中加载进来的Pro/TOOLKIT程序。

3。单击【启动】。

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

Line 1~12

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

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

添加命令: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

添加菜单按钮: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

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

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有打开零件档、组立档或工程图的情况下才是可 见并可选的,否则菜单项会变灰