莊志凡,陳賓賓
(特靈科技亞太研發(fā)中心,江蘇 太倉215400)
當(dāng)工程師利用PTC的CAD產(chǎn)品Creo Parametric進(jìn)行產(chǎn)品設(shè)計(jì)研發(fā)的過程當(dāng)中,會經(jīng)常遇到很多重復(fù)性、標(biāo)準(zhǔn)化的任務(wù),因此要做到簡化并自動執(zhí)行這些任務(wù)就需要對Creo進(jìn)行一些具備企業(yè)風(fēng)格的二次開發(fā)。
假設(shè)完成一款CAD軟件的二次開發(fā),需要開發(fā)者同時(shí)具備編程語言、算法設(shè)計(jì)、CAD高級建模等多學(xué)科應(yīng)用能力。而工程師是用戶或需求方,通常并不具備其中的軟件開發(fā)能力,企業(yè)往往會讓二次開發(fā)部門或者外部供應(yīng)商來幫助進(jìn)行開發(fā),這其中需要花費(fèi)很多的溝通和測試的時(shí)間。另外,長期的維護(hù)成本也是企業(yè)管理者考慮的一個(gè)重要的因素。
當(dāng)前筆者所闡述的一種基于Excel和Mapkey的二次開發(fā)技術(shù),具有簡單、快速等特點(diǎn),其學(xué)習(xí)的難度和成本較低,主要因?yàn)閯?chuàng)建這個(gè)開發(fā)環(huán)境不需要大量的編程知識和構(gòu)架能力,因而可以讓需求者(工程師)自主開發(fā)自己需要的二次開發(fā)軟件,來實(shí)現(xiàn)工作效率和質(zhì)量的提升。
目前Creo的主流二次開發(fā)程序有兩種,Pro/toolkit和VB API。
Pro/toolkit是一款PTC官方的開發(fā)模塊,它有一套獨(dú)立的工具包并且需要購買MS Visual Studio等付費(fèi)開發(fā)軟件,其成本高昂。另外,開發(fā)者需要掌握基本的C語言和C++框架才能夠使用它進(jìn)行開發(fā)。Pro/toolkit技術(shù)已趨近成熟,開發(fā)周期通常比較長,國內(nèi)已有相關(guān)的企業(yè)和大學(xué)對其開發(fā)模式進(jìn)行深入的研究。
VB API則是另一種PTC官方提供的二次開發(fā)包,這種開發(fā)模式相比較Pro/toolkit而言價(jià)格會比較低廉,只要用VB代碼就可以完成創(chuàng)建。但是它仍然需要開發(fā)者去學(xué)習(xí)及查詢PTC API的英文手冊并進(jìn)行實(shí)踐,同時(shí)也需要開發(fā)者掌握VB編程的基本知識和實(shí)踐能力。它能夠?qū)崿F(xiàn)的功能比較局限,運(yùn)行的效率一般,其開發(fā)的周期也是相對較長的,目前在國內(nèi)仍處于探索階段[1]。
相比前兩者開發(fā)工具,本文所描述的二次開發(fā)技術(shù)主要基于Excel和Mapkey這兩大平臺。Excel是一款微軟平臺上常用的綜合性圖表軟件,它擁有豐富的計(jì)算和數(shù)據(jù)分析模塊,其內(nèi)嵌的VBA語言適合初級軟件開發(fā)者學(xué)習(xí)并使用。也由于它有很強(qiáng)的通用性,適合各個(gè)不同專業(yè)領(lǐng)域的用戶使用,其上手的難度比較低。因此將Excel作為這類二次開發(fā)平臺的客戶端和執(zhí)行語言。Mapkey作為Creo內(nèi)置的宏模塊,它和Creo的兼容性非常好,能夠涵蓋軟件內(nèi)部許多不同的設(shè)計(jì)模塊。使用這類技術(shù)開發(fā)門檻比較低,可以通過手動錄制的方法隨時(shí)設(shè)計(jì)自己所需的流程和代碼,它的代碼字符通常也是和界面命令相似,便于開發(fā)者理解使用。同時(shí)因?yàn)樗虲reo處于同一獨(dú)立的模式和進(jìn)程,執(zhí)行程序時(shí)并不影響其他軟件的使用效率,甚至能夠提高Creo內(nèi)部運(yùn)行的速度。因此選用Mapkey作為開發(fā)的底層語言模塊。
綜合運(yùn)用Excel和Mapkey兩個(gè)模塊的二次開發(fā)技術(shù),可以更好地結(jié)合兩者獨(dú)立的優(yōu)勢,來達(dá)到開發(fā)和使用的效率提升。
表1 不同開發(fā)模式特點(diǎn)對比
在搭建開發(fā)環(huán)境之前,需要準(zhǔn)備兩部分內(nèi)容,第一部分需要準(zhǔn)備一個(gè)notepad++工具來編輯及儲存Mapkey,第二部分需要準(zhǔn)備一個(gè)Excel來進(jìn)行VBA簡易編程,其中要求開發(fā)者至少入門應(yīng)用這兩種基本的編程技術(shù):Mapkey和VBA。
Mapkey編碼技術(shù):Creo內(nèi)置二次開發(fā)宏模塊,它主要功能是模擬用戶操作軌跡并且重復(fù)執(zhí)行,搭建這個(gè)二次開發(fā)則需要用戶會錄制和解讀簡單的Mapkey,來完成一些流程設(shè)計(jì)即可。
VBA技術(shù):VBA是VB基于Excel做的一個(gè)拓展包,其底層的知識結(jié)構(gòu)大致和VB一樣,在當(dāng)前這類二次開發(fā)技術(shù)中VBA只是作為一個(gè)基本框架和模板,無需開發(fā)者單獨(dú)設(shè)計(jì)具體算法。
主要流程:首先需要利用VBA從Excel端口創(chuàng)建一個(gè)自定義宏文件→同時(shí)利用VBA創(chuàng)建自定義的Mapkey并且傳遞儲存至創(chuàng)建好的自定義宏文件→設(shè)計(jì)一個(gè)Mapkey執(zhí)行器可以在Creo端口利用它的執(zhí)行功能直接運(yùn)行自定義的Mapkey→創(chuàng)建一個(gè)啟動器和Creo進(jìn)行連接 并 喚 醒Mapkey執(zhí)行器完成二次開發(fā)環(huán)境的最終環(huán)節(jié)。 二次開發(fā)流程如圖1所示。
圖1 二次開發(fā)流程(總)
Mapkey的主要特點(diǎn)就是其宏的獨(dú)特性和單一性,但是在實(shí)際應(yīng)用中用戶的流程和需求是千變?nèi)f化的,需要更多地考慮靈活性和通用性。讓Creo每次都能夠接受不同的用戶信號并快速地運(yùn)用Mapkey去運(yùn)行。因此,筆者采用了創(chuàng)建臨時(shí)自定義宏文件的方案,目的就是可以隨時(shí)調(diào)用其中的Mapkey宏,這個(gè)文件是由用戶按照特定的規(guī)則創(chuàng)造,且可以生成不同的自動化流程。它需要具備以下幾大特點(diǎn):1)文件必須是臨時(shí)的,且不會永久地修改Creo的設(shè)置和一切宏;2)文件儲存的區(qū)域必須是已知有效的本地通用路徑;3)文件需要自己獨(dú)立的名稱,避免與其他文件的文件名沖突;4)文件格式和編碼必須和默認(rèn)宏文件一致。
筆者在設(shè)計(jì)這個(gè)宏文件的自動創(chuàng)建流程時(shí)采用的是VBA 工作簿啟動事件,目的是在Excel用戶開發(fā)工具啟動的同時(shí)識別或創(chuàng)建該文件,自定義宏文件開發(fā)流程如圖2所示,具體代碼如圖3所示。
圖2 自定義宏文件開發(fā)流程
圖3 自定義宏文件程序代碼
其中:變量SourceFile為筆者公司系統(tǒng)默認(rèn)宏儲存路徑和名稱config.pro;變量DestinationFile為筆者定義自定宏的儲存路徑和名稱USER.pro。
該程序主要先利用IF語句判斷自定宏文件是否存在,當(dāng)用戶第一次使用該工作簿時(shí),系統(tǒng)會自動復(fù)制同目錄下的config文件到自定義宏文件,同時(shí)打開該文件并清空內(nèi)容。而用戶第二次啟動時(shí),則會識別到該文件而自動退出程序,目的就是確保自定義宏文件的成功創(chuàng)建為后續(xù)的開發(fā)作安全保障。
當(dāng)完成自定義宏文件的創(chuàng)建之后,需要開發(fā)者繼續(xù)定義創(chuàng)建Mapkey的方法并且把Mapkey傳遞及儲存到自定義宏文件中去。針對這種流程,筆者采取的是VBA編程技術(shù),主要需要完成大致兩項(xiàng)內(nèi)容:Mapkey創(chuàng)建和動態(tài)參數(shù)關(guān)聯(lián),以及Mapkey代碼到自定義宏文件的傳遞。Mapkey創(chuàng)建及傳遞流程如圖4所示。
圖4 Mapkey創(chuàng)建及傳遞流程
3.2.1 Mapkey創(chuàng)建和動態(tài)參數(shù)關(guān)聯(lián)
通常在VBA編程里會利用Print命令去輸出需要的Mapkey代碼字符。對于一個(gè)靜態(tài)參數(shù)的Mapkey代碼,它的處理方式比較簡單,只需要依次輸入print的字符串就可以將整套程序代碼生成出來。圖5所示是一個(gè)實(shí)現(xiàn)打開固定零件的Mapkey靜態(tài)參數(shù)語句。
圖5 靜態(tài)參數(shù)語句
其中:Print #1是指在1號通道輸出該值,1號通道由開發(fā)者定義,引號內(nèi)部則是該Mapkey主要代碼。
對于帶有動態(tài)參數(shù)的Mapkey程序,除了輸出常規(guī)的語句之后,需要對動態(tài)參數(shù)語句進(jìn)行和輸入端口的一個(gè)關(guān)聯(lián),通常將靜態(tài)和動態(tài)兩種參數(shù)作一個(gè)關(guān)聯(lián)語句就能夠完成匹配。例如,輸入端口為單元格A1的值,那輸出的語句為print #1“Text1”&Range(“A1”),這樣就能夠返回用戶在A1內(nèi)輸入的值的Mapkey字符串。圖6所示是一個(gè)實(shí)現(xiàn)打開用戶輸入的零件Mapkey動態(tài)參數(shù)語句。
圖6 動態(tài)參數(shù)語句
其中:Range(“A1”)為單元格A1的參數(shù)。
當(dāng)用戶輸入的信號是多種,數(shù)量不定的動態(tài)參數(shù)的時(shí)候,單一輸出的語句就無法滿足該類型的Mapkey創(chuàng)建,因此在VBA程序內(nèi)部就需要添加一個(gè)基于參數(shù)清單的循環(huán)語句,實(shí)現(xiàn)批量打開零件語句代碼實(shí)例如圖7所示。
圖7 動態(tài)循環(huán)參數(shù)語句
本案例的目標(biāo)就是在Creo連續(xù)循環(huán)打開清單內(nèi)的模型號碼直到最后一個(gè)為止。其中第一句是Mapkey的起始句,它僅能夠出現(xiàn)一次,因此它不在循環(huán)語句內(nèi),主語句根據(jù)Excel A列清單做了一個(gè)循環(huán)過程,分別依次輸出基于當(dāng)前單元格的Mapkey語句,最終執(zhí)行到最后的單元格的時(shí)候用if語句來判斷并執(zhí)行,最后一行末端換行符“”的移除表示程序終止。這就是一個(gè)簡單的循環(huán)動態(tài)參數(shù)的設(shè)定。基于有時(shí)候代碼的數(shù)量會比較多,建議將字符都賦給一個(gè)變量,從而簡化代碼的字符數(shù)量和行數(shù)[2]。
3.2.2 Mapkey代碼到自定義宏文件的傳遞
將Mapkey代碼用print輸出字符后,需要定向地將其儲存?zhèn)鬟f到自定義宏文件內(nèi),因此可以建立一個(gè)文本文件字符串的添加事件,來完成Mapkey字符串填寫并儲存。其格式通常為:
總而言之,從open→print→close的一個(gè)過程,可以完成一個(gè)簡易Mapkey創(chuàng)建及傳遞,其中自定義宏文件的地址一定是先前工作簿啟動事件的地址。針對不同的二次開發(fā)程序,一般只需套用此類模板,對Mapkey創(chuàng)建代碼區(qū)域進(jìn)行編輯修改即可,Mapkey的快捷鍵位必須設(shè)置成同一種,目的為后續(xù)執(zhí)行器的設(shè)計(jì)提供統(tǒng)一的標(biāo)準(zhǔn),筆者采用的標(biāo)準(zhǔn)快捷鍵位為“\”,主語句設(shè)計(jì)則結(jié)合實(shí)際需求進(jìn)行定制。
當(dāng)自定義宏文件及其內(nèi)部Mapkey代碼搭建完成后,需要去加載執(zhí)行該宏內(nèi)的代碼。筆者的解決方案則是設(shè)計(jì)一個(gè)Mapkey執(zhí)行器,目的是載入自定義宏文件并運(yùn)行其內(nèi)部用戶創(chuàng)建的自定義Mapkey,來完成單批次的自動運(yùn)行。具體代碼如圖8所示。
圖8 Mapkey執(zhí)行器代碼
該Mapkey功能是快速地調(diào)用已存在的USER.PRO文件,即自定義宏文件,并再運(yùn)行其內(nèi)部的Mapkey宏\,即自定義Mapkey的快捷鍵位。
需要注意的是:1)該宏代碼建議儲存在默認(rèn)配置文件config.pro中,重啟Creo即可,作用是讓用戶下一次啟動Creo時(shí)能夠自動載入該配置。2)==和\是筆者根據(jù)自己偏好設(shè)置的Mapkey快捷鍵,在定義之前需要從當(dāng)前可用的Mapkey清單內(nèi)檢查是否有快捷鍵沖突的鍵位,避免Mapkey失效問題。3)不同版本Creo,該Mapkey代碼可能會稍有區(qū)別,筆者所用的當(dāng)前版本為4.0 M050。
自定義宏創(chuàng)建及內(nèi)部Mapkey 的傳遞完成之后,就需要讓Creo自行啟動Mapkey執(zhí)行器來完成自定義Mapkey的運(yùn)行。要實(shí)現(xiàn)這一步操作需要介入一些編程算法,由于此前所采用的都是Excel的VBA技術(shù),為了保證代碼的兼容性,筆者仍舊利用該語言去進(jìn)行啟動器代碼的異步算法設(shè)計(jì),當(dāng)下有3類常用的啟動器設(shè)計(jì)方法:
3.4.1 Creo parametric 輔助窗口啟動器
該技術(shù)需要對Mapkey執(zhí)行器進(jìn)行進(jìn)一步的修改,先設(shè)計(jì)一個(gè)Mapkey輔助窗口,再定義執(zhí)行該窗口下的resume按鈕就可以運(yùn)行Mapkey執(zhí)行器,Mapkey代碼如圖9所示,Creo輔助窗口如圖10所示。
圖9 Mapkey輔助窗口代碼
圖10 Creo輔助窗口
用appactivate來激活該窗口,再用keybd_event來模擬鍵盤事件就可以使Creo執(zhí)行該輔助窗口的程序運(yùn)行按鈕,代碼如圖11所示。
利用這種啟動器運(yùn)行程序,需要首先在Creo窗口用Mapkey的快捷鍵喚醒圖10的輔助窗口,本案例所采用的是鍵位是“GE”,然后再運(yùn)行圖11代碼完成啟動器程序的執(zhí)行,其中的If語句目的是為了判斷輔助窗口是否被打開,再選擇是否繼續(xù)執(zhí)行。
圖11 輔助窗口啟動器代碼
3.4.2 VB API啟動器
利用VB API技術(shù)找到Excel與Creo窗口的接口,并執(zhí)行Mapkey執(zhí)行器的宏代碼,代碼如圖12所示。
圖12 VB API啟動器代碼
圖13 Creo控件激活
首先需要加載如圖13上的Creo 控件,然后定義API的幾個(gè)窗口同步的變量,最后利用Session.RunMacro(“%==”)來運(yùn)行快捷鍵“==”完成程序執(zhí)行[3-4]。
3.4.3 Creo parametric母窗口啟動器
該方法與第一種類似,區(qū)別是它直接用appactivate激活Creo的通用母窗口,并且用keybd_event來模擬鍵盤事件啟動Mapkey執(zhí)行器代碼,代碼如圖14所示。
圖14 母窗口啟動器代碼
可以看到這類啟動器上會加一個(gè)On error報(bào)錯(cuò)修復(fù)功能,由于VBA無法快速判斷Creo 窗口的狀態(tài)。因此當(dāng)它未打開時(shí),該語句前會出現(xiàn)一個(gè)窗口未找到的報(bào)錯(cuò),這時(shí),系統(tǒng)會進(jìn)入修復(fù)模式,出現(xiàn)一個(gè)彈窗提醒用戶打開Creo并重新運(yùn)行。
這3類啟動器都能夠?qū)崿F(xiàn)程序的啟動運(yùn)行,利用Creo parametric輔助窗口啟動器運(yùn)行程序的優(yōu)點(diǎn)是運(yùn)行狀態(tài)較為穩(wěn)定,效率也比較適中,但是由于開啟輔助窗口需要用戶手動操作,不夠快速、直觀。VB API啟動器狀態(tài)為最穩(wěn)定的,但是它和Creo之間的連接時(shí)間過長,運(yùn)行效率相對較差。而Creo parametric母窗口啟動器運(yùn)行效率是最快的,并且用戶使用十分方便,但是它和Creo之間的連接穩(wěn)定性一般。不同啟動器特點(diǎn)對比如表2所示。
表2 不同啟動器特點(diǎn)對比
筆者推薦使用的是第三類啟動器,由于用戶在使用的時(shí)候需要得到快速的輸入響應(yīng),更多地關(guān)注使用效率的問題;其次,它無需安裝或者激活任何第三方的控件,通用性強(qiáng),能夠在任何一臺配置的工作站上進(jìn)行開發(fā)使用;即使第三類啟動器有時(shí)候連接穩(wěn)定性不夠好,但是它在當(dāng)前啟動模式下是十分穩(wěn)定的,更多影響它的是公司的登陸程序等第三方插件和網(wǎng)絡(luò)連接斷開等風(fēng)險(xiǎn)。
通常這類二次開發(fā)理念中,自定義宏文件、Mapkey執(zhí)行器及啟動器都是固定不變的,開發(fā)者只需進(jìn)行個(gè)性化定制的是自定義Mapkey的創(chuàng)建及傳遞,從而達(dá)到開發(fā)效率的最大化,完成企業(yè)綜合性CAD軟件自動化的應(yīng)用。
雖然結(jié)合Excel和Mapkey能夠?qū)崿F(xiàn)很多功能的自動化,但是這種技術(shù)仍有一些不足:1)Mapkey目前只是一個(gè)執(zhí)行模塊單元,無法實(shí)現(xiàn)更高級的功能;2)不同Creo版本的Mapkey代碼不太一樣,很難完全統(tǒng)一;3)Mapkey的編碼目前沒有官方的指導(dǎo)手冊和學(xué)習(xí)平臺,需要用戶錄制去完成整理;4)Excel作為輸入端,運(yùn)行時(shí)需要兼顧其他Excel宏文件,代碼的安全級別低。這些問題目前尚未有成熟的解決方案。
這類二次開發(fā)技術(shù)除了應(yīng)用在一些簡易的宏開發(fā),還可以結(jié)合Excel其他的功能完成一些更復(fù)雜的數(shù)據(jù)運(yùn)算和處理。在實(shí)際CAD模型設(shè)計(jì)中它能夠完成Creo圖樣搭建、3D建模、裝配體搭建等,在質(zhì)量管理過程中也能夠有效地監(jiān)控各個(gè)設(shè)計(jì)環(huán)節(jié),甚至可以結(jié)合其他Creo內(nèi)置的編程模塊進(jìn)行跨平臺項(xiàng)目的搭建,例如CAD軟件結(jié)合PDM系統(tǒng)和項(xiàng)目管理文檔等,讓開發(fā)者根據(jù)企業(yè)實(shí)際應(yīng)用需求去靈活地訂制方案。
本文所闡述的二次開發(fā)的技術(shù)和理念,目的是為了滿足工程師及其他領(lǐng)域設(shè)計(jì)人員的日常工作需求。其實(shí)際操作也只是引用了筆者常用的一種編程技術(shù)來進(jìn)行描述,希望能夠讓讀者從中得到一些啟發(fā),可以更高效、自由地利用這種技術(shù)和理念。