找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1638|回复: 10

[求助] [求助]:小lsp就把我难倒了,请教安全退出的lsp设置。

[复制链接]
发表于 2005-6-18 18:49:48 | 显示全部楼层 |阅读模式

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

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

×
小妹刚学lisp,别笑话。呵呵。

请教如何设置lisp,使得启动命令后,开始或中途Esc和空格等取消操作能够安全退出。即没有错误提示,也不进行变量或值的更改。

正在看书中……
如果高手有空请帮忙解答一下。。

下面是两个小小测试程序。

;多段线编辑
(defun c:ee()
(setvar "cmdecho" 1)
(command "_pedit" "m" (ssget) "" "y" "j" "" "")
)


;第一点打断
(defun c:brf()
  (setvar "cmdecho" 1)
  (command "break" pause "f" pause "@")
  (setvar "cmdecho" 0)
  (princ)
)



[启动brf,后按Esc]

命令行提示:

命令: brf break 选择对象: *取消*
命令: ; 错误: *error* 函数中出错no function definition: SETOSM


[启动brf,后按空格]

命令行提示:

命令: brf break 选择对象:
命令: f 未知命令“F”。按 F1 查看帮助。

;然后,cmdecho变量被设置为1了。




[启动ee,后按Esc]

命令行提示:

命令: ee _pedit 选择多段线或 [多条(M)]: m
选择对象: *取消*
; 错误: *error* 函数中出错no function definition: SETOSM

选择对象: *取消*


[启动ee,后按空格]

命令行提示:

命令:  EE _pedit 选择多段线或 [多条(M)]: m
选择对象:
选择对象:
命令: EE 未知命令“EE”。按 F1 查看帮助。

命令: y 未知命令“Y”。按 F1 查看帮助。

命令: j 未知命令“J”。按 F1 查看帮助。

命令: EE 未知命令“EE”。按 F1 查看帮助。

命令: EE 未知命令“EE”。按 F1 查看帮助。

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

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2005-6-21 09:52:21 | 显示全部楼层
定义如下两个函数SetIErr,ReErr,在程序开始前使用SetIErr,结束时使用ReErr,例如:
(Defun Test ()
    (SetIerr)
     .
     .
     .
    (ReErr)
    (princ)
  )

定义函数如下:

