找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3227|回复: 17

[求助] 新手关于UNDO的问题

[复制链接]

已领礼包: 685个

财富等级: 财运亨通

发表于 2013-8-24 23:19:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
  1. (defun c:1()
  2. (setvar "cmdecho" 0)
  3.    (command "")
  4. (setq pt1 (getpoint"\n---->请输入文字起点:  "))
  5. (setq txt (getstring"\n---->请输入文字内容:  "))
  6. (entmake (list '(0 . "TEXT")(CONS 10 pt1) (CONS 40 2.5) (cons 1 txt)))
  7.    
  8. (princ)   
  9.    )
以上代码生成一行单行文字

问题来了:
我在运行完这段代码的时候输入U   回退的时候,会把我之前的一次操作也一起U掉了
当然,如果中间加个  (command "undo"  "b")     (command "undo"  "be")   的话就没有这样的问题

但是加了(command "undo"  "b")     (command "undo"  "be") 后
我在这段(setq txt (getstring"\n---->请输入文字内容:  "))  按了ECS之后(也是就是中断程序)
后面的 (command "undo"  "be")没被执行到,所以就没法按U回退
这样很麻烦

我知道可以加个错误处理,(新手只看了些资料,还没学会呢)但觉得这样很麻烦....哪位大神有更好的办法吗?  指点一下吧  谢谢了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-24 23:49:28 | 显示全部楼层
你说的都挺明白了,你只能把 (command "undo"  "be") 放到错误处理函数立面了,处理你按ESC时候。

点评

能不能详解一下关于错误处理函数  详情 回复 发表于 2013-8-25 20:31
问题是还是看不懂有关于错误处理的用法~~~  详情 回复 发表于 2013-8-25 10:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-8-25 07:00:45 来自手机 | 显示全部楼层
加个包装
  1. (defun c:tt ()
  2.     (command "undo" "b")
  3.     (vl-catch-all-apply
  4.          (function
  5.              (lambda ()
  6.                 ;;以下为你的主程序
  7.               
  8.               )
  9.            )
  10.         )
  11.         (command   "undo"  "end")
  12.         (princ)
  13. )

点评

谢谢你的热心回答, 能说一下原理吗?  详情 回复 发表于 2013-8-25 10:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-8-25 10:42:08 | 显示全部楼层
newer 发表于 2013-8-24 23:49
你说的都挺明白了,你只能把 (command "undo"  "be") 放到错误处理函数立面了,处理你按ESC时候。

问题是还是看不懂有关于错误处理的用法~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-8-25 10:42:40 | 显示全部楼层

谢谢你的热心回答,
能说一下原理吗?

点评

通俗说,lisp是逐句执行的,中断时后面的语句不再执行,这个catch内的语句可以理解为一句,但是特殊的是这句中断了lisp只返回错误,不中断整个程序,后面的语句继续执行  详情 回复 发表于 2013-8-25 12:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-8-25 12:05:41 来自手机 | 显示全部楼层
ysq101 发表于 2013-8-25 10:42
谢谢你的热心回答,
能说一下原理吗?


通俗说,lisp是逐句执行的,中断时后面的语句不再执行,这个catch内的语句可以理解为一句,但特殊的是catch内中断时,该句只返回错误,不中断整个程序,后面的语句继续执行

点评

有一点明白了...谢谢了啊~~~  详情 回复 发表于 2013-8-25 12:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-8-25 12:20:02 | 显示全部楼层
eachy 发表于 2013-8-25 12:05
通俗说,lisp是逐句执行的,中断时后面的语句不再执行,这个catch内的语句可以理解为一句,但特殊的是c ...

有一点明白了...谢谢了啊~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-8-25 13:18:20 | 显示全部楼层
最简单的undo处理是最前面加一个“无聊”的command:
  1. (defun c:1 ()
  2.   (command "color" "")
  3.   (setq pt1 (getpoint "\n---->请输入文字起点:  "))
  4.   (setq txt (getstring "\n---->请输入文字内容:  "))
  5.   (entmake (list '(0 . "TEXT")
  6.                  (CONS 10 pt1)
  7.                  (CONS 40 2.5)
  8.                  (cons 1 txt)
  9.            )
  10.   )
  11.   (princ)
  12. )



点评

[*](defun c:1() [*](setvar "cmdecho" 0) [*] (command "") [*](setq pt1 (getpoint"\n---->请输入文字起点: ")) 看清梦我第三行了吗?我是加了了个COMMAND的,只是我没有把“无聊”的  详情 回复 发表于 2013-8-25 16:45
我也是看了长老的文章才知道的。 你比我发的快了一步哈哈  详情 回复 发表于 2013-8-25 13:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-25 13:24:00 | 显示全部楼层
ll_j 发表于 2013-8-25 13:18
最简单的undo处理是最前面加一个“无聊”的command:

我也是看了长老的文章才知道的。 你比我发的快了一步哈哈
  1. (defun c:1()
  2.     (setvar "cmdecho" 0)
  3.     (command "_color" "")
  4.     (setq pt1 (getpoint"\n---->请输入文字起点:  "))
  5.     (setq txt (getstring"\n---->请输入文字内容:  "))
  6.     (entmake (list '(0 . "TEXT")(cons 10 pt1) (cons 40 2.5) (cons 1 txt)))
  7.     (princ)
  8. )

点评

只能说你和长老是:英雄所见略同 高手就是高手啊~  详情 回复 发表于 2013-8-25 16:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-8-25 16:45:57 | 显示全部楼层
ll_j 发表于 2013-8-25 13:18
最简单的undo处理是最前面加一个“无聊”的command:


  •                                
    登录/注册后可看大图
    (defun c:1()

  •                                
    登录/注册后可看大图
    (setvar "cmdecho" 0)

  •                                
    登录/注册后可看大图
       (command "")     

  •                                
    登录/注册后可看大图
    (setq pt1 (getpoint"\n---->请输入文字起点:  "))





    看清梦我第三行了吗?我是加了了个COMMAND的,只是我没有把“无聊”的命令加上去
    我记得我曾经在哪见过样的写法。。。只是没有加上实际命令加上去。。。。
    一句话,不懂就是不懂啊!!!!!
    谢谢长老指点!!!!


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2013-8-25 16:47:42 | 显示全部楼层
wowan1314 发表于 2013-8-25 13:24
我也是看了长老的文章才知道的。 你比我发的快了一步哈哈

只能说你和长老是:英雄所见略同   {:soso_e113:}


高手就是高手啊~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-8-25 17:18:29 | 显示全部楼层
ysq101 发表于 2013-8-25 16:45
  • (defun c:1()
  • (setvar "cmdecho" 0)

  • 其实你的第二行设置cmdecho的代码不应该出现在这里,或者说不应该这样出现。
    多数情况下,我们都是设置cmdecho为0的,这样就应该有一个文件专门放置这些设置,比如我的acad.lsp的开头是这样:
    1. (defun S::STARTUP()
    2.   (setvar "cmdecho" 0)
    3.   (defun *ERROR*(msg)
    4.     (if msg
    5.       (progn
    6.         (princ "error:")
    7.         (princ msg)
    8.         (setvar "highlight" 1)
    9.         (setvar "cmdecho" 0)
    10.         (terpri)
    11.       )
    12.     )
    13.   )
    14.   (command "undefine" "end")
    15.   (setvar "modemacro" "??")     ;可以在右下角显示一个提示词
    16.   (gc)
    17.   (princ)
    18. )

    这样,每次打开文件都自动设置cmdecho为0。
    如果某个程序中需要对部分变量进行特别设计,应该在开始先保存变量,然后再设置,程序结束前(包括出错)进行恢复。

    发一个“无聊”的命令是最简单的UNDO处理,一般在程序中没有其它使用command的情况下,命令虽无聊,但还是要“说清楚”的,但一个空回车输入是不行的。

    点评

    先谢谢你的热心回答 每次打开文件都自动设置cmdecho为0。 像我这些常用COMMAND新手来说,有时候设置cmdecho为1 会更方便找出程序的错误哦  详情 回复 发表于 2013-8-25 20:29
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 1268个

    财富等级: 财源广进

    发表于 2013-8-25 17:59:23 来自手机 | 显示全部楼层
    一般都是写独立程序而且command也是尽量不用,对这个*error*就很少用,一般情况用catch包装,万不得以的时候才正常的定义myerr, 其实也可以用autodesk定义的*meerr*来自: Android客户端

    点评

    *error* 可是很人性化的, 毕竟不是你一个人在用这个LISP 而且你不知道用户在什么时候会按ESC 所以弄个错误处理还是很有必要的 以上是新手的见解  详情 回复 发表于 2013-8-25 20:27
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 685个

    财富等级: 财运亨通

     楼主| 发表于 2013-8-25 20:27:31 | 显示全部楼层
    st788796 发表于 2013-8-25 17:59
    一般都是写独立程序而且command也是尽量不用,对这个*error*就很少用,一般情况用catch包装,万不得以的时 ...

    *error*   可是很人性化的,    毕竟不是你一个人在用这个LISP   
    而且你不知道用户在什么时候会按ESC    所以弄个错误处理还是很有必要的
    以上是新手的见解
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 685个

    财富等级: 财运亨通

     楼主| 发表于 2013-8-25 20:29:28 | 显示全部楼层
    ll_j 发表于 2013-8-25 17:18
    其实你的第二行设置cmdecho的代码不应该出现在这里,或者说不应该这样出现。
    多数情况下,我们都是设置c ...

    先谢谢你的热心回答



    每次打开文件都自动设置cmdecho为0。  

    像我这些常用COMMAND新手来说,有时候设置cmdecho为1  
    会更方便找出程序的错误哦
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

    GMT+8, 2024-9-25 08:36 , Processed in 0.493066 second(s), 67 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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