在线工博会

浅谈二维CAD系统绘图装配消隐的实现
清华大学 潘华 郭辉
为节省流量,手机版未显示文章中的图片,请点击此处浏览网页版
摘要:深入研究了二维消隐的原理,设计了零件视图内、外边界表示的数据结构,通过以零件视图的内外边界对图形实体的显示进行裁剪的方法实现了二维消隐。在实现中零件视图的设计信息保存在该视图的扩展数据域中,用户以交互方式定义零件视图及零件视图相互间的遮挡关系。
关键词:消隐;零件视图;边界
产品装配图是产品设计与制造中不可缺少的技术文档。为了提高装配图的绘图效率,充分利用已绘制好的零件图,仿照产品装配过程把许多零件视图“装配”到一起,并加以少量的编辑修改来绘制装配图,是二维CAD系统不可缺少的手段。因此,能否实现二维工程绘图的装配消隐是衡量二维CAD系统的重要指标。装配图的每个视图可以看作由几个零件的部分或全部视图进行遮挡消隐和装配而成。
消隐是二维CAD系统向用户提供具有正确遮挡关系的零件装配图显示的功能。图形设计用户在使用绘制好的零件图构造装配图时,零件间的遮挡关系使得图纸中出现部分多余的线条,这种情况给用户带来很大不便,因此对零散的图形单元进行集成和在图中加入设计信息,从而使得计算机能够对这样的结构化图形进行处理,消隐的概念由此产生。消隐功能可以这样简单地描述:把零散的图形实体定义成零件视图块,并指定不同零件视图块的遮挡关系,用户通过命令的方式调用消隐功能,根据这些信息进行计算并构造具有正确遮挡关系的图形显示。
1 零件视图块[1]
消隐是由于不同零件图之间的遮挡而产生的概念,零件视图块是消隐的基本单位,用户选择零散图形实体以块的方式生成零件视图块。零件视图块具有遮挡能力,不同的零件视图块可以具有不同的遮挡能力,这由用户指定零件视图块之间的遮挡关系并赋予消隐高度值的方法进行实现。消隐高度值的不同确定了零件视图块之间的遮挡关系,零件视图块之间的遮挡关系可以表示为1棵树,从树根到树叶逐级被遮挡,普通实体可以被任意零件视图块遮挡,它具有最低的消隐高度,这样零件视图之间的相互遮挡关系由它们的消隐高度值唯一确定。
2 消隐的原理[2]
装配消隐的过程如图1所示,用户从图形实体数据中选择图形实体并定义为零件视图块,利用边界搜索算法得到该零件视图块的内外轮廓信息,这些信息作为用于消隐的零件图设计信息而被记录于零件视图块的扩展数据域中。然后用户指定零件视图块之间的遮挡关系,对零件视图块赋予消隐高度值,同样记录在零件视图块的扩展数据域中。最后系统利用零件视图块的轮廓信息、零件视图的消隐高度等数据,通过裁剪等基本算法进行消隐的计算处理,最后得到具有消隐效果的图形显示和打印结果。

(图片)

图1 消隐过程示意图

