VisualC++对SolidWorks的二次开发方法针对目前普遍开发三维 CAD系统的需要 ,讨论了对三维绘图软件 SolidWorks进行二次开发的方法 ,并结合实例重点阐述利用Visual C++6.0 编程语言开发 SolidWorks 动态连接库 DLL 的步骤和编程方法 ,所开发的DLL 实现了于SolidWorks 的无缝集成 ,对相关三维 CAD 软件的开发是一种启示和借鉴。
1前言
为了缩短产品开发周期、提高市场竞争能力 ,各企业在产品设计中大多要对通用 CAD 软件进行二次开发,建立适合自己的专用模块。但目前所开发的 CAD 系统 ,一般是对二维绘图软件如 AutoCAD 进行二次开发,实现机械零件参数化设计。由于二维绘图软件本身无法实现参数化驱动 ,所以对其进行二次开发的周期长、工作量大、不易实现CAX系统的集成。而三维绘图软件如 SolidWorks,采用特征建模、参数化驱动可方便地设计出三维实体模型。利用三维实体模型可以自动生成二维工程图;可以在生产之前动态模拟装配过程、进 行干涉检查;可以对重要零部件进行有限元分析与优化设计(CAE);可以模拟数控加工(CAM) ;可以生成零件的工艺规程(CAPP) ,这样就易于实现CAX系统的集成。所以基于三维绘图软件的二次开发必将成为今后 CAD 技术发展的主流。
本文将讨论在Visual C++6. 0 的集成开发环境下 ,对 SolidWorks 进行二次开发实现机械零件参数化设计的方法,并结合实例说明二次开发的具体实现过程。
1 SolidWorks 二次开发的原理
1. 1SolidWorks 的 API 接口
SolidWorks通过 OLE(Object Linking and Embedding ,对象的链接和嵌入) 技术为用户提供了强大的二次开发接口API(Application Programming Interface ,应用程序界面) ,API 中包含了数百个可以在Visual Basic、VBA(Excel 、Access 等) 、C、C++ 或 SolidWorks宏文件调用的函数。SolidWorks API 接口采用面向对象的方法,所有的函数都是有关对象的方法或属性。用户通过对这些对象属性的设置和方法的调用 ,就可以在用户自己开发的程序中对 SolidWorks进行各种操作控制,完成零件草图的绘制和修改;零件各种特征的建立和修改;零件的特征信息、装配信息及工程图纸信息的提取等。
1. 2SolidWorks 二次开发的方法
SolidWorks的API 接口分为两种:一种是基于 OLE Automation 的 IDispatch 技术 ;另一种开发方式是基于 Windows基础的 COM(Object Model ,组件对象模型) 。
基于 OLEAutomation 的 IDispatch 技术作为快速开发的手段 ,一般常用于 VB、Delphi 编程语言的接口 ,通过IDispatch 接口暴露对象的属性和方法 ,以便在客户程序中使用这些属性并调用它所支持的方法。此种技术只能开发 EXE形式的程序,所开发的 CAD 系统不能直接加挂在 SolidWorks 系统界面下 ,无法实现与 SolidWorks系统的集成。
COM是一种组件开发技术 ,是 Microsoft 公司提出的并被大多数公司支持的一种标准协议 ,它建立了一个软件模块同另一个软件模块的连接,当这种连接建立之后 ,两个模块之间就可以通过接口来进行通讯。COM接口更为简洁高效 ,这种技术可以使用最多的 SolidWorksAPI函数。实际上 SolidWorks 系统本身是用 VC++编写的 ,所以使用 VC++语言通过 COM 接口开发 ,可以实现对SolidWorks 底层的开发并且代码的执行效率高。
通过 VC编写基于COM的动态连接库 DLL(Dynamic Link Library)文件 ,能直接在 SolidWorks的界面下添加菜单、工具条等 ,如图 1 所示。在注册表中注册成功即可成为 SolidWorks 的插件 ,实现了与SolidWorks 的无缝集成 ,是众多二次开发方法中的首选 ,以下结合参数化设计铜合金轴承保持架挤压模垫套的实例 ,介绍 DLL程序的开发方法。
2 DLL 程序的具体实现过程
2. 1 DLL的创建
SolidWorks公司提供了制作 DLL 文件的向导 ,利用向导模板可方便快捷地生成 DLL 文件。具体步骤是:首先从 SolidWorks公司的网站下载制作动态连接库的向导文件"SWizard. awx",将其拷贝至 VC++安装目录下的 Common MSDev98 Template 文件夹 ,这时 VC 新建工程项中会出现"SolidWorks AddInAppWizard"向导。选择此向导输入项目名 3DCAD 后单击 Next ,在 Step 1 of 2 选择SolidWorks 的安装路径 ,除了 Overload WNDPROC of ModelView复选框 ,选中其他所有复选框,然后单击 Next 进入 Step 2 of 2 ,选中 Create Sample Feature Manager 和ViewRegister Add - In at compile time 复选框后单击 Finish 即可完成DLL工程的创建。
2. 2 DLL中添加资源的方法
在动态链接库中,当用户需要添加自己的资源如对话框时 ,应明确指出在什么时候使用自己的资源 ,否则 SolidWorks系统分不清那些是由系统控制的资源 ,那些是由用户控制的资源 ,会发生冲突导致程序运行错误。避免资源冲突的方法是在使用自己资源前调用Afx Get Resource Handle 函数保存当前的资源 ,然后调用 Afx Set Resource Handle函数把当前资源设置成新的资源 ,当使用完自己的资源后 ,再调用Afx Set Resource Handle函数恢复先前已保存的资源。创建本程序的运行界面时 ,首先用对话框编辑器创建对话框模板资源 ,如图 2 所示加入所需控件 ,再用Class wizard 为对话框生成 CTestDlg类(基类为 CDialog) ,并加入所需的成员变量,相关代码如下:
/ /保存当前系统资源
HINSTANCEsaver = AfxGetResourceHandle() ;
/ /把当前资源设置成新的资源
AfxSetResourceHandle(AfxGetResourceHandle() ) ;
CDlg1 dlg; / / 声明一个对话框类
If (int n =dlg. DoModal () = = IDOK) ; / / 按下绘图按钮后绘图
{
drawdt( ) ;/ / 参数化绘制垫套三维图的自定义函数
}
/ /恢复先前已保存的系统资源的句柄
AfxSetResourceHandle(saver) ;
2.3 DLL 与 SolidWorks 的集成
用户可以通过 DLL程序定制 SolidWorks 的菜单 ,工具栏资源等 ,从而实现二次开发的 CAD 系统与SolidWorks 的无缝集成,以下为其部分代码 :
·定制SolidWorks 的菜单。在 CAPITourApp : : docCreateMenu 函数中添加以下代码:
/ /添加顶层弹出式菜单[3DCAD]
hres =pFrame2 > AddMenu(auT"(3DCAD( &G) "), swMenuPosition , &bres) ;
/ /添加[3DCAD]的下一级菜单[垫套]
hres =pFrame2 > AddMenuItem(auT("3DCAD(&G) ") ,auT"(垫套( &D) . . . ") ,swLastPosition ,
auT"(3DCAD@MyFunction") ,&bres) ;
·定制SolidWorks 的工具栏。在 CAPITourApp : : docCreateMenu 函数中添加以下代码:
SetResources() ; / / 确保使用自己添加的资源
/ /加载工具栏图标资源
mSmallToolbar.LoadMappedBitmap (IDR TOOLBAR SMALL);
HBITMAPhbmSmallImageWell = (HBITMAP) m SmallToolbar. GetSafeHandle();
ResetResources() ; / / 把资源控制权交还给 SolidWorks
2. 4 DLL的编译和注册
在 VC中编译 DLL程序时 ,不同的操作系统应该采用不同的设置:Windows95/ 98 应该采用MBCS设置 , Windows NT/ 2000应该采用Unicode 设置 ,单步调试时应该采用 Pseudo2Debug 设置。编译链接成功后会生成*.dll 格式的文件 ,运行Windows 系统的 Regsvr32 命令注册此 DLL 文件 ,若 DLL 文件注册成功就可成为 SolidWorks系统的插件。
3DCAD. dll注册成功后 ,打开注册表编辑器展开 HKEY LOCALMACHINE SOFTWARE SolidWorks Applications 3DCAD 项 ,会发现一个名字为 CLSID 的字符串值 ,这是 Windows 系统为你的 DLL所分配的唯一标识字符串。展开 HKEY CLASSES ROOT CLSID 项 ,找到与 CLSID 字符串值相同的项,此项有一子项 InprocServer32 和一个默认值 ,InprocServer32 子项用来指明你的 DLL 文件的具体路径,默认值可在 SolidWorks 插件对话框中描述你所编写插件的功能(如图 3 所示) 。
2. 5 DLL程序的运行
如果在 VC++调试环境下运行 DLL 程序 ,系统会提示你输入调用此 DLL 的可执行文件名 ,选择SolidWorks 可执行程序的具体路径后SolidWorks 就会自动运行 ,使用 SolidWorks 的文件/ 打开菜单 ,在文件类型过滤器中选择 Add~Ins ( 3. dll)就可加载自己的 DLL 程序。DLL 注册成为 SolidWorks 系统的插件后 ,还可使用工具/插件菜单打开插件对话框 ,选中需要加载的插件(如图 3 所示) ,以后启动 SolidWorks 就可自动加载该 DLL 程序,无须再进行加载操作 ,十分方便。
SolidWorks加载 DLL 成功后 ,用户可在 SolidWorks 系统中打开 3DCAD/ 垫套菜单或单击工具栏快捷按钮弹出程序运行界面(如图2 所示) ,用户输入垫套的尺寸参数后 ,单击绘图按钮 ,SolidWorks 就会自动绘出垫套的三维实体造型(如图 1 所示)。
3结束语
本文探讨了对三维绘图软件SolidWorks 进行二次开发实现机械零件三维造型参数化设计的方法。设计实例表明 ,采用 Visual C++编程语言建立SolidWorks 的动态连接库文件可以很好实现与 SolidWorks系统的无缝集成 ,能满足用户二次开发 CAD系统的需要。