一、AutoLisp/VisualLisp 函数
1.定义函数
通过defun函数来定义函数,需要包括函数名、变元(即函数参数/形参)、局部变量(函数内所用到的变量,随函数结束自动释放),例如
;;(defun 函数名 (变元 / 局部变量) 代码段...)
(defun add (c a b / )
(setq c(+ a b));;实现c=a+b
)
2.定义命令
通过defun函数来定义命令,与定义函数不同的是,函数名前需加 c: ,且没有变元,例如
;;定义绘制(0,0)至(10,10)直线命令
(defun c: drawline ( / p1 p2)
(setq p1 (list(0 0)))
(setq p2 (list(10 10)))
(command "line" p1 p2 "c")
)
二、编程实例
1.编写 LISP 命令 CreateCircle,用 AutoLISP 函数实现:创建建圆心为(0,0),半径为 10,颜色随层的圆
(defun c:CreateCircle(/ pt r)
(setq pt (list 0 0 0))
(setq r 10)
(entmake (list (cons 0 "CIRCLE") (cons 10 pt) (cons 40 r)))
(princ)
)
这里并没有调用“circle”命令,而是使用entmake函数来直接生成图元组码。原因一是这种方法不会被环境因素例如鼠标或者捕捉等原因影响,二是在绘制大量图元时,其速度和效率超远command命令,对于entmake函数,其结构为:
(entmake [elist]);; elist中需要包含创建图元的必要元素,如实例中圆心位置、半径长度
此外命令末尾有如下一行表达式,用于表示命令结束后静默推出,并不打印任何内容
(princ)
2. 编写 LISP 函数(ChangeCircleColor),用 AutoLISP 函数实现:选择圆,改变圆的颜色为红色
(defun c:ChangeCircleColor(/ elst etype oldcolor newcolor)
(setq elst (entget(car(entsel))))
(setq etype(cdr(assoc 0 elst)))
(if(= etype "CIRCLE");;判断是否为圆,是则改色,否则退出
(progn
(setq newcolor (cons 62 1))
(if(setq oldecolor (assoc 62 elst))
(setq elst (subst newcolor oldecolor elst))
(setq elst (append elst (list newcolor)))
)
)
)
(entmod elst)
(princ)
)