用Lisp制作简单的CAD命令,将多步骤CAD命令改为单步骤命令,主要使用到两个函数:command (或者vl-cmdf)及defun函数。此为Autolisp入门函数。
个人感想:同一种功能有多种方式算法可以实现,比如可以用Lisp,Vlisp(vla),VBA;一般常用功能用Lisp中的command调用CAD内置命令即可实现,而且多数时候代码更简单简洁,执行效率更高。例如修改图形对象属性中的图层,颜色,线型等等,Vlisp与VBA需要用到循环,对每个对象的属性进行逐一修改,而用内置命令可以对全部对象属性直接修改。总的来说,在没有特别性能需求的情况下,怎么简单怎写。掌握简单基础的多步命令改单步命令,可以快速入门lisp,提高制图效率。
结尾附个人常用CAD命令集及相关源代码,方便使用交流学习。
一,函数介绍
command 函数语法
(command [arguments]...)
功能及参数
此函数可使 AutoLISP 能在 AutoCAD 中执行命令, 然后传回 nil。arguments 是AutoCAD 的命令或副命令。每一个参数在经过分析之后, 将被送至 AutoCAD 系统中来响应其提示语句。命令的名称是以字符串来表示的, 2D点是一个含有两个实型数的表, 3D 点则是一个含有三个实型数的表。
defun 函数语法
(defun sym argument-list expr...)
功能及参数
defun 是以名称 sym 来定义函数, 此名称函数会自动加上引号, 所以您不需自行加上引号。函数名称之后是一个参数表函数, 此 argument-list 内的参数可有可无。在参数后, 可以使用一个“/”符号和一个或一个以上的 sym 区域性符号。区域性符号和参数的间隔必须以“/”符号来分隔。同时, 要隔一个空格。如果没有给出参数或区域性符号, 那么必须在函数名称的后面加上一空白的括号。
二,代码示例
打开记事本,输入代码;将文件另存为my.lsp,保存类型选全部,编码类型默认UTF-8或者ANSI,代码为;或者在CAD中输入Vlisp,进入Lisp编程界面,新建文件,输入代码,保存.lsp。
常用修改对象命令有:"chang","chprop","-layer","-color","-linetype"等等。
;;;输入命令XH,创建横向构造线--------------------------------------
(defun c:XH ()
(command "xline" "h" ) ;用command命令将两个命令一起执行
(princ))
;;;输入命令XV,创建竖向洋红色构造线---------------------------------
(defun c:XV ()
(command "-color" "6") ;设置当前绘图颜色为洋红色
(command "xline" "v" )
(while (/= (getvar "cmdactive") 0) ;用于连接空格后的命令
(command pause))
(command "-color" "bylayer");恢复当前绘图颜色为随层
(princ))
;;;绘制尺寸标注参考线(任意角度,适用于A4图框比例)--------------------
(defun c:xar ()
(command "-color" "6")
(setq ds (getvar "dimscale"))
(setq ds1 (* ds 6))
(setq ds2 (* ds 5))
(setq pt1 (getpoint "\n选择直线对象的偏移点"))
(setq pt2 (getpoint "\n指定向哪侧偏移"))
(command "xline" "o" ds1 pt1 pt2 "")
(repeat 9
(setq las (entlast))
(cond
((and (<= (car pt1) (car pt2)) (<= (cadr pt1) (cadr pt2)))
(setq pt2 (list (+ (car pt2) ds1)
(+ (cadr pt2) ds1)
(caddr pt2))))
((and (<= (car pt1) (car pt2)) (>= (cadr pt1) (cadr pt2)))
(setq pt2 (list (+ (car pt2) ds1)
(- (cadr pt2) ds1)
(caddr pt2))))
((and (>= (car pt1) (car pt2)) (<= (cadr pt1) (cadr pt2)))
(setq pt2 (list (- (car pt2) ds1)
(+ (cadr pt2) ds1)
(caddr pt2))))
((and (>= (car pt1) (car pt2)) (>= (cadr pt1) (cadr pt2)))
(setq pt2 (list (- (car pt2) ds1)
(- (cadr pt2) ds1)
(caddr pt2)))))
(command "xline" "o" ds2 las pt2 ""))
(command "-color" "bylayer")
(princ))
;;;输入命令BY,设置颜色随层--------------------------------------
(defun c:by ()
(command "-color" "bylayer")
(princ "Set Color By Layer")
(princ))
;;;输入命令BF,选择对象,打断于点--------------------------------
(defun c:BF ()
(command "break" pause "f" pause "@")
(princ))
;;;-------------------------------------------------------------
;;;输入命令VF,将视图改为前视图;(改为俯视图,左视图,参照程序修改即可)
(defun C:VF ()
(command "-view" "front")
(princ "前视")
(princ))
;;;-------------------------------------------------------------
;;;输入命令1,将对象颜色设为红色(1);其他颜色0~255,参照程序修改数字即可
;;;仅修改选中对象的颜色,不改变图层和线型。
(defun c:1 ()
(setq ss (ssget))
(if ss (command "chprop" ss "" "c" 1 ""))
(princ))
;;;-------------------------------------------------------------
;;;输入命令LL,选择对象,将对象所在图层设置成当前图层(模型及布局空间均可用)
;;;或者在gpg文件中末尾添加命令 LL, *ai_molc (模型可用,布局不可用)
(defun c:LL ()
(setq ent (car (entsel)))
(if ent
(progn
(setq lay (cdr (assoc 8 (entget ent))))
(command "-layer" "s" lay ""))
)
(princ "\n未选择图元!")
)
(princ))
;;;-------------------------------------------------------------
;;;输入命令KK,选择对象,把对象从其他图层改到当前图层
(defun c:kk ()
(setq layername (getvar "CLAYER"))
(setq ss (ssget))
(if ss
(command "chprop" ss "" "la" layername "")
(princ "\n未选择图元!")
)
(princ))
三,使用方法
在CAD命令行中输入AP,回车键后选择Lisp文件,加载成功,即可使用Lisp 定义的命令。如果经常使用,可以加入启动组。
四,常用的 Lisp 命令集
以下是本人35个简单的常用自定义命令集,AP加载后即可使用,文件程序见结尾。
如以下命令与自身常用命令冲突,可自行修改命令(即修改 “defun c:” 后的命令)。.lsp为源程序(PS:可自由删改,按需使用),.vlx为编译后的程序,编译后的程序运行效率更高些,二者加载其中一个即可。
(PS: 线型命令如发现比例不协调,问题出在这几个线型在图纸中已经有了,并且这几个线型的被图纸修改了,基本解决方法是命令 “LT” 重载这几个线型,并 命令 “RE” 重生成;另一个解决方法是,使用命令 "JJXX",重载线型。)
如果lisp每次加载都弹出对话框,可将lisp文件(即.lsp或.vlx),加入启动组。并将lisp所在文件夹,在选项设置中(命令“OP”打开)加入 文件--受信任位置;
结尾
以下为Lisp程序文件下载链接获取方式:
公众号:为赶路人干杯
公众号回复:Lisp
(后续如有制作Lisp 命令都会放在共享这个文件夹中)