2.1 由图形定义零件视图块
消隐操作首先要把若干个没有逻辑联系的图形实体组合成零件视图块,并将用于消隐的设计信息存储在零件视图块的扩展数据域中,步骤如下:
(1)检查图形实体集的外边界和内孔边界情况 零件视图块必须具有封闭的外边界,为了找出图形实体集合形成的外边界,在利用边界搜索算法进行搜索时,应该选取在位于这一边界之外的参考点,最简单的选取方式是计算被选择实体集合共同的包围盒,任取包围盒之外的1点即满足要求。
另外要检查选择的图形实体集形成的零件视图块的内孔情况。用户以交互方式选择决定内孔位置的标记点,同样利用基于参考点的边界搜索算法找出该点指示的内孔边界。如果用户选取的标记点是错误的,例如该标记点指示的是外边界或者已经定义的内孔边界,或者标记点不在希望搜索的内孔边界之内,那么内孔边界的检查将会指示出错或得不到需要的结果。
(2)以选择的图形实体生成块 利用块的生成函数把选择的图形实体集合组合成1个赋名的块,并插入该块的Insert实体,同时删除被选择的图形实体集合。
(3)存储零件视图块的遮挡信息 零件视图块的遮挡信息就是用于构造零件视图块的内外轮廓边界的基本数据为了重构零件视图块的内外边界,除了需要构成零件视图块的实体集外,还需要指示内孔的标记点序列,因此这里需要保存的数据主要就是各标记点数据,它们被存储在零件视图块实体的Xdata扩展数据域中。
2.2 建立零件视图块间的遮挡关系
用户对零件视图块间的遮挡关系的指定通过Above命令来进行,该命令可以指定若干个零件视图块的遮挡能力大于另一个零件视图块。在实现中采用消隐高度值表示零件视图块的遮挡能力大小,通过消隐高度值的不同来建立零件视图块间的遮挡关系。消隐高度的数值作为零件视图块的遮挡信息,也保存在被插入的零件视图块的Insert实体的Xdata域中。
2.3 消隐
消隐按如下的规则进行:
外轮廓之内和内轮廓之外的区域对背景具有遮挡作用,具有较高消隐高度的图形实体遮挡具有较低消隐高度的图形实体。
利用保存于零件视图实体中的遮挡信息,零件视图块的内外轮廓边界以及它的消隐高度在消隐步骤中被重构出来。
消隐的基本操作是扫描显示链表,计算和修改当前视图中每一实体的显示数据。为了减少计算工作量,首先要根据包围盒数据对正在扫描的实体可能产生遮挡的零件视图块范围,然后逐一进行计算和修改。
由于显示链表中的显示结构是离散的线段和填充多变形,消隐的最终计算就是利用所有可能对实体产生遮挡的零件视图块的内外轮廓边界,对该实体的显示链表项中的离散线段集合或填充多边形集合进行裁剪操作,得到位于零件视图块的外轮廓之内和内孔之外的部分作为裁剪结果,并用这一结果修改显示链表项,这样就得到了该实体消隐后的正确显示。
由于显示链表项中的基本图形结构是线段和填充多边形,所以问题就转化为遮挡图形的各边界对线段、多边形的裁剪算法。由于零件视图块的边界是由线段、圆弧或椭圆弧构成的没有自相交的任意形状的封闭边界,这种边界对填充多边形的裁剪较复杂,可采用对多边形各边进行裁剪的替代处理方法,可以得到正确的轮廓线,但缺点是裁剪结果丢失了填充信息,真正的多边形裁剪在下一阶段的开发中进行实现。
3 零件视图块的边界表示
零件视图由零件的整个或部分视图构成,具有一个封闭的外边界即外多边形环,可以没有内边界或有若干个内边界。零件视图的外边界之内和内边界之外的区域是零件视图块的遮挡区域,可以遮挡消隐高度在该零件视图块之下的各图形实体或零件视图块。
零件视图块的轮廓边界是零件视图块的重要几何特征和遮挡信息,外边界和内孔边界唯一决定零件视图块的遮挡区域。二维CAD系统的若干图形实体必须具有封闭的外边界才能构成零件视图块,边界必须由轮廓线构成,基本曲线单位是线段、圆弧和椭圆弧见图2。

(图片)

图2 零件视图块的内、外边界

零件视图块的外边界由基于回溯的参考点边界搜索算法对于选择的图形实体集合进行搜索,需要的参考点通过计算这些实体集的共同包围盒之后,选择该包围盒之外任一点而得到。内边界的搜索需要由用户交互定义内孔的标记点。在边界搜索算法中,当参考点在边界外时,搜索结果是最大和最靠外的边界,其路径方向为顺时针,而当参考点在边界内部时,搜索结果是围绕参考点的最小边界,其路径方向为逆时针。
传统的零件视图块都具有一个外边界,可以没有内边界或者有若干个内孔边界。但在系统的新版本中,由于要实现对于CTEXT实体的正确处理,零件视图块的概念被扩展到具有多个外边界和各自的多个内边界的情况。CTEXT是由多个分离的字符或汉字形成的特殊的文字实体,每个字符或汉字都有各自的包围盒形成的边界,因此CTEXT实体的轮廓边界特征是具有多个不相交的外边界,没有内边界。
零件视图块的边界表示应当满足这样一些要求,一是完备表示零件视图块的内、外边界轮廓信息,二是应采用数据冗余度最小的数据结构。系统中采用这样的数据结构表示边界,若干个有序关键点顺次连结成没有自相交的封闭边界,一个零件视图块的各内外边界形成该零件视图块的边界链表。
3.1 边界上关键点的数据结构
typedefstruct
{
cHar tag;
double x,y,r,r2,angle,twist;
}TSLoopEdge;
在这一表示边界关键点的数据结构中,不仅记录了构成边界的各点的坐标,还记录了与该点与下一点构成的曲线边的基本信息,因此这一点的数据结构和下一点的数据结构中的坐标值唯一决定这一段曲线边,下面对该结构各域作具体说明:
tag:记录与下一点共同构成的曲线类型;
为线段、圆弧、椭圆弧三种,当曲线为圆弧、椭圆弧时,还需要其中一空闲数据位记录曲线由该点到下一点是逆时针方向还是顺时针方向,以确定曲线几何表示;
(x,y):记录这一点的坐标值;
r:当曲线为圆弧时记录其半径,当曲线为椭圆弧时记录其半长轴;
r2:当曲线为椭圆弧时记录其半短轴;
angle:当曲线为椭圆或圆弧情况时,记录点对应的参数角;
twist:当曲线为椭圆弧时,记录该椭圆弧的偏转角度。
用上面的边界点的数据表示方法,当前点的坐标、下一点坐标以及当前点数据结构中记录的曲线边的几何参数可以唯一地决定这段曲线边。以椭圆弧为例,首先根据当前点的参数角和椭圆弧的长短轴数据,可以计算出椭圆模型坐标系中当前点的坐标,然后根据椭圆弧偏转角计算出世界坐标系中当前点相对于椭圆心的坐标,这样就可以计算出椭圆心坐标,再根据下一点的坐标值以及标志域中一位记录的表示椭圆弧几何形状的信息,便能唯一确定这段椭圆弧曲线边。
3.2 边界表示数据结构
零件视图块的每一内、外边界采用下面的数据结构进行表示,若干个边界项形成一个链表,完整地表示出零件视图块的边界结构。
typedefstructMDSPartLoopHead
{
sHort tag;
long xmin,ymin,xmax,ymax;
unsignedsHort HeigHt,PtNum;
TSLoopEdge pts;
structMDSPartLoopHead next;
} TSLoopHead;
tag:表示消隐时边界对当前扫描实体的是否可能遮挡标志,以及表示边界是外边界还是内边界;
当被扫描图形实体的消隐高度高于边界对应的零件视图块,或者被扫描图形实体在边界的包围盒之外时,该边界对扫描实体无遮挡关系。
(xmin,ymin,xmax,ymax):表示边界的包围盒数据;
HeigHt:边界所在的零件视图块的消隐高度;
PtNum:边界的关键点个数;
边界为1个圆时是特殊情况,此时关键点为圆心,点数为1。见图3。

