文献标识码: A
文章编号: 0258-7998(2012)09-0125-03
随着计算机技术的发展,软件系统越来越复杂。这种变化在计算机辅助设计/制造(CAD/CAM)领域表现得尤为明显,以往大而全的CAD/CAM软件越来越显得力不从心。众多CAD/CAM软件开发者转而开始对这类软件的基础和共性进行研究,希望提供可进行二次开发的CAD/CAM平台支撑系统[1],使用户能在该支撑系统上进行二次开发,实现所需的特殊功能,定制出用户所在特殊领域的专用CAD/CAM软件。目前,为用户提供功能强大、使用灵活的二次开发接口,已经成为对CAD/CAM软件的普遍要求。二次开发也成为发挥CAD/CAM软件功能的重要途径之一[2]。TiGEMS是采用特征造型技术的三维几何造型软件[3],而特征造型技术也是当前CAD软件主流实现技术[4]。如何在二次开发接口中体现特征造型思想的特色和优点,是本文要探讨的主要问题。
二次开发接口的实现方式多种多样,目前流行的有通用文件格式实现的接口[5]、组件技术实现的接口[6]、数据库技术实现的接口[7]以及动态链接库技术实现的接口。不同的实现技术各有其优缺点,并且随软件技术的发展,二次开发接口技术也在发展变化中。当前很多CAD/CAM软件系统都同时实现了多种接口方式,以满足不同用户的不同需求。不论使用何种技术,能够将接口编程技术与宿主软件完美结合,在接口中体现宿主软件的特色和优点才是关键。并在三维几何造型系统TiGEMS中,选用动态库技术实现TiGEMS的二次开发接口的原因在于:(1)动态库技术有利于在接口中体现TiGEMS的特征造型思想,保持了各类用户对TiGEMS技术和使用特征的认知一致性;(2)用户有自定义特征的需求,在考察多种实现方式后认为,动态库技术为实现该需求的最好方式;(3)动态链接库技术发展时间长,技术成熟,掌握该种编程技术的程序员较多,适宜为工程技术人员做二次开发用; (4)使用基于动态库技术编写的用户程序执行效率高、速度快,能够充分满足用户的各种需求。
1 设计目标及原则
1.1 设计目标
设计目标用于规定设计的大方向和基本功能描述,在设计中起总括和纲领的作用,设计目标应该在设计方案中被逐一细化并最终得到实现。
(1)设计良好的三维几何造型系统的二次开发接口应该能够向用户展示系统的设计思想,引导用户正确、快速地掌握三维几何造型系统的特点;使接口开发用户对系统的感知与直接操作三维几何造型系统的感知一致。用户可以无障碍地从直接操作转到二次开发上来。
(2)用户通过接口开发模块能以插件形式载入三维几何造型系统中,也能以独立程序的形式与三维几何造型系统共同运行。用户可根据自己的需求和喜好在用户界面加入自己的设计元素,因此接口应该实现动态的用户界面(UI)管理功能,方便用户根据自己的需要定制操作界面,甚至重新构造用户操作界面[8]。
(3) 二次开发接口应该具有良好的可扩展性。二次开发接口不但要求实现用户直接操作的所有功能,还应该实现更底层的数据定义和微操作功能,以及更高层的批量操作和集合操作功能。用户能够通过二次开发赋予三维几何造型系统更强大或更专业的功能。
1.2 设计原则
设计原则规定了在二次开发接口设计过程中需要遵守的规则和方法。遵守设计规则可以保证最终代码的质量、效率和稳定性,并为今后工作的可延续性提供方便。
(1) 屏蔽不必要的细节。进行二次开发的用户多数是工程技术人员,不太可能精通专业的程序开发技术。他们要求的二次开发接口在功能强大的同时又要易学好用。因此封装细节信息,简化操作过程非常必要。
(2) 严格封装内部对象和方法。二次开发程序对CAD软件功能的调用和对变量的存取,都要通过二次开发接口进行,严禁越过接口函数直接存取变量对象或者调用内部方法。
(3) 保证接口的鲁棒性和独立性。用户往往会以设计人员没有想到的方式调用二次开发接口,因此必须保证接口函数的鲁棒性,不能在屏蔽细节的同时埋下隐患。每个接口函数实现的功能要单一、明确[9]。
(4) 充分考虑接口可扩充性。二次开发接口程序架构应该是开放性的,可平滑扩展,能根据应用需求的增加将新的功能加入到接口中去,同时不影响已经实现的接口功能[9]。
2 TiGEMS二次开发接口的设计方案
TiGEMS是多文档/视图结构的应用程序,共实现了零件、装配、渲染、有限元和工程图5种文档类型。用户可以同时打开多种类型的多个文档,但在同一时刻只能编辑一个文档,即当前活动文档。TiGEMS使用特征树组织和管理特征并表示它们之间的相互关系。特征就是TiGEMS的核心数据,特征树即TiGEMS的核心数据组织方式: (1)二次开发接口应开放特征和特征树的操作方法,让用户能够编程实现对TiGEMS文档的操作;(2)实现用户定义特征功能,扩展特征外延;(3)能够对多个用户插件进行有效管理,最后可修改用户界面,实现动态UI。
2.1 接口功能模块综述
TiGEMS的二次开发接口可分为插件管理模块、UI控制模块、用户特征管理模块和用户接口模块,如图1所示。
为了使得TiGEMS支持二次开发,首先对TiGEMS的核心进行修改:增加了插件管理、UI控制和用户特征管理3个模块,然后在TiGEMS核心之外创建用户接口模块,封装所有TiGEMS功能调用,并向用户提供函数调用和对象定义的头文件和库文件。
2.2 插件管理模块
TiGEMS允许用户通过二次开发接口编写插件,插件可以调用所有二次开发接口提供的功能,但是不能独立运行,必须载入TiGEMS中才能使用。插件管理模块作为常住TiGEMS核心的一个功能模块,提供了载入、管理、卸载用户插件的功能。
由于TiGEMS的不同文档类型使用不同的类实现,具有不同的属性和操作方法,所以某个插件在某种文档中的功能对另一种文档并不适用。因此,要将插件和文档对应起来,同类文档的插件可以共享,不同类文档的插件必须相互隔离。
插件管理模块管理用户插件,根据用户需求将用户插件载入或者卸载,同时隔离对应不同文档类型的插件模块,避免冲突和混乱。
2.3 UI控制模块
UI控制模块可根据用户载入插件中定义的界面信息构造用户界面,以及在卸载插件时恢复以前的用户界面。当用户在不同文档类型中切换时,UI控制模块还需根据当前活动文档的不同重新构造用户界面。
2.4 用户特征管理模块
用户特征管理模块专门用来管理用户自定义的特征,由于用户定义的特征需要被TiGEMS的核心处理和识别[10],因此TiGEMS核心不可避免地要对用户定义的特征处理函数进行调用,这极大增加了TiGEMS的潜在不稳定性。为了最大可能地避免这种风险,用户特征管理模块统一负责用户定义特征的注册和TiGEMS核心对用户特征的调用,严格限制用户特征的行为。
2.5 用户接口模块
所有接口函数都封装在动态链接库文件中,与API函数声明、对象定义头文件一起提供给用户。用户编写好的插件程序也以动态链接库的形式载入TiGEMS。
接口函数部分根据功能的不同可以分为通用特征操作函数、UI控制函数、用户特征操作函数、插件管理函数及其他杂项函数。
通用特征即TiGEMS已经定义好的特征,这些特征的操作函数包括特征创建函数、特征修改函数、特征删除函数、特征复制函数、特征查询函数、特征重构函数和特征加入函数。
UI控制函数专门用来创建和修改用户菜单、工具条、按钮及浮动面板等用户界面元素,同时还可以添加更改窗口布局,整体显示风格等。UI控制接口函数通过调用处于TiGEMS核心的UI控制模块起作用。
用户特征操作函数可向TiGEMS注册、修改及删除用户自定义的特征类。
插件管理函数为用户提供在自主开发程序中管理TiGEMS二次开发接口插件的功能,当然也可以在插件中管理其他插件,进行插件的载入、卸载等操作。插件甚至可以通过管理接口函数实现卸载自身的操作。
其他杂项函数包括对象操作函数和辅助功能函数及文件操作函数。其中文件操作函数可用来打开、保存和关闭TiGEMS创建的特定格式,因为保密或者其他原因不能将格式开放给用户的文件。
3 TiGEMS二次开发接口的实现
TiGEMS二次开发接口的代码实现在Windows平台下VC++6.0中完成,具体工作可以分为TiGEMS核心代码修改和接口函数封装两大部分。TiGEMS二次开发接口代码实现的关健主要集中在TiGEMS核心代码的修改。插件管理、UI控制和用户特征管理都涉及到了对TiGEMS核心代码的修改。
3.1 插件管理
TiGEMS是多文档/视图结构的程序,同类文档的用户插件是共享的,但是不同类文档的用户插件互相隔离。实现插件的载入/卸载以及初始化都有一套专用的接口函数,并且插件管理模块在载入插件的同时将当前活动文档的类型作为插件的类型保存起来,为以后可能发生的文档切换等操作保存必要的信息。插件管理模块使用一个结构数组m_moduleList来管理所有被载入的用户插件,这个数组的每个组元对应一个插件,存放插件的名称、句柄、类型以及插件内部相关信息。其他模块通过识别插件的类型来判断该插件是否属于当前的活动文档。
3.2 UI控制
所有用户插件造成的用户界面的动态变化都由UI控制模块进行统一的调度和控制。用户插件中会携带有关用户界面的修改信息,在载入初始化时向UI控制模块提出界面请求,UI控制模块使用一个结构数来保存每个插件对用户界面的更改要求。每遇到一个新插件的界面更改要求,UI控制模块都会先进行条件预判断,全部或部分允许该用户插件对用户界面的改变。之后UI控制模块就不再干预界面与插件之间的交互。直到有插件载入、卸载以及文档切换时,UI控制模块才会干预用户界面的生成。
UI控制模块的另一个重要功能是在非同类文档切换时保证用户界面随之改变,对于可以与MFC文档类关联,随文档的切换而切换的界面元素(如菜单等),UI控制模块无需干预。但对于无法随文档切换而切换的界面元素(如命令窗口等),UI控制器需要捕捉文档切换消息,在消息处理中完成界面元素的重新构造。
3.3 用户定义特征管理
用户特征实现的关键在于如何定义以及TiGEMS如何识别并处理用户特征。为了让用户能在插件中创建特征定义,需要继承特征基类C_FeatureDef和c_FeatureStep的定义。考虑到用户特征的特殊性,在GEMSAPI模块中继承这两个类,定义了两个新的用户特征基类C_UserFeatureDef和C_UserFeatureStep,增加了表征用户特征的变量,并规定所有用户特征必须继承这两个特征基类。这样就解决了用户特征定义的问题,同时用户特征识别问题也因为用户特征继承自TiGEMS通用特征基类而得到解决,TiGEMS可以从特征基类中的m_property变量中获取所需的特征信息。用户特征在使用前需要先向用户特征管理模块注册,只有不存在重名和其他冲突的用户定义特征类才被允许注册。用户特征管理模块使用一个结构数组m_userFeature来管理用户特征。TiGEMS对用户特征的任何调用都要通过用户特征管理模块间接执行。这样做的好处在于提高了TiGEMS的稳定性,而且用户特征管理模块可以及时拦截某些可能出错的调用,如用户插件已卸载,但TiGEMS却要调用该插件中用户特征处理函数等。TiGEMS核心代码中所有需要判断特征类型并调用对应处理的模块,都要加入对用户特征判断的代码,以及通过用户特征管理模块调用用户特征处理的代码,以便实现TiGEMS对新加用户特征的响应。
为用户提供二次开发接口,满足各种专业用户的不同需求是提高三维造型软件使用范围和生命力的一个重要途径。TiGEMS作为一个成功的国产CAD软件,实现了二次开发接口,其功能得到进一步完善,应用范围得到了扩展,使用方式也变得更加丰富。
参考文献
[1] SABIN M. CAD system component [J]. Computer-Aided Design, 1996,28(3):183-192.
[2] 赵卫东, 柳先辉, 卫刚. CAD软件二次开发平台实现技术[J]. 计算机辅助设计与图形学学报, 2003,15(4):512- 516.
[3] 袁奕. 特征造型在GEMS5.0中的实现[D]. 北京: 清华大学,1998.
[4] 叶修梓,彭维,何利力. 从工业界的角度看CAD 技术的研究主题与发展方向[J]. 计算机辅助设计与图形学学报,2003,15(10):1194-1199.
[5] 陈为. 基于AutoCAD 二次开发的研究[J]. 计算机工程与应用,1997,33(1):39-43.
[6] 陆薇,刘强,周琛,等.基于组件的开放式CAD系统模型[J].软件学报, 1998,9(9):651-655.
[7] 赵付青,余冬梅,张聚礼. CAD智能工程数据库实现方法的研究与应用[J]. 计算机工程与应用 ,2003,39(2):215-219.
[8] 吴余华,童水光,许跃敏. 国外CAD/CAM系统二次开发关键技术的研究[J]. 计算机辅助设计与制造,1996,15(8):11-12.
[9] 王云鹏,雷毅,潘翔,等. CAXA电子图版的二次开发技术[J].计算机辅助设计与图形学学报,2002,14(2):189-192.
[10] 宋玉银, 蔡复之, 张伯鹏,等. 基于特征设计的CAD系统[J]. 计算机辅助设计与图形学学报, 1998,10(2):145-151.