Proe应用ProTOOLKIT二次开发.docx
《Proe应用ProTOOLKIT二次开发.docx》由会员分享,可在线阅读,更多相关《Proe应用ProTOOLKIT二次开发.docx(25页珍藏版)》请在冰豆网上搜索。
![Proe应用ProTOOLKIT二次开发.docx](https://file1.bdocx.com/fileroot1/2023-2/24/ba670460-fe40-4b18-abbc-e3ced06f27d1/ba670460-fe40-4b18-abbc-e3ced06f27d11.gif)
Proe应用ProTOOLKIT二次开发
手把手教你开发Pro/TOOLKIT应用程序
1前言
本教程采用VS2008+Pro/EWildfire5.0来讲解怎样开发Pro/TOOLKIT应用程序。
开发Pro/TOOLKIT应用程序时,Pro/E和VisualStudio的版本需对应,否则很难搭建开发环境,其对应关系如下:
∙Wildfire4.0<>VS2008
∙Wildfire5.0<>VS2008
∙Creo1.0<>VS2010
∙Creo2.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查看有无安装Pro/TOOLKIT。
2.VS2008
VS2008中文版下载地址:
最好安装下VS2008SP1补丁,否则编译Debug版本时常会报错。
VS2008SP1中文版下载地址:
如果你需要开发64位的Pro/TOOLKIT程序,请确保安装X64CompilersandTools,如下图所示:
3二、新建工程
点击【文件】->【新建】->【项目】菜单命令,创建MFCDLL工程。
输入工程名称:
test_wf5。
单击【确定】,然后在弹出的对话框中单击【下一步>】
DLL类型:
使用共享MFCDLL
单击【完成】完成创建工程。
4三、配置工程属性
1.新增64位编译平台
注意:
如果只编译32位程序,请跳过此步骤。
单击【生成】->【配置管理器】菜单命令,然后依照下图操作。
如果没有x64选项,那说明安装VS2008时,没有安装X64CompilersandTools,重新安装此选项即可。
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。
5四、添加Pro/TOOLKIT代码
在test_wf5.cpp文件的最后添加以下Pro/TOOLKIT代码。
该段代码的功能是:
在Pro/E的【帮助】菜单后新增一个菜单【TestMenu】,然后在【TestMenu】下新增两个菜单项【Test】和【ShowCurrModelName】。
分别实现弹出测试对话框和获取当前模型的名称并弹窗显示。
注意:
先只要大体理解代码的整体思路即可,本教程会在第三篇:
手把手教你开发Pro/TOOLKIT应用程序(三)中具体阐明代码的所有细节,在学习完本篇和第二篇后,再去学习第三篇会比较好。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//包含常用头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//函数声明
uiCmdAccessStateTestAccess(uiCmdAccessModeaccess_mode);
uiCmdAccessStateShowCurrModelName_Access(uiCmdAccessModeaccess_mode);
intTest(uiCmdCmdId command,
uiCmdValue*p_value,
void *p_push_command_data);
intShowCurrModelName(uiCmdCmdId command,
uiCmdValue*p_value,
void *p_push_command_data);
//Pro/TOOLKIT入口函数
extern"C"intuser_initialize()
{
ProErrorerr;
//信息文件名称
ProFamilyNameMsgFile;
ProStringToWstring(MsgFile,"Test_Msg.txt");
//添加菜单:
TestMenu
err=ProMenubarMenuAdd("TestMenu","TestMenu","Help",PRO_B_TRUE,MsgFile);
//添加命令和菜单项
//测试命令
uiCmdCmdIdcmd_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);
//显示并输出当前模型的名称
uiCmdCmdIdcmd_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);
return0;
}
//Pro/TOOLKIT结束时调用的函数
extern"C"voiduser_terminate()
{
}
//测试命令响应函数
intTest(uiCmdCmdId command,
uiCmdValue*p_value,
void *p_push_command_data)
{
AfxMessageBox(_T("JustForTest"));
return0;
}
//命令:
获取当前模型的名称并显示
intShowCurrModelName(uiCmdCmdId command,
uiCmdValue*p_value,
void *p_push_command_data)
{
ProErrorerr;
//获取当前模型
ProMdlmdl;
err=ProMdlCurrentGet(&mdl);
if(PRO_TK_NO_ERROR!
=err)
{
return-1;
}
//获取当前模型名称并显示
ProNamename;
err=ProMdlNameGet(mdl,name);
MessageBoxW(NULL,name,L"wf5test",MB_OK);
return0;
}
//测试命令菜单权限函数
//任何情况下菜单都有效
uiCmdAccessStateTestAccess(uiCmdAccessModeaccess_mode)
{
returnACCESS_AVAILABLE;
/*
ProErrorerr;
ProMode mode;
err=ProModeCurrentGet(&mode);
if(err!
=PRO_TK_NO_ERROR)
{
returnACCESS_UNAVAILABLE;
}
if(mode==PRO_MODE_PART
||mode==PRO_MODE_ASSEMBLY)
{
returnACCESS_AVAILABLE;
}
else
{
returnACCESS_UNAVAILABLE;
}
*/
}
//获取当前模型名称并显示菜单权限函数
//只有在当前打开的模型为PART档,ASM档或Drawing档时菜单才有效
uiCmdAccessStateShowCurrModelName_Access(uiCmdAccessModeaccess_mode)
{
ProErrorerr;
ProMode mode;
err=ProModeCurrentGet(&mode);
if(PRO_TK_NO_ERROR!
=err)
{
returnACCESS_UNAVAILABLE;
}
if(mode==PRO_MODE_PART
||mode==PRO_MODE_ASSEMBLY
||mode==PRO_MODE_DRAWING)
{
returnACCESS_AVAILABLE;
}
else
{
returnACCESS_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_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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TestMenu
Test
测试菜单
#
Test
Test
测试
#
Test_Help
JustForTest
测试
#
ShowCurrModelName
ShowCurrModelName
显示模型名称
#
ShowCurrModelName_Help
ShowCurrentModelName
显示模型名称
#
4.在usascii文件夹下新建如下内容的文本文件:
Test_Msg.txt。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TestMenu
Test
#
#
Test
Test
#
#
Test_Help
JustForTest
#
#
ShowCurrModelName
ShowCurrModelName
#
#
ShowCurrModelName_Help
ShowCurrentModelName
#
#
6.2七、编写注册文件
注册文件包含Pro/TOOLKIT应用程序的路径,text文件夹的路径等信息,Pro/E通过注册文件中包含的信息,找到Pro/TOOLKIT程序并加载。
在Bin文件夹下新建文本文件protk.dat,并输入如下内容。
1
2
3
4
5
6
7
name Test_wf5
startup dll
exec_file .\Test_wf5.dll
text_dir .\
revision Wildfire
allow_stopTRUE
end
含义如下:
oname:
Pro/TOOLKIT应用程序标识名称
ostartup:
Pro/TOOLKIT应用程序与Pro/E的交互方式,一般为dll
oexec_file:
Pro/TOOLKIT程序的路径,可以是绝对路径,也可以使相对路径
otext_dir:
text文件夹路径
orevision:
版本
oallow_stop:
是否允许手动终止Pro/TOOLKIT程序
oend:
结束标志
6.3八、自动加载Pro/TOOLKI程序
在Bin文件夹下新建一批处理文件GoProE.bat,输入命令:
call[Pro/E全路径]
例如在我的电脑上输入以下命令即可:
1
call"C:
\PTC\proeWildfire5.0\bin\proe1.bat"
双击GoProE.bat运行,将会启动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程序之前,我们需要先修改之前创建的注册文件protk.dat。
将exec_dir和text_dir指定的相对路径改为绝对路径,否则手动加载时会由于找不到相对路径指定的文件而报错的。
示例如下:
1
2
3
4
5
6
7
name Test_wf5
startup dll
exec_file D:
\WangYao\Test_wf5\Bin\Test_wf5.dll
text_dir D:
\WangYao\Test_wf5\Bin\
revision Wildfire
allow_stopTRUE
end
通过桌面上的快捷方式来启动Pro/E。
单击【工具】->【辅助应用程序】
1.单击【注册】,在弹出的对话框中选择Bin文件夹下的protk.dat文件。
2.选中加载进来的Pro/TOOLKIT程序。
3.单击【启动】。
这篇主要讲解第一篇中Pro/TOOLKIT代码的具体含义。
Line1~12
包含Pro/TOOLKIT常用的头文件。
Line15~24
函数声明。
Line26~55 user_initialize
user_initialize为Pro/TOOLKIT程序的初始化函数,每个Pro/TOOLKIT程序(DLL)都必须定义该函数。
一般在该函数中添加菜单和菜单项。
Line30~32
定义了宽字符数组变量MsgFile用于存储信息文件的名称:
Test_Msg.txt。
ProFamilyName为宽字符(wchar_t)数组。
ProStringToWstring函数将char字符串转换为wchar_t字符串。
Line35
在Pro/E【帮助】菜单之后添加菜单【TestMenu】。
1
2
3
4
5
6
ProErrorProMenubarMenuAdd(
ProMenuItemNamemenu_name,
ProMenuItemLabeluntranslated_menu_label,
ProMenuItemNameneighbor,
ProBooleanadd_after_neighbor,
ProFileNamefilename);
∙menu_name:
菜单名称,必须唯一。
∙untranslated_menu_label:
菜单文本,该文本用于匹配信息文件中的内容。
∙neighbor:
相邻的菜单名。
"Help"为【帮助】菜单。
∙add_after_neighbor:
是否位于相邻菜单的右侧。
PRO_B_TRUE表明位于右侧,否则位于左侧。
∙filename:
信息文件名。
Line39~41
添加命令:
Test。
1
2
3
4
5
6
7
8
ProErrorProCmdActionAdd(
char *action_name,
uiCmdCmdActFn action_cb,
uiCmdPriority priority,
uiCmdAccessFn access_func,
ProBoolean allow_in_non_active_window,
ProBoolean allow_in_accessory_window,
uiCmdCmdId *action_id);
∙action_name:
命令名称,必须唯一。
∙action_cb:
命令的响应函数。
∙priority:
命令的优先级,一般为uiCmdPrioDefault。
∙access_func:
命令的访问权限函数。
该函数的返回值关系到和命令关联的菜单项的状态,具体如下:
1
2
3
4
5
6
7
8
typedefenum
{
ACCESS_REMOVE=-1, //移除菜单项
ACCESS_INVISIBLE, //菜单项不可见
ACCESS_UNAVAILABLE, //菜单项灰化不可选
ACCESS_DISALLOW, //菜单项不可选
ACCESS_AVAILABLE //菜单项可选
}uiCmdAccessState;
∙allow_in_non_active_window:
是否在非激活窗口中显示命令关联的菜单项,一般为PRO_B_FALSE。
∙allow_in_accessory_window:
是否在附属窗口中显示命令关联的菜单项,一般为PRO_B_FALSE。
∙action_id:
命令ID。
Line42~43
添加菜单按钮:
Test。
1
2
3
4
5
6
7
8
9
ProErrorProMenubarmenuPushbuttonAdd(
ProMenuItemName parent_menu,
ProMenuItemName