(图片)

图3 线段被有内孔的零件视图快遮挡

pts:边界的有序关键点数组首指针;
next:下一边界指针;
4 装配消隐的实现
消隐的实现方法应该保持图形中各个实体的几何数据不变,在消隐后图形可以得到恢复,因此,消隐通过对实体的显示数据以及打印数据进行处理而实现。
由于显示链表中存储的最终实体数据是离散线段或者填充多边形,而零件视图块边界对填充多边形的裁剪目前是通过边界对填充多边形的各边的裁剪来实现的,因此装配消隐就转化为零件视图块内、外边界间的有效区域对线段的遮挡问题,其实质为:对具有一定消隐高度的直线段P1P2和具有一定消隐高度的由外边界和零或多个内孔构成的平面区域,求线段不被遮挡的部分。
假设一装配图具有N条离散直线段,其中li的消隐高度为Hi(i为0到N-1),同时有M个零件视图形成的有效平面区域,其中πj的消隐高度为Hj(j为0到M-1),消隐算法的流程描述如下:
for(i=0;i{
li送入空的缓冲区1;
for(j=0;j{
缓冲区2置空
wHile(缓冲区1中有未取的线段)
{
从缓冲区1取下一条线段A
if(Hj>Hi)//直线段li可能被πj遮挡
{
if(线段A在πj的包围盒之内)
{
求出A在πj的外边界外的部分;
依次求出A在πj各内边界内的部分;
两部分求并集,加入缓冲区2
}
else
把A加入临时缓冲区
}
}
缓冲区2送缓冲区1
}
//缓冲区1中的线段集就是不被遮挡的li的消隐结果
}
在系统的新版本中,CTEXT文字是一种新的文字实体,它具有多个分离的字符或汉字,因此CTEXT实体构成的零件视图块具有多个外边界。具有多个外边界的零件视图快的消隐处理,与通常的具有唯一外边界的零件视图块的处理有一定差别,具有一个外边界的零件视图区域对线段进行裁剪时,裁剪结果是线段在外边界外的部分与线段在各内孔中的部分的并集,而具有多个外边界和各自的若干内孔边界的零件视图区域对线段进行裁剪时,结果是线段逐一被各个外边界内区域裁剪的部分,与原线段在各内孔边界内部的部分的并集,前一部分指被上一个外边界内部区域裁剪的结果作为输入又被下一个外边界内部区域进行裁剪,以此类推。
参考文献:
[1] 吴怀军,孙家广.基于回溯的参考点边界搜索算法[J].计算机研究与发展,1998,35(6):563
[2] 郑国勤,孙家广.二维CAD系统绘图装配消隐实现方法[J].计算机辅助设计与图形学学报,1998,10(6):496
[3] 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,1987
[4] 孙家广,杨长贵.计算机图形学(新版)[M].北京:清华大学出版社,1995
[5] NicHollTM,LeeDT,NicHollRA. An efficient new algoritHm for 2D line clipping[J]. Computer GrapHics, 1987, 21(4):253-262 1/28/2005


电脑版 客户端 关于我们
佳工机电网 - 机电行业首选网站