明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7192|回复: 22

[已解答] 怎样在使用_.UNDO时取消命令栏提示?

[复制链接]
发表于 2013-12-18 21:00:05 | 显示全部楼层 |阅读模式
2明经币
怎样在使用_.UNDO时取消命令栏多余“ (LISP 表达式)” 提示?
因为lisp里面带了undo be 跟undo e,使用程序的时候执行了一个循环1000多遍的代码,撤销的时候命令栏就出现了1000多遍“(LISP 表达式)”的提示,怎样让多余的“(LISP 表达式)”这句话不显示?
求高手解答出现这么多“(LISP 表达式)”的原因。
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-12-18 21:00:06 | 显示全部楼层
;;你这样试试
  1. (defun c:et ()
  2.   (command "_.undo" "be")
  3.   (setvar "cmdecho" 0)
  4.   (setq ptlist1 nil)
  5.   (setq ss (ssget '((0 . "INSERT"))))
  6.   (setq ss0 (sort-se (sort-se ss 10 1 50 nil) 10 0 2 nil))
  7.   (setq sct (sslength ss))
  8.   (setq        x1 0
  9.         x2 0
  10.   )
  11.   (setq        ss1 ss0
  12.         ss2 ss0
  13.   )
  14.   (repeat sct
  15.     (setq sent (entget (ssname ss1 x1)))
  16.     (setq ascd10 (assoc 10 sent))
  17.     (setq ptlist1 (cons ascd10 ptlist1))
  18.     (setq x1 (1+ x1))
  19.   )
  20.   (etmove)
  21.   (command "_.undo" "e")
  22.   (prin1)
  23. )
  24. (defun etmove ()
  25.   (setvar "cmdecho" 0)
  26.   (setq ptlist2 ptlist1)
  27.   (repeat sct
  28.     (setq acx10 (cdr (car ptlist2)))
  29.     (setq ptlist2 (cdr ptlist2))
  30.     (setq sn (ssname ss2 x2))
  31.     (setq sent2 (entget sn))
  32.     (setq acy10 (cdr (assoc 10 sent2)))
  33.     (command "_move" sn "" acy10 acx10)
  34.     (setq x2 (1+ x2))
  35.   )
  36.   (setvar "cmdecho" 1)
  37. )

点评

麻烦黄大师了,虽然还是没解决,最佳答案给你吧  发表于 2013-12-19 17:11
回复

使用道具 举报

发表于 2013-12-19 09:22:06 | 显示全部楼层
没有源码,不好准确判断,一般说来,这是Undo e位置使用不当所致,undobe使用在程序的开始,undoe使用在程序的结尾和出错处理函数*error*中,都要在循环外,如果是程序本体循环,可以把程序设置为子函数,任何使用主函数调用子函数,循环子函数,Undo处理放在子函数以外。

评分

参与人数 1明经币 +1 收起 理由
菜卷鱼 + 1 虽然还是没有解决,但还是谢谢你的回答

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-12-19 09:27:03 | 显示全部楼层
ll_j 发表于 2013-12-19 09:22
没有源码,不好准确判断,一般说来,这是Undo e位置使用不当所致,undobe使用在程序的开始,undoe使用在程序 ...

我已经试过将UNDO E 放在子程序里,一样 ,谢谢你的提醒,我再去多试一试
回复

使用道具 举报

发表于 2013-12-19 09:34:31 | 显示全部楼层
菜卷鱼 发表于 2013-12-19 09:27
我已经试过将UNDO E 放在子程序里,一样 ,谢谢你的提醒,我再去多试一试

unde e不能放在循环内,这是要点。
回复

使用道具 举报

发表于 2013-12-19 09:37:28 | 显示全部楼层
何不将程序贴上来?
一般将程序进行研究编组,这样可以一次撤销
(command "_.undo" "be")
lisp
(command "_.undo" "e")
回复

使用道具 举报

 楼主| 发表于 2013-12-19 10:43:19 | 显示全部楼层
本帖最后由 菜卷鱼 于 2013-12-19 10:51 编辑
  1. (defun c:et ()
  2. (setvar "cmdecho" 0)
  3. (setq ptlist1 nil)
  4. (setq ss (ssget  '( (0 . "INSERT")) ))

  5. (setq ss0 (sort-se (sort-se ss 10 1 50 nil) 10 0 2 nil ))

  6. (setq sct (sslength ss))
  7. (setq x1 0 x2 0)
  8. (setq ss1 ss0 ss2 ss0)
  9. (repeat sct
  10. (setq sent (entget (ssname ss1 x1 )))
  11. (setq ascd10 (assoc 10 sent))
  12. (setq ptlist1 (cons ascd10 ptlist1))
  13. (setq x1 (1+ x1))
  14. )
  15. (etmove)
  16. (prin1)
  17. )

  18. (defun etmove ( )
  19. (setvar "cmdecho" 0)
  20. (command "_.undo" "be")
  21. (setq ptlist2  ptlist1)
  22. (repeat sct
  23. (setq acx10 (cdr (car ptlist2)))
  24. (setq ptlist2 (cdr ptlist2))
  25. (setq sn (ssname ss2 x2 ) )
  26. (setq sent2 (entget sn))
  27. (setq acy10 (cdr (assoc 10 sent2)))
  28. (command "_move" sn "" acy10 acx10  )
  29. (setq x2 (1+ x2))
  30. )
  31. (command "_.undo" "e")
  32. (setvar "cmdecho" 1)
  33. )

  34. ;;;;;;通用排序程序,来自明经论坛
  35. (vl-load-com)
  36. (defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
  37.   ;;建立排序列表
  38.   (setq LST '() INDEX 0)
  39.   (repeat (sslength SE)
  40.     (setq ENT (entget (ssname SE INDEX))
  41. TMP (cdr (assoc DXF ENT)) )

  42.     (if (and INT (= (type INT) 'INT) (= (type TMP) 'list)(< INT (length TMP)) )
  43.         (setq TMP (nth INT TMP)))

  44.     (setq LST (cons (list TMP (cdr (assoc 5 ENT))) LST))
  45.     (setq INDEX (1+ INDEX)));;排序操作

  46.   (if (and FUZZ
  47.   (or (= (type FUZZ) 'INT)
  48.       (= (type FUZZ) 'REAL))
  49.   (or (= (type TMP) 'INT) (= (type TMP) 'REAL)))
  50.     (setq NEWLST
  51. (vl-sort LST (function (lambda (E1 E2) (< (+ (car E1) FUZZ) (car E2)))
  52. )))
  53.     (setq NEWLST
  54. (vl-sort LST (function (lambda (E1 E2) (< (car E1) (car E2))))
  55. )))         ;;如果K为T,则倒置
  56.   (if K (setq NEWLST (reverse NEWLST)))
  57.   (setq NEWSE (ssadd))
  58.   (foreach TMP NEWLST
  59.     (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
  60. )   ;;返回值  NEWSE ;_结束defun;;;
  61. )
  62. ;;;;示例:
  63. ;(SORT-SE SS 10 0 5.0 T);;;;;;;;;
  64. ;表示按照10组码的X坐标值进行排序,允许偏差值为5.0,顺序为从大到小;;;;;;;
  65. ;(SORT-SE SS 10 1 3.0 NIL);;;;;;;
  66. ;表示按照10组码的Y坐标值进行排序,允许偏差值为3.0,顺序为从小到大;;;;;;
  67. ;(SORT-SE SS 8 NIL NIL NIL);;;;;;;
  68. ;表示按照8组码值(图层名称)进行排序,顺序为从小到大;;;;;;
  69. (prin1)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2013-12-19 10:50:35 | 显示全部楼层
菜卷鱼 发表于 2013-12-19 10:43

问题就是Undo处理放在循环中了。
Undobe和Undoe应该放在c:et的首尾,而不是子函数的首尾。
回复

使用道具 举报

 楼主| 发表于 2013-12-19 10:54:23 | 显示全部楼层
ll_j 发表于 2013-12-19 10:50
问题就是Undo处理放在循环中了。
Undobe和Undoe应该放在c:et的首尾,而不是子函数的首尾。

我一开始就是放在c:et的首尾的,听了你之前的建议我才放到子程序的首尾的
回复

使用道具 举报

 楼主| 发表于 2013-12-19 10:57:36 | 显示全部楼层
自贡黄明儒 发表于 2013-12-19 09:37
何不将程序贴上来?
一般将程序进行研究编组,这样可以一次撤销
(command "_.undo" "be")

可以一次撤销,就是撤销的时候出现很多“(LISP 表达式)”

点评

我试过了,没有你说的这种情况  发表于 2013-12-19 14:33
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-25 14:34 , Processed in 0.194118 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表