张卫国 王雅光 罗年猛
华中科技大学国家CAD支撑软件工程技术研究中心,武汉,430074
CAD图纸多明细表功能的研究与实现
张卫国 王雅光 罗年猛
华中科技大学国家CAD支撑软件工程技术研究中心,武汉,430074
提出了一种适用于二维CAD软件的多明细表实现方案,该方案具有在一张CAD图纸中绘制多张装配图且每张装配图具有独立的明细表功能。采用“观察者-目标”模式对各明细表相关对象进行组织,实现零部件信息与具体图形表达的分离,减少了数据冗余,降低了对象耦合度,简化了数据的组织与提取,同时支持明细表的智能化修改和更新。实际应用表明,该方案提高了工程人员的设计效率,减少了错误的发生。
二维CAD;装配图设计;多明细表;BOM
明细表是装配图的重要组成部分。装配图中,明细表与零件标签(也称标签、件号、指引线等)协同工作,可以标记出组成装配体的各个零部件的具体信息[1]。同时,明细表也是报表统计、BOM(bill of material)汇总输出等工作的基本依据。
传统情况下,一张CAD图纸(即CAD软件保存的图纸格式,如AutoCAD的DWG文件等)中仅仅绘制一个零件(或者一张装配图)。随着二维CAD软件的图形处理能力日益增强,越来越多的企业倾向于在一张CAD图纸中表达较多的信息。特别是在建筑等行业,一张CAD图中往往绘制了多张图纸,它们之间相互参照,可以更好地表达出一个复杂的模型。机械行业也逐渐出现在一张CAD图纸中绘制多张零件图,甚至多张装配图的需求。
但是,当前的CAD系统大都只支持在一张CAD图纸中绘制至多一张装配图。这是因为:一般情况下,每张装配图都有自己独立的明细表,在出现多张装配图的情况下,多个明细表维护起来较为复杂,数据的集成和提取也较为困难。同时,在使用二维CAD软件进行装配体设计的过程中,明细表的填写与修改也是重复性高、易于出错的地方。
目前,CAD软件明细表功能的实现方式一般可以分为以下两大类:
(1)零件标签、明细表作为纯粹的图形而存在,二者之间不存在关联关系,最多仅保证在创建零件标签的同时,明细表中也添加一条对应信息[2-3]。该方案属于比较初级的实现方式,必须手工维护标签和明细表之间的对应关系,不仅绘图效率低,而且容易出错。单一明细表环境下,该方案的功能已经较弱,更谈不上对多明细表的支持。
(2)将图纸中的每个零部件当作一个整体的对象来进行处理,所有零件信息均作为扩展属性与图纸中对应的图元绑定,将图纸中所有图元的扩展信息汇总后生成明细表[4]。该方案中,零件信息的正确性与唯一性得到了保证,零件信息的修改较为方便,但是该方案也存在如下缺点:①某一零部件一般都是由多个直线、圆弧、样条曲线等简单图形组合而成,因此,必须将这些图元组织成一个整体的对象才能进行信息填写。如果将这些图元全部组合成为图块,会导致图纸的修改较为复杂。如果将零件信息记录于零件的每一个图形之上,则会增加数据冗余,导致零件信息更新困难。②在多明细表环境下,必须指定图元上的零件属于哪一个装配图,才能对零部件信息进行正确的统计。③将零件信息分散记录在具体的图形中,也会造成BOM数据的集成与提取的困难。
针对上述问题,笔者提出了一种新的多明细表实现方案,不仅较好地解决了多明细表实现与维护的复杂性问题,简化了BOM信息的组织与提取,而且在明细表数据的修改更新方面,也具有较高的灵活性。该方案的总体实现框架如图1所示(为简化问题,仅以两个装配图为例进行介绍,同时略去装配图b中的部分关联关系表述)。
图1 多明细表实现框架
具体实现方案如下:
(1)在一张CAD图纸中,允许存在多张装配图,每张装配图可以有自己独立的标签和明细表。
(2)每一张装配图由装配体图形、装配图图框、BOM 表、明细表、零件标签五部分组成,后四者是实现明细表功能的主要对象。每张装配图中,图框、BOM 表有且仅有一个,明细表至多存在一个,零件标签可以有任意多个。BOM表作为一个数据载体而存在,不在图纸中反映出来。其他三种实体,均以图形的形式呈现在图纸上。
(3)在一张装配图中,采用“观察者-目标”模式[5]对BOM 表、零件标签、明细表进行组织(图2)。所谓“观察者-目标”模式,就是定义一种一对多的依赖关系,当目标对象的状态发生改变时,所有依赖于它的观察者都得到通知并被自动更新。具体的实现方案是:BOM 表作为“目标”,以零件序号值为索引,对其所对应的装配图中的所有零部件的信息进行记录。零件标签记录其所指向的零部件的序号,明细表记录其所关联的BOM表句柄,它们作为要在图纸中显示的图形实体,自身并不记录任何零件信息,而是以“观察者”的身份从BOM表中获取零件信息,并根据需要在图纸上显示。
图2 采用“观察者-目标”模式组织关联关系
(4)BOM表以一个扩展数据的形式寄生于装配图图框之上。在一张装配图中,图框所包围的范围确定了BOM表的作用范围。某个零件标签属于哪一张装配图,对应哪个BOM 表,是由该标签指引线基点坐标处于哪个图框的包容范围所决定的。BOM表中也记录其关联的明细表的句柄,从而实现明细表与BOM表之间的双向关联。
(5)BOM注册表作为一个全图纸范围内的单一数据对象,对整张图纸中的装配图图框进行记录。通过它可以获取包容某一区域的图框及其所承载的BOM表。
上述解决方案具有以下特点:①采用“观察者-目标”模式实现了数据表达与显示内容的分离,降低了各实体之间的耦合度,减少了数据冗余;②通过几何位置确定零件标签与BOM表之间的关联关系,避免了复杂的一对多双向关联关系的维护;③隔离了各明细表相关对象与具体的装配体图形之间的关系,简化了零部件信息的更新;④零部件信息集中保存,便于BOM 信息的组织、修改与提取。整个框架具有较大的弹性,可扩充性较强。除了对多明细表的支持之外,针对当前企业的各种不同的定制需求,上述方案也对以下几个问题给出了较好的解决办法。
(1)智能化修改更新,即在对零件标签(或BOM表内容)进行修改时(包括添加、插入新零件信息,修改现有零件序号或者其他信息等),及时更新相关的明细表和零件标签的显示信息,并且时刻保证指引标签与明细表对应关系正确。
(2)零件标签上可以表达一些必要的零件信息(如零件名称、代号、数量等),同时保证在任何情况下,其上所表达的零件信息与明细表中显示的信息完全一致。
(3)支持多个零件标签共享同一个序号、对应明细表中同一条信息的情况,并保证在零件序号或者信息变动时对应的所有标签全部更新。
(4)支持零件信息的自由化显示。如某些零件(如标准件)的信息仅在零件标签中显示,无需在明细表中出现。
多明细表实现方案中,BOM表是唯一的零件信息载体,零件标签和明细表属于具体的图形表现,这三个对象之间的“观察者-目标”关联关系实现是整个方案的核心。标签和明细表作为具体的图形,还必须支持一些通用的图形编辑操作,而这些操作在某些情况下也会对BOM表中的数据造成影响,如图3所示。同时,在对BOM 进行编辑时,零部件信息的更新过程,也是多明细表实现方案中的技术关键。
图3 一张装配图中各对象关联关系的实现方式
对于仅支持单明细表的CAD系统,可以将BOM表作为一个全局的对象记录在图纸中,所有的零件标签均对应同一个BOM表。但是在多明细表环境下,情况将变得复杂。零件标签必须要知道自己对应的是哪一个BOM表,才能进行正确的显示。BOM表必须知道自己与哪些零件标签关联,才能正确地实现更新。
一般情况下,一张装配图中所有的图元都处于该装配图图框的包容范围之内。因此,位于同一个图框内的所有标签,一般都是对应的同一个BOM表。我们可以利用这一特性来建立零件标签与BOM 表之间的关联关系,具体的方案是:作为所有零部件信息载体的BOM表寄生于装配图图框而存在(作为图框的扩展数据)。同时以一个全图纸范围内的变量(BOM注册表)来记录图纸中所有的图框。当零件标签需要从BOM表中获取具体的零件信息时:①获取全局的BOM注册表;②根据其自身的位置,在BOM注册表中找到包容其自身的装配图图框;③找到对应图框所承载的BOM表并进行查询。当BOM表需要更新其对应的零件标签时,亦只需通过对其所寄生的装配图图框范围内的图元进行搜索,获取图框范围内的所有标签。这样,实际上就通过零件标签和装配图图框之间的几何关系,确定了零件标签与BOM表之间的双向关联关系。
明细表是BOM表的图形化表达,BOM表中的零部件信息通过明细表最终呈现在图纸上,二者是一对一的关联关系,这种关联关系通过相互记录对方句柄来实现。为了保证整体数据的唯一性,同时避免数据冗余,明细表中不记录零部件相关的信息,仅记录明细表的具体几何信息(包括明细表折返信息、各折返块的坐标等),并在图纸中合适的位置进行显示。
在多明细表的实现方案中,零件标签、明细表以及装配图图框是作为具体的图形而存在的。因此这些对象必须支持图形数据通用的删除、移动等操作。但是,这些操作可能会导致BOM数据或者图形显示内容的更新。具体包括:
(1)某一零件标签被删除,可以被认为是在BOM表中删除这一零件标签所指引的零件。
(2)当某一零件标签从装配图a中被移动到同一张CAD图纸中的装配图b中时,必须对标签的显示信息进行更新。具体包括:①如果该标签需要显示零件的细节信息,则其必须从装配图b所对应的BOM表中查询零件信息并重新显示;②如果该标签中包含了装配图b中并不存在的零件序号,则应及时将该序号删除,以免造成混乱。
(3)如果某一装配图图框被删除,则该装配图中的所有明细表相关便不再有效,应当将关联该装配图BOM表的所有零件标签、明细表一并删除。
为了保证CAD系统各种一般操作(删除、移动等)的通用化,不应当针对上述各图形对象而引入新的命令,此时,系统应当在这些操作进行之时,悄无声息地实现BOM表信息以及相关对象显示内容的更新。在明细表的实现方案中,这些更新操作主要是基于“触发器”实现的。
应用程序中,触发器是个特殊的消息机制,它的执行不是由程序调用的,也不是手工启动的,而是由事件来触发的。当应用程序启动时,或者特定的模块被加载时,触发器被注入到CAD系统之中,响应特定的消息事件。当这些特定的消息事件发生后,CAD系统便会根据所注入的触发器,调用相应的函数来实现一些特定的操作。
多明细表实现方案要求CAD平台提供一些必要的触发器功能,来实现各个对象的协同更新。具体包括:
(1)对象触发器。当特定的图元对象添加到图纸空间、从图纸空间删除或者被修改时,对象触发器可以捕捉到这一消息并进行处理。
(2)命令触发器。通过触发器捕捉到特定命令的开始、结束以及取消的消息(如删除、移动等)。
下面以删除某一零件标签为例,阐述基于触发器的更新机制(为简化问题,假设该标签中仅记录了一个序号)。
(1)用户手动删除了某一零件标签,设其为Label。
(2)在Label真正被删除之前,事先注入的对象触发器捕捉到Label即将被删除的消息,调用预先设置的回调函数,并将Label作为参数传递进来。
(3)获取Label中记录的序号值Order,同时根据 Label的基点坐标,找到其对应的 BOM表。
(4)在BOM表中删除Order所对应的零件信息,同时完成其他更新操作。
零件序号是连接零件标签、BOM表、明细表三者之间的纽带。一般情况下,每一种零件都需要一个独立的正数零件标签,因此,在 BOM表中,我们可以用零件序号作为键,零件信息作为值,来组织零件信息。但是,上文提到,有的企业有一种较为特殊的需求:“某些零件(如标准件)不需要在明细表中做零件信息记录,只需在零件标签上显示其全部信息即可”。为了满足企业的这种需求,采用下述方式来组织零件序号(其中,INT_M IN和INT_M AX分别为计算机可以表达的最小和最大整数)。
(1)序号区间[INT_M IN,0):如果某一零件只在零件标签上标注,不在明细表中添加记录,则其序号位于该区间内。该序号值由系统进行分配与管理,用户不可见(BOM信息界面显示为0),也无法修改。
(2)序号值0:该序号值仅用于零件信息输入,BOM表中禁止出现序号为0的零件。
(3)序号区间[1,INT_MAX):一般情况下的序号。所有正数序号均在明细表中被显示。
BOM信息的生成,一般通过如下两种方案来实现:①在创建零件标签的同时,填写标签指向零件的信息;②直接在BOM表中添加新的零件信息。在对某一个标签或者BOM表进行编辑时,会涉及零件序号的变更,包括添加新序号、插入新序号、修改现有序号、删除某一序号等。定义数据结构EditIn fo,对BOM信息生成和编辑过程中的操作进行记录,并通过对该数据的解析,保证修改完成后零件标签和明细表之间依然维持正确的映射关系:
其中,Item为编辑完成后某一条零件的信息;O O为某个零件在编辑之前的序号值(OrderOld);PartIn fo为经过编辑之后的零件信息;OE为编辑过程中被删除掉的零件在编辑之前的序号(OrderErased);SI和SE分别为 Item和OE的集合。
对于每一个 Item,其 OrderOld和OrderNew之间的组合形式只可能出现6种情况,意义分别如下:
(1)O O=0,O N=0:添加新的,只在零件标签中显示的零件,系统将自动为该零件分配一个负数的零件序号。其中,O N为某个零件在经过编辑之后的序号值(OrderNew)。
(2)OO=0,ON>0:添加新的,需要在明细表中显示的零件。
(3)OO>0,ON>0:如果原序号与新序号相同,表明没有对序号进行修改,只是简单地更新零件信息;否则,表示对某一需要在明细表中显示的零件的序号进行修改。
(4)O O>0,O N=0:某一序号原来是需要在明细表中显示的,现在令其只在零件标签中显示,系统将自动为该零件分配一个负数的零件序号。
(5)OO<0,ON=0:该序号对应的零件只在零件标签中显示,同时,编辑过程中没有对该零件的序号进行修改。
(6)OO<0,ON>0:某一序号原来只在零件标签中显示,现在让其也在明细表中显示。
通过如下算法,来对BOM表的信息以及零件标签和明细表的显示内容进行更新。
基于 AutoCAD平台,利用VC++以及Ob jectARX实现了本文所论述的多明细表的建立,并采用此方法完成了与标准件库与PDM系统的完全集成。
如图4所示,在一张CAD图纸中绘制了两张装配图,每张装配图均有自己独立的明细表和标签。在对装配图a进行件号标注、BOM信息修改、零件标签删除等操作时,装配图b不会受到任何影响,也不需要特殊的指令来标记当前是对图a而不是图b进行操作。对装配图b也有相同的特性。
在装配图b中,如上文所描述的,所有的标准件均未在明细表中给出,而是直接在零件标签中标明其全部信息,其线上文字的显示格式为“数量-名称”,线下显示内容为零件的国标代号。如图5所示,这些零件的信息依然记录在BOM表中,其真实的序号值为一个负数,但是以数值“0”展示给用户。如果在BOM表中对这些零件的信息进行修改,那么修改完成后,零件标签的显示内容也会相应改变。
在对BOM信息的修改方面,实现了操作的智能化。例如,图4中的两张装配图中存在以下几个问题需要修改:①装配图a漏标了钻套;②装配图b中,M 8螺母的数量应该为 3而不是2;③装配图b中因为某些原因,需要删除对5号零件的标注。对这些问题进行修正后,结果如图6所示。特别标记了改变的部分:①在装配图a中新建零件标签,指向钻套,并设定其零件序号为4。添加标签完成后,原有的4、5、6号零件将依次顺延成为5、6、7号零件,并立即引发图形显示的变更。②在装配图b的BOM表编辑界面(图5)中修改M 8螺母数量为3,或者双击对应的零件标签进行信息修改。修改完成后,标签显示信息会立即更新。③在装配图b中直接选中标签5并删除。原有的6、7号零件将自动递补为5、6号,并保证零件标签与明细表中的信息一致。
图4 在一张CAD图纸中绘制两张装配图的实例
图5 装配图b(图4b)对应的BOM表信息
其他方面,多明细表实现方案还支持零件标签或者整体装配图的复制粘贴。同时,在充分挖掘现有实现框架潜力的基础上,还提供了引用标签、依照标签位置重排序号等扩展功能。
[1] GB/T 4457.4-2002机械制图图样画法图线[S].北京:中国标准出版社,2005.
[2] 张静,齐学义,侯祎华,等.AutoCAD中装配图明细表的自动填写[J].排灌机械,2006(8):37-39.
[3] 徐金娟,沈精虎.基于AutoCAD的装配图明细表自动生成系统开发[J].青岛大学学报(工程技术版),2009(2):24-28.
[4] AutoCAD Mechanical 2010产品说明书[EB/OL].http://www.autodesk.com.cn/adsk/serv let/index?id=9460102&siteID=1170359.
[5] Erich G,Richard Helm,Ralph J,et al.Design Patterns:Elements of Reusable Object-Oriented software[M].李英军,马晓星,蔡敏,等译.北京:机械工业出版社,2007.
Research and Implementation of Multip le Parts List for Assembly Drawings in CAD
Zhang Weiguo Wang Yaguang Luo Nianmeng
National CAD Support Software Engineering Research Center,Huazhong University of Science and Technology,Wuhan,430074
A solution which supported mu ltiple parts lists for two-dim ensional CAD software was p resent.In the solution,mu ltip leassemb ly d raw ingsw ere supported in a CAD d raw ing,and each of them had independent parts list.W ith organizing the parts list related objects by“observersubject”mode,the parts information and the graphic com ponents were separated,data redundancy and object coupling were reduced,and the organization and retrieval of datawere simp lified.A t the sam e time,intelligentm odification and data updatewere supported.The app lications show that the design efficiency for assem b ly body is im p roved by the solution,and the incidence of errors is reduced.
2D-CAD;assem bly draw ing design;multiple parts list;BOM(bill ofmaterial)
TP391.72
1004—132X(2011)12—1459—07
2010—07—07
图6 对图4中两张装配图进行修改后的结果
(编辑 王艳丽)
张卫国,男,1 9 5 7年生。华中科技大学机械科学与工程学院教授。主要研究方向为机械设计及理论。发表论文2 0余篇。王雅光,男,1 9 8 7年生。华中科技大学机械科学与工程学院硕士研究生。罗年猛,男,1 9 7 2年生。华中科技大学机械科学与工程学院副教授。