《Proe应用ProTOOLKIT二次开发.doc》由会员分享,可在线阅读,更多相关《Proe应用ProTOOLKIT二次开发.doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、手把手教你开发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/TOOL
2、KIT在安装Pro/E时,默认是不安装Pro/TOOLKIT的,必须选中【API工具包】节点下的Pro/TOOLKIT选项。可以通过运行:Pro/E安装目录/bin/ptcsetup.bat 查看有无安装Pro/TOOLKIT。2.VS2008VS2008中文版下载地址:最好安装下VS2008 SP1补丁,否则编译Debug版本时常会报错。VS2008 SP1中文版下载地址:如果你需要开发64位的Pro/TOOLKIT程序,请确保安装X64 Compilers and Tools,如下图所示:3 二、新建工程点击【文件】-【新建】-【项目】菜单命令,创建MFC DLL工程。输入工程名称:tes
3、t_wf5。单击【确定】,然后在弹出的对话框中单击【下一步 】DLL类型:使用共享 MFC DLL单击【完成】完成创建工程。4 三、配置工程属性1.新增64位编译平台注意:如果只编译32位程序,请跳过此步骤。单击【生成】-【配置管理器】菜单命令,然后依照下图操作。如果没有x64选项,那说明安装VS2008时,没有安装X64 Compilers and Tools,重新安装此选项即可。2.新增头文件路径单击【项目】-【属性】菜单命令,添加如下头文件路径。【Pro/E安装目录】prodevelopincludes【Pro/E安装目录】protoolkitincludes注意:请先选择平台是Win3
4、2还是x64。3.新增库文件路径32位:【Pro/E安装目录】prodevelopi486_ntobj【Pro/E安装目录】protoolkiti486_ntobj64位:【Pro/E安装目录】prodevelopx86e_win64obj【Pro/E安装目录】protoolkitx86e_win64obj4.添加附加依赖项mpr.libwsock32.libpsapi.libprotk_dllmd.libprodev_dllmd.libnetapi32.lib5.设置工程字符集推荐优先采用Unicode。5 四、添加Pro/TOOLKIT代码在test_wf5.cpp文件的最后添加以下Pro
5、/TOOLKIT代码。该段代码的功能是:在Pro/E的【帮助】菜单后新增一个菜单【TestMenu】,然后在【TestMenu】下新增两个菜单项【Test】和【ShowCurrModelName】。分别实现弹出测试对话框和获取当前模型的名称并弹窗显示。注意:先只要大体理解代码的整体思路即可,本教程会在第三篇:手把手教你开发Pro/TOOLKIT应用程序(三) 中具体阐明代码的所有细节,在学习完本篇和第二篇后,再去学习第三篇会比较好。1234567891011121314151617181920212223242526272829303132333435363738394041424344454
6、64748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143/ 包含常用头文件#include #include #include #include #include #includ
7、e #include #include #include #include #include / 函数声明uiCmdAccessState TestAccess(uiCmdAccessMode access_mode);uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode access_mode);int Test(uiCmdCmdIdcommand,uiCmdValue *p_value,void *p_push_command_data);int ShowCurrModelName(uiCmdCmdIdcommand,uiCmd
8、Value *p_value,void *p_push_command_data);/ Pro/TOOLKIT入口函数extern C int user_initialize()ProError err;/ 信息文件名称ProFamilyName MsgFile;ProStringToWstring(MsgFile, Test_Msg.txt);/ 添加菜单:TestMenuerr = ProMenubarMenuAdd(TestMenu, TestMenu, Help, PRO_B_TRUE, MsgFile);/ 添加命令和菜单项/ 测试命令uiCmdCmdId cmd_id1;err =
9、 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, uiCmdPrioD
10、efault, 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(uiCmdCmd
11、Idcommand,uiCmdValue *p_value,void *p_push_command_data)AfxMessageBox(_T(Just For Test);return 0;/ 命令:获取当前模型的名称并显示int ShowCurrModelName(uiCmdCmdIdcommand,uiCmdValue *p_value,void *p_push_command_data)ProError err;/ 获取当前模型ProMdl mdl;err = ProMdlCurrentGet(&mdl);if (PRO_TK_NO_ERROR != err)return -1;/
12、获取当前模型名称并显示ProName name;err = ProMdlNameGet(mdl, name);MessageBoxW(NULL, name, Lwf5 test, MB_OK);return 0;/ 测试命令 菜单权限函数/ 任何情况下菜单都有效uiCmdAccessState TestAccess(uiCmdAccessMode access_mode)return ACCESS_AVAILABLE;/*ProError err;ProModemode;err = ProModeCurrentGet(&mode);if (err != PRO_TK_NO_ERROR)retu
13、rn ACCESS_UNAVAILABLE;if (mode = PRO_MODE_PART | mode = PRO_MODE_ASSEMBLY)return ACCESS_AVAILABLE;elsereturn ACCESS_UNAVAILABLE;*/ 获取当前模型名称并显示 菜单权限函数/ 只有在当前打开的模型为PART档,ASM档或Drawing档时菜单才有效uiCmdAccessState ShowCurrModelName_Access(uiCmdAccessMode access_mode)ProError err;ProModemode;err = ProModeCurre
14、ntGet(&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;elsereturn ACCESS_UNAVAILABLE;代码说明:1. user_initialize()为Pro/TOOLKIT应用程序的入口函数,每个Pro/TOOLKIT程序在被Pro/E加载时,首先执行此函数。2. user_terminate()是Pr
15、o/TOOLKIT程序被Pro/E卸载时执行的函数。3. ProMenubarMenuAdd为Pro/TOOLKIT程序添加菜单。4. ProCmdActionAdd为Pro/TOOLKIT程序添加一个命令,一般在添加菜单项时会将命令和菜单项关联,这样在单击菜单项时,就会执行对应的命令。5. ProMenubarmenuPushbuttonAdd为菜单添加菜单项。6. 以上代码添加了两个命令:test - 直接弹出测试对话框。ShowCurrModelName - 获取当前模型的名称并显示。6 五、编译程序1.选择需要编译Win32还是x64版本,以及Debug还是Release版本。2.单击
16、【生成】-【生成解决方案】即可编译生成DLL文件:test_wf5.dll。注意:如果你的VS2008没有安装SP1补丁,编译Debug版本时常会报错,即使编译成功,Pro/E也无法加载生成的test_wf5.dll。在编写信息文件前,首先在工程文件夹下新建Bin文件夹,然后将第五步生成的test_wf5.dll拷贝到Bin文件夹下。6.1 六、编写信息文件信息文件是用来定义Pro/TOOLKIT程序菜单及菜单项显示信息的文本文件。其内容以四行为一组,每行代表的意义如下: 菜单或菜单项的名称 菜单或菜单项的英文显示 菜单或菜单项的中文显示或其他语言版本的显示 #加载Pro/TOOLKIT程序时
17、,会读取信息文件,并根据菜单或菜单项的名称,匹配出菜单或菜单项的显示字符串。信息文件必须位于text目录下。操作步骤如下:1. 首先在Bin文件夹下新建text文件夹。2. 然后在text文件夹下新建两个子文件夹:chinese_cn、usascii,分别代表当Pro/E的语言版本为简体中文时,会读取chinese_cn文件夹下的信息文件。当Pro/E的语言版本为英文时,会读取usascii文件夹下的信息文件。3. 在chinese_cn文件夹下新建如下内容的文本文件:Test_Msg.txt。1234567891011121314151617181920TestMenuTest测试菜单#Te
18、stTest测试#Test_HelpJust For Test测试#ShowCurrModelNameShowCurrModelName显示模型名称#ShowCurrModelName_HelpShow Current Model Name显示模型名称#4. 在usascii文件夹下新建如下内容的文本文件:Test_Msg.txt。1234567891011121314151617181920TestMenuTest#TestTest#Test_HelpJust For Test#ShowCurrModelNameShowCurrModelName#ShowCurrModelName_Help
19、Show Current Model Name#6.2 七、编写注册文件注册文件包含Pro/TOOLKIT应用程序的路径,text文件夹的路径等信息,Pro/E通过注册文件中包含的信息,找到Pro/TOOLKIT程序并加载。在Bin文件夹下新建文本文件protk.dat,并输入如下内容。1234567name Test_wf5startupdllexec_file.Test_wf5.dlltext_dir .revision Wildfireallow_stop TRUEend含义如下:o name:Pro/TOOLKIT应用程序标识名称o startup:Pro/TOOLKIT应用程序与Pr
20、o/E的交互方式,一般为dllo exec_file:Pro/TOOLKIT程序的路径,可以是绝对路径,也可以使相对路径o text_dir:text文件夹路径o revision:版本o allow_stop:是否允许手动终止Pro/TOOLKIT程序o end:结束标志6.3 八、自动加载Pro/TOOLKI程序在Bin文件夹下新建一批处理文件GoProE.bat,输入命令:call Pro/E全路径例如在我的电脑上输入以下命令即可:1call C:PTCproeWildfire 5.0binproe1.bat双击GoProE.bat运行,将会启动Pro/E并自动加载我们编写的Pro/TO
21、OLKIT程序。这是因为我们通过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程序之前,我们需要先修改之前创建的注册文件protk.dat。将exec_dir和tex
22、t_dir指定的相对路径改为绝对路径,否则手动加载时会由于找不到相对路径指定的文件而报错的。示例如下:1234567name Test_wf5startupdllexec_fileD:WangYaoTest_wf5BinTest_wf5.dlltext_dir D:WangYaoTest_wf5Binrevision Wildfireallow_stop TRUEend通过桌面上的快捷方式来启动Pro/E。单击【工具】-【辅助应用程序】1.单击【注册】,在弹出的对话框中选择Bin文件夹下的protk.dat文件。2.选中加载进来的Pro/TOOLKIT程序。3.单击【启动】。这篇主要讲解第一篇
23、中Pro/TOOLKIT代码的具体含义。Line 112包含Pro/TOOLKIT常用的头文件。Line 1524函数声明。Line 2655user_initializeuser_initialize为Pro/TOOLKIT程序的初始化函数,每个Pro/TOOLKIT程序(DLL)都必须定义该函数。一般在该函数中添加菜单和菜单项。Line 3032定义了宽字符数组变量MsgFile用于存储信息文件的名称:Test_Msg.txt。ProFamilyName为宽字符(wchar_t)数组。ProStringToWstring函数将char字符串转换为wchar_t字符串。Line 35在Pro
24、/E【帮助】菜单之后添加菜单【TestMenu】。123456ProError ProMenubarMenuAdd(ProMenuItemName menu_name,ProMenuItemLabel untranslated_menu_label,ProMenuItemName neighbor,ProBoolean add_after_neighbor,ProFileName filename); menu_name:菜单名称,必须唯一。 untranslated_menu_label:菜单文本,该文本用于匹配信息文件中的内容。 neighbor:相邻的菜单名。Help为【帮助】菜单。 a
25、dd_after_neighbor:是否位于相邻菜单的右侧。PRO_B_TRUE表明位于右侧,否则位于左侧。 filename:信息文件名。Line 3941添加命令:Test。12345678ProError ProCmdActionAdd(char *action_name,uiCmdCmdActFn action_cb,uiCmdPriority priority,uiCmdAccessFn access_func,ProBooleanallow_in_non_active_window,ProBooleanallow_in_accessory_window,uiCmdCmdId *ac
26、tion_id); action_name:命令名称,必须唯一。 action_cb:命令的响应函数。 priority:命令的优先级,一般为uiCmdPrioDefault。 access_func:命令的访问权限函数。该函数的返回值关系到和命令关联的菜单项的状态,具体如下:12345678typedef enumACCESS_REMOVE = -1,/ 移除菜单项ACCESS_INVISIBLE,/ 菜单项不可见ACCESS_UNAVAILABLE,/ 菜单项灰化不可选ACCESS_DISALLOW, / 菜单项不可选ACCESS_AVAILABLE / 菜单项可选 uiCmdAccess
27、State; allow_in_non_active_window:是否在非激活窗口中显示命令关联的菜单项,一般为PRO_B_FALSE。 allow_in_accessory_window:是否在附属窗口中显示命令关联的菜单项,一般为PRO_B_FALSE。 action_id:命令ID。Line 4243添加菜单按钮:Test。123456789ProError ProMenubarmenuPushbuttonAdd(ProMenuItemName parent_menu,ProMenuItemName push_button_name,ProMenuItemLabelpush_butto
28、n_label,ProMenuLineHelp one_line_help,ProMenuItemName neighbor,ProBooleanadd_after_neighbor,uiCmdCmdIdaction_id,ProFileName filename); parent_menu:父菜单名。 push_button_name:菜单按钮名。 push_button_label:菜单按钮文本,用于匹配信息文件中的内容。 one_line_help:菜单按钮提示文本,用于匹配信息文件中的内容。 neighbor:相邻菜单项名,若为NULL,则添加到父菜单的最后。 add_after_ne
29、ighbor:是否位于相邻菜单项的后面。PRO_B_TRUE表明位于后面,否则位于前面。 action_id:关联的命令ID。 filename:信息文件名。Line 4651添加命令和菜单按钮:获取当前模型的名称并弹窗显示。同前,略。Line 5759 user_terminateuser_terminate函数为Pro/TOOLKIT应用程序退出时被执行的函数,每个Pro/TOOLKIT程序(DLL)都必须定义该函数。Line 6268命令响应函数:弹出测试对话框。Line 7192命令响应函数:获取当前模型的名称并弹出显示。ProMdlCurrentGet:获取当前模型,Pro/E中的任何模型,例如:零件档、组立档、工程图、钣金件等,都可以用ProMdl类型来表示。ProMdlNameGet:获取模型的名称。Line 96119命令访问权限函数。该函数始终返回ACCESS_AVAILABLE,所以菜单项【Test】始终是可见并可执行的。Line 123143命令访问权限函数。首先通过ProModeCurrentGet获取当前Pro/E的模式,后面的语句表明只有在零件档、组立档或工程图模式下才返回 ACCESS_AVAILABLE;也就是说菜单项【ShowCurrModelName】只有在Pro/E有打开零件档、组立档或工程图的情况下才是可 见并可选的,否则菜单项会变灰
限制150内