(DEFUN SetIErr (/ sv)
  (if (or (= 'LIST (type *Error*)))
         (alert "ERROR  :THE LAST (SETiERR) FUNCTION HAS NO (ReErr)!")
        (PROGN
          (SETQ *SVARL* '())
          (FOREACH SV *SYSVARNL*
            (SETQ *SVARL* (CONS (GETVAR SV) *SVARL*))
            )
          (FOREACH SV '("ATTDIA" "BLIPMODE" "CMDECHO" "DIMZIN"
                        "OSMODE" "ORTHOMODE" "MIRRTEXT")
            (SETVAR SV 0)
            )
          
          (SETVAR "EXPERT" 5)
         (SETVAR "CECOLOR" "BYLAYER")
         (SETVAR "celtype" "BYLAYER")
        ; (if SetScale () (InitMap))

          (defun *error* (st) (if selections (cancel-s)) (reerr)(princ))
          )
         )
    )

(defun ReErr ()
  (if (or (= 'LIST (type *error*)) (= 'SUBR (type *error*)) (= 'USUBR (type *error*)))
         (PROGN (MAPCAR 'SETVAR *SYSVARNL* (REVERSE *SVARL*))
           (SETQ  *Error* nil)
           )
         (ALERT "ERROR  : NO (SETIERR)!")
         )
(PRINC)
   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-27 17:19:56 | 显示全部楼层
感谢两位帮忙。努力中……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-27 18:33:59 | 显示全部楼层
对于SetIErr函数将OSMODE设为0并不好,只有画线取点时才需设为0。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-6-29 11:31:03 | 显示全部楼层
当程序出错时自动运行/转入出错处理程序,
可由用户定义的错误处理函数
(*error* string)

如果 *error* 不为 nil,则当 AutoLISP 的错误条件出现时,就会执行其中的定义,并由 AutoCAD 传给它一个包含错误信息的字符串作为参数。
用户 *error* 函数可以不带参数调用 command 函数(如 (command))。这样可以取消前面由 command 函数执行的 AutoCAD 命令。

返回值

除使用 vl-exit-with-value 外,本函数无返回值。

样例

如下函数与标准 AutoLISP 出错处理执行相同的任务,打印“错误:”和错误信息:

(defun *error* (msg)
  (princ "错误:")
  (princ msg)
  (princ)

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

使用道具 举报

 楼主| 发表于 2006-12-19 23:38:21 | 显示全部楼层
能用不同的方法加入出错处理,完善这两个程序吗?边城实在不行。谢谢啦。到现在还没学会。平时也没能挤出点时间好好学学。

;多段线编辑
(defun c:ee()
(setvar "cmdecho" 1)
(command "_pedit" "m" (ssget) "" "y" "j" "" "")
)

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2006-12-20 12:57:37 | 显示全部楼层
COMMAND 函数内部最好不要出现交互操作。其参数放到command函数执行之前完成。
对command执行的条件进行判断,把不能执行的条件过滤掉。

把8楼的代码修改后,如下:
[PHP]

;;;多段线编辑
(defun c:ee (/ s1)
    (setq CMDOLD (getvar "CMDECHO"))
    (setvar "CMDECHO" 0)

    (princ "\n将多条线连接。\n请选择要添加的对象...")
    (setq s1 (ssget))
    (if        (= nil s1)
        (princ "\n选择集为空,正常退出。")
        (command "_pedit" "m" s1 "" "y" "j" "" "")
    )

    (setvar "CMDECHO" CMDOLD)
    (princ)
)


;;;第一点打断
(defun c:brf (/ ENT1 PT)
    (setq CMDOLD (getvar "CMDECHO"))
    (setvar "CMDECHO" 0)

    (if        (setq ENT1 (entsel "请选择一个对象: "))
        (if (SETQ PT
                     (getpoint "\n指定打断点:")
            )
            (command "break" ENT1 "f" PT "@")
        )
    )

    (setvar "CMDECHO" CMDOLD)
    (princ)
)

;;;自定义错误处理函数
(defun *error* (msg)
    (princ "MY错误:")
    (princ msg)
    (if        (or (= CMDOLD 0) (= CMDOLD 1))
        (setvar "CMDECHO" CMDOLD)
    )
    (princ)
)
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-4 19:13:49 | 显示全部楼层
先谢谢 zml84  了。另外也同样谢谢热心的朋友。
这段“自定义错误处理函数”程序在一些小程序里面可以通用吗?

另外,我想恢复默认的错误处理和捕捉,按照下面(打下划线部分)做可以吗?



;;;多段线编辑
(defun c:ee (/ s1)
    [U](setq os (getvar "osmode") olderr *error*)[/U]
    (setq CMDOLD (getvar "CMDECHO"))
    (setvar "CMDECHO" 0)

    (princ "\n将多条线连接。\n请选择要添加的对象...")
    (setq s1 (ssget))
    (if        (= nil s1)
        (princ "\n选择集为空,正常退出。")
        (command "_pedit" "m" s1 "" "y" "j" "" "")
    )

    (setvar "CMDECHO" CMDOLD)
    [U](setq *error* olderr)[/U]
    [U](setvar "osmode" os)[/U]     
    (princ)
)


;;;第一点打断
(defun c:brf (/ ENT1 PT)
    (setq os (getvar "osmode") olderr *error*)
    (setq CMDOLD (getvar "CMDECHO"))
    (setvar "CMDECHO" 0)

    (if        (setq ENT1 (entsel "请选择一个对象: "))
        (if (SETQ PT
                     (getpoint "\n指定打断点:")
            )
            (command "break" ENT1 "f" PT "@")
        )
    )

    (setvar "CMDECHO" CMDOLD)
    (setq *error* olderr)
    (setvar "osmode" os)
    (princ)
)

;;;自定义错误处理函数
(defun *error* (msg)
    (princ "MY错误:")
    (princ msg)
    (if        (or (= CMDOLD 0) (= CMDOLD 1))
        (setvar "CMDECHO" CMDOLD)
    )
    (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-26 19:30:46 | 显示全部楼层
我想你可能已经通过测试,你的这个思想是完全可以的。
<br>
可以到通用函数板块中找到好多诸如此类的好东东。
积极吸收前人的经验,在学习中就可以少走弯路。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 19:21 , Processed in 0.201465 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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