找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5671|回复: 22

[求助] [求助]:在LISP程序里无法搞定Esc键

[复制链接]
发表于 2004-5-9 17:07:32 | 显示全部楼层 |阅读模式

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

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

×
我编的一个LISP小程序,当提示“输入XX<退出>:”时,按回车键就正常退出了,如果按Esc键,退是退出了,但“对象捕捉”
来不及恢复,全部清空了,图层也退不回去运行此程序前的图层
了!等等。更苦恼的是我已经习惯用Esc键了。555!谁能救我?!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-9 17:17:00 | 显示全部楼层
程序主体中定义自己的*error*出错处理函数,同时保存一些原系统变量值(保存现场),在自定义出错处理函数中恢复保存的各系统变量(恢复现场)。如:
(defun c:dp ()

  (command "_.undo" "_begin")

  (setq        old_err        *error*
        *error*        dp_err
  )
...
(setq old_osmode (getvar "osmode"))
  (setq old_lunits (getvar "lunits"))      
  (setq old_luprec (getvar "luprec"))
  (setq old_dimzin (getvar "dimzin"))
..
)

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

使用道具 举报

 楼主| 发表于 2004-5-13 11:47:15 | 显示全部楼层
哇噻!老大,这种问题你都能解决。莫非是个中高手?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-13 12:19:00 | 显示全部楼层
我编的lsp程序需要在某张图纸中存入一些数据,并且付给变量,包括数字和字符,希望在存盘退出后再进入本章图纸时这些变量的值还存在,而且我可以付给变量新值。有朋友说可以用xdata,请问我可以用entget将这些数据放在某个实体上,但是怎样提取又怎样输入呢?555,帮帮我
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-15 07:55:21 | 显示全部楼层
最初由 mhy007 发布
[B]哇噻!老大,这种问题你都能解决。莫非是个中高手? [/B]

错误处理函数要短,要快,否则,它也会被ESC中断的,因为它也是一段程序。
To:yanxinbo67
你的问题可以将数据存为LDATA数据或XRDATA数据,可以参考下面的帖子
http://www.xdcad.net/forum/showt ... d=250104#post250104
http://www.xdcad.net/forum/showt ... y=&pagenumber=1
http://www.xdcad.net/forum/showt ... d=251409#post251409
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-15 15:15:31 | 显示全部楼层
这个问题真的很及时,我也碰到同意的问题,没法解决,esc是
一种错误吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-7-18 16:42:01 | 显示全部楼层
esc退出也困扰了我好久,比如写一个lisp程序标楼号,这个标楼号的程序可以循环的,一直可以往下标,用了循环while,就是想标一直往下标,也不知道有多少个可标,退出正常可以用空格或者回车,但是自己经常习惯用ESC,本来系统变量恢复在while后面,而ESC后直接终止了,恢复函数无法执行,导致了cad的系统变量(如捕捉)无法恢复到原值,如何处理这种错误?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-7-18 20:01:05 | 显示全部楼层
lisp这个语言实在是太怪了,esc键出错控制是个怪胎,虽然搞了好多lisp,但还是觉得lisp这个语言蹩脚至极,让人很难受。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2008-8-23 23:56:36 | 显示全部楼层
有办法:
首先在命令开始时保存现场数值,再自定义一个*error*函数,函数中设置陷阱,一旦捕捉到“ESC”中断错误,立即执行恢复现场数据的程序,然后退出。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-9-3 11:51:43 | 显示全部楼层
关于*error*程序,个人认为这正是vlisp最灵活最强大的特色之处,一个vlisp程序员如果不会运用*error*来使他的程序健壮完善,就像一个篮球运动员不会三步上篮一样。
至于*error*程序的大小,个人认为通常它不必要很大,但一般来说不必担心Esc会中断*error*,因为*error*本身就是在出现错误(包括ESC事件也被认为是错误的一种)后被调用的,也就是说,*error*运行在Esc事件结束之后,不存在被Esc中断之说,即便是在*error*运行过程中再次按下Esc,只要还没有运行到尾句(setq *error* nil),其结果仍是递归调用*error*,这里就涉及到了*error*在递归情况下的写法,属于更高一点的应用了。
总的来说,好的vlisp程序员应该学会利用*error*,试着爱上*error*


