APP下载

基于ExcelVBA对Creo进行异步模式下的二次开发

2019-05-24张文晓

电脑知识与技术 2019年7期
关键词:二次开发

张文晓

摘要:本文主要介绍了如何在Excel中利用VBA对Creo进行简单的异步模式下的二次开发,并结合工程实例,具体说明了如何批量提取模型中的材料、重量、长、宽、厚等尺寸。

关键词:Excel;VBA;Creo;二次开发;异步模式;提取钣金展平件质量属性;

中图分类号:TP391 文献标识码:A

文章编号: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

在产品研发过程中,工程师很多时候要处理大量的模型、数据,有时是将数据导入三维软件用于生成模型,有时是从三维模型中提取数据,用于统计、分析、计算。很多时候,三维软件本身并没有合适的功能来实现特定地操作,因此,企业往往需要根据自己的具体需求,进行二次开发,以便提高效率。以Creo软件为例,PTC公司提供了丰富的二次开发API,如Pro/Toolkit,J-Link(Java),VB API等。其中在国内应用最广泛的是Pro/Toolkit。

同时,开发模式也可以分为同步模型、异步模式。同步模式是指开发插件随Creo一起启动,不能单独运行。异步模式是指二次开发程序可以不与Creo一起运行,而是独立运行之后再调用Creo,建立数据通信。目前,国内的Creo二次开发的一般都是在同步模型下进行。

那么,是不是一定要基于Protoolkit并在同步模式下二次开发呢?其实对于一些工程问题,可以简化地在Excel中利用VBA进行开发。本文将通过工程实例,详述开发过程以及对比此开发模式与其他开发模式的优缺点。

1 开发环境简介

在Excel中通过VBA进行二次开发,实际是利用Creo Parametric提供的VB API中的一些開发接口来接入Creo Parametric。同时,利用OLE objects操作模型以及从模型中获取数据。

具体地,就是在Excel VBA中引用VB API,并用CCpfcConnectionId.Create() and CCpfcAsyncConnection.ConnectById()两个函数建立Excel和Creo之间的连接。后续,再通过VB API里的一些函数和方法,调用Creo模型,提取模型中的参数、尺寸,同时也可以对模型本身进行打开、另存、检入、检出等操作。

2 Creo VB API基础知识

2.1 引用VB API

首先需要创建一个对 Creo VB API的引用。在Excel里按alt+F11进入VBA代码编辑器,点击工具→引用,勾选“Creo VB API Type Library for Creo Parametric 4.0”。如下图所示。

2.2 如何利用PTC给出的VB API指南

事实上PTC公司已经给出了函数说明以及丰富的示例代码,供我们二次开发时参考,如果我们妥善加以利用,能起到事倍功半的效果。下面介绍一下如何得到这些参考:

在Creo的安装路径下,找vbapi文件夹,笔者路径为C:\ptc\Parametric4_M050\Creo 4.0\M050\Common Files\vbapi。

1) 其中vbug.pdf文档是PTC公司提供的VB API用户操作指南。如果你想实现某一功能的代码,可以在此文档里按照一定的关键词检索;

2) 打开C:\ptc\Parametric4_M050\Creo 4.0\M050\Common Files\vbapi\vbapidoc路径下的IESwing.html文件,可以得到VB API Creo Parametric 3.0 (VB) APIWizard,可以从中查找你要用的具体函数;

3) 在C:\ptc\Parametric4_M050\Creo 4.0\M050\Common Files\vbapi\vbapi_examples里,可以找到PTC给出的实例代码。大多数情况下,只需要在示例代码里找到你所需的源代码,进行组合,就可以实现你的目的。

另外,进入PTC公司的e-support论坛,也能找到一些文章和解决方案。

2.3 建立Excel与Creo的连接

如果Creo没打开,可以用下面方式打开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已经打开,则可以用下面方式建立二者之间的链接:

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

注意,如果代码运行过程中,出现"Microsoft Office Excel is waiting for another application to complete an OLE action"报错,说明Excel调用Creo进程的时间,比Excel许用的等待时间长,所以出现提示。解决方案是——最好提前打开Creo,并登陆PDM系统(笔者用的是windchill),然后再建立连接。

3 工程实例:从模型中提取参数、轮廓尺寸及质量属性

3.1 总则

我们在设计钣金件的时候,往往需要提取钣金件的展平尺寸、材料以及质量属性,以便进行原材料用量预估、喷涂面积计算、重量计算、以及成本核算。对于单个零件,在Creo里虽然可以获取上述参数,但对于多个零件无法做到上述参数的批量导出。

