经验交流苑(41):活用对象数据库
软件世界
我是一名高级机械工程师,从事滚针轴承的产品与工装模具设计已有多年。经常需要绘制大量各种各样的机械图形,在用AutoCAD绘制图形的时候,经常会遇到改变文字高度的情况。如用单行和多行文字编辑器编辑的大量文字,当我们发现文字太大或太小需要改变文字高度时,却在AutoCAD中找不到与此相关的命令。为了解决这个问题,我自己开发不少适合自己使用的各种命令。从绘图、辅助设计、工具栏的定制到参数化设计绘图的二次开发等都是自己动手解决问题。下面我谈谈自己的一些经验,希望对大家有所帮助。
访问和使用对象数据库的数据
*.DWG文件是AutoCAD在图形生成和编辑中使用的数据库,它存放的主要内容是所生成的几何信息和其他有关信息。DWG数据库功能允许用户在任何一条图线的数据结构中再加入一部分其他信息,这就是所谓的扩展的对象数据库结构。使用扩展的对象数据库结构,必须用AutoLISP等程序设计,实施对它的访问和修改,先自行定义扩展的对象数据库信息表,再加入到指定的对象中。
访问和使用对象数据库的数据,是AutoLISP程序应用的较高水平。AutoCAD的对象数据库是以*.DWG文件形式存盘。在交互操作中,可以利用如List 、DBList等命令间接或局部地得到对象数据库的一些可读格式的数据,但都不方便且不容易在程序中自动处理。AutoLISP提供了一整套函数,能相当方便地直接到数据库的底层去访问和改变对象数据库中的数据,为专业绘图或设计提供素材。
为了了解对象(图元)定义数据的结构和组成,在acad.lsp中添加一个查询实体数据库的命令。
( DEFUN C:CX (/ ES);查询实体数据库
( SETQ NIL)
( WHILE (= ES NIL)
( SETQ ES (ENTSEL “选择要显示数据的实体:\n”)))
;ENTSEL提示用户通过指定一个点来选择单个对象(图元)
( TEXTSCR);TEXTSCR切换至文本屏幕(相当于AutoCAD中的F2功能键)
( ENTGET (CAR ES)))
;ENTGET获得对象(图元)的定义数据,CAR返回表的第一个元素
使用AutoCAD 2000绘制图形时,只要在菜单“工具→选项→系统”的“每个图形均加载acad.lsp”的前面打上钩,这样每打开一个新的模板或图形时,都会把acad.lsp加载到每个图形中。将以上代码粘贴到acad.lsp中,重新运行AutoCAD2000。在命令行输入命令 CX 回车,命令行提示“选择要显示数据的实体:”, 选择图形中的对象(图元),就会在AutoCAD文本窗口里显示以下内容 (此例的对象是用单行文字编辑器编辑的文字“电脑报”) 。
选择要显示数据的实体:
((-1 . <图元名: 1d741d0>) (0 . “TEXT”) (330 . <图元名: 1d740f8>) (5 . “62”)
(100 . “AcDbEntity”) (67 . 0) (410 . “Model”) (8 . “0”) (100 . “AcDbText”)
(10 14.1338 8.40999 0.0) (40 . 5.0) (1 . “电脑报”) (50 . 0.0) (41 . 1.0) (51 . 0.0)
(7 . “Standard”) (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0)
(100 . “AcDbText”) (73 . 0))
组码解释:其中组码-1表示实体名(每次打开图形文件时发生变化),组码0表示实体类型,组码330表示主字典的硬指针标识符或句柄,组码5表示句柄,组码100表示子类标记,组码67表示实体所在的模型/图纸空间(0/1),组码410表示布局标签名,组码8表示图层名,组码100表示子类标记,组码10表示第一个对齐点的坐标,组码40表示文字高度,组码1表示文字内容,组码50表示文字旋转角,组码41表示比例因子,组码51表示文字倾斜角度,组码7表示文字样式名,组码71表示文字生成标志,组码72表示水平文字对齐类型,组码11表示第二个对齐点的坐标, 组码210表示文字拉伸方向,组码100表示子类标记,组码73表示垂直文字对齐类型等。
修改对象数据库编辑图形元素
从实体数据库中看出, 可以通过修改对象数据库改变的内容较多,如将文字“电脑报”改换为其他内容,将忘记标直径符号的尺寸加上φ等。大多数在AutoCAD2000中已经有了很完善的解决命令,下面的例子是改变单行文字编辑器编辑的文字高度。
( DEFUN C:ZG (/ H SS ENMING ED H I LEN ) ;改变字高
( PRINC “请选择要修改字体高度的文字实体集:”) ;在命令行中显示提示文字
( SETQ SS (SSGET)) ;SS为根据选定对象创建的选择集
( SETQ H (GETREAL “字高=”)) ;H为在命令行中输入的表示字高的实数
( SETQ LEN (SSLENGTH SS)) ;LEN为选择集中的对象(图元)数目
( SETQ I 0)
( WHILE (< I LEN)
( SETQ ENMING (SSNAME SS I) )
;ENMING为选择集中由序号指定的那个对象(图元)的图元名
( SETQ ED (ENTGET ENMING)) ;ED为对象(图元)的定义数据
( IF (EQUAL (CONS 0 “TEXT”) (ASSOC 0 ED) )
;如果实体类型为单行文字编辑器编辑的“TEXT”
(PRNOG ( SETQ ED ( SUBST (CONS 40 H) (ASSOC 40 ED) ED) )
;将新的字高数据H替换到对象(图元)的定义数据ED中
( ENTMOD ED))) ;修改对象(图元)的定义数据
( SETQ I (1+ I))))
将以上代码粘贴到acad.lsp中,重新运行AutoCAD2000,在命令行中输入命令ZG后回车,选择图形中用单行和多行文字编辑器编辑的文字,在命令行中输入改变后的文字高度数值按鼠标右键或回车。笔者的目的是通过改变文字高度的例子,说明利用修改对象数据库实现对图形元素的编辑。(acad.lsp压缩包下载地址:www.jy-bearing.com/old/acad/cad.rar)