张小丽
(吉林工商学院,吉林 长春130507)
在实际的CAD 设计工作中,经常遇到这样的零件或零部件,虽然他们结构相同但尺寸却有所不同,如果能事先在CAD 系统中存储这些零件或零部件,设计过程中如果遇到相似结构,就可以按照实际尺寸在存储中调取,将调取的存储作为一个整体设计零件,这样就可以大幅度提升零件的设计效率。[1]UDF 把特征和参数化设计融合在一起,把特征作为基本执行单元,通过不断的修改参数实现形状特征的调整,实现了用户定义的特征参数化,大大提升了CAD 设计效率。[2]
在语义特征造型中,是一个不可再分的几何实体单元[3],具有一定的通用性。CAD 设计过程中,根据零部件实际数值可以对存储模型进行设计变体,把得到的变体作为一个整体进行设计的布尔运算。可将UDF定义为:
其中:UDF 的唯一标识用ID 来表示;图中UDF 对应的几何形状我们用Gty 来表示;一些特征属性,如名称、类型等我们用Pty 来表示;Cot 是构成UDF 的元素之间的约束,如拓扑约束等;Hoy 表示UDF 的设计过程,在UDF 的重构中使用。
如图1 所示,每个UDF 类都能分成部分,即形状、属性、约束、设计历史和用户接口。UDF 类中各部分之间相互作用,即UDF 的形状由内部特征形状组成,每一个内部特征的形状上都具有形状属性,通过存在于内部特征形状之间的几何约束来调整UDF 的形状;形状和属性之间通过UDF 的约束相互联系;在设计历史过程中我们把形状特征的添加次序记录下来;把属性和约束一起封存在用户接口中,同时,通过接口得到的UDF类与外部进行交互的方法,我们能够获得用户给出的信息参数,利用这些参数来驱动UDF 类模板,最终实现UDF 类的实例化。
图1 UDF 类结构
由于随着特征形状的创建而建立了UDF 的设计历史,所以,我们把它UDF 的定义过程分成四个步骤:特征形状的定义、特征属性的定义、特征约束的定义和特征接口的定义。
1.特征形状的定义
特征形状是定义UDF 类的基础。有两种方法可以定义特征形状:
(1)形状继承。如果一个实际基本形状和所期望的特征形状完全相符,就可以启用形状继承。这样,就可以使用直接继承重新构成其它UDF 类的形状。在新形成的特征类中我们可以利用继承为全部父类外形属性重新命名,并另外增加新的属性和约束。
(2)形状组合。如果实际设计的特征类在CAD 系统存储的所有基本形状中都找不到,我们可以启用形状组合。通过顺序增加特征和约束的方法,利用形状组合实现所需特征形状的组合。首先增加主特征,主特征完全不参考任何其它特征,之后的特征的定义和特征定位都参照前面定义的特征。顺序增加完所有特征后,就把它们存储在新的UDF 中。
2.特征属性的定义
特征名称、类型、尺寸、公差等信息的载体就是特征属性。这里,我们使用双向链表来存储特征属性,通对双向链表进行删除、修改和添加最终完成特征属性的删除、修改和添加。
3.特征约束的定义
我们把特征约束定义成数学公式,这个数学公式是我们在设计时所依赖的变量间的关系,我们通过特征约束捕获设计者的意图,一些几何尺寸、技术参数和工程变量等我们用约束中的变量来表示。用双向链表来存储约束,约束的删除、修改和添加可通过对双向链表的删除、修改和添加来实现。
4.特征接口的定义
我们通过特征接口把具有工程意义的参数如尺寸和约束等暴露给设计人员,UDF 的参数化设计也因此实现。设计人员在实际设计过程中可以指定这些具有工程意义的参数。
特征接口分为两个部分,即一个唯一的ID 和一组符号参数。这些参数共分三个访问级别,分别为公开型、保护型和公开型。
设计参数分为两种,即独立参数、依赖参数。所谓的独立参数是指那些一直通过外部供给的值。那些在UDF 中被其它实体约束的值就是依赖参数。在接口中,我们只定义独立参数就可以。
图2 法兰盘
5.UDF 定义实例
本文所提出的UDF 的定义方法,现以法兰盘类(图2)的定义过程进行说明。定义步骤如下:
(1)特征形状的定义
1)选取形状特征。选用孔两个:中心孔circumHole,圆柱体一个:cylinderl,圆周孔circumHole。
2)几何约束的定义。centerHole 与cylinderl 之间有一个同轴约束和两个共面约束。
cstrCoaxiall(cylinderl.top,centerHole.top)
cstrCoplanar1(cylinderl.top,centerHole.top)
cstrCoplanar2(cylinderl.bottom,centerHole.bottom)
circumHole 与cylinderl 之间有一个轴平行约束和两个共面约束。
cstrPrarllel1(cylinderl.axile,circumHole.axile)
cstrCoplanar3(cylinderl.top,circumHole.top)
cstrCoplanar4(cylinderl.bottom,circumHole.bottom)
cstrCoaxial2(cylinder.axile,arr.axile)
(2)特征属性的定义
名称:name=faLan
特征类型:加特征natre=1
尺寸属性:
外半径outerRadius=cylinder1.radius
内半径innerRadius=cylinder1.radius
圆周上孔半径holeRadius=circumHole.radius
圆周上孔到法兰中心的距离dist
厚度thickness=cylinder.height
约束属性:孔个数holeCount。
拓扑面属性:
顶面top={cylinderl.top-centerHole.top-circumHole.top}
外侧面outerSide={cylinder1.side}
内侧面i inneSide={centerHole.side+circumHole.side}
底面bottom={cylinder.bottom-centerHole.bottom-circumHole.bottom}
(3)特征约束的定义
代数约束:centerHole 的半径大于0,cylinderl 的半径大于centerHole 的半径,dist 减circumHoled 的半径大于centerHole 的半径,dist 加circumHole 的半径小于cylinderl 的半径。
cstrOver1(centerHole.radius,0)
cstrOver2(cylinder1.radius,cylinder2.radius)
cstrOver3(dist-circumHoled.radius,certerHole.radius)
cstrOver4(cylinder.radius,dist+circumHoled.radius)
拓扑约束:
cstrOnBoumdery(top,1)
cstrOnBoumdery(outerSide,1)
cstrOnBoundery(innerSide,1)
cstrOnBoundery(bottom,1)
cstrAttachl(top,topFace)
cstrAttach2(cylinder1.frontplane,frontFace)
cstrAttach3(cyliner1.rightPlane,rightFace)
(4)特征接口的定义
尺寸参数:outerRadius,innerRadius,holeRadius,dist,thickness
定位和定向参数:topFace,frontFace,rightFace
约束参数:holeCount。
法兰盘类的用户定义界面如图3 所示:
图3 法兰盘类的用户定义界面
在传统使用的CAD 系统中,每一个树形结构中的一个结点只有一个父结点,所以结点无法实现共享,从而导致UDF 分类模型也无法实现共享。而实际的UDF 分类结构只是与树形结构的DAG 相似,UDF 文件可以在DAG 中以多个分类的公共子结点存在,这样就使UDF 文件的共享成为了可能。
1.基于DAG 的UDF 分类模型
支持UDF共享的分类关系是一个类似树形结构的DAG,为了真正实现对UDF的分类和共享,本文引出了基于DAG 的UDF 分类模型(图4)。
图4 基于DAG 的UDF 分类模型
图5 基于DAG 的UDF 分类模型实例
可用DAG 图表示UDF 分类模型,其中:
(1)r 是根结点,根节点只有一个,我们用它表示UDF 库的根分类。
(2)V 是结点的集合,即:分类结点、UDF 结点、UDF 链接结点和UDF 文件结点。
(3)E 是有向边的集合,共有五类有向边。
(4)C 是约束条件的集合,它包括五类约束:一个分类结点不能属于多个分类结点、分类结点之间不能直接或间接相互从属、一个UDF 结点不能属于多个分类结点、一个UDF 结点只能有一条到UDF 链接结点的有向边和一个UDF 链接结点只能有一条到UDF 文件结点的有向边。
由于DAG 中结点和有向边的用途存和功能都有所不同,所以在基于DAG 的UDF 分类模型中,我们可以把模型进行分类,分成根、映射和文件三个层次(见图4)。分类层由三类节点和四类有向边构成,我们是通过树形结构最终实现对UDF 的分类的;通过映射层来连接分类层和文件层,从而实现UDF 链接到文件的映射,同时我们利用UDF 链接结点最终实现对其链接结点的共享,最后间接完成了对UDF 文件的共享;我们将所有物理UDF 文件都存储在文件层。基于DAG 的UDF 分类模型既有树形结构的优势又同时具备无环图的优点,这就使得有效对UDF 的分类和共享成为可能。图5 所示的是一个基于DAG 的UDF 分类模型的实例,UDF 库是DAG 的根结点,它由钻模库和标准件库两个分类节点构成,其中钻模库中有两个节点,即叉形页根和定位销,其中叉形页根我们把它映射到1 号UDF链接结点;定位销和标准件库中的销共同映射到2号UDF 链接结点,而2 号链接结点我们又把它映射到另外一个销文件,这样两个库中的不同销虽然名称不同却共享了同一个销文件。
2.UDF 分类模型的建立过程
如图6 所示,在UDF 分类模型建立过程中,我们顺序的向模型中添加结点和有向边,同时所有UDF 也被添加到UDF 库中,UDF 入库具体步骤如下:
(1)首先,通过文件编号、文件名称或文件路径等信息在映射层查找UDF 链接信息,如果能查找到,则跳转到步骤5,否则进入下一步。
(2)在操作系统目录中,我们通过文件名称或文件路径查找UDF 文件类信息,如果能查找到文件,则跳转到步骤4,否则进入下一步。
(3)利用UDF 创建功能我们创建UDF 类文件,从而形成了UDF 文件结点。
(4)UDF类的注册过程中,将UDF 类文件生成一个编号,同时将共享计数和文件路径等有用信息记录下来。注册成功后UDF 链接结点和从链接结点到结点的有向边也同时产生。
(5)在分类层我们通过名称来查找UDF 所属分类,如果能查找到,则跳转到步骤7,否则进入下一步。
(6)利用分类名称首先形成分类结点,然后利用父结点类型之间存在的差异产生两种有向边,即从根结点到分类结点的有向边或两分类结点之间的有向边。
(7)在添加UDF 过程中,我们把它的别名和它所对应的文件编号记录下来,同时它所对应的共享计数被加1,最后,我们把UDF 添加到它所在的分类中。
图6 UDF 入库流程图
为了解决目前CAD 系统中UDF 定义和分类中存在的问题,本文提出了一种快速定义UDF 的过程性方法,通过详细分析UDF 的组成,通过四个步骤对UDF 类进行定义。定义过程中,文章详细说明了每一步中定义的内容,从而大大提升了UDF 设计效率。另外,为了解决UDF 分类不支持特征类共享的问题,文章又提出了基于有向无环图的UDF分类模型,利用该模型的树形结构实现对UDF的分类的同时也实现了对UDF的共享,最后给出了UDF 分类模型的建立过程。
[1]Bronsvoort WF,Bidarra R,and Nyirenda PJ,Developments in feature modeling[J].Computer-Aided Design and Applications,2006,3(5):655-664.
[2]Rafael Bidarra,Alex Noort,Advanced Direct Manipulation of Feature Models[C],Proceedings of the 2nd International Conference on Computer Graphics Theory and Applications–GRAPP 07,2007,8-11 March,Barcelona,Spain.
[3]Daniel Louren?o,Pedro Oliveira,Alex Noort,and Rafael Bidarra.Constraint solving for direct manipulation of features[J],Journal of Artificial Intelligence for Engineering Design,Analysis and Manufacturing,2006,20(4):369-382.