怎样在使用_.UNDO时取消命令栏提示?
怎样在使用_.UNDO时取消命令栏多余“ (LISP 表达式)” 提示?因为lisp里面带了undo be 跟undo e,使用程序的时候执行了一个循环1000多遍的代码,撤销的时候命令栏就出现了1000多遍“(LISP 表达式)”的提示,怎样让多余的“(LISP 表达式)”这句话不显示?
求高手解答出现这么多“(LISP 表达式)”的原因。 ;;你这样试试
(defun c:et ()
(command "_.undo" "be")
(setvar "cmdecho" 0)
(setq ptlist1 nil)
(setq ss (ssget '((0 . "INSERT"))))
(setq ss0 (sort-se (sort-se ss 10 1 50 nil) 10 0 2 nil))
(setq sct (sslength ss))
(setq x1 0
x2 0
)
(setq ss1 ss0
ss2 ss0
)
(repeat sct
(setq sent (entget (ssname ss1 x1)))
(setq ascd10 (assoc 10 sent))
(setq ptlist1 (cons ascd10 ptlist1))
(setq x1 (1+ x1))
)
(etmove)
(command "_.undo" "e")
(prin1)
)
(defun etmove ()
(setvar "cmdecho" 0)
(setq ptlist2 ptlist1)
(repeat sct
(setq acx10 (cdr (car ptlist2)))
(setq ptlist2 (cdr ptlist2))
(setq sn (ssname ss2 x2))
(setq sent2 (entget sn))
(setq acy10 (cdr (assoc 10 sent2)))
(command "_move" sn "" acy10 acx10)
(setq x2 (1+ x2))
)
(setvar "cmdecho" 1)
) 没有源码,不好准确判断,一般说来,这是Undo e位置使用不当所致,undobe使用在程序的开始,undoe使用在程序的结尾和出错处理函数*error*中,都要在循环外,如果是程序本体循环,可以把程序设置为子函数,任何使用主函数调用子函数,循环子函数,Undo处理放在子函数以外。 ll_j 发表于 2013-12-19 09:22 static/image/common/back.gif
没有源码,不好准确判断,一般说来,这是Undo e位置使用不当所致,undobe使用在程序的开始,undoe使用在程序 ...
我已经试过将UNDO E 放在子程序里,一样 ,谢谢你的提醒,我再去多试一试 菜卷鱼 发表于 2013-12-19 09:27 static/image/common/back.gif
我已经试过将UNDO E 放在子程序里,一样 ,谢谢你的提醒,我再去多试一试
unde e不能放在循环内,这是要点。 何不将程序贴上来?
一般将程序进行研究编组,这样可以一次撤销
(command "_.undo" "be")
lisp
(command "_.undo" "e") 本帖最后由 菜卷鱼 于 2013-12-19 10:51 编辑
(defun c:et ()
(setvar "cmdecho" 0)
(setq ptlist1 nil)
(setq ss (ssget'( (0 . "INSERT")) ))
(setq ss0 (sort-se (sort-se ss 10 1 50 nil) 10 0 2 nil ))
(setq sct (sslength ss))
(setq x1 0 x2 0)
(setq ss1 ss0 ss2 ss0)
(repeat sct
(setq sent (entget (ssname ss1 x1 )))
(setq ascd10 (assoc 10 sent))
(setq ptlist1 (cons ascd10 ptlist1))
(setq x1 (1+ x1))
)
(etmove)
(prin1)
)
(defun etmove ( )
(setvar "cmdecho" 0)
(command "_.undo" "be")
(setq ptlist2ptlist1)
(repeat sct
(setq acx10 (cdr (car ptlist2)))
(setq ptlist2 (cdr ptlist2))
(setq sn (ssname ss2 x2 ) )
(setq sent2 (entget sn))
(setq acy10 (cdr (assoc 10 sent2)))
(command "_move" sn "" acy10 acx10)
(setq x2 (1+ x2))
)
(command "_.undo" "e")
(setvar "cmdecho" 1)
)
;;;;;;通用排序程序,来自明经论坛
(vl-load-com)
(defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
;;建立排序列表
(setq LST '() INDEX 0)
(repeat (sslength SE)
(setq ENT (entget (ssname SE INDEX))
TMP (cdr (assoc DXF ENT)) )
(if (and INT (= (type INT) 'INT) (= (type TMP) 'list)(< INT (length TMP)) )
(setq TMP (nth INT TMP)))
(setq LST (cons (list TMP (cdr (assoc 5 ENT))) LST))
(setq INDEX (1+ INDEX)));;排序操作
(if (and FUZZ
(or (= (type FUZZ) 'INT)
(= (type FUZZ) 'REAL))
(or (= (type TMP) 'INT) (= (type TMP) 'REAL)))
(setq NEWLST
(vl-sort LST (function (lambda (E1 E2) (< (+ (car E1) FUZZ) (car E2)))
)))
(setq NEWLST
(vl-sort LST (function (lambda (E1 E2) (< (car E1) (car E2))))
))) ;;如果K为T,则倒置
(if K (setq NEWLST (reverse NEWLST)))
(setq NEWSE (ssadd))
(foreach TMP NEWLST
(setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
) ;;返回值NEWSE ;_结束defun;;;
)
;;;;示例:
;(SORT-SE SS 10 0 5.0 T);;;;;;;;;
;表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小;;;;;;;
;(SORT-SE SS 10 1 3.0 NIL);;;;;;;
;表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大;;;;;;
;(SORT-SE SS 8 NIL NIL NIL);;;;;;;
;表示按照8组码值(图层名称)进行排序,顺序为从小到大;;;;;;
(prin1) 菜卷鱼 发表于 2013-12-19 10:43 static/image/common/back.gif
问题就是Undo处理放在循环中了。
Undobe和Undoe应该放在c:et的首尾,而不是子函数的首尾。 ll_j 发表于 2013-12-19 10:50 static/image/common/back.gif
问题就是Undo处理放在循环中了。
Undobe和Undoe应该放在c:et的首尾,而不是子函数的首尾。
我一开始就是放在c:et的首尾的,听了你之前的建议我才放到子程序的首尾的 自贡黄明儒 发表于 2013-12-19 09:37 static/image/common/back.gif
何不将程序贴上来?
一般将程序进行研究编组,这样可以一次撤销
(command "_.undo" "be")
可以一次撤销,就是撤销的时候出现很多“(LISP 表达式)”