小弟最近用grread做了个递增复制的lisp,根据Gu_xl版主的帖子想替换为gxl-Ge-grread带捕捉的函数,可不知怎样终止循环。下面我发上我自己的这个lisp,有精通该函数用法的高手,请深处您的援助之手。小弟不胜感激。 - (defun c:mc ( )
- ;自定义新的出错函数
- (defun newerr (msg)
- (mapcar 'eval sysvarlst) ;恢复变量设置
- (if *olderror*
- (setq *error* *olderror*
- *olderror* nil
- )
- ) ;恢复*error*函数
- (if (not
- (member msg '(nil "函数被取消" ";错误:quit / exit abort"))
- )
- (princ (strcat ";错误:" msg))
- )
- );;系统设置
- (command "undo" "be") ;;命令编组开始
- (setq
- sysvarlst (mapcar
- (function (lambda (n) (list 'setvar n (getvar n))))
- '("osmode" "cmdecho" "OSNAPCOORD"
- "dimzin" "plinewid" "TEXTSIZE"
- "textstyle"
- )
- )
- ) ;;保存系统变量
- (setq *olderror* *error*) ;;保存出错函数
- (setq *error* newerr) ;;设置自定义出错函数
- (setvar "cmdecho" 0) ;;关闭命令响应
- (setvar "OSNAPCOORD" 1) ;;坐标数据优先级设为:键盘输入替代对象捕捉设置
- (setvar "OSMODE" 65) ;;改变捕捉模式
- (setvar "dimzin" 0) ;;不对主单位值作消零处理
- (setq el (entget (car (entsel "\n 请选择数字 >>"))))
- (setq p0 (cdr (assoc 10 el))
- str (read (cdr (assoc 1 el)))
- h (assoc 40 el)
- )
- (c:mf)
- (command "_undo" "_e") ;;活动编组结束
- (mapcar 'eval sysvarlst) ;;恢复变量设置
- (setq *error* *olderror*) ;;恢复出错函数
- (princ)
- (defun c:mf ()
- (if el
- (progn
- (entmake
- (list '(0 . "TEXT") (cons 1 (itoa (1+ str))) (cons 10 p0) h)
- )
- (setq lst (entget (entlast)))
- (setq loop T)
- (while loop
- (setq code (grread T 8)
- mod (car code)
- val (cadr code)
- )
- (cond ((= mod 5)
- (setq p0 val)
- (setq lst (subst (cons 10 p0) (assoc 10 lst) lst))
- (entmod lst)
- (setq str (read (cdr (assoc 1 lst))))
- )
- ((= mod 3) (c:mf)) ;;左击鼠标从c:mf继续循环
- ((= mod 25) (setq loop nil) (entdel (entlast))) ;;右击鼠标(本电脑值为25),删除最后生成的数字编号,结束操作
- )
- )
- )
- )
- )
- )
|