UG平台下注塑模CAD系统BOM表功能的开发胡卫卫王华昌(华中科技大学材料学院,湖北武汉430074)摘要:模具设计完成后为了快速准确得到其BOM(BillOfMaterial),在UG三维设计平台下进行二次开发,开发出由实体装配模型生成BOM的功能模块。该模块能快速自动识别出存储在模具三维模型中的零部件信息,生成可配置化的BOM表;并且可以从外部导入修改过的BOM表,保证零件信息与BOM的同步更新。关键词:BOM,装配模型,遍历,树,ExcelDevelopmentofBOMfunctionformoldCADsystemundertheUGplatformHuWeiweiWangHuachangAbstract:InordertogeneratetheBOMofmoldquicklyafterdesign,afunctionmoduleisdesignedthroughfurtherdevelopmentundertheUGplatform.InthenewlydesignedBOMmodule,partinformationstoredin3-Dmodelisrecognizedautomaticallyandquickly,andthenaconfiguredBOMwillbegeneratedcorrectly;intheotherhand,themodifiedBOMinExcelformatcanbeimportedtothe3-Dmodelsoastoupdatethepartinformationofmold.Keywords:BOM,assemblymodel,ergodic,tree,Excel1、引言BOM(BillOfMaterial)是定义产品结构的重要技术文件,是一种描述装配的结构化零件表,它反映了一个产品所有零部件的构成层次关系和数量关系,产品从设计到制造的全生命周期中,BOM起着重要的作用。因此,BOM的变化与维护将对生产产生最直接的影响,BOM的数据结构及算法构成了ERP系统数据模型的核心[1]。注塑模具企业的BOM表通常包括零件名称、零件编号、零件描述、零件尺寸和零件数量等信息。另外,不同企业可能会有各自不同的BOM表信息涵盖内容要求,甚至同一项BOM内容在各企业都会有不同的叫法。然而,目前国内模具企业设计人员在完成模具结构设计、生成模具物料清单(BOM)时,方法不外乎有以下两种:一是对照庞大的模具装配结构信息,逐个零件地测量、拾取其BOM信息然后记录到对应的Excel文件中;另外一种方法则是借助UG的注塑模设计向导Moldwizard提供的BOM表功能,自动生成模具的BOM表。第一种方法费时费力,而且长时间靠人工记录繁多的零件信息难免出错;第二种方法则对注塑模模具设计过程有限制——必须使用Moldwizard进行设计,从而大大限制了设计人员的设计自由度。两种方法还有一个共同的不足之处就是:BOM表一旦生成,就与对应的模具产品结构模型失去关联,当在外部Excel中更改零件物料信息以后,对应零件模型的信息难以保持同步更新。正是基于以上原因,提出了UG平台下注塑模CAD系统BOM表功能的开发。2、功能定义及设计2.1功能定义综合前文提到的两种BOM设计方法的优点,本模块提供的BOM表功能既达到了全自动识别零件信息和出表的效果,又保证了识别过程和BOM表格式、内容可配置的特点,为各具特色的众多模具企业提供了足够的设计和使用自由度。总体来说,本BOM模块具有以下功能:(1)自动从模型中提取零件BOM信息;(2)零件命名规则开放,给出缺省配置;(3)支持装配、非装配情况;(4)BOM表输出内容与格式可配置;(5)支持外部BOM表的导入功能。2.2功能设计在注塑模CAD设计中,产品装配模型可以规范为一个根部在上的产品结构树。产品本身为树根,组成产品的每一零部件均为树的节点。BOM程序即是要将此产品结构树的相关数据以一定的格式识别出来,并输出到Excel中。“一定的格式”即指BOM程序采用的数据结构。本系统采用树型数据结构组织模具产品结构树的信息。程序首先定义一个全局树结构变量,然后用模具产品结构树本身的装配结构信息初始化全局树变量,树根即为产品装配模型的根节点,其它装配节点则分别与全局树变量的其它子节点一一对应。程序接下来就可以通过这个全局树变量把模具产品装配模型映射到BOM程序的对话框界面上(参见图一,对话框左边“装配树列表”部分)。之后单击“识别零件信息”识别按钮,程序自动从产品装配模型中识别、提取BOM信息,并将这些信息存放到前面已初始化的全局树变量中。BOM信息识别完成后,就可以通过在对话框左边模具装配树中选择零件节点,查看其对应的BOM信息了;同时还可以方便地编辑任何一个零件节点的BOM信息。识别完零件信息后,就可以单击“ExportBOM”按钮输出模具产品的BOM表了,选择路径、输出文件名、确认即可。在退出模块时,程序会自动把包含所有零件BOM信息的全局树变量保存到磁盘上。下次对该模具产品再使用BOM功能时,程序会自动从磁盘上读入上次保存下来的BOM信息(假如有的话)。如果用户对生成的BOM表进行了编辑,则可以通过再次调用BOM程序,使用其“ImportBOM”导入功能,把这些更新及时地应用到产品模型上。图一:UG平台下开发的BOM功能模块界面3、BOM表功能实现及其相关技术3.1模具产品装配树结构信息的初始化程序首先要建立一个全局树变量,用来存储模具产品的装配结构信息,保证构成模具产品的每一个零件都与内存模型中全局树变量的一个子节点唯一对应起来。这个过程就是模具产品装配树结构信息的初始化。程序实现流程参见图二,具体算法如下:开始打开三维CAD实体装配模型读取第一层的节点(根节点)依次获取节点类型是否是装配体获取零件基本信息并为全局树变量创建一个对应的叶子节点获取装配基本信息并为全局树变量创建一个对应的子树节点读取装配体第一层的节点遍历节点是否结束结束否是是否图二:模具产品装配结构信息初始化流程图(a)在UG平台下打开三维CAD实体装配模型,读取装配树根节点(即第一层的唯一节点),经判断该节点为装配体,获取其基本信息(UF_ASSEM_ask_component_data[2]),如节点零件名称等,用这些基本信息构造程序全局树变量的树根节点;(b)读取装配模型中根节点下的所有零件子节点,假设子节点数为part_occ_num,将该part_occ_num个子节点存放到临时数组child_part_occs(只需调用UGAPI函数UF_ASSEM_ask_part_occ_children[3]即可)。另外,定义一个循环变量i,令i=0;(c)获取第i个零件子节点的类型;(d)如果类型为装配体,则获取其基本信息(UF_ASSEM_ask_component_data),用获取到的基本信息为程序全局树变量构造一个对应的子树节点。然后以该装配体零件节点为根节点,调用递归函数CycleAllParts,直至所有零件节点都没有子节点,同时也在这个过程中不断为程序全局树变量构造相应的树节点。当CycleAllParts递归函数执行完毕,即回溯到(c)步骤中第i个零件子节点的状态时,令i=i+1,(d)步骤结束;(e)如果类型为零件,则直接获取该零件节点的基本信息(UF_ASSEM_ask_component_data)并为程序全局树变量相应地构造一个叶子节点,令i=i+1;(f)如果ipart_occ_num,重复执行步骤(c)~(e),直到i=part_occ_num,算法结束。3.2三维实体装配模型的BOM信息识别与提取在该部分中,程序自动从产品装配模型中识别、提取BOM信息,并将这些信息存放到前面已初始化的全局树变量中。这是整个BOM功能模块的核心部分,程序运行的时间开销和空间开销主要花费在这部分。需要识别的BOM信息内容项通常包括文件名称(在初始化部分已经识别)、零件名称、零件编号、零件规格、零件数量、零件材质、供应商、备注等,不同的企业可能还会有不同的内容要求。为了保证程序的灵活性和适用性,对于BOM信息的包含内容项,即程序需要识别和输出哪些BOM信息,本系统采用了配置文件的设计方案。在配置文件中,系统预先定义了一些默认的BOM信息内容项;但配置文件同时又是开放给用户的,用户在使用BOM功能模块之前,可以自行修改配置文件的内容,这样就达到了BOM信息内容项可配置的目的,大大提高了程序的灵活性和适用性。对程序实现而言,只需在三维实体装配模型的BOM信息识别之前,先从配置文件中读取BOM信息所应包括的内容项即可。在识别三维实体装配模型的BOM信息时,有时可能会遇到模型复杂,零件装配层次比较深的情况。此时如果采用上文初始化小节中提到的递归算法,来对模型信息进行识别的话,由于每一个零件节点的BOM信息识别都需要占用相当部分的系统开销,程序对模型装配树节点的递归识别就会花费大量的时间来保存数据量相对较大的递归函数现场,同时还可能出现递归算法太深导致系统堆栈空间消耗完毕的情况。最终导致的现象是,程序识别BOM信息所花费的时间大大延长,识别过程占用大量系统资源,更有甚者是BOM程序没有响应,甚至系统长时间没有响应。为了避免这些情况的出现,本系统在BOM信息识别部分采用了非递归算法,把对装配树的深度优先递归识别算法改进为非递归实现。实体装配模型BOM信息的非递归识别算法可描述如下:(参见图三)(a)定义一个临时树节点temp_node,初始化为模型装配树的根节点A;估计模型装配树的规模(即节点数),定义一个足够大的数组,元素类型为树节点的数据类型,将数组的所有元素的初始值赋为空,该数组用来模拟外部堆栈,最后再定义一个整形变量top,用来表示外部堆栈的栈顶指针,初始值为0,表示栈顶指针指向栈底,即堆栈状态为空;(b)对temp_node进行BOM信息识别,并将temp_node压栈,栈顶指针top加1;ABCDGEF图三:三维实体模型装配结构树A(c)判断temp_node是否有子节点,如果有的话,将temp_node的子节点赋值给temp_node,并执行步骤(b);(d)重复执行步骤(b)~(c),直到temp_node本身为叶子节点,即图三的节点B;(e)如果top0,从栈中弹出一个元素,并将该元素的(下一个)兄弟节点赋值给temp_node,栈顶指针top减1;如果top=0,算法结束;(f)重复执行步骤(b)~(e),直到top=0,算法结束。以上即为实体装配模型BOM信息的非递归识别算法,对于图三所示装配树而言,算法的具体实现过程为:识别根节点A,A进栈;识别A的子节点B,B进栈;B没有子节点,出栈,识别B的后继兄弟节点C,C进栈;识别C的子节点E,E进栈;E没有子节点,出栈,E没有后继兄弟节点;栈内下一个节点C出栈,识别C的后继兄弟节点D,D进栈;识别D的子节点F,F进栈;F没有子节点,出栈,识别F的后继兄弟节点G,G进栈;G没有子节点,出栈,G没有后继兄弟节点;栈内下一个节点D出栈,D没有后继兄弟节点;栈内下一个节点A出栈,A没有后继兄弟节点;栈为空,算法结束。3.3BOM报表导出及导入的相关实现BOM报表的导出(即生成BOM)和导入主要涉及到数据库访问技术。在制造业中,鉴于零件数据库结构比较简单,系统的后台数据库常采用Excel文件[4]。Excel文件访问(读写)技术有很多种,常见的有ODBC、ActiveXAutomation等。ODBC(OpenDatabaseConnectivity)是由Microsoft公司于1991年推出的开放式数据互联技术,它为用户提供了一个访问关系数据库的标准接口,它可以通过MFC或API使应用程序独立于原数据库管理系统[5]。使用ODBC访问Excel文件,要求系统中安装有ODBC驱动“MicrosoftExcelDriver(*.xls)”。尽管Excel并不是一个关系数据库系统,ODBC驱动仍然可以把Excel工作表当成数据库