本帖最后由 Gu_xl 于 2015-9-5 08:59 编辑
在一个lisp文件里,有多个程序defun,对于全局变量不知道具体应该如何处理。原代码如下: - (vl-load-com)
- (setvar "CMDECHO" 0)
- ;这个函数是用来取得图纸上所有的图层名组成的集合
- (defun ALL-LAY (/ LAY I)
- (vlax-for I (vla-get-layers
- (vla-get-activedocument (vlax-get-acad-object)))
- (setq LAY (cons (vla-get-name I) LAY)))
- (setq LAY (vl-sort LAY '<)))
- ;这个函数是用来取得选择集合里所包含的所有图层名集合,且图层名集合不重名
- (defun S-LAY (/ SS I LAY)
- (setq SS (ssget))
- (setq SS (vla-get-activeselectionset
- (vla-get-activedocument (vlax-get-acad-object))))
- (vlax-for I SS (setq LAY (cons (vla-get-layer I) LAY)))
- (setq LAY (vl-sort LAY '<))); 不重名设置,同时作为函数的返回值
-
- ;这个函数是用来取得除了选择集以外的所有图层名集合
- (defun NS-LAY ( / LAY lays MBR)
- (setq LAY (ALL-LAY))
- (setq lays (S-LAY))
- (setq clay (car lays))
- (foreach MBR lays (setq LAY (vl-remove MBR LAY)))
- (setq LAY (vl-sort LAY '<)))
- ;打开关闭系列
- (defun C:1 ()
- (prompt "图层全开.\n")
- (command "_.-LAYER" "ON" "*" "")
- (princ))
- (defun C:2 ( / LAY MBR )
- (prompt "关闭其他.\n")
- (setq lay (NS-LAY))
- (if (vl-position (getvar "CLAYER") lay);判断表中是否有当前图层,有的话关闭当前图层
- (command "_.-LAYER" "OFF" (getvar "CLAYER") "Y" ""))
- (setq LAY (vl-remove (getvar "CLAYER") lay))
- (command "UNDO" "BE")
- (foreach MBR LAY (command "_.-LAYER" "OFF" (eval MBR) ""))
- (setvar "CLAYER" clay )
- (setq clay nil )
- (command "UNDO" "E")
- (princ))
-
- (defun C:3 (/ LAY MBR)
- (prompt "关闭自己.\n")
- (setq lay (S-LAY))
- (if (vl-position (getvar "CLAYER") lay);判断表中是否有当前图层,有的话关闭当前图层
- (command "_.-LAYER" "OFF" (getvar "CLAYER") "Y" ""))
- (setq LAY (vl-remove (getvar "CLAYER") LAY))
- (command "UNDO" "BE")
- (foreach MBR LAY (command "_.-LAYER" "OFF" (eval MBR) ""))
- (command "UNDO" "E")
- (princ))
这个Lisp文件中,主要的疑问在于函数 (defun C:2 ( / LAY MBR )...)调用了函数(defun NS-LAY ( / LAY lays MBR)...),这两个函数里都有一个变量clay,我希望这个变量是全局变量,这样就可以传递值。
但当我将这两个函数改成 (defun C:2 (clay / LAY MBR )...)和(defun NS-LAY ( clay / LAY lays MBR)...)时,程序就断了,断的地方就是定义这里。
局部变量名称前的斜线和第一个局部名称之间,以及该斜线和最后一个参数(如果存在的话)之间,都必须保持至少一个空格的距离。这一点我有注意,但我不知道哪里出错了,一直找不到原因。
当我把clay全局变量取消,不去定义时,程序对于不定义的变更默认成全局变量,程序又可以正常运行。所以想请教一下哪里出了错,谢谢~
|