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 “表格”的预处理 |
民众工作室.制作 版权所有 |