1. lisp的开头怎么写,相信很多的新手都有这个疑问,当然具体的还是需要学习别人写的代码
    2. ;带错误恢复捕捉的程序开头和结尾写法
    3. (defun c:tt( / )
    4. (vl-load-com)
    5. ;错误恢复捕捉
    6. (defun *MYERR* (MSG)
    7. (setvar "CMDECHO" CMD_OLD)
    8. (setvar "OSMODE" OS_OLD)
    9. (setq *ERROR* *OLDERR*)
    10. (if (= MSG "完美退出。谢谢使用。")
    11. (princ (strcat "\\n>>>" MSG))
    12. (princ "\\n>>>虽然中途退出了,对象捕捉已经被恢复。")
    13. )
    14. (princ)
    15. )
    16. (setq *OLDERR* *ERROR*
    17. *ERROR* *MYERR*
    18. OS_OLD (getvar "OSMODE")
    19. CMD_OLD (getvar "CMDECHO")
    20. )
    21. ;----开始系统变量备份----
    22. (setvar "cmdecho" 0);_关闭命令提示
    23. (command "._undo" "_begin")
    24. (setq osmode_bak (getvar "osmode"));_记录捕捉
    25. (setvar "osmode" 0);_关闭捕捉
    26. (setq clayer_bak (getvar "clayer"));_记录当前图层
    27. ;----绘制部分开始----
    28. (你的程序)
    29. ;----操作中需要开启捕捉,就增加代码----(setvar "osmode" 【一个数值,具体多少,先打钩捕捉点,再看系统变量osmode】)
    30. ;----绘制部分结束----
    31. ;----结束系统变量还原----
    32. (setvar "osmode" osmode_bak);_还原捕捉
    33. (setvar "clayer" clayer_bak);_还原图层
    34. (command "._undo" "_end")
    35. (setvar "cmdecho" 1);_打开命令提示
    36. (princ);_关闭程序返回值
    37. );_程序结束
    38. (princ "\n**********春婵程序加载完成,启动命令:tt **********")
    39. (princ "\n")
    1. (command "._undo" "_begin")
    2. 意外退出时没有恢复undo end,会导致无法使用U回退
    3. 另外在本程序定义*error*可以采用局部函数形式,没必要做*error*函数备份(备份也行,略显啰嗦),一般做备份的是跨函数调用
    4. ;;取消捕捉
    5. (defun try-osmode0(/ os*error*)
    6. (defun os*error* (MSG)
    7. (if try-osmode (setvar "osmode" try-osmode))
    8. (setq try-osmode nil *error* *#error#*)
    9. )
    10. (setq *#error#* *error* *error* os*error*)
    11. (setq try-osmode (getvar "osmode"));记录捕捉系统变量
    12. (if (< try-osmode 16384)(setvar "osmode" (+ try-osmode 16384)));判断是否启用了捕捉
    13. ;按F3关闭捕捉
    14. )
    15. ;;恢复捕捉
    16. (defun try-osmode1()
    17. (setvar "osmode" try-osmode)
    18. (setq try-osmode nil *error* *#error#*)
    19. )
    20. 我是这样写的,两个函数分别放在开头和结尾,因为独立函数调用,所以才备份*error*,但是我现在基本不用,因为应用场景极少
    21. (defun c:tt ()
    22. (try-osmode0)
    23. 你的程序
    24. (try-osmode1)
    25. )

    (setvar “osmode” 0);
    捕捉设置为0是误人子弟
    正确的做法应该是判断用F3来关闭,随便改变原有设置是非常不负责任的做法
    (setq try-osmode (getvar “osmode”));记录捕捉系统变量
    (if (< try-osmode 16384)(setvar “osmode” (+ try-osmode 16384)));判断是否启用了捕捉,关闭捕捉