找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2367|回复: 8

[求助] 请教,vl-catch-all-apply方法之后如何判断是esc还是回车?

[复制链接]
发表于 2013-4-17 19:29:57 | 显示全部楼层 |阅读模式

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

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

×
就是怎么根据vl-catch-all-error-message的返回消息判断是按了esc,还是按了回车、空格或右键,然后分别处理?

评分

参与人数 1D豆 +4 收起 理由
XDSoft + 4 出题引导交流奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-4-17 19:54:10 | 显示全部楼层
问题提的太笼统!请举出具体实例,以便帮你分析!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-17 20:29:29 | 显示全部楼层

[pcode=lisp,true];;;错误处理教程-1
(defun c:tt1 (/  varlst var_old var_new)
  (defun *error* (inf)
    (setq inf (strcase inf t)) ;将出错信息转换为小写字符串
    (cond
         ((wcmatch inf "*break,*cancel*,*exit*,*取消*") ;|按了<Esc>键出错处理|;
           (princ "\n用户按了<Esc>强制退出\n")
           (mapcar 'setvar varlst var_old)
          )
        (t ;|其余错误处理|;
            (princ (strcat "\n" inf))
            (mapcar 'setvar varlst var_old)
        )
    ) ;_ 结束cond
    (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
    (princ)
  ) ;_ 结束defun
  (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq varlst '("osmode")
           var_new '(0)
           var_old (mapcar 'getvar varlst)
  ) ;_ 结束setq
  (mapcar 'setvar varlst var_new)
  (princ "\n按<Esc>强制退出, <空格>/<Enter>/<右键>错误...")
  (rtos (getreal "\n请输入实数:"));出错后转到内部自定义的*error*函数
  (mapcar 'setvar varlst var_old)
  (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  (princ)
) ;_ 结束defun
;;;错误处理教程-2
(defun c:tt2 (/ err inf varlst var_old var_new)
   (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
   (setq err (vl-catch-all-apply
                                     '(lambda ()
                                                  (setq varlst  '("osmode")
                                                          var_new '(0)
                                                          var_old (mapcar 'getvar varlst)
                                                    ) ;_ 结束setq
                                                   (mapcar 'setvar varlst var_new)
                                                   (princ "\n按<Esc>强制退出, <空格>/<Enter>/<右键>错误...")
                                                   (rtos (getreal "\n请输入实数:"))
                                        ) ;_ 结束lambda
                       ) ;_ 结束vl-catch-all-apply
  ) ;_ 结束setq
  (if (vl-catch-all-error-p err)
          (progn ;|出错处理|;
            (setq inf (strcase (vl-catch-all-error-message err) t)) ;将出错信息转换为小写字符串
            (cond ((wcmatch inf "*break,*cancel*,*exit*,*取消*") ;|按了<Esc>键出错处理|;
            (princ "\n用户按了<Esc>强制退出\n")
            (mapcar 'setvar varlst var_old)
            (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
           )
           (t ;|其余错误处理|;
            (princ (strcat "\n" inf))
            (mapcar 'setvar varlst var_old)
            (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
           )
            ) ;_ 结束cond
            (princ)
          ) ;_ 结束progn
          (progn ;|程序正常运行完毕的处理|;
            (princ "\n")
            (mapcar 'setvar varlst var_old)
            (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
            (princ)
          ) ;_ 结束progn
  ) ;_ 结束if
) ;_ 结束defun[/pcode]

在上面两个出错处理函数教程中,vl-catch-all-apply方法之后按<Esc>强制退出与<空格>/<Enter>/<右键>都是一同退出,我想加一个判断,如果是按<Esc>就强制退出,按<空格>/<Enter>/<右键>就执行其它代码而不退出,关键是vl-catch-all-apply方法之后如何判断是esc还是回车?

评分

参与人数 1D豆 +2 收起 理由
XDSoft + 2 出题引导交流奖!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2013-4-17 20:34:31 | 显示全部楼层
yx5277 发表于 2013-4-17 20:29
;;;错误处理教程-1
(defun c:tt1 (/  varlst var_old var_new)
  (defun *error* (inf)

上述代码来自于出错处理案例解析 [url]http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85081&fromuid=219579[/url]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-4-17 20:47:04 | 显示全部楼层
yx5277 发表于 2013-4-17 20:34
上述代码来自于出错处理案例解析 http://bbs.mjtd.com/forum.php?mod=viewthread&tid=85081&fromuid=2195 ...

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

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-4-17 22:09:11 | 显示全部楼层
增加循环可以满足你的要求吧!
[pcode=lisp,true](defun c:tt2 (/ err inf varlst var_old var_new)
  (vla-StartUndoMark
        (vla-get-ActiveDocument (vlax-get-acad-object))
  )
  (setq con t)
  (while con
        (setq
          err
           (vl-catch-all-apply
                 '(lambda ()
                        (setq varlst  '("osmode")
                                  var_new '(0)
                                  var_old (mapcar 'getvar varlst)
                        ) ;_ 结束setq
                        (mapcar 'setvar varlst var_new)
                        (princ "\n按<Esc>强制退出, <空格>/<Enter>/<右键>错误...")
                        (rtos (getreal "\n请输入实数:"))
                        (setq con nil)
                  ) ;_ 结束lambda
           ) ;_ 结束vl-catch-all-apply
        ) ;_ 结束setq
        (if        (vl-catch-all-error-p err)
          (progn ;|出错处理|;
                (setq inf (strcase (vl-catch-all-error-message err) t))
                                                                                ;将出错信息转换为小写字符串
                (cond ((wcmatch inf "*break,*cancel*,*exit*,*取消*")
                           ;|按了<Esc>键出错处理|;
                           (princ "\n用户按了<Esc>强制退出\n")
                           (mapcar 'setvar varlst var_old)
                           (vla-EndUndoMark
                                 (vla-get-ActiveDocument (vlax-get-acad-object))
                           )
                           (setq con nil)
                          )
                          (t ;|其余错误处理|;
                           (princ (strcat "\n" inf))
                           (mapcar 'setvar varlst var_old)
                           (vla-EndUndoMark
                                 (vla-get-ActiveDocument (vlax-get-acad-object))
                           )
                          )
                ) ;_ 结束cond
                (princ)
          ) ;_ 结束progn
          (progn ;|程序正常运行完毕的处理|;
                (princ "\n")
                (mapcar 'setvar varlst var_old)
                (vla-EndUndoMark
                  (vla-get-ActiveDocument (vlax-get-acad-object))
                )
                (princ)
          ) ;_ 结束progn
        ) ;_ 结束if
  );_ 结束while
) ;_ 结束defun
[/pcode]

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

发表于 2013-4-17 22:54:36 | 显示全部楼层
想的太多,既然Catch了,按最终结果处理,没必要再分情况
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-18 16:41:29 | 显示全部楼层
zhang8755 发表于 2013-4-17 22:09
增加循环可以满足你的要求吧!
(defun c:tt2 (/ err inf varlst var_old var_new)
  (vla-StartUndoMark
...

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

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-4-18 19:56:22 | 显示全部楼层
本帖最后由 zhang8755 于 2013-4-18 19:58 编辑

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 13:23 , Processed in 0.244314 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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