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


发布评论