你当前的位置>>主页>>AutoCAD>>AutoCAD二次开发
 
                        AutoCAD普通表格转换为表格对象的方法
 

               吴伟中, 贾长学
       ( 河南工业大学机电工程学院, 郑州450007)
    
摘要: 表格是A utoC A D 新引入的对象类型, 使绘制和编辑表格变得相当简单。文中介绍了把用直线和文字制成的
“表格”转换成表格对象的原理和方法, 并给出了转换的流程。
    
关键词: 表格对象; A utoC A D ; 二次开发; A ctiveX 技术
    表格( Table) 是AutoCAD 自2005 版开始新引入的对象, 给工程图样中各类表格的绘制和编辑带来了极大的方便, 同时表格对象与Excel 工作表的相互转换也相当简单。早期用一般方式绘制的“表格”仅在外观上和表格对象类似, 但不具备表格对象的特性, 不能用相关的表格命令修改, 也不能直接输出到Excel, 而在实际设计中, 经常要在已有图纸基础上修改,  由此想到, 若能把普通的“表格”转换为表格对象将给以后的设计带来许多便利。
    本文利用AutoCAD 的ActiveX 技术, 用Visual LISP 编程, 实现了将普通"表格"转换为表格对象。
    1. 普通“表格”绘制的方法
    工程图中m×n 行列型的“表格”较为常见, 如明细栏、材料汇总表等, 这类表格的特点是行、列关系比较单一,文字的规律性强。AutoCAD 2005 版之前, 绘制“表格”一般采用以下几种方法:
  ( 1) 用LINE 或PLINE 绘制表格线框, 然后在线框的单元格内填写单行或多行文字( TEXT 或MTEXT) 形成“表格”;
  ( 2) 用第三方制作的表格专用工具绘制表格;
  ( 3) 在Excel 中处理表格, 再用专门工具转换或直接粘贴到AutoCAD 中。
   以上( 2) 、( 3) 两种方式因为都要用到专门开发的表格工具, 绘制的"表格"格式和特性是程序制订的。第( 1) 种方法较为常用, 为多数用户采用, 故此是本文讨论的重点。
    2. “表格”转换为表格对象的方法
    在单行( 多行) 文字和线条组成的“表格”中, 文字是组成表格的主要角色, 表格线条属于辅助性的元素, 在转换过程中可以忽略。因此, 表格转换的实质就是将原“表格”中的文字转换到新创建的表格对象中, 并放置在对应的单元格内。文字的样式、对齐方式、颜色、图层、高度以及表格样式等可保留原有设置, 或者采用当前的图形设置。
    2.1 文字插入点坐标的获取
在Visual LISP 中, 可用ENTGET 方法通过图元名取得文字的构造参数表, 例如:
  ( ( - 1.<图元名: 7e60fdd0>)( 0.TEXT)( 330.<图元名:7efd8cc0>)( 5.2904A)( 100.AcDbEntity)( 67.0)( 410. Model)( 8.TXT)( 100.AcDbText)( 10 15 20 0.0)( 40. 14.0)( 1.进汽包)( 50.0.0)( 41.1.0)( 51.0.0)( 7.GBCBIG)( 71.0)( 72.0)( 110.0 0.0 0.0)( 210 0.0 0.0 1.0)( 100.AcDbText) ( 73.0) )
  其中,( 0. TEXT) 表示这是一TEXT 对象,( 8.TXT)表示所在图层为“TXT”,( 10 15 20 0) 表示文本的插入点坐标为( 15, 20, 0) ,( 1.进汽包) 表示文字内容。由此可见,只要抽取文字的有关信息( 插入点坐标、文本内容、图层、文字样式等) 建立原始数据表( LISP 表) , 再以插入点坐标为关键元素, 对表中的信息进行分析、筛选, 即可将该表重构为包含行数、列数、文字内容及对应行列信息的表格对象所需的新表。
    2.2 表格转换的方法
