Creo的二次開發(fā)配置(creo 二次開發(fā))
ProE/Creo Parametric TOOLKIT 二次開發(fā)環(huán)境推薦設(shè)置(上)
一、ProE/Creo與IDE選擇
IDE(Integrated Development Environment):集成開發(fā)環(huán)境,是用于提供程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面等工具。
VS(Microsoft Visual Studio):是微軟發(fā)布的一個很完整的開發(fā)工具集,包含很多高級語言的開發(fā)環(huán)境,VC只是VS其中的一個開發(fā)環(huán)境。
VC(Microsoft Visual C ):是微軟公司的C 開發(fā)工具,具有集成開發(fā)環(huán)境,可提供編輯C語言,C 以及C /CLI等編程語言。
ProE或Creo低版本上開發(fā)的插件一般可以在高版本上運行,或?qū)⒃创a經(jīng)過少量修改,然后在高版本上編譯后即可在高版本上運行,高版本上開發(fā)的插件不可以在低版本上運行。
二、創(chuàng)建MFC DLL項目(Visual Studio 2012 Creo3.0 M140)
1. 啟動Visual Studio 2012>文件>新建>項目>模板>Visual C >MFC>MFC DLL>填寫項目“名稱(N)”>選擇項目文件存放“位置(L)”>“確定”
DLL (Dynamic Link Library):動態(tài)鏈接庫文件,又稱“應(yīng)用程序拓展”,是一種軟件文件類型。
DLL模式:進程內(nèi)模式,Pro/TOOLKIT插件與ProE或Creo程序之間的信息交換通過直接函數(shù)調(diào)用的形式完成,插件與程序無縫集成,推薦使用的一種方式。
EXE模型:多進程模式,插件被編譯為可執(zhí)行程序,這個插件程序?qū)⑹荘roE或Creo程序的衍生,并作為主程序的一個子進程來運行。
2. “下一步>”
3. DLL類型:選擇“帶靜態(tài)鏈接MFC 的規(guī)則 DLL(R)”>“完成”
使用共享MFC DLL的規(guī)則DLL(D):編譯后的DLL程序文件中不包含MFC的庫,DLL程序文件稍小一些,當(dāng)發(fā)布該程序時,如果對方的機器上沒有安裝對應(yīng)版本的MFC的庫,那么該DLL程序無法運行。
帶靜態(tài)鏈接MFC 的規(guī)則 DLL(R):編譯后的DLL程序文件中包含MFC的庫,DLL程序文件稍大一些,當(dāng)發(fā)布該程序時,即使對方電腦即使沒有安裝對應(yīng)版本的MFC的庫,那么該DLL程序也可以運行。
第一種與第二種類型對于Pro/TOOLKIT插件程序文件大小影響不大,推薦使用第二種類型。
三、項目屬性設(shè)置
1. 新建x64平臺
現(xiàn)在用戶安裝的ProE或Creo大多是64位版本,所以開發(fā)時建議開發(fā)64位平臺的插件程序,具體還是要以用戶安裝的程序平臺位數(shù)來定。
Debug:調(diào)試版本,包含調(diào)試信息,所以容量比Release大很多,并且不進行任何優(yōu)化(優(yōu)化會使調(diào)試復(fù)雜化,因為源代碼和生成的指令間關(guān)系會更復(fù)雜),便于程序調(diào)試。Debug模式下生成兩個文件,除了.exe或.dll文件外,還有一個.pdb文件,該文件記錄了代碼中斷點等調(diào)試信息。
Release:發(fā)布版本,不對源代碼進行調(diào)試,編譯時對應(yīng)用程序的速度進行優(yōu)化,使得程序在代碼大小和運行速度上都是最優(yōu)的。Release模式下生成一個文件.exe或.dll文件(調(diào)試信息可在單獨的PDB文件中生成)。
建議開發(fā)調(diào)試的時候使用Debug模式,方便插入斷點和捕捉變量值,發(fā)布的時候使用Release模式,在創(chuàng)建項目的時候可以將兩種方式都配置好,以供后續(xù)選擇。
2. 常規(guī)設(shè)置
輸出目錄:插件DLL程序文件生成的目錄,對x64平臺建議使用“..binx86e_win64”,對x86平臺建議使用“..bini486_nt”。
中間目錄:插件程序編譯鏈接是產(chǎn)生的中間文件的目錄。
平臺工具集:當(dāng)電腦中安裝有多個版本的平臺工具集時,可修改當(dāng)前項目使用的平臺工具集,平臺共計集的選擇請參照【表格1】。
MFC的使用:當(dāng)新建MFC DLL項目時,如果DLL類型選擇“使用共享MFC DLL的規(guī)則DLL(D)”,那么此處顯示“在共享 DLL 中使用 MFC”;如果DLL類型選擇“帶靜態(tài)鏈接MFC 的規(guī)則 DLL(R)”,那么此處顯示“在靜態(tài)庫中使用 MFC”。也可在此處修改DLL類型,推薦使用“在靜態(tài)庫中使用 MFC”。
字符集:可以選擇“使用 Unicode 字符集”或“使用多字節(jié)字符集”,PTC官方推薦選擇“使用 Unicode 字符集”。
3. VC 目錄
對于x64平臺和x86平臺,包含目錄一樣,庫目錄有所不同。
x64平臺:
包含目錄:D:PTCCreo 3.0M140CommonFilesprotoolkitincludes
庫目錄:D:PTCCreo 3.0M140CommonFilesprotoolkitx86e_win64obj
x86平臺:
包含目錄:D:PTCCreo 3.0M140CommonFilesprotoolkitincludes
庫目錄:D:PTCCreo 3.0M140CommonFilesprotoolkit i486_ntobj
4. 預(yù)處理器定義
運行庫選擇“多線程 DLL (/MD)”或“多線程調(diào)試 DLL (/MDd)”時,添加:_AFXDLL,因為不推薦選擇這兩種方式,所以不采用這兩種方式是不需要添加。
在插件DLL程序中用到頭文件“ProMessage.h”中函數(shù)時,添加:PRO_USE_VAR_ARGS,一般都會使用該文件中的函數(shù),默然是添加。
5. 運行庫
對與Debug和Release模式,運行庫的選擇有所不同:
Debug模式:多線程調(diào)試 (/MTd),推薦。
Debug模式:多線程調(diào)試 DLL (/MDd),不推薦。
Release模式:多線程 (/MT),推薦。
Release模式:多線程 DLL (/MD) ,不推薦。
運行庫:是程序在運行時所需要的庫文件。通常運行庫是以DLL的形式提供。
6. 附加依賴項
Creo版本不同,需要添加的庫文件也有所不同,一般都需要添加的項有:
mpr.lib
psapi.lib
ws2_32.lib
netapi32.lib
Creo版本
庫文件:(/MT)或(/MTd)
庫文件:(/MD)或(/MDd)
ProE4.0
protk_dll.lib
protk_dllmd.lib
ProE5.0
protk_dll.lib
protk_dllmd.lib
Creo2.0
protk_dll.lib
protk_dllmd.lib
Creo3.0
protk_dll_NU.lib、ucore.lib、udata.lib
protk_dllmd.lib、ucore.lib、udata.lib
Creo4.0
protk_dll_NU.lib、ucore.lib、udata.lib
protk_dllmd_NU.lib、ucore.lib、udata.lib
Creo5.x.x.x
protk_dll_NU.lib、ucore.lib、udata.lib
protk_dllmd_NU.lib、ucore.lib、udata.lib
四、代碼編輯
以下是該插件程序中,需要在文件“TkPlugin.cpp”中輸入的代碼:
//頭文件
#include “ProMenubar.h”
#include “ProMenu.h”
#include “ProUtil.h”
#include “ProMessage.h”
//菜單狀態(tài)
static uiCmdAccessState AccessDefault(uiCmdAccessMode access_mode)
{
return(ACCESS_AVAILABLE);
}
//自定義函數(shù)
void SayHello()
{
//消息文件
ProFileName msg_file;
ProStringToWstring(msg_file, “message.txt”);
//消息轉(zhuǎn)換
ProLine msg;
ProMessageToBuffer(msg, msg_file, “Hello World”);
//顯示消息
AfxMessageBox(msg);
}
//入口函數(shù)
extern “C” int user_initialize()
{
ProError status = PRO_TK_NO_ERROR;
//菜單文件
ProFileName menu_file;
ProStringToWstring(menu_file,”menu.txt”);
//創(chuàng)建菜單
status = ProMenubarMenuAdd(“TkPluginMenu”,”TkPluginMenu”,”Help”,PRO_B_TRUE,menu_file);
//第一個命令
uiCmdCmdId FirstCmd_Id;
status = ProCmdActionAdd(“FirstCmd_Act”,(uiCmdCmdActFn)SayHello,uiCmdPrioDefault,
AccessDefault,PRO_B_TRUE,PRO_B_TRUE,&FirstCmd_Id);
status = ProMenubarmenuPushbuttonAdd(“TkPluginMenu”,”FirstCmd”,”FirstCmd”,
“This button will show a message”,NULL,PRO_B_TRUE,FirstCmd_Id,menu_file);
status = ProCmdIconSet(FirstCmd_Id,”FirstCmd.gif”);
//返回值
return (0);
}
//出口函數(shù)
extern “C” void user_terminate()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
}