利用AutoCAD 二次开发批量提取图纸中的BOM 表
2020-10-17唐志广
唐志广
(大连中远海运重工有限公司,辽宁大连 116113)
0 引言
AutoCAD软件是美国AutoDesk公司研发的目前世界上最为先进的计算机辅助设计软件,它功能全面,界面十分美观,操作特别方便,能够帮助用户轻松地进行2D、3D绘图与建模设计[1]。广泛应用于工程制图、装饰装潢、土木建筑、船舶海工、机械设计等行业。
AutoCAD的图形功能十分强大,可是表格处理功能比较弱,在日常工作中经常需要在AutoCAD软件中处理许多表格,如BOM表等[2]。而且经常需要将这些表格数据与EXCEL、ERP等软件进行导入导出操作,当图纸数量较少时,手工处理尚能应付。但实际项目中图纸数量往往有成百上千份,数量巨大。如果全部由手工转换,不仅浪费大量的设计工时,还需要花费很大的心血去检查正确性,比较繁琐。针对这种需求,可以利用AutoCAD提供的多种 二次开发方法,为设计师开发出定制化的功能应用于设计实践中,帮助设计师提高自动化设计水平,提高生产力。
1 AutoCAD 二次开发方法简介
为方便客户化开发,AutoCAD提供了多种开发方式,LISP、VBA、ObjectARX、托管ARX等,它们各有千秋,都可以做出有强大功能的插件。下面对其进行简单进行简单介绍。
1.1 LISP
LISP语言为函数式编程,它的代码都是以函数形式给出的,没有语句概念或其他语法结构,语法简单,所以上手很快。它内置于AutoCAD,可以直接执行AutoCAD的命令,编写的代码一般不受AutoCAD版本限制,可以各个版本通用,受到众多初学者的青睐。但它是一种解释性语言,效率较差[3]。
1.2 VBA
AutoCAD VBA(Visual Basic for Application)是一种嵌入AutoCAD内部的集成开发方式,利用ActiveX Automation接口对AutoCAD进行编程控制。VBA是VB的一个子集,利用VB的语法进行编程使得入门十分容易。不过从AutoCAD 2009版本开始VBA编辑器不再随AutoCAD主程序一起安装,需要单独到AutoDesk公司网站下载,受此影响利用VBA编程的开发人员也越来越少了[4]。
1.3 ObjectARX
ObjectARX提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速的访问AutoCAD图形数据库和AutoCAD的软件界面,开发出的插件可以和AutoCAD软件原生功能媲美[5]。ObjectARX方式开发的插件程序其实是一个动态链接库,加载后可以共享AutoCAD的地址空间,对AutoCAD内部的许多功能进行直接函数调用。所以,使用ObjectARX编写的插件的执行速度非常高[6]。由于使用C++语言开发,需要开发者具有较高软件开发实力。
1.4 托管的ObjectARX
托管ObjectARX既能利用ObjectARX的高效率等优点,又可以借助.NET框架的很多优秀特征进行AutoCAD的二次开发。经综合分析对比,本文采用托管的ObjectARX方法编写插件。
2 实际应用
本次项目中涉及的几批图纸每一批都有一千多份,累计超过两万份,都需要将图纸中的管线信息提取出来,按指定格式输入到EXCEL表格中,供后续工序使用。如图1所示,蓝色字部分为示例图纸中要提取的报表信息。
图1 要提取数据的图纸
2.1 DWG 文件结构分析
在本项目涉及的图纸文件中,图纸名为管线号,每份图纸中有一页或多页图纸,绘制在一个或多个横版A3(420 mm×297 mm)尺寸的矩形图框中,矩形右下角为标题栏,标题栏里有管线编号和系统编号[7]。需要提取的信息处,第二行是管线号下的子系统编码,所有这些文字都是单行文字。因此可遍历当前图纸中的所有单行文字,再查询哪些文字的开头是当前图纸名对应的管线号就可以读取到子系统编码,再利用子系统编码文字对象寻找附近的文字对象,作为该子系统的属性填入EXCEL表格。
图2 AutoCAD图纸数据库结构
2.2 DWG 图面信息提取
一个AutoCAD图纸文件是一个图形数据库,有特定的文件结构,要读取其中的信息可以利用托管ObjectARX提供的类库对图形数据库进行操作。如图2所示,要读取的图形和文本信息就在BlockTable块表中的ModelSpace记录中,需要编写程序代码逐个遍历ModelSpace下的所有图元,筛选出符合条件的信息,写入到EXCEL表格中。
程序首先打开图纸数据库,定位到ModelSpace模型空间,遍历ModelSpace空间中的所有ObjectId,利用此ObjectId查询此对象的类型,如果对象类型是单行文字的,就放入文字列表备用,如果对象类型是矩形框并且矩形大小满足A3幅面(420 mm×297 mm)的,就放入图框列表备用。部分代码如下:
通过上述过程获取到文字列表和图框列表后,再逐个遍历图框列表,对每个图框列表循环查询文字列表,检查文字位置是否位于当前图框坐标范围内,并且检查文字是否以从当前图框标题栏里读取到的管线名开头,如果是则将文字内容作为构件名称写入Joint类型的对象中。同时查询该文字附近(10个文字字高大小)范围内的其他文字,将这些文字内容作为构件属性写入Joint类型的对象中。
2.3 导出EXCEL 表格
统计完成后,将统计结果输出到EXCEL模板,形成报表。
在C#开发中有许多对EXCEL操作的方法,有收费的也有免费的,对性能、兼容性等简单对比见表1。
表1 C#读写EXCEL方法对比
经过对比发现,如果开发独立的应用程序,使用NPOI和ClosedXml是不分伯仲,但是AutoCAD开发中,需要引用的.NET F ramework必须和AutoCAD的版本保持一致[8],所以在这里采用了比较成熟和编译起来相对方便的NPOI来输出表格。NPOI的使用示例在网上还是比较多的,输出表格的操作也都比较类似,简单改一下就可以使用了。程序代码比较简单,在此不再赘述。
2.4 最终效果
如图4的套料图,图面下部是本文开发的自动生成套料列表功能自动生成的套料列表;图面上的余量符号和坡口文字经过本文开发的图面处理功能处理完成后,完全符合本厂的设计规范。
图4 提取的报表最终效果
3 结论
此功能开发完成后避免了大量的手工设计工时。以本系统图纸为例,共有1 056份图纸需要提取构件数据生成报表,每份图纸手工操作一般需要约3.5 min,一个设计员连续不断的操作,累计需要大约7天时间。采用本程序一次性选择所有图纸,批量运行提取每份图纸中的数据汇总到报表中只需不到5 min即可完成,快速方便。通常一条船有几十个这样的系统,效率提升十分明显。