计算机辅助设计( CAD) 技术, 作为电子信息技术的一个重要组成部分实现设计自动化, 增强企业及其产品在市场上竞争能力, 文献[ 10]用三维CAD系统生成的产品模型, 可以直接输入到相应的系统中进行有限元分析、可制作性分析、加工模拟等工作, 从而可以大大地缩短产品的开发周期。随着CAD技术的蓬勃发展, 基于该技术上的二次开发正在以其独特的魅力被越来越多的用户所接受, 而且二次开发作为一种技术也日臻成熟。当前, 比较xx的CAD 软件, 如PRO/E, AutoCAD, SolidWorks 和SolidEdge 等都提供自己的二次开发平台。其中, SolidWorks 二次开发平台应用相当普遍, 平台支持多种开发语言。文献[ 1, 7, 8] 演示了使用VC 以及COM 技术进行SolidWorks 二次开发的流程与方法; 文献[ 2] 对使用SolidWorks进行二次开发进行了总体介绍; 文献[ 3] 对参数化设计进行了讨论。
二次开发最常见的应用是搭建标准件库, 以便按类别统一地管理标准件, 而且搭建标准件库的技术比较成熟, 文献[ 5]对该技术进行了全面介绍。这种所说的标准件可以是零件也可以是简单的装配体, 但是对于由许多复杂零件组成的装配体, 使用常规的二次开发方法不能进行很好的处理。笔者针对复杂的装配体设备库进行了二次开发的研究, 而且通过装配体设备库搭建成多种成套设备, 并总结了一套运用SolidWorks 二次开发管理设备库的方法, 供业内人士参考。
1. 1 使用动态链接库技术
一个已经存在的软件来说, 对它进行二次开发扩展该软件功能, 主要是通过为其添加插件来完成的。但是, 不是所有的软件系统具有添加插件的功能。SolidWorks 提供了一个开放的平台, 允许用户为其添加插件, 扩展其功能。
户角度看, 基于SolidWorks 的二次开发是为其制作并添加插件的过程。从二次开发人员角度看, 基于SolidWorks 的二次开发则是编写动态链接库( DLL) , 并将这个DLL 注册到SolidWorks 软件中的过程。使用传统的Windows 编程方法来创建和使用一个动态链接库是一件很令人xx的事, 用户需要对定义文件、工程文件进行一系列的修改以适应创建和使用动态链接库的需要。在VC6 开发环境中, 使用SolidWorks 二次开发工程向导创建的代码框架, 可以免去手工编写动态链接库的很多麻烦。开发人员在框架中只需关心软件需求部分的代码编写, 其他和SolidWorks 接口部分的代码向导已经自动生成。SolidWorks 为动态链接库提供了加载的接口, 能够将用户的动态链接库通过加载嵌入到SolidWorks 内部。
综上所述, 使用VC6 向导搭建一个基于SolidWorks 的二次开发软件框架, 是进行课题项目的起点, 该框架原理上使用的是动态链接库技术。搭建一个基于设备库二次开发软件的框架一般需要如下步骤:
(1) 安装SolidWorks API SDK 开发包。该开发包是SolidWorks 提供给开发人员的编程环境, 因此要进行二次开发首先应该安装SolidWorks API SDK, 可以去SolidWorks 官方网站上下载{zx1}的开发包( 目前版本是2004) 。
(2) 在VC6 开发环境下, 使用SolidWorks 二次开发向导创建一个工程。安装SolidWorks API SDK 开发包将为VC6 添加一个二次开发的模板文件, 在VC6 IDE 下, 可以看到新建工程类型中多出一项, 如图1 所示。
图1 添加SolidWorks二次开发模板文件后的VC工程向导
(3) 编译VC6 工程, 得到功能最简的DLL 文件。如果创建工程的时候选择自动注册, 则VC 会帮助开发人员自动将DLL文件注册为SolidWorks 的插件并启动SolidWorks。
(4) 通过SolidWorks 的菜单命令使用这个插件, 如图2 所示。这样, 基于设备库的二次开发框架已经搭建好, 开发人员只需要根据自己的需求使用VC6 环境对上述DLL 工程添加代码, 扩充插件功能即可。
图2 通过SolidWorks的菜单命令使用插件
总之, 动态链接库技术是实现基于设备库二次开发软件的最基本的技术, 通过该技术才使得自己定制的功能以进程内组件的形式插入到SolidWorks 中去, 使得在SolidWorks 环境下使用扩充的功能成为可能。
1. 2 使用COM技术
COM( Component Object Model) 是组件对象模型技术的简称。利用COM技术开发软件组件, 组件实际上是一些小的二进制可执行程序, 它可以给应用程序、操作系统及其他组件提供一些服务。开发定制的COM组件就如同开发动态的、面向对象的API。多个COM对象可以连接起来以形成应用程序或组件系统。并且组件可以在运行时、在不从重新连接或编译应用程序的情况下被卸载或者替换。COM是一种强有力的集成技术, 可以在程序运行时把各种毫不相关的软件部分混和连接起来, 而不再参与其余的事务。连接建立后, 两个模块就可以通过一种称为接口的结构进行通信。除了需要很少的几个COM功能启动通信进程之外, 接口不再需要其他任何静态或动态的连接入口或硬编码地址。
SolidWorks 支持COM标准, xx实现了COM自动化。作为一个COM服务器, SolidWorks 提供了大量的COM组件, 以及这些组件所拥有的方法和属性, 用户通过在客户应用程序中对这些COM对象及其方法和属性的操作, 可以在自己开发的应用软件中实现诸如创建直线、构造实体、检查曲面表面参数等几乎所有的SolidWorks 软件的功能。
SolidWorks 提供了大量的COM组件对象用于二次开发, 这些COM组件对象涵盖了全部的SolidWorks 的数据模型, 通过对SolidWorks 的COM组件对象属性的设置和对COM组件对象方法的调用, 就可以在用户自己开发的系统中实现与SolidWorks 相同的功能。SolidWorks 为二次开发人员提供的COM对象结构如图3 所示。
图3 SolidWorks提供的COM对象关系图
在如图3 所示的对象关系图中, 每种类型的COM对象总能对应于SolidWorks 工作平台的某个元素。比如PartDoc 对应于SolidWorks 的零件文件, 用户对零件文件的操作一般都能在PartDoc这一COM对象找到对应的方法, 这样就给予了二次开发人员通过代码实现常规操作的能力。
使用SolidWorks 提供的COM对象, 一般遵循如下步骤:
(1) 声明一个COM组件对象, 例如
LPMODELDOC2 pDoc2 = NULL;
(2) 获得该COM组件对象的指针, 例如
hres = TheApplication->GetSWApp()->IOpenDoc5
(
fileName,
swDocASSEMBLY,
swOpenDocOptions_Silent,
JHDOName, &fileError,
);
(3) 使用该COM组件对象提供的服务进行操作, 例如
hres = pDoc2->GetTitle(&title);
(4) 释放该COM组件对象指针, 例如
pDoc2->Release( );
1. 3 使用子图化原则划分子设备
搭建设备库的过程就是将成套设备划分为若干部分, 每个部分作为独立的子设备存入该库中, 以便将来按照用户输入的参数调用并通过程序修改子设备, 最终组合成符合用户需求的成套设备。与零件库所不同的是, 设备库往往不遵循某种尺寸标准, 即在使用设备库中的设备前通常都需要先修改该设备某些尺寸, 然后再将某几个设备组合成成套设备。同样, 组合好的成套设备还需要局部的程序修改, 如子设备间的连接管直径等参数。
将整套设备划分为若干子设备关键是考虑整套设备的划分粒度问题。例如, 对于课题项目中的工业制氮机成套设备来说, 在进行程序开发前将其分解为四个子设备: 空气净化设备(AC设备) 、空气储罐设备(CG设备) 、吸附塔设备(PSA设备)以及缓冲罐设备(NT设备) , 如图4 所示。
图4 工业制氮机成套设备
如图4 所示, 每个子设备显然可以细分, 如AC 设备细分为AC 除油器和AC 冷干机。这里需要遵循子图形建立原则(子图化原则) , 如下所述:
(1) 子图形不能过于简单, 即不能把零件拆得过细。零件拆得过细虽可以减少子图形的工作量, 但是图形库的尺寸就会增大, 绘图速度就会降低, 子图形利用率不高。
(2) 子图形不能过于复杂, 以免降低其通用性, 造成建立和维护子图库工作量的增加。
总之, 在建立子图形时要综合分析所要设计的产品, 正确处理好上述矛盾, 从中找出通用性较大、使用率较高的基本图形作为子图形单元, 按类型分别建立零件的子图形。因此, 子图化原则在实际的应用中, 需要具体问题具体分析。在本课题项目中, 正是考虑到上面划分的子设备在其他成套设备中的复用性才没有进一步细分。
软件开发过程中, 根据用户要求, 确定每个子设备的主要参数, 包括可变参数与不可变参数, 并对可变参数实现变量驱
动, 贯彻尺寸驱动、变量驱动的基本原则。综上所述, 使用SolidWorks 二次开发的过程中, 搭建设备库一般遵循如下步骤:
(1) 使用SolidWorks 按照某种尺寸的规格建模成套设备, 这需要专门的画图人员绘制三维设备造型图。
(2) 将成套设备按照子图化原则划分为若干可复用的子设备。
(3) 为每套子设备添加约束方程、尺寸驱动等。对于某些子设备需要使用配置进行序列化, 对于子设备的局部零件还可能需要采用压缩隐藏技术, 这些将在后面部分详细介绍。
(4) 创建一个表示设备库的文件夹, 将上面划分好的子设备添加到文件夹所代表的设备库中, 以便将来组合成套设备时从库中取出。
总体上说, 运用SolidWorks 搭建的设备库将配合设备信息库共同为二次开发软件提供可操作的信息。
1. 4 使用Access搭建设备信息库
在基于设备库的二次开发中, 只搭建设备库是不能满足软件设计灵活性、交互性要求的, 还需要为二次开发软件搭建设备信息库。设备信息数据库中的数据通常是程序修改设备参数的依据, 该库的作用以及搭建方法如下所述:
(1) 限定用户输入参数的取值范围。如在用户操作界面中, 某些参数取值可以从信息数据库中读取, 然后以选择框的形式提供给用户, 而不是让用户输入数值, 避免用户提供的参数数值不合理。更高级的应用是根据前几步的输入或计算结果, 只从数据库中取得满足条件的记录, 将其中的参数值显示给用户选择。如图5 所示, 课题项目设备中的主管路通径型号是让用户来选择的, 而不是手工输入的, 这些取值均是从数据库读取到的。
(2) 隐含确定其他参数, 省去手工输入。根据用户输入的参数值读取数据库中对应的记录, 自动获得其他参数取值信息, 供系统对设备进行参数修改。例如, 课题项目的NT设备信息表如图6 所示。NT设备的装配图如图7 所示(其中支腿经过隐藏处理) 。
因此, 系统可以根据用户选择的NT 设备型号( 对应NT_NAME 字段) 来确定其他参数, 包括NT设备出气口通径(对应
NT_ SHANGGUAN 字段) 、NT 设备排污口通径( 对应NT_XIAGUAN字段) 、NT 设备主管径( 对应NT_GUANJING字段) 、NT设备入孔型号( 对应NT_RENKONG) 等参数。
(3) 产品可扩展性高。系统大量依据数据库中信息来修改设备尺寸, 可以实现设备生成的高度自动化。同时, 如果因为某个规格过时而不让用户选择该规格下的参数数值, 只删除数据库中对应的记录即可。这样, 系统的操作界面中供用户选择的参数值便不会再出现过时的那种规格的数据了。同样道理, 由于有新规格的设备要加入, 可以在数据库中添加一条记录, 系统操作界面加载时会自动在选择项中添加新规格参数数值供用户选择。
设备信息库其实就是面向工程的数据库, 可以使用一般的数据库产品。本课题项目决定选用Microsoft Access 搭建数据库, 因为它是一个小巧的数据库管理系统, 可以完成诸如查询、排序、增加记录等操作, xx满足实际的要求。同时, VC6 提供了对数据库的管理, 使用户可以很方便地在开发环境中管理数据库, 而不需要进入数据库管理系统。除了对子设备建立信息数据库外, 还要针对成套的设备建立数据库, 然后用程序完成对数据的管理( PDM) 。采用Microsoft DAO 数据库访问技术,在VC6 中每个需要的数据表创建类, 这是通过VC6 提供的添加类向导完成的, 提高了开发效率。
1. 5 使用配置和设计表生成标准件技术
使用配置和设计表生成标准件也是二次开发过程中经常使用的技术, 它可以实现图形文件的复用。配置和设计表可以说是SolidWorks 的强大功能之一, 即使用它可以方便地从一个单独的零件创造出一个零件族, 通过Excel 电子表格可以设计具有相同拓扑结构但尺寸不同的零件(或装配体) 。例如, 在同一个文件中构建法兰的标准件库, 只需要将几个关键参数在Excel 中作为配置列出, 需要的时候加载不同的配置名称即可完成不同零件的使用。这种做法的一个明显优势就是多种规格的造型可以集中在一个文件中进行统一管理。
必须是相同拓扑结构的造型才能使用配置进行系列化。两种具有相同拓扑结构的零件如图8 所示, 具有不同拓扑结构的零件如图9 所示。
在SolidWorks 中, 对零件或设备进行系列化也是课题项目要涉及到的, 下面给出某个法兰零件的配置表, 如图10 所示。
SolidWorks 提供给开发人员的API 中, 包含对配置表中某个配置进行选取。每个配置项都有自己的名称, 通过该名称可以在配置表中{wy}确定某个配置, 可以将配置的名称想象成数据表中的键值。在程序加载某种配置的过程中, 使用的接口主要是LPMODELDOC2, 一般遵循如下步骤:
(1) 声明一个LPMODELDOC2 类型的变量, 例如
LPMODELDOC2 pDoc2 = NULL;
(2) 调用打开函数打开含有配置表的文件, 根据需要为函数传递配置名称, 这样在打开文件的同时自动加载传入的配
置, 设备/ 零件尺寸根据配置各项内容自动进行相应调整, 例如
hres = TheApplication->GetSWApp()->IOpenDoc5
(
fileName, lDoc-Type,
swOpenDocOptions_ReadOnly, configName, &fileError,
);
其中, fileName为设备/零件文件的存放位置, lDocType为文件类型(可以是零件文件类型或装配体文件类型),
swOpenDocOptions_ReadOnly表示以只读形式打开文件, configName为传入的配置名。
(3) 如果打开的是装配体文件, 则要先调用重构函数对模型重构, 才能使配置真正加载, 例如
if ( lDocType == swDocASSEMBLY )
{
pDoc2->EditRebuild3(&bres);
}
(4) 对打开的文件进行其他操作后, 保存并关闭文件, 例如
pDoc2->SaveAs4
(
fileName, swSaveAsCurrentVersion, swSaveAsOptions_
Silent, NULL, NULL,
);
BSTR title;
hres = pDoc2->GetTitle(&title);
hres = TheApplication->GetSWApp()->CloseDoc(title);
pDoc2->Release();
::SysFreeString(fileName);
::SysFreeString(configName);
1. 6 使用压缩和隐藏技术
在进行基于设备库的二次开发过程中, 经常会遇到这种情形: 设备某个位置上的部件, 在设备选取不同规格时将会出现比较大的差异, 即此位置上部件会表现出不同的拓扑结构。SolidWorks 针对这种复杂的情况, 提供了两种处理办法, 即压缩和隐藏。这两种技术的工作方式很相似, 它们都能够使某个部分暂时处于不可见状态, 在需要的时候将该部分显示出来。但是, 压缩和隐藏技术的工作原理并不相同, 压缩是不让被压缩部分读入内存, 解压缩时才读入内存并显示。隐藏则是先将被隐藏部分读入内存而不显示, 将来解除隐藏时不必再次读入内存。由此可见, 压缩的好处是节省内存, 设备/零件初次加载时由于不xx读入内存而速度较快, 缺点是解压缩时需要的时间稍长; 隐藏的好处则是在显示被隐藏部分时, 能根据内存内容很快地显示, 缺点是初次加载的过程比较费时。
隐藏还有一个{zd0}的缺陷: 当隐藏同一位置的不同部件的时候, 由于部件实际是装入内存的, 在内存中的情形便是同一位置上装配有多个不同部件, 因此必然会造成模型装配关系的错误。考虑到隐藏这方面的限制, 对于某位置上只有一种部件需要隐藏或显示的情况, 可使用隐藏技术。对于某位置上多个部件中只能有一个部件显示的情况, 必须使用压缩技术。例如, 课题项目中的PSA 设备内有一种称为“气缸”的部件, 分别对应不同的规格: 气缸100 和气缸200。两种规格气缸的拓扑结构不同, 需要根据输入的参数值在同一位置上只显示一种气缸, 因此应该使用压缩技术。使用压缩技术一般遵循如下步骤:
(1) 在搭建设备库时, 将某一位置上可能出现的所有部件全部放入到该设备装配体文件中, 先不将部件装配在设备上, 而是将那些部件全部压缩。
(2) 将压缩的某一个部件解压缩, 在需要的位置上建立该部件与设备之间的装配关系, 之后再次压缩该部件。
(3) 对同一位置上所有可能出现的部件重复进行(2) 中所述的操作。这样, 任意解压缩一个部件都会在固定的位置上与设备保持很好装配关系。
(4) 在程序中, 根据用户输入参数或计算结果, 选择解压缩一个部件, 并保证其他部件仍处于压缩状态。
2 结论
基于设备库的二次开发应用比基于标准件库的二次开发更具有针对性, 它往往是一个企业内部具体产品设计的应用。上面介绍的若干基于设备库二次开发的方法, 在思路上给开发人员以引导。在进行实际设计与开发过程中, 使用上述方法与技巧能够快速地制作出符合要求的软件产品。一个具体的基于设备库的二次开发应用, 需要客户、设计人员以及开发人员之间的良好沟通, 需要认真进行需求分析、总体设计、详细设计、编码实现以及系统的各类测试等。项目经历的过程应该符合软件工程的各个阶段, 同时比一般的软件项目要多出制作模型图阶段。笔者所介绍的方法在每个阶段都起到不同程度的作用, 例如, 在项目体系结构分析过程中, 考虑使用SolidWorks提供给VC6 的向导搭建软件框架。在详细设计阶段, 搭建设备库和信息库的方法将起到指导作用。压缩与隐藏技术用来限定模型图的制作方法。总之, 对于上述各种方法的灵活运用必将对任何基于设备库的二次开发系统大有裨益。