本人常用的一段错误处理函数,欢迎讨论指正

;;; ===================== error checking======================

(defun Lionel:err()
  (if (boundp *error*) (setq Old_err *error*))
  (defun *error* (msg)
  (if (not (member msg
              (list "console break" "Function cancelled" "quit / exit abort" "函数被取消")))
    (princ (strcat "错误:" msg "\n") )
    (princ)
  );if
  (if (boundp 'cmdecho_old) (setvar "cmdecho" cmdecho_old) )
  (if (boundp 'osmode_old) (setvar "osmode" osmode_old) )
  (command "_.undo" "_e")
  (setq *error* Old_err Old_err nil)
  (princ)
  );defun *error*
);defun
;;; =================end of error checking ===================
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-3 15:41:32 | 显示全部楼层
四年前的帖子都翻出来了!这几年偶还是没有完全解决这个问题。虽然不是每次都清空捕捉设置,但是还是有大约30%的时候还是会清空,忍着忍着就过了四年。。。试试lionyoyo同学的方法看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-9-3 16:58:46 | 显示全部楼层
我也发个我常用的错误处理程序..

  1.   [FONT=courier new]
  2. ;;;m_redraw----高亮显示的目标
  3. ;;;m_delss-----在程序运行时生成的临时物体
  4. ;;;m_hbdraw-----在程序中设置此值来确定是否在出错后重绘图形;;;m_setFirst------程序运行中的临时选择集
  5. (defun hb_error        (a /)
  6.   (if
  7.     (not
  8.       (member a
  9.               '("函数被取消" "Function cancelled" "quit / exit abort")
  10.       )
  11.     )
  12.      (princ a)
  13.   )
  14.   (if m_redraw
  15.     (cond
  16.       ((member (type m_redraw) (list 'ename ))
  17.        (redraw m_reDraw 4)
  18.        (setq m_reDraw nil)
  19.       )
  20.       ((= (type m_redraw) 'list)
  21.        (MAPCAR '(LAMBDA (itm) (redraw itm 4))
  22.                m_redraw
  23.        )
  24.        (setq m_reDraw nil)
  25.       )
  26.     )
  27.   )
  28.   (if m_hbdraw
  29.     (redraw)
  30.   )
  31.   (if m_delss
  32.     (progn
  33.       (vl-cmdf "_.erase" m_delss "")
  34.       (setq m_delss nil)
  35.     )
  36.   )
  37.   (if m_setFirst
  38.     (sssetfirst nil nil)
  39.   )
  40.   (HB_SETVAR m_lst)  ;_m_lst为初始化时所保存的系统变量值
  41.   (setq *error* olderr)
  42.   (vla-EndUndoMark VLAXDOC)
  43. )
  44.   [/FONT]


下面是2个参考函数

  1.   [FONT=courier new]
  2. ;;;本函数为初始化程序,在程序的开始和结束时加载.
  3. ;;;例: 在程序头(hb_start '(("CMDECHO" . 0)("OSMODE" . 0)) t)
  4. ;;;在程序尾(hb_start nil nil)
  5. (defun hb_start        (lst is /)
  6.   (if is
  7.     (progn
  8.       (vla-StartUndoMark vlaxDoc)
  9.       (setq m_lst (HB_SETVAR lst))
  10.       (setq *error* hb_error)
  11.     )
  12.     (progn
  13.       (setq *error* olderr)
  14.       (HB_SETVAR m_lst)
  15.       (vla-EndUndoMark VLAXDOC)
  16.     )
  17.   )
  18. )  

  19. ;;;设置系统变量
  20. (defun hb_setVar (lst / rel)
  21.   (foreach itm lst
  22.     (setq rel (cons (cons (car itm) (getvar (car itm))) rel))
  23.     (setvar (car itm) (cdr itm))
  24.   )
  25.   rel
  26. )

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

使用道具 举报

已领礼包: 2026个

财富等级: 金玉满堂

发表于 2008-9-4 18:17:41 | 显示全部楼层
这可能是初学者都会遇到的问题,关注着。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-9-9 11:23:58 | 显示全部楼层
这问题困惑了我很久,居然给古墓派的发现秘诀了,学习学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:27 , Processed in 0.416652 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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