谁有PROE5.0 二次开发的资料
谁有PROE5.0 二次开发的资料,谢谢啦 我也想要兄弟你有了能不能给我发一份
邮箱是328154551@qq.com 顶出高手来。。。。 市面上还没有中文书籍,建议参看帮助文件,纯英文,需要英语4级以上水平。 不如让小弟来回答这个问题?以前用Proe4.0配着VC++2005来对Proe进行二次开发,肯定大家都知道是怎么配置VC++2005喽,现在Proe5.0已经出来很长时间了,肯定大家都想尝试一把了,可惜市面上又没有中文书籍(说实话,其实当时用Proe4.0配着VC++2005的时候,那些个中文的参考书也都是在扯淡,中国的学术界我真是无语了),现在就让小弟来给大家详细讲解一下如何对Proe5.0进行二次开发吧,哈哈。由于可能篇幅比较长,我决定将整个过程用多贴发上去吧,呵呵,以防太多错别字的出现,呵呵。 本帖最后由 lovedongyao 于 2011-3-30 21:05 编辑
首先要知道Proe5.0是要配合着VC++2008来进行二次开发的,所以各位还是赶紧安装一个VC++2008吧,为了讲解详细,我在讲如何配置之前先讲下如何测试Pro/Toolkit安装成功吧,呵呵。
第一步,找到...\proe5.0\protoolkit\i486_nt\obj这个路径下的一个叫做make_install的文件,用写字板打开,找到如下# Pro/Toolkit Source & Machine Loadpoint(EXTERNAL USE - DEFAULT)这么一行字,然后把它下面的PROTOOL_SRC = ../..改成PROTOOL_SRC = ...\proe5.0\protoolkit,保存下关闭就好了。
第二步,在“开始”找到VC++2008,但是这次不是打开VC++2008,而是要打开Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio2008命令提示,打开后感觉像是进入了cmd一样,呵呵。
第三步,在打开的这个界面里面敲上如下字符cd ...\proe5.0\protoolkit\i486_nt\obj然后回车,再敲上如下的字符nmake /f make_install dll,然后再点回车,等它自己运行一会,运行完了就可以关掉了,然后你再回到...\proe5.0\protoolkit\i486_nt\obj这个文件夹里面,发现多出一个pt_inst_test.dll文件,证明前面的工作全是成功的,呵呵。
第四步,回到...\proe5.0\protoolkit文件夹,找到protk.dat文件,用写字板打开,将第二行和第三行前面的“.”改成路径...\proe5.0\protoolkit,将第五行后面的“18”改成“wildfire5.0”,其他的都不变,保存,关闭,这一步相信经常弄Proe4.0二次开发的哥们再熟悉不过了,呵呵。
第五步,打开Proe5.0,找到工具-->辅助应用程序,打开,点“注册”,找到...\proe5.0\protoolkit里的protk.dat,打开,选中它,点“启动”,发现左上角出现一行字“程序'pt_inst_test'成功启动”,这就好了,然后关闭“辅助应用程序”,就差最后一步了,呵呵。
第六步,打开“文件”菜单栏,会出现一个新的按钮,叫“安装检测”,点击它,就会出现“PRO/TOOLKIT安装检测成功”。
至此Pro/Toolkit的安装检测全部完成了,呵呵,下一贴教大家配置VC++2008,哈哈 现在告诉大家配置VC++2008吧,呵呵。
第一步,加上Proe5.0的包含文件和库文件还用我说么,呵呵,还是说吧,照顾下初学者,也保证讲解的完整性。
包含文件就是
...\proe5.0\protoolkit\includes
...\proe5.0\protoolkit\protk_appls\includes
...\proe5.0\prodevelop\includes
...\proe5.0\prodevelop\prodev_appls\includes
这些加到Tools(工具)-->Options(选项)-->Projects and Solutions(项目于解决方案)-->VC++Directories(VC++目录)-->Show directories for:Include files(显示以下内容的目录:包含文件)
库文件就是
...\proe5.0\protoolkit\i486_nt\obj
...\proe5.0\prodevelop\i486_nt\obj
这些加到Tools(工具)-->Options(选项)-->Projects and Solutions(项目于解决方案)-->VC++Directories(VC++目录)-->Show directories for:Library files(显示以下内容的目录:库文件)。
第二步,在你做的工程名上单击右键,选择Properties(属性)-->Linker(连接器)-->Input(输入)-->Addtional Dependencies(附加依赖项),在这里加载以下lib文件:
(若是MFC DLL工程)
wsock32.lib
mpr.lib
psapi.lib
netapi32.lib
prodev_dllmd.lib
(若是MFC 应用程序工程)
wsock32.lib
mpr.lib
psapi.lib
protkmd.lib
pt_asynchronous.lib
netapi32.lib
第三步,在你做的工程名上单击右键,选择Properties(属性)->C/C++->PreProcessor(预处理器)->PreProcessor Definitions(预处理器定义),在这里加上以下命令:
PRO_USE_VAR_ARGS
到此为止,你的程序如果没有你自己书写或是逻辑的错误,肯定能运行通过了,绝对没有链接啊,配置啊,库啊,之类的错误,我亲自试过,没有问题,只不过有时可能会出现些警告,但是不会影响整个程序的运行,更不会影响你对Proe5.0的开发。谢谢大家,哈哈,如果你按照我的方法还是弄不出来,那就直接联系我吧,QQ281406178,呵呵 下面我为大家送上一个我自己做的所有菜单,按钮,对话框的一个总和的程序源代码吧,我自己在VC++2008里面写的,在Proe5.0里面运行成功了,呵呵。 #include"ProMenu.h"
#include"ProUtil.h"
#include"ProMenubar.h"
#include<ProMessage.h>
#include<ProUIDialog.h>
#include<ProUIPushbutton.h>
#include<ProUIRadiogroup.h>
#include<ProUILabel.h>
#include<ProUICheckbutton.h>
#include<ProUIInputpanel.h>
#include<ProArray.h>
int ShowMessage();
int ModeMenuActFn();
int MenuActFn();
int MenuActFn1();
static uiCmdAccessState AccessAvailable(uiCmdAccessMode);
static uiCmdAccessState AccessUnAvailable(uiCmdAccessMode);
static uiCmdAccessState AccessRemove(uiCmdAccessMode);
int MenuButton1ActFn();
int MenuButton2ActFn();
int MenuButton3ActFn();
int CheckButton(uiCmdCmdId,uiCmdValue*);
int SetCheckButtonValue(uiCmdCmdId,uiCmdValue*);
int RadioButton(uiCmdCmdId,uiCmdValue*);
int SetRadioButtonValue(uiCmdCmdId,uiCmdValue*);
int ContrlPashButtonShow(uiCmdCmdId,uiCmdValue*);
int ContrlCheckButton(uiCmdCmdId,uiCmdValue*);
void OK_Action(char*,char*,ProAppData);
void CANCEL_Action(char*,char*,ProAppData);
void SelectType_Action(char*,char*,ProAppData);
void Check_Action(char*,char*,ProAppData);
void InputText_Action(char*,char*,ProAppData);
void OK_Action1(char *,char *,ProAppData);
void CANCEL_Action1(char *,char *,ProAppData);
#define OK 1
#define CANCEL 0
typedef struct user_check_but
{
uiCmdCmdId command_ID;
ProBoolean state;
} UserCheckBut;
static ProMenuItemName RadioItemName;
uiCmdAccessId access_id,access_id1;
static UserCheckBut check_button; extern "C" int user_initialize()
{
ProError status;
ProFileName MsgFile;
uiCmdCmdId PushButton_cmd_id,PushButton_cmd_id1,PushButton_cmd_id2,ModeMenu_cmd_id,radio_act;
ProStringToWstring(MsgFile,"Message.txt");//设置菜单信息文件名
//添加菜单条
status=ProMenubarMenuAdd("UserMenuBar","UserMenu","Utilities",PRO_B_TRUE,MsgFile);
//菜单按钮设置
status=ProCmdActionAdd("PushButtonAct",(uiCmdCmdActFn)ShowMessage,uiCmdPrioDefault,
AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&PushButton_cmd_id);//动态函数设置
status=ProMenubarmenuPushbuttonAdd("UserMenuBar","PushButton","PushButton1",
"Adding a push button to the ProE menu bar",NULL,PRO_B_TRUE,PushButton_cmd_id,MsgFile);//添加菜单按钮
//显示UI对话框所有的元素
status=ProCmdActionAdd("PushButtonAct2",(uiCmdCmdActFn)MenuActFn1,uiCmdPrioDefault,
AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&PushButton_cmd_id2);//动态函数设置
status=ProMenubarmenuPushbuttonAdd("UserMenuBar","PushButton_UIAll","All Components",
"View all of the components in the UI dialog box",NULL,PRO_B_TRUE,PushButton_cmd_id2,MsgFile);//添加菜单按钮
//菜单复选按钮设置
status=ProCmdOptionAdd("CheckButtonAct",(uiCmdCmdActFn)CheckButton,PRO_B_TRUE,
(uiCmdCmdValFn)SetCheckButtonValue,AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&check_button.command_ID);//动作函数设置
status=ProMenubarmenuChkbuttonAdd("UserMenuBar","CheckButton","CheckButton1",
"Adding a check button to the ProE menu bar",NULL,PRO_B_TRUE,check_button.command_ID,MsgFile);//添加复选按钮
//菜单单选按钮组设置
status=ProCmdOptionAdd("RadioGroupOpt",(uiCmdCmdActFn)RadioButton,PRO_B_FALSE,
(uiCmdCmdValFn)SetRadioButtonValue,AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&radio_act);//动作函数设置
ProMenuItemName radio_group_items[]={"RadioButton1","RadioButton2","RadioButton3",""};//各单选按钮标识名
static ProMenuItemLabel radio_group_labels[]={"RadioButton1","RadioButton2","RadioButton3",""};//各单选按钮标签名
static ProMenuLineHelp radio_group_help[]={"Select radio button 1","Select radio button 2","Select radio button 3"};//各单选按钮提示信息关键字
status=ProMenubarmenuRadiogrpAdd("UserMenuBar","RadioGroup",3,radio_group_items,
radio_group_labels,radio_group_help,NULL,PRO_B_TRUE,radio_act,MsgFile);//添加单选按钮
//下级子菜单设置
status=ProMenubarmenuMenuAdd("UserMenuBar","SubMenu","SubMenu",NULL,PRO_B_TRUE,MsgFile);//添加下级子菜单项
//添加复选按钮来控制“菜单按钮1”项的显示与移除
status=ProCmdOptionAdd("CheckButtonAct1",(uiCmdCmdActFn)ContrlPashButtonShow,PRO_B_TRUE,
(uiCmdCmdValFn)SetCheckButtonValue,AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&check_button.command_ID);//动作函数设置
status=ProMenubarmenuChkbuttonAdd("SubMenu","CheckButton1","RemovePushButton1",
"Switch Push Button Test",NULL,PRO_B_TRUE,check_button.command_ID,MsgFile);//添加复选按钮
//添加复选按钮来控制“菜单复选按钮1”项不可选或可选
status=ProCmdOptionAdd("CheckButtonAct2",(uiCmdCmdActFn)ContrlCheckButton,PRO_B_TRUE,
(uiCmdCmdValFn)SetCheckButtonValue,AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&check_button.command_ID);//动作函数设置
status=ProMenubarmenuChkbuttonAdd("SubMenu","CheckButton2","CheckButton1Disenabled",
"Check Button 1 Disenabled Test",NULL,PRO_B_TRUE,check_button.command_ID,MsgFile);//添加复选按钮
//添加模式菜单
status=ProCmdActionAdd("ModeMenu",(uiCmdCmdActFn)ModeMenuActFn,uiCmdPrioDefault,
AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&ModeMenu_cmd_id);//动作函数设置
status=ProMenubarmenuPushbuttonAdd("UserMenuBar","ModeMenu","ModeMenu",
"Starting a mode-specific menu",NULL,PRO_B_TRUE,ModeMenu_cmd_id,MsgFile);//添加模式菜单按钮
//UI对话框菜单按钮设置
status=ProCmdActionAdd("PushButtonAct1",(uiCmdCmdActFn)MenuActFn,uiCmdPrioDefault,
AccessAvailable,PRO_B_TRUE,PRO_B_TRUE,&PushButton_cmd_id1);//动态函数设置
status=ProMenubarmenuPushbuttonAdd("SubMenu","PushButton_UI","UIDialogBox",
"Open a UI Dialog Box",NULL,PRO_B_TRUE,PushButton_cmd_id1,MsgFile);//添加菜单按钮
return status;
}
extern "C" void user_terminate()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
}
//菜单项访问权限设置
static uiCmdAccessState AccessAvailable(uiCmdAccessMode)
{
return(ACCESS_AVAILABLE);
}
static uiCmdAccessState AccessUnAvailable(uiCmdAccessMode)
{
return(ACCESS_UNAVAILABLE);
}
static uiCmdAccessState AccessRemove(uiCmdAccessMode)
{
return(ACCESS_REMOVE);
}
int ShowMessage()
{
ProFileName MsgFile;
ProStringToWstring(MsgFile,"Message.txt");
ProMessageDisplay(MsgFile,"Push button pressed");
return true;
}
int CheckButton(uiCmdCmdId command,uiCmdValue *p_value)
{
ProFileName MsgFile;
ProStringToWstring(MsgFile,"Message.txt");
check_button.state=(ProBoolean)!check_button.state;//切换菜单复选按钮项的开关状态
ProMenubarmenuChkbuttonValueGet(p_value,&check_button.state);//获得复选按钮之值
if(check_button.state)
ProMessageDisplay(MsgFile,"Check button selected");
else
ProMessageDisplay(MsgFile,"Check button cancel");
return 0;
}
int ContrlPashButtonShow(uiCmdCmdId command,uiCmdValue *p_value)
{
ProFileName MsgFile;
ProStringToWstring(MsgFile,"Message.txt");
uiCmdCmdId PushButton_cmd_id;
check_button.state=(ProBoolean)!check_button.state;
ProCmdCmdIdFind("PushButtonAct",&PushButton_cmd_id);
if(check_button.state)
{
ProCmdAccessFuncAdd(PushButton_cmd_id,(uiCmdAccessFn)AccessRemove,&access_id);
ProMessageDisplay(MsgFile,"Push button disappear");
}
else
if(access_id!=(uiCmdAccessId)NULL)
{
ProCmdAccessFuncRemove(PushButton_cmd_id,access_id);
ProMessageDisplay(MsgFile,"Push button appear");
}
return 0;
}
int ContrlCheckButton(uiCmdCmdId command,uiCmdValue *p_value)
{
ProFileName MsgFile;
ProStringToWstring(MsgFile,"Message.txt");
uiCmdCmdId CheckButton_cmd_id;
check_button.state=(ProBoolean)!check_button.state;
ProCmdCmdIdFind("CheckButtonAct",&CheckButton_cmd_id);
if(check_button.state)
{
ProCmdAccessFuncAdd(CheckButton_cmd_id,(uiCmdAccessFn)AccessUnAvailable,&access_id);
ProMessageDisplay(MsgFile,"Check button can't be selected");
}
else
if(access_id!=(uiCmdAccessId)NULL)
{
ProCmdAccessFuncRemove(CheckButton_cmd_id,access_id);
ProMessageDisplay(MsgFile,"Check button can be selected");
}
return 0;
}
int SetCheckButtonValue(uiCmdCmdId command,uiCmdValue *p_value)
{
for(int i=0;i<3;i++)
if(check_button.command_ID==command)
{
ProMenubarmenuChkbuttonValueSet(p_value,check_button.state);
break;
}
return 0;
}
int SetRadioButtonValue(uiCmdCmdId command,uiCmdValue *p_value)
{
ProMenubarMenuRadiogrpValueSet(p_value,RadioItemName);
return 0;
}
int RadioButton(uiCmdCmdId command,uiCmdValue *p_value)
{
ProFileName MagFile;
ProStringToWstring(MagFile,"Message.txt");
ProMenubarMenuRadiogrpValueGet(p_value,RadioItemName);
if(strcmp(RadioItemName,"RadioButton1")==0)
ProMessageDisplay(MagFile,"Radio button 1 selected");
if(strcmp(RadioItemName,"RadioButton2")==0)
ProMessageDisplay(MagFile,"Radio button 2 selected");
if(strcmp(RadioItemName,"RadioButton3")==0)
ProMessageDisplay(MagFile,"Radio button 3 selected");
return 0;
}
//模式菜单设计
int ModeMenuActFn()
{
int menu_id;
//注册菜单文件(.mnu为完整菜单扩展名,.aux为辅助菜单扩展名)
ProMenuFileRegister("Mode_specific","ModeMenu.mnu",&menu_id);
//动作函数设置(包括三个选择按钮和一个退出按钮)
ProMenubuttonActionSet("Mode_specific","Menu Button1",
(ProMenubuttonAction)MenuButton1ActFn,NULL,0);
ProMenubuttonActionSet("Mode_specific","Menu Button2",
(ProMenubuttonAction)MenuButton2ActFn,NULL,0);
ProMenubuttonActionSet("Mode_specific","Menu Button3",
(ProMenubuttonAction)MenuButton3ActFn,NULL,0);
ProMenubuttonActionSet("Mode_specific","Done",
(ProMenubuttonAction)ProMenuDelete,NULL,0);
//创建模式菜单
ProMenuCreate(PROMENUTYPE_MAIN,"Mode_specific",&menu_id);
//激活模式菜单
ProMenuProcess("",&menu_id);
return true;
}
//三个按钮的动作函数
int MenuButton1ActFn()
{
AfxMessageBox(L"选择菜单项1!",MB_OK);
return true;
}
int MenuButton2ActFn()
{
AfxMessageBox(L"选择菜单项2!",MB_OK);
return true;
}
int MenuButton3ActFn()
{
AfxMessageBox(L"选择菜单项3!",MB_OK);
return true;
}
//UI对话框的动作函数
int MenuActFn()
{
ProError status;
char *dialog_name="Usr_sample";
int ActiveDialog_status;
//装入对话框资源
status=ProUIDialogCreate(dialog_name,dialog_name);
if(status!=PRO_TK_NO_ERROR)
{
AfxMessageBox(L"UIDialog CreateCreate error!");
return status;
}
//设置对话框指定元件的动作函数
ProUIRadiogroupSelectActionSet(dialog_name,"SelectType",SelectType_Action,NULL);//设置单选按钮组的动作函数
ProUICheckbuttonActivateActionSet(dialog_name,"Checkbutton1",Check_Action,NULL);//设置复选按钮1的动作函数
ProUICheckbuttonActivateActionSet(dialog_name,"Checkbutton2",Check_Action,NULL);//设置复选按钮2的动作函数
ProUIInputpanelActivateActionSet(dialog_name,"InputText",InputText_Action,NULL);//设置输入框的动作函数
ProUIPushbuttonActivateActionSet(dialog_name,"OK",OK_Action,NULL);//设置OK按钮的动作函数
ProUIPushbuttonActivateActionSet(dialog_name,"Cancel",CANCEL_Action,NULL);//设置Cancel按钮的动作函数
//显示和激活对话框
status=ProUIDialogActivate(dialog_name,&ActiveDialog_status);
if(status!=PRO_TK_NO_ERROR)
{
AfxMessageBox(L"UIDialogActivate error!");
return status;
}
//从内存清楚对话框资源
status=ProUIDialogDestroy(dialog_name);
if(status!=PRO_TK_NO_ERROR)
{
AfxMessageBox(L"UIDialogDestroy error!");
return status;
}
return status;
}
//UI对话框单选按钮组动作函数定义
void SelectType_Action(char *dialog,char *component,ProAppData data)
{
ProLine PromptMessage;
char** names;
ProCharLine strtmp;
int Index;
ProArrayAlloc(0,sizeof(char*),1,(ProArray*)&names);
ProUIRadiogroupSelectednamesGet(dialog,component,&Index,&names);
sprintf(strtmp,"选择基准面:%s",names);
ProStringToWstring(PromptMessage,strtmp);
ProUILabelTextSet(dialog,"ShowMessage",PromptMessage);
ProArrayFree((ProArray*)&names);
}
//UI对话框复选按钮的动作函数定义
void Check_Action(char *dialog,char *component,ProAppData data)
{
ProLine PromptMessage;
ProBoolean set;
ProUICheckbuttonGetState(dialog,component,&set);
if(set)
{
if(strcmp(component,"CheckButtton1")==0)
ProStringToWstring(PromptMessage,"复选按钮1选中");
else
ProStringToWstring(PromptMessage,"复选按钮2选中");
}
else
{
if(strcmp(component,"CheckButtton1")==0)
ProStringToWstring(PromptMessage,"复选按钮1未选中");
else
ProStringToWstring(PromptMessage,"复选按钮2未选中");
}
ProUILabelTextSet(dialog,"ShowMessage",PromptMessage);
}
//UI对话框输入框的动作函数定义
void InputText_Action(char *dialog,char *component,ProAppData data)
{
wchar_t* PromptMessage;
ProUIInputpanelValueGet(dialog,component,&PromptMessage);
ProUILabelTextSet(dialog,"ShowMessage",PromptMessage);
}
//UI对话框“OK”按钮的动作函数定义
void OK_Action(char *dialog,char *component,ProAppData data)
{
ProUIDialogExit(dialog,OK);
}
//UI对话框“CANCEL”按钮的动作函数定义
void CANCEL_Action(char *dialog,char *component,ProAppData data)
{
ProUIDialogExit(dialog,CANCEL);
}
//显示UI对话框所有元素动作函数
int MenuActFn1()
{
ProError status;
char *dialog_name="UI_Allcomponents";
int ActiveDialog_status;
//装入对话框资源
status=ProUIDialogCreate(dialog_name,dialog_name);
if(status!=PRO_TK_NO_ERROR)
{
AfxMessageBox(L"UIDialog CreateCreate error!");
return status;
}
//设置动作函数
ProUIPushbuttonActivateActionSet(dialog_name,"PushButton1",OK_Action1,NULL);//设置OK按钮的动作函数
ProUIPushbuttonActivateActionSet(dialog_name,"PushButton2",CANCEL_Action1,NULL);//设置Cancel按钮的动作函数
//显示和激活对话框
status=ProUIDialogActivate(dialog_name,&ActiveDialog_status);
if(status!=PRO_TK_NO_ERROR)
{
AfxMessageBox(L"UIDialogActivate error!");
return status;
}
//从内存清楚对话框资源
status=ProUIDialogDestroy(dialog_name);
if(status!=PRO_TK_NO_ERROR)
{
AfxMessageBox(L"UIDialogDestroy error!");
return status;
}
return status;
}
void OK_Action1(char *dialog,char *component,ProAppData data)
{
ProUIDialogExit(dialog,OK);
}
void CANCEL_Action1(char *dialog,char *component,ProAppData data)
{
ProUIDialogExit(dialog,CANCEL);
}