張文曉
摘要:本文主要介紹了如何在Excel中利用VBA對(duì)Creo進(jìn)行簡(jiǎn)單的異步模式下的二次開(kāi)發(fā),并結(jié)合工程實(shí)例,具體說(shuō)明了如何批量提取模型中的材料、重量、長(zhǎng)、寬、厚等尺寸。
關(guān)鍵詞:Excel;VBA;Creo;二次開(kāi)發(fā);異步模式;提取鈑金展平件質(zhì)量屬性;
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)07-0212-03
Abstract: This article mainly introduced how to use VBA in Excel to do the secondary development in simple asynchronous mode for Creo, and take an engineering example shows how to achieve the batch extraction of material, weight, size, length, width, thickness from models.
Key words: Excel; VBA; Creo; Secondary Development; Asynchronous Mode; Extract the material properties from sheet metal flat
在產(chǎn)品研發(fā)過(guò)程中,工程師很多時(shí)候要處理大量的模型、數(shù)據(jù),有時(shí)是將數(shù)據(jù)導(dǎo)入三維軟件用于生成模型,有時(shí)是從三維模型中提取數(shù)據(jù),用于統(tǒng)計(jì)、分析、計(jì)算。很多時(shí)候,三維軟件本身并沒(méi)有合適的功能來(lái)實(shí)現(xiàn)特定地操作,因此,企業(yè)往往需要根據(jù)自己的具體需求,進(jìn)行二次開(kāi)發(fā),以便提高效率。以Creo軟件為例,PTC公司提供了豐富的二次開(kāi)發(fā)API,如Pro/Toolkit,J-Link(Java),VB API等。其中在國(guó)內(nèi)應(yīng)用最廣泛的是Pro/Toolkit。
同時(shí),開(kāi)發(fā)模式也可以分為同步模型、異步模式。同步模式是指開(kāi)發(fā)插件隨Creo一起啟動(dòng),不能單獨(dú)運(yùn)行。異步模式是指二次開(kāi)發(fā)程序可以不與Creo一起運(yùn)行,而是獨(dú)立運(yùn)行之后再調(diào)用Creo,建立數(shù)據(jù)通信。目前,國(guó)內(nèi)的Creo二次開(kāi)發(fā)的一般都是在同步模型下進(jìn)行。
那么,是不是一定要基于Protoolkit并在同步模式下二次開(kāi)發(fā)呢?其實(shí)對(duì)于一些工程問(wèn)題,可以簡(jiǎn)化地在Excel中利用VBA進(jìn)行開(kāi)發(fā)。本文將通過(guò)工程實(shí)例,詳述開(kāi)發(fā)過(guò)程以及對(duì)比此開(kāi)發(fā)模式與其他開(kāi)發(fā)模式的優(yōu)缺點(diǎn)。
1 開(kāi)發(fā)環(huán)境簡(jiǎn)介
在Excel中通過(guò)VBA進(jìn)行二次開(kāi)發(fā),實(shí)際是利用Creo Parametric提供的VB API中的一些開(kāi)發(fā)接口來(lái)接入Creo Parametric。同時(shí),利用OLE objects操作模型以及從模型中獲取數(shù)據(jù)。
具體地,就是在Excel VBA中引用VB API,并用CCpfcConnectionId.Create() and CCpfcAsyncConnection.ConnectById()兩個(gè)函數(shù)建立Excel和Creo之間的連接。后續(xù),再通過(guò)VB API里的一些函數(shù)和方法,調(diào)用Creo模型,提取模型中的參數(shù)、尺寸,同時(shí)也可以對(duì)模型本身進(jìn)行打開(kāi)、另存、檢入、檢出等操作。
2 Creo VB API基礎(chǔ)知識(shí)
2.1 引用VB API
首先需要?jiǎng)?chuàng)建一個(gè)對(duì) Creo VB API的引用。在Excel里按alt+F11進(jìn)入VBA代碼編輯器,點(diǎn)擊工具→引用,勾選“Creo VB API Type Library for Creo Parametric 4.0”。如下圖所示。
2.2 如何利用PTC給出的VB API指南
事實(shí)上PTC公司已經(jīng)給出了函數(shù)說(shuō)明以及豐富的示例代碼,供我們二次開(kāi)發(fā)時(shí)參考,如果我們妥善加以利用,能起到事倍功半的效果。下面介紹一下如何得到這些參考:
在Creo的安裝路徑下,找vbapi文件夾,筆者路徑為C:\ptc\Parametric4_M050\Creo 4.0\M050\Common Files\vbapi。
1) 其中vbug.pdf文檔是PTC公司提供的VB API用戶操作指南。如果你想實(shí)現(xiàn)某一功能的代碼,可以在此文檔里按照一定的關(guān)鍵詞檢索;
2) 打開(kāi)C:\ptc\Parametric4_M050\Creo 4.0\M050\Common Files\vbapi\vbapidoc路徑下的IESwing.html文件,可以得到VB API Creo Parametric 3.0 (VB) APIWizard,可以從中查找你要用的具體函數(shù);
3) 在C:\ptc\Parametric4_M050\Creo 4.0\M050\Common Files\vbapi\vbapi_examples里,可以找到PTC給出的實(shí)例代碼。大多數(shù)情況下,只需要在示例代碼里找到你所需的源代碼,進(jìn)行組合,就可以實(shí)現(xiàn)你的目的。
另外,進(jìn)入PTC公司的e-support論壇,也能找到一些文章和解決方案。
2.3 建立Excel與Creo的連接
如果Creo沒(méi)打開(kāi),可以用下面方式打開(kāi)Creo并建立Excel與Creo的鏈接:
Dim cAC As CCpfcAsyncConnection
Set cAC = New CCpfcAsyncConnection
Dim asyncConnection As IpfcAsyncConnection
Set asyncConnection = cAC.Start("C:\ptc\Parametric4_M050\Creo 4.0\M050\Parametric\bin\ parametric.exe " + " -g:no_graphics -i:rpc_input", ".")
如果Creo已經(jīng)打開(kāi),則可以用下面方式建立二者之間的鏈接:
Dim cAC As CCpfcAsyncConnection
Dim asyncConnection As IpfcAsyncConnection
Dim session As IpfcBaseSession
Set cAC = New CCpfcAsyncConnection
Set asyncConnection = cAC.Connect(Null, Null, Null, Null)
Set session = asyncConnection.session
注意,如果代碼運(yùn)行過(guò)程中,出現(xiàn)"Microsoft Office Excel is waiting for another application to complete an OLE action"報(bào)錯(cuò),說(shuō)明Excel調(diào)用Creo進(jìn)程的時(shí)間,比Excel許用的等待時(shí)間長(zhǎng),所以出現(xiàn)提示。解決方案是——最好提前打開(kāi)Creo,并登陸PDM系統(tǒng)(筆者用的是windchill),然后再建立連接。
3 工程實(shí)例:從模型中提取參數(shù)、輪廓尺寸及質(zhì)量屬性
3.1 總則
我們?cè)谠O(shè)計(jì)鈑金件的時(shí)候,往往需要提取鈑金件的展平尺寸、材料以及質(zhì)量屬性,以便進(jìn)行原材料用量預(yù)估、噴涂面積計(jì)算、重量計(jì)算、以及成本核算。對(duì)于單個(gè)零件,在Creo里雖然可以獲取上述參數(shù),但對(duì)于多個(gè)零件無(wú)法做到上述參數(shù)的批量導(dǎo)出。
3.2 建立Excel與Creo之間的連接
基于2.3所述,本實(shí)例選擇先打開(kāi)Creo然后再建立Excel與Creo間的鏈接。具體代碼參考2.3,不再重復(fù)。
3.3 獲取模型句柄
在建立了Excel和Creo之間的連接之后,需要獲取某一模型的句柄,然后再對(duì)模型進(jìn)行例如提取參數(shù)等操作。具體的代碼如下:
Dim descModel As IpfcModelDescriptor
Dim descModelOpen As CCpfcModelDescriptor
Dim model As IpfcModel
Dim CurrentModels As IpfcModels
filename = mysheet.Range("A" & i).Value & "_flat1.prt"
Set descModelOpen = New CCpfcModelDescriptor
On Error Resume Next
Set descModel = descModelOpen.CreateFromFileName(filename)
session.OpenFile(descModel).Activate
Set model = session.CurrentModel
If model Is Nothing Then
mysheet.Range("G" & i) = "Model Open Fail"
GoTo ModelOpenErr
End If
注意,最后4行代碼,是用于容錯(cuò)。例如,批量處理多個(gè)零件時(shí),如果用戶用戶給出的其中一個(gè)模型名稱有誤,如果不加最后4行代碼,會(huì)造成程序運(yùn)行報(bào)錯(cuò)中斷。加入這4行代碼,程序可以輸出用戶預(yù)設(shè)錯(cuò)誤信息,并得以繼續(xù)運(yùn)行。
3.4 提取模型的質(zhì)量屬性
讀取模型中的質(zhì)量屬性,用到的是Solid類下面的GetMassProperty函數(shù)。而我們?cè)?.3中獲取的是Model句柄,Model類中并沒(méi)有GetMassProperty函數(shù),因此我們要將進(jìn)程中的Model句柄轉(zhuǎn)化為Solid句柄。這里,讀者需要首先讀2.2中提及的PTC的用戶指南,了解Creo VB API中Model和Solid的區(qū)別。簡(jiǎn)而言之,Model可以是模型或者圖紙,Solid特指Part或者assembly,Solid是從Model中繼承的類?;谶@個(gè)特性,我們事實(shí)上可以用Set mysolid = session.CurrentModel直接將當(dāng)前模型轉(zhuǎn)換為Solid類型,然后用GetMassProperty函數(shù)獲取質(zhì)量屬性。具體代碼如下:
Dim mysolid As pfcls.IpfcSolid
Dim solidProperties As IpfcMassProperty
Set mysolid = session.CurrentModel
Set solidProperties = mysolid.GetMassProperty("DEF_CSYS")
Weight = solidProperties.Mass
本文中只提取了質(zhì)量一個(gè)參數(shù),讀者還可以通過(guò)獲取solidProperties里的其他屬性,提取例如重心、慣性矩等其他數(shù)據(jù)。
3.5 獲取模型的材料和壁厚
在Creo模型中,已經(jīng)預(yù)設(shè)了材料、厚度參數(shù),當(dāng)用戶建模的時(shí)候,系統(tǒng)會(huì)對(duì)這兩個(gè)參數(shù)自動(dòng)賦值。所以獲取模型的材料,技術(shù)上,就是讀取模型中的代表材料、厚度的參數(shù)的值。這一過(guò)程,首先是利用 GetParam(參數(shù)名)獲取參數(shù)句柄,然后利用GetScaledValue函數(shù)獲取具體的數(shù)值。示例代碼如下:
Dim myMat As IpfcParameter, myThick As IpfcParameter
Dim myParaOwner As IpfcParameterOwner
Set myParaOwner = model
Set myMat = myParaOwner.GetParam("PTC_MATERIAL_NAME")
Set myThick = myParaOwner.GetParam("SMT_THICKNESS")
Set myMat_val = myMat.GetScaledValue
Material = myMat_val.StringValue
Set myThick_val = myThick.GetScaledValue
WallThick = myThick_val.DoubleValue
3.6 獲取鈑金展平件的長(zhǎng)、寬尺寸
提取鈑金展平件的長(zhǎng)、寬尺寸,大體上有兩種方式:
1) 如果你的展平模型,是嚴(yán)格利用Creo中的Flat Pattern特征建立的
a. 系統(tǒng)會(huì)自動(dòng)生成兩個(gè)長(zhǎng)、寬參數(shù),讀者可以在展平件的Flat Pattern 1特征中找到這兩個(gè)參數(shù)。如下圖所示:
b. 然后可以如3.5中所提及的方式,首先獲取模型句柄,然后獲取Flat Pattern1特征句柄,最后,或者此特征下的SMT_FLAT_PATTERN_WIDTH和SMT_FLAT_PATTERN_LENGTH兩個(gè)參數(shù)的值。
2) 如果你的展平模型,不是利用Creo中的Flat Pattern特征建立的,而是用Unbend特征建立的。那么就不能用提取參數(shù)值的方法了,因?yàn)橛肬nbend系統(tǒng)不會(huì)自動(dòng)生成兩個(gè)長(zhǎng)、寬參數(shù)。
c. 此時(shí)可以用Solid類下的GeomOutline函數(shù),獲取模型的輪廓,其實(shí)是獲取兩個(gè)端點(diǎn)的坐標(biāo)值;
d. 然后利用兩點(diǎn)的坐標(biāo)值,換算出長(zhǎng)度、寬度,輸出;
e. 代碼如下:
Dim myoutline As IpfcOutline3D
Set myoutline = mysolid.GeomOutline
Dim X1 As Double, Y1 As Double, Z1 As Double
Dim X2 As Double, Y2 As Double, Z2 As Double
X1 = myoutline.Item(0).Item(0)
Y1 = myoutline.Item(0).Item(1)
Z1 = myoutline.Item(0).Item(2)
X2 = myoutline.Item(1).Item(0)
Y2 = myoutline.Item(1).Item(1)
Z2 = myoutline.Item(1).Item(2)
LWT(0) = Abs(X1 - X2): LWT(1) = Abs(Y1 - Y2): LWT(2) = Abs(Z1 - Z2)
Flat_L = Application.WorksheetFunction.Max(Abs(X1 - X2), Abs(Y1 - Y2), Abs(Z1 - Z2))
Flat_W = Application.WorksheetFunction.Small(LWT, 2)
4 優(yōu)勢(shì)與不足
綜上所述,我們就完成了在Excel中實(shí)現(xiàn)對(duì)Creo的簡(jiǎn)單的二次開(kāi)發(fā)。下面簡(jiǎn)要對(duì)比一下在Excel中進(jìn)行Creo簡(jiǎn)單異步模式下二次開(kāi)發(fā),和Creo Toolkit的優(yōu)缺點(diǎn):
5 展望
本文只是舉了一個(gè)簡(jiǎn)單的例子,論述了如何在VBA對(duì)Creo進(jìn)行二次開(kāi)發(fā)。事實(shí)上,我們還可以用類似的方式,做很多其他更“酷”的操作。比如:我們可以批量導(dǎo)出PDF、IGES等,也可以批量將數(shù)據(jù)導(dǎo)入Creo創(chuàng)建模型,也可以批量地操作模型檢入、檢出等??傊?,只要VB API中提供了接口的功能,我們都能用這種方式實(shí)現(xiàn)。
6 結(jié)論
本文主要闡述了如何基于VBA,實(shí)現(xiàn)Excel和Creo之間的數(shù)據(jù)交互,實(shí)現(xiàn)對(duì)Creo的簡(jiǎn)單二次開(kāi)發(fā)。
然而,本文所述的工程實(shí)例只是一個(gè)簡(jiǎn)單示范,但愿能拋磚引玉,給讀者提供一種思維方式,讓讀者能夠根據(jù)自己的需求,設(shè)計(jì)自己的應(yīng)用程序,使工作變得更加得心應(yīng)手。
參考文獻(xiàn):
[1] Parametric Technology Corporation. PTC VB API幫助文檔.USA:PTC, 2018.
[2] 張繼春. ProΠENGINEER二次開(kāi)發(fā)實(shí)用教程[M]. 北京:北京大學(xué)出版社,2003.
【通聯(lián)編輯:梁書(shū)】