摘要:本文主要分析了开发cad应用系统的层次模型特点,对图形程序设计中的特殊问题提出了解决方案,研制了通用的层次模型处理函数库。
一、引 言
在cad应用系统的开发中,各类设计图的程序编制往往是一项重要内容。由于工程、机械设计图所涉及的构造细节较多,相互关系错综复杂,因此相应的图形程序设计工作往往十分繁琐。此外,按常规程序设计思路编制的图形程序从编程风格来看不够精炼,且不易维护。因此,在遵循统一的程序设计原则的前提下,按照一种新的概念和思路合理组织程序结构,提高开发效率和程序质量,具有重要的实用意义。本文提出的模型层次结构思路正是解决这一问题的有效方法,十分适合在工程、机械cad图形程序设计中应用。实际上它也是iso颁布的phigs图形标准中的一个重要部分。据此,作者研制了一个层次模型处理的通用c语言函数库,可配合既有图形软件包工作,并已应用于多个cad应用系统的开发中,收到了良好效果。
二、模型的层次结构及建模变换
1.几何模型的层次结构
模型的层次结构表现为:用基本部件构造出高一级的实体,而用高一级的实体又可构造出更高一级的实体。在工程设计中,层与层之间的关系实际上是物体与子物体、部件与子部件、图形与子图形的关系。层次关系也反映了它们之间的装配调用关系。层次结构中的部件不仅本身具有一定几何形状,而且应注意到部件相互之间的位置和关系。部件本身的几何形状与其它部件无关,可以定义在一个自己拥有的局部坐标系上,该坐标系称为本体坐标系(master coordinate system)。高层部件可以对低层部件的本体坐标定义施行一个引用变换(instance transformation),从而在高层部件的本体坐标系中构成该部件的一个实例。若高层部件是根物体(rootobject),则在世界坐标系上获得了部件的实例。部件之间的相对位置关系就是由这些引用变换决定的。此外,在部件的本体坐标系下,为便于部件自身的几何处理,可以引入一些坐标变换,这是有别于引用变换的另一类变换。这两类变换都被用于构造物体模型,统称为建模变换。
在gks图形标准中引入了图段机制,用它可以实现单层的物体模型构建,其建模功能十分有限。较新的phigs图形标准则通过引入结构(structure)及其嵌套引用机制,可以实现任意层次的物体模型构建。
2.基于当前变换矩阵的建模
在多层结构的模型中,部件需要经由低层到高层的多重引用变换才能zui终在根物体的世界坐标系下实现引用。记xwc为世界坐标点,xmc为部件本体坐标点,各级引用变换记为t0,t1,…,tk,则有xwc=xmc.tk.tk.-1….t1.t0。由此可见,这一引用过程要求施行一系列的坐标变换操作,需进行多次矩阵乘法运算,由于部件内的所有图素都需进行这种操作,因此执行效率极低。根据复合几何变换原理,存在复合变换t,使得t=tk.tk.-1….t1.t0,则有xwc=xmc.t。复合变换t直接反映了部件本体坐标至根物体世界坐标的变换关系。因此,我们可引入一个当前变换矩阵(current transformation matrix,ctm)作为全局变量,它代表这一复合变换。当模型自根物体逐层向下引用部件时(树的前序遍历),累积相应的引用变换而得到新的ctm,即ctm0=t0,ctm1=t1.ctm0,…,ctmk=tk.ctmk。由此可得xwc=xmc.ctm,部件内的各图素仅需一次(当前)坐标变换即可在世界坐标系下实现引用。
利用ctm变换模型需要有一组关于ctm的操作函数。首先,应能够设置ctm。设置分两种:相对设置和设置。设置是指用给定的矩阵取代ctm原值;相对设置是指将给定的矩阵与ctm相乘后取代ctm,用以实现ctm的累积。其次,需要对ctm临时保留,因为在多层嵌套使用的环境下,当部件完成对下层部件的引用后返回到本部件时,相应地应返还部件的ctm原值,对ctm进行堆栈操作可满足这一要求。
按照ctm原理来实现部件引用变换的典型程序表述如下:
push(ctm,stk);将ctm压入堆栈stk
set-ctm-rel(m);用m.ctm代替ctm
sub-object;调用部件(定义在本体坐标系下)
pop(ctm,stk);将ctm弹出堆栈stk
ctm操作函数可看成是建立在世界坐标系下的图形系统的一组建模函数,它用来帮助应用软件建立模型,各部件生成定义在其本体坐标系下的输出图素,经由ctm函数处理后变换为定义在世界坐标系下的输出图素,再交图形系统处理。-1
三、工程图的分层组织及特殊问题
1.工程图的分层组织
工程设计图具有明显的层次结构。一幅整图由反映设计对象的各个视图及其它图形单元组成;这些图形单元又由更低层次的基本构件拼合而成;zui底层则是基本图素。典型的例子如一台机器,它包含多个部件,每一部件或是不可分的零件,或是可进一步分解的组件,因此其设计图可表现为一个层次结构。这种分层组织与结构化的程序设计相对应,图形程序设计一般都应按它来组织程序结构。
应当指出,常规的图形程序正是按以上结构设计的,但对设计对象的处理却存在一定缺陷。按照层次模型的原理,高层部件与低层部件的关系应是一种引用变换,但常规的图形程序却仅仅是一种调用子程序的关系。具体来说,在设计一个部件的程序段或程序模块时,常规方法往往需要进行频繁的设计数据→图纸数据的比例转换,程序设计者要同时关注设计对象本身及其在图纸上的表现等多方面的问题,这势必加重程序设计的负担,且程序代码也不够精炼。但按照层次模型方法,因部件是在自己的本体坐标系中定义的,因此可在部件自身的本体坐标空间中用真实设计尺寸绘制图形,而无需考虑比例转换等问题,即程序设计者只需关注设计对象自身,这就大大简化了程序设计工作。该方法表面上似乎未作比例转换,但实质上比例转换已通过引用变换矩阵被隐藏到后台,由层次模型操作函数自动处理了。
按照层次模型方法,图形程序的结构如下:
{根层(图面)图形处理;
object-open(引用变换参数);
object-1;部件1在本体坐标系中的图形处理
object-close;
……
object-open(引用变换参数);
object-n;部件n在本体坐标系中的图形处理
object-close;
根层其它图形处理;}
其中,在各部件的程序模块中又可嵌套引用低一级部件,如此可形成一个多重嵌套结构。
2.图面信息问题
一幅工程图所表达的内容,除了设计对象自身的图形外,尚有与图面有关的信息,如尺寸标注、文字说明、图形标记等。这是工程图绘制中的特殊问题。可以认为,图面信息都是定义在图纸亦即根层的世界坐标系下的,因此可直接在根层绘制它们。但有一类图面信息,其定位点、方位等是与设计对象上的某一位置和方向相关的,例如尺寸标注等。若在世界坐标系下绘制它们,其定位点、方位等却又定义在设计对象的本体坐标系下,则从程序流程及数据流向上难于解决。为此,可引入一类专门的标注图素,约定它们的定位点定义在当前坐标系下,而其它属性值(如文字高度、尺寸值等)则始终定义在世界坐标系下。这样,只要在设计对象的本体坐标系下调用它们即可完成相应的图面信息绘制,使用十分方便。
在phigs图形标准中,定义了一个加注文字输出原语,用于在规范化投影坐标系上生成一个字符串,以实现对模型某一处的加注,但其它视图信息如图形标记却难于在建模时实现。因此,phigs图形标准这方面的功能较弱。
3.层与层之间的关联与交叉引用问题
在多层图形结构中,当程序在某一部件的本体坐标空间中工作时,某些数据有时需取自另一部件的本体坐标空间。这样,层与层之间的数据发生关联,需要交叉引用。典型的例子是在部件的本体坐标系下引用根层世界坐标系下的数据,如某个定位点或某个方向矢量。这种数据引用按常规引用变换规则是无法解决的。为此,可引入“虚拟工作空间”的概念,即在当前部件的本体坐标系下临时复制另一部件的坐标空间,用以处理相关数据,处理完毕后立即将其撤去,再回到当前部件的本体坐标空间下。虚拟工作空间的操作细节由支持函数自动完成,对应用程序设计者则是*透明的。
四、层次模型处理函数库的功能
基于上述原理,作者用c语言研制了用于层次模型处理的通用函数库,配合图形软件包工作。它主要可提供以下几方面的功能:(1)部件引用变换的支持函数;(2)用于部件自身布局的坐标变换函数;(3)当前工作空间支持函数,用于设置当前工作空间、交叉数据变换,也可用于虚拟工作空间的操作;(4)各种标注图素的支持函数;(5)其它实用坐标计算函数。
为便于实际编程,作者在函数库中定义了以下几类坐标系:(1)世界坐标系wcs:即图面的坐标系;(2)部件坐标系bcs:部件的本体坐标系;(3)当前坐标系cacs:bcs下的基坐标系,若在wcs下则为wcs下的基坐标系;(4)当前坐标系(或称工作坐标系)ccs:当前绘图所用的坐标系,与crcs并列,若未设定crcs则为cacs,若未设定cacs则为bcs,若在wcs下则为wcs下的坐标系。
相应地,作者定义了以下几类坐标变换:(1)部件引用变换:引用部件的变换;(2)坐标变换:重置cacs,相应地撤消crcs、ccs;(3)相对坐标变换:重置crcs,相应地撤消ccs;(4)当前坐标变换(或称累积的坐标变换):在原ccs上增量累积的坐标变换,ccs取累积后的坐标系特别适用于保持程序设计中模块间的坐标系独立性。
五、结 语
基于层次模型的cad应用系统开发方法为我们提供了一种系统化的手段,在工程、机械cad图形程序设计中具有实用意义。这一方法需要得到相应函数库的支持,因此研制一个较为通用的层次模型处理函数库是十分重要的。层次模型处理函数库可以建立在现有的图形软件包之上,并与之协同工作。