汪 林,杜玉祥,何雪浤
(东北大学 机械工程与自动化学院,辽宁 沈阳 110819)
在日趋激烈的市场竞争环境下,为适应现代技术发展和产品更新的要求,如何实现产品的产品的快速设计是复杂机械产品研究的重点。目前典型的快速化设计的理论和方法有:模块化设计、参数化设计、产品族设计及可重构设计等[1]。参数化设计是产品设计规格化和系列化的一种简单、高效的方法。其通常是在保持模型原有拓扑结构不变的前提下,针对关联参数做几何约束建模和求解来实现有效的智能参数驱动方法[2]。
SolidWorks是Windows平台下的一款优秀的特征造型软件,其设计功能强大且操作较为简单,因而得到了非常广泛的应用。同时,有许多学者[3-4]对其参数化建模功能进行了研究并取得了一定成果。其中,绝大多数的研究都是针对单个零部件进行的,通常是利用SolidWorks中系列零件设计表并结合ACCESS等数据库实现参数化设计[5-6],而对复杂装配体的参数化建模很少涉及,且有所涉及的研究也基本没有对装配体参数化建模的具体过程和方法进行介绍。针对此现状,以VC++为开发工具,采用SolidWorks二次开发的异步模式,对大型装配体参数化建模的方法进行了研究,并实现了大型装配体剪叉式升降平台的参数化建模。
在SolidWorks中参数化建模可以通过两种方法实现,一种方法是用户根据需要直接用程序生成需要的模型,称为完全程序化参数建模;另一种方法是利用已有的模型,通过修改模型参数的方法得到需要的模型,称为参数修改法建模[4]。对于大型装配体的参数化建模,由于其模型相对复杂,使用完全程序化建模是很难实现的,故一般只能选用参数修改法建模。采用参数修改法建模通常需要事先建立好模型库,并保存在程序所指向的目录下,当需要使用时由程序调用模型文件。参数修改建模对模型库的要求是比较高的,在零件建模过程中需要综合考虑尺寸的标注方式,尽量避免尺寸参数间产生制约效应,而在装配过程中需要充分考虑各零件之间的相互约束关系,为其添加合适的约束方程。模型库处理完毕后即可通过程序对模型的相关零件进行尺寸修改和重建,其中可变参数可以通过对话框输入、数据库导入或直接从程序的计算结果获得。最终通过程序实现整个装配体的重建。因此,装配体参数修改建模的总体流程可总结,如图1所示。
图1 装配体参数化建模的总体流程Fig.1 Overall Process of Parameterized Modeling of Assembly
SolidWorks模型库的预处理主要是对后期需要进行尺寸修改的零件的相关尺寸进行参数链接和方程式约束,然后对各级装配体中相关的尺寸进行方程式约束,最终确保相关尺寸发生变化后总装配体的重建不会发生错误。在进行模型处理前,需要对模型的拓扑结构进行仔细的分析。在模型装配及添加几何方程式的过程中,都需要充分考虑零件尺寸修改后整个装配体模型的联动效果。通常以零件—子装配体—总装配体的层次进行处理,以剪叉式升降平台为例,其处理顺序为:单个零件(剪叉臂、铰点销轴等)—单层剪叉结构—整个剪叉结构—剪叉式升降平台。在零部件繁多的情况下,此过程一般是很难一步到位的,需要进行反复的修正才能实现,包括几何约束关系的修改和装配关系的修正等。
SolidWorks是Windows平台下优秀的特征造型软件,其设计功能强大且操作较为简单,因而得到了非常广泛的应用。SolidWorks提供了OLE(对象的嵌入与链接)应用程序开发接口(API),包含有数以百计的功能函数,为程序员提供了直接访问SolidWorks的能力。用户可以使用支持OLE编程的开发工具,如VB、VC++、VBA、Delphi等对 SolidWorks API函数进行调用。
接口处理是SolidWorks二次开发的关键技术之一,是开发工具能够实现对SolidWorks软件的API函数进行调用的前提。VC++对SolidWorks的二次开发大致有两种方法:一种是通过VC++编写DLL程序在SolidWorks中添加菜单项的方式,直接在SolidWorks的界面下实现对模型的特定操作;另一种则是所有操作命令菜单都在集中在VC++的MFC模块,通过SolidWorks API函数的调用来实现软件各项操作,即所谓的异步模式。针对这两种方法,其接口的处理有所不同。前者是通过VC++生成插件来进行开发的。SolidWorks2009之前的版本通过其提供的一个SWizard.awx的向导程序生成DLL框架,在此框架下即可进行SolidWorks的二次开发。而其后的版本,SWizard.awx向导程序基本已淘汰,取而代之的是一个API-SDK二次开发工具包。而后者主要是通过将SolidWorks提供的API函数库导入VC++中,然后就可以直接在VC++中调用SolidWorksAPI函数实现其二次开发。下面以VC++6.0为例,就异步模式的接口技术的操作步骤进行介绍。
首先,在VC++中选择MFCAppWizard(exe)新建一个工程。接下来是在类向导中通过添加类型库的方式在SolidWorks安装目录下找到sldworks.tlb文件加载SolidWorks类型库。添加完成后会发现Header Files中多了sldworks.h文件,在Resource Files中多了sldworks.cpp文件。至此,基本上SolidWorksAPI函数都已经导入到了该工程中,接下来就可以进行二次开发的编程了。但还需在工程头文件中手动添加SolidWorks安装路径下的swpublished.tlb和swconst.tlb文件,以确保编程时能够对SolidWorks文档类型及其它一些常量进行定义,具体的添加命令为:
#import"D:\ProgramFiles\SOLIDWORKS\swpublished.tlb"raw_interfaces_only,raw_native_types,no_namespace,named_guids
#import"D:\Program Files\SOLIDWORKS\swconst.tlb"raw_interfaces_only,raw_native_types,no_namespace,named_guids。
以上是VC++6.0与SolidWorks之间的接口处理技术,其它版本的VC++软件的接口处理原理和方法基本相同。
零件尺寸的修改是通过VC++调用SolidWorks API函数编程实现的,编程方法大致有两种:一种是为零件添加一个尺寸配置,配置中包含有该零件需要修改的所有尺寸参数,具体操作方法可参考文献[7];另一种是直接修改零件的标注尺寸。这两种方法各有利弊。采用添加配置的方法会将每次设置的参数都保存在零件的系列设计表中,但这也会使得文件随着使用次数的增多而占用更大的内存,而且随着配置数据的增多会容易造成混乱。采用直接修改零件标注尺寸的方法可以很好的避免文件占用内存过大的弊端,但是采用该方法修改后的零件将失去原有尺寸的记录。采用的是直接修改标注尺寸的方法,其编程流程可总结,如图2所示。
图2 零件尺寸修改的编程流程Fig.2 Programming Process of Modify the Dimensions of the Parts
另外,装配体重建的编程相对简单,利用SolidWorks的自动重建功能,在打开装配体模型后通过一个重建命令即可实现其中的零部件尺寸的更新。具体的编程流程可总结为,如图3所示。
图3 装配体模型重建的编程流程Fig.3 Programming Process of Assembly Model Reconstruction
下面以一个剪叉式升降平台为例,说明如何通过编程修改SolidWorks零件的尺寸以及如何实现整个装配体模型的重建。在此仅以修改剪叉式高空作业平台的SolidWorks模型中的剪叉臂尺寸为例,来说明整个参数化建模的过程。剪叉臂的三维图,如图4所示。
图4 剪叉臂模型Fig.4 Scissor Arm Model
模型预处理后的剪叉臂截面长、宽、厚及臂长的标注对象的名称分别为:A@草图1、B@草图1、S@草图1和L@凸台-拉伸1。在后面程序对尺寸参数进行修改时需要首先获取这些标注对象,然后再调用API函数对其值进行设置。在VC++与SolidWorks的接口已经连接成功的前提下,在VC+中是可以直接调用API函数进行编程的。首先,在工程中建立对话框并添加edit控件、图片控件等,并对相应的控件添加变量,本例的最终对话框,如图5所示。接下来进入代码编写界面。程序编写完成后,在剪叉臂参数设置窗口的编辑框中输入需要修改的尺寸值后,点击“确定”按钮,即可完成对剪叉臂尺寸的修改和更新。最后,在装配体窗口中点击“生成模型”按钮,则整个装配体中修改过的零件将会进行更新,从而得到重建模型。其中部分程序代码如下:
//剪叉臂参数设置
ISldWorksm_SldWorks;//定义 SolidWorks对象
IModelDoc pModelDoc;//定义 ModelDoc对象
longtype=swDocPART;//定义文档类型为零件
BOOL panduan=m_SldWorks.CreateDispatch("SldWorks.Applica
tion",NULL);//运行 SolidWorks软件
_bstr_t fileName(_T("C:\****\剪叉上下叉管 1.SLDPRT"));//定义文件名
UpdateData(TRUE);//获得编辑框输入的数据
inta=m_a.GetBuffer(0);
intb=m_b.GetBuffer(0);
ints=m_s.GetBuffer(0);
intl=m_l.GetBuffer(0);
CStringpath=(LPCTSTR)fileName;//定义文件路径
LPDISPATCH modDisp=m_SldWorks.OpenDoc(path,type);
pModelDoc.AttachDispatch (modDisp);//获 得 IModelDoc 对 象
m_pModelDoc
IPartDoc partDoc(modDisp);//获得 IPartDoc对象
//剪叉臂截面长A的参数设置
LPDISPATCHpDim_a=pModelDoc.Parameter("A@ 草图 1");//获得
尺寸参数A
IDimension Dime_a(pDim_a);//获得 IDimension 对象 Dime_a
Dime_a.SetValue(a);//将尺寸设置为编辑框输入值 A
//剪叉臂截面宽B的参数设置
**********;
//剪叉臂截面长S的参数设置
**********;
//剪叉臂臂长L的参数设置
**********;
partDoc.EditRebuild();//零件重建
pModelDoc.SaveAsSilent(path,type);//保存文件
m_SldWorks.CloseDoc(path);//关闭打开的文件
m_SldWorks.ExitApp();//关闭 SolidWorks
装配体重建的编程流程大体与修改零件尺寸的前半部分相似。在调用打开SolidWorks软件后,通过OpenDoc函数打开装配体文件,然后通过一个重建命令实现整个模型的重建。程序的部分代码如下:
longtype=swDocASSEMBLY;//定义文档类型为装配体
**************;//调用 SolidWorks软件
_bstr_tfileName(_T("C:\****\剪叉式升降平台总装.SLDASM"));//定义文件名
pModelDoc=m_SldWorks.OpenDoc(fileName,type);//打开装配体文件
pModelDoc.EditRebuild3(); //重新生成模型
其中“C:\****\剪叉上下叉管 1.SLDPRT”和“C:\****\剪叉式升降平台总装.SLDASM”中的****为零件和装配体文件的存放路径。另外,为便于对修改结果进行观察,可以将程序运行后SolidWorks的图形界面通过截图的方式嵌入到对话框中,具体代码如下:
CStringsFileBmp;//定义位图文件路径
intwz1=path.Find('.',0);//将位图放置在零件文件路径
sFileBmp=path.Mid(0,wz1)+".bmp";//添加位图后缀
CRectrect;
m_pic.GetClientRect(&rect);
pModelDoc.SaveBMP ((LPCTSTR)sFileBmp,rect.Width (),rect.Height());//保存位图文件
m_pic.SetBitmap((HBITMAP)::LoadImage(::AfxGetInstanceHandle(),sFileBmp,IMAGE_BITMAP,rect.Width(),rect.Height(),LR_LOADFROMFILE));//加载位图文件
运行程序,输入相关参数值,最终结果,如图5所示。示例中两次参数设置的剪叉臂尺寸A分别为100和200,从图5(a)可以看出两者运行结果的差别。从图5(b)的局部放大图可看出修改剪叉臂尺寸后整个装配体模型的变化。
图5 零件尺寸修改前后的模型对比Fig.5 The Comparison of Models Before and After Modify Parts Dimensions
介绍了一种以VC++为开发工具、以SolidWorks为造型软件的大型装配体的参数化建模方法,并对其中的关键技术进行了阐述,包括装配体模型库的处理、SolidWorks二次开发的异步模式的接口技术及具体的编程流程等。并且通过某型号的剪叉式升降平台的参数化建模实例进行了具体演示。应用该参数化建模方法得到的设计平台,能够实现当对相关设计参数进行修改时,其它的相关尺寸能够进行自动更新,最终实现整个装配体的重建。使用该参数化建模方法,能够大大提高系列化三维装配体设计和优化的效率,减轻设计人员的工作量,具有一定理论和实际意义。