3.2 建立Excel与Creo之间的连接

基于2.3所述,本實例选择先打开Creo然后再建立Excel与Creo间的链接。具体代码参考2.3,不再重复。

3.3 获取模型句柄

在建立了Excel和Creo之间的连接之后,需要获取某一模型的句柄,然后再对模型进行例如提取参数等操作。具体的代码如下:

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行代码,是用于容错。例如,批量处理多个零件时,如果用户用户给出的其中一个模型名称有误,如果不加最后4行代码,会造成程序运行报错中断。加入这4行代码,程序可以输出用户预设错误信息,并得以继续运行。

3.4 提取模型的质量属性

读取模型中的质量属性,用到的是Solid类下面的GetMassProperty函数。而我们在3.3中获取的是Model句柄,Model类中并没有GetMassProperty函数,因此我们要将进程中的Model句柄转化为Solid句柄。这里,读者需要首先读2.2中提及的PTC的用户指南,了解Creo VB API中Model和Solid的区别。简而言之,Model可以是模型或者图纸,Solid特指Part或者assembly,Solid是从Model中继承的类。基于这个特性,我们事实上可以用Set mysolid = session.CurrentModel直接将当前模型转换为Solid类型,然后用GetMassProperty函数获取质量属性。具体代码如下:

Dim mysolid As pfcls.IpfcSolid

Dim solidProperties As IpfcMassProperty

Set mysolid = session.CurrentModel

Set solidProperties = mysolid.GetMassProperty("DEF_CSYS")

Weight = solidProperties.Mass

本文中只提取了质量一个参数,读者还可以通过获取solidProperties里的其他属性,提取例如重心、惯性矩等其他数据。

3.5 获取模型的材料和壁厚

在Creo模型中,已经预设了材料、厚度参数,当用户建模的时候,系统会对这两个参数自动赋值。所以获取模型的材料,技术上,就是读取模型中的代表材料、厚度的参数的值。这一过程,首先是利用 GetParam(参数名)获取参数句柄,然后利用GetScaledValue函数获取具体的数值。示例代码如下:

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 获取钣金展平件的长、宽尺寸

提取钣金展平件的长、宽尺寸,大体上有两种方式:

1) 如果你的展平模型,是严格利用Creo中的Flat Pattern特征建立的

a. 系统会自动生成两个长、宽参数,读者可以在展平件的Flat Pattern 1特征中找到这两个参数。如下图所示:

b. 然后可以如3.5中所提及的方式,首先获取模型句柄,然后获取Flat Pattern1特征句柄,最后,或者此特征下的SMT_FLAT_PATTERN_WIDTH和SMT_FLAT_PATTERN_LENGTH两个参数的值。

2) 如果你的展平模型,不是利用Creo中的Flat Pattern特征建立的,而是用Unbend特征建立的。那么就不能用提取参数值的方法了,因为用Unbend系统不会自动生成两个长、宽参数。

c. 此时可以用Solid类下的GeomOutline函数,获取模型的轮廓,其实是获取两个端点的坐标值;

d. 然后利用两点的坐标值,换算出长度、宽度,输出;

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 優势与不足

综上所述,我们就完成了在Excel中实现对Creo的简单的二次开发。下面简要对比一下在Excel中进行Creo简单异步模式下二次开发,和Creo Toolkit的优缺点:

5 展望

本文只是举了一个简单的例子,论述了如何在VBA对Creo进行二次开发。事实上,我们还可以用类似的方式,做很多其他更“酷”的操作。比如:我们可以批量导出PDF、IGES等,也可以批量将数据导入Creo创建模型,也可以批量地操作模型检入、检出等。总之,只要VB API中提供了接口的功能,我们都能用这种方式实现。

6 结论

本文主要阐述了如何基于VBA,实现Excel和Creo之间的数据交互,实现对Creo的简单二次开发。

然而,本文所述的工程实例只是一个简单示范,但愿能抛砖引玉,给读者提供一种思维方式,让读者能够根据自己的需求,设计自己的应用程序,使工作变得更加得心应手。

参考文献:

[1] Parametric Technology Corporation. PTC VB API帮助文档.USA:PTC, 2018.

[2] 张继春. ProΠENGINEER二次开发实用教程[M]. 北京:北京大学出版社,2003.

【通联编辑:梁书】

猜你喜欢

二次开发
浅谈基于Revit平台的二次开发
浅谈Mastercam后处理器的二次开发
西门子Easy Screen对倒棱机床界面二次开发
基于Pro/E二次开发的推土铲参数化模块开发