首页 -> 2007年第6期

浅谈基于AutoLISP的AutoCAD二次开发技术

作者:神红玉




  [摘要] 在以AutoCAD制图的工程应用中,经常需要开发一些符合工程需求的AutoCAD工具。AutoLISP语言是一种对AutoCAD进行二次开发的灵活手段。本文通过一个从上到下逐行写文本的简单程序,探讨了基于AutoLISP的AutoCAD二次开发程序设计的基本步骤和具体实现过程。
  [关键词] AutoCAD AutoLISP 二次开发
  
  AutoCAD是由美国Autodesk公司开发的通用计算机辅助绘图和设计软件包,它具有易于掌握、使用方便、体系开放等特点。已广泛应用于机械、建筑、电子、土木工程、轻工等各个领域。目前AutoCAD最新的版本是AutoCAD2006。
  
  一、AutoLISP及二次开发的概念
  
  AutoLISP 语言是嵌入在AutoCAD内部的LISP编程语言,它是LISP语言与AutoCAD有机结合的产物。AutoLISP的嵌入使AutoCAD真正成为能进行计算机辅助设计、绘图的CAD软件。
  在使用AutoCAD制图中,大量操作都是通过鼠标点击控件和键盘输入相应参数组合实现的。有时在制图过程中会需要做大量重复的操作,这些操作又具有一定的规律。那么,便可以通过AutoLISP开发出AutoCAD中可以使用的自定义控件,在点击该控件后,大量繁琐的执行过程交由后台执行,用户仅需输入一些必要的参数,即可实现制图效果。这种方法就是所谓的“二次开发”。显然,二次开发能够提高工作的效率和减轻工作量。
  
  二、使用AutoLISP进行二次开发的实例及过程剖析
  
  (一)题目。
  下面通过编写一个从上到下逐行写文本的小程序段来简要分析AutoLISP的开发过程。题目要求如下:
  1. 用户只需点击一个自定义工具按钮,系统即会提示用户输入首行文本所在位置、相邻两行文本偏移量、文本高度这三个参数。其中,首行文本所在位置由鼠标在屏幕上点击获得,文本高度默认值为4。
  2. 用户依次输入文本,回车表示结束当行输入。
  3. 当所有文本输入结束后,按“Esc”键结束退出。AutoCAD回到等待命令输入状态下。
  (二)题目编制依据。
  设计人员经常会遇到一些“填表”的工作,譬如在电力系统设计中,工作人员现场测得各电力杆的间距,需要在AutoCAD中将其制成电子表格,在表格中从上到下依次填制数据。传统的办法就是,先用“Array”或“Copy”给每个空格都填上一个任意的数据,然后依次修改各个数据。使用这种方法填制数据需要频繁地交叉使用鼠标和键盘输入,如果要填制的电力杆多达上千根,那么设计人员的工作量将非常大。
  如果编制出该控件,那么用户除输入三个必要参数外,只需依次输入各行数据即可,并且如果能够保证输入数据的准确性,设计人员甚至可以不看屏幕,只需看着记录文本即可实现快速录入,从而大大简化工作、压缩工作量、提高工作效率。
  需要说明的是,在从AutoCAD2005始,软件中已增加了表格的功能,因此上述所提的困难主要是针对老版本AutoCAD的。但是考虑到本文仅仅是浅要剖析AutoLISP二次开发的过程,采取该程序例题作探讨仍然是合适的。
  (三)程序流程及代码。
  本例流程图如下所示:
  
   在AutoCAD的环境变量中,cmdecho是控制命令回显的参数,将cmdecho设置为“0”后,可以屏蔽命令回显。由于程序执行时,其实是在后台频繁调用各种CAD命令进行制图,如果不屏蔽,则调用的各种命令都将在CAD主窗台下面的命令栏里滚动显示,造成命令行频繁刷屏,虽然没有影响,但却属于无用信息,因此需给予屏蔽。
  环境变量osmode是控制捕捉的参数,将osmode置“0”后,捕捉状态即被屏蔽。如果没有屏蔽捕捉状态,当用户用鼠标点取文本起始位置时,往往会误捕捉到附近的交点、端点等等地方,造成不便。
  另外,这两个变量只能在该程序段中置零,程序执行完必需予以还原,否则程序执行完之后,将存在没有命令回显和捕捉开关必须重设的麻烦。
  在初始化环境变量后,就必需依次输入三个重要参数:起始位置、行距、文字高度。其中起始位置由用户在CAD主窗口用鼠标点取,而行距和文字高度,由用户键盘输入,在这文字高度问题上,当程序从键盘上可以获得一有效数字时,即将其设为文字高度,如果用户在该部分直接回车跳过,那么系统将默认文字高度为4。同理,该方法对行距调整也可适用。
  在初始化及提供参数结束的情况下,用户可以逐行输入文本,回车表示结束一行文本录入,当一行文本输入结束后,程序对该行文本进行分析,如果发现所获得的文本不为空,则输出该行文本,并重新回到等待输入的状态下,等待新的输入。而当程序分析所获文本内容为空,则结束循环,将AutoCAD的环境变量还原并退出程序。
  以下即为本例程序代码:
  (defun c:textt()
  (setq oldcmdecho (getvar "cmdecho"));环境变量,用于屏蔽命令回显
  (setvar "cmdecho" 0);将系统参数cmdecho置0
  (setq oldosmode (getvar "osmode"));环境变量,用于关闭捕捉状态
  (setvar "osmode" 0) ;将系统参数osmode置0
  (setq p1 (getpoint "请输入起始点\n"))(setq d (getreal "\n请输入相邻两行文本之间距离 :"))
  (setq h (getreal "\n请输入文本高度 <4>"))
  (setq s (getstring "\n请输入文本内容:(回车结束输入)"))
  (if (= h nil) (setq h 4)) (while (/= s "")
  (progn (command "text" "j" "bc" p1 h "0" s "") ;在指定坐标处输出文本
  (setq p1 (list (car p1) (+ (cadr p1) d))) ;获取下一点平面坐标
  (setq s (getstring "\n请输入文本内容:(回车结束输入)"))
   )
  )
  (setvar "cmdecho" oldcmdecho);还原系统环境变量
  (setvar "osmode" oldosmode) (princ)
  )
  (四)调试。
  程序编辑完保存后,点击Visual LISP主窗口上的“工具”菜单,在其下拉菜单中选“加载编辑器中的文字”,然后在Visual LISP控制台中输入用户所编程序的程序名,如果有错误,控制台中会有错误提示,如果程序没有错误,则在控制台中显示程序运行结果。
  (五)定制工具按钮。
  在CAD工具栏处右键,选“自定义”,在弹出的对话框中,选“用户定义”,将出现的“用户定义的按钮”,拖放到工具栏上,则会出现一个没有任何定义的空白工具按钮。不要关闭刚才的弹出对话框,此时点击该新增空白按钮,会弹出该按钮的特性对话框,用户在该对话框中可对此按钮进行设置,按钮名称和说明由用户个人设定,在“宏”定义中,填入“(load "d:/lsp/filename.lsp”) programname”(仅供示例,需对照修改)即可。其中“d:/lsp/filename.lsp”为被编辑原代码文件的带地址文件名,而programname则为用户自定义的程序名。修改好之后,即可按下“应用”按钮并退出。
  该工具按钮定制结束后,在AutoCAD的 “工具”菜单的下拉菜单“AutoLISP”中选 “加载…”命令,将所开发的二AutoLISP程序文件进行加载,即完成本次全部开发。
  
  三、结论及说明
  
  上述程序代码段,经调试、检验,是确实可用的。其检验环境是AutoCAD2006。
  在该二次开发实现中,用户需对相应的CAD命令和LISP函数都能熟练掌握。
  不同版本的CAD可能在某些CAD命令的使用上会有所区别,这会导致某些二次开发移植到不同版本的CAD中无法正常使用。
  
  参考文献:
  [1] 赵景亮,李志刚.AutoCAD 2004与AutoLISP二次开发技术[M].北京:清华大学出版社.
  [2] 张跃峰,陈通.AutoCAD 2002入门与提高[M].北京:清华大学出版社.