如上所述, 取得文字信息数据后, 即可根据文字插入点的坐标来判定表格的行数和列数以及文字的归属, 即判定文字位于哪个单元格。
    2.2.1 总行数和列数的判定
   表格的行数、列数可以由用户输入, 但从方便用户操作的角度看, 由程序自动判断行数和列数显然更人性化。对不存在空白单元格的“表格”, 判断方法比较简单, 只要多个文字具有相同的y 坐标则判定为同属一行, 具有相同的x 坐标则判定为同属一列。但是实际的表格中往往存在空白单元格, 不能简单的采用以上办法, 需加以改进。
   假设抽取文字的插入点x, y 坐标和内容text 三要素作为子表, 构建如下形式的数据模型表tb_list:
( ( x1 y1 text1)( x2 y2 text2)( x3 y3 text3) ?( xn yn textn) )
   根据表格文字的每一行具有相同的y 坐标、每一列具有相同的x 坐标这一特点, 遍历tb_list 表, 统计表中每个y 坐标、x 坐标出现的次数m、n, 即为表格的总行数m和总列数n。判定流程参见图1。
    由于绘图的不规范性, 表格内同一行文字的y 坐标或同一列行文字的x 坐标可能存在一定的偏差, 故此需设置容差机制, 比如以字高的一半作为阈值, 只要文字插入点的x、y 坐标在允许误差范围以内, 则可以认定其同属一行或同属一列。

     
     在排序后的tb_list 中, 每一个子表( xi yj textij) 均与单元格( i j) 相对应。据此, 先用object.AddTable 方法创建新的表格对象, 再从tb_list 表中分离得到按单元格列顺序排列的文字, 将其填充到对应的单元格中即完成了表格对象的转换。原始表格根据需要可以删除或保留。
    图2 为转换流程图。为简洁计, 省去了出错检查、特殊情况分析判断等辅助流程。
      

     2.3 “表格”的预处理
   有些普通“表格”在绘制时可能不是很规范, 为了降低表格转换的难度, 提高转换的效率和准确性, 在表格转换之前可对原始普通表格进行预处理, 处理措施包括文字的行对齐、列对齐、文字样式和对正方式的统一、同一单元格内的多个文字对象合并成一个对象等。如果有必要, 也可将所有的文字全部转换成MEXT 或TEXT 一种类型, 这是因为单行文字和多行文字有差别, 混合处理有可能产生误判。文字预处理可以通过对象特性对话框, 结合FILTER、特性匹配等工具手动进行, 也可以编制程序自动处理, 具体算法从略。
    当然, 如果不对“表格”进行规范化预处理也是可以的, 但是需要修改以上表格转换的算法, 由于要考虑如何处理可能出现的各种不规范情况, 程序的算法将变得更加复杂。由此可见, 制图越规范, 后期对图形数据的处理和再利用就越简单, 效率越高, 因此规范化的设计是应予高度重视的一项重要措施。
     3. 结语
    利用ActiveX 技术进行二次开发, 实现了把用LINE( 或PLINE) 和TEXT( 或MTEXT) 命令绘制的普通“表格”转换为AutoCAD 的表格对象, 为以后高效、快捷地进行表格操作创造了条件, 因此具有较高的实用价值。本文只针对常见的表格形式给出了转换的算法, 在此基础上修改、完善, 可实现将其它形式的"表格"转换为表格对象。

   [ 参考文献]
[ 1] 朱玉.用VBA 实现Excel 电子表格到AutoCAD 表格的转换[ J] .机床与液压, 2004( 12) : 176- 178.
[ 2] 陈伯雄, 冯伟.Visual LISP 程序设计技巧与范例[ M] .北京.人民邮电出版社, 2003.
[ 3] 杜平安.AutoCAD 明细表自动导入Excel 的实现方法[ J] .工程图学学报, 2003( 1) : 50- 56. ( 编辑明涛)

民众工作室.制作      版权所有