找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2331|回复: 13

[每日一码] 程序開頭與結尾的寫法?

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-30 15:14:52 | 显示全部楼层 |阅读模式

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

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

×
參考XYP1964與EACHY版主的函數,及fsxm的意見,寫了如下的函數.
請問兩種對error的處理有何區別?

  1. ;;; ==================================================================
  2. (defun tfterr (errmsg)
  3.   (if (not (member errmsg '("console break" "Function Cancelled")))
  4.     (princ (strcat "\nError: " errmsg))
  5.   )
  6.   (tft-end)
  7. )
  8. (defun tft-begin (varlst)               ; varlst为系统变量表如'("cmdecho"
  9.                                        ; "osmode")或nil
  10.   (command "undo" "be")
  11.   (setq *#$*sysvarnl*#$* varlst)
  12.   (setq errtmp *error*)
  13.   (setq *error* tfterr)
  14.   (if *#$*sysvarnl*#$*
  15.     (setq *#$*svarl*#$* (mapcar
  16.                           'getvar
  17.                           *#$*sysvarnl*#$*
  18.                         )
  19.     )
  20.   )
  21.   (princ)
  22. )
  23. (defun tft-end ()
  24.   (command ".undo" "E")
  25.   (if *#$*svarl*#$*
  26.     (mapcar
  27.       'setvar
  28.       *#$*sysvarnl*#$*
  29.       *#$*svarl*#$*
  30.     )
  31.   )
  32.   (setq *error* errtmp)
  33.   (setq *#$*sysvarnl*#$* nil
  34.         *#$*svarl*#$* nil
  35.         errtmp nil
  36.   )
  37.   (princ)
  38. )
  39. ;;; ==================================================================
  40. (defun tt-begin (varlst)               ; varlst为系统变量表如'("cmdecho"
  41.                                        ; "osmode")或nil
  42.   (command "undo" "be")
  43.   (setq *#$*sysvarnl*#$* varlst)
  44.   (defun myerr (errmsg)
  45.         (if (not (member errmsg '("console break" "Function Cancelled")))
  46.       (princ (strcat "\nError: " errmsg))
  47.     )
  48.     (tt-end)
  49.   )
  50.   (setq errtmp *error*)
  51.   (setq *error* myerr)
  52.   (if *#$*sysvarnl*#$*
  53.     (setq *#$*svarl*#$* (mapcar
  54.                           'getvar
  55.                           *#$*sysvarnl*#$*
  56.                         )
  57.     )
  58.   )
  59.   (princ)
  60. )
  61. (defun tt-end ()
  62.   (command ".undo" "E")
  63.   (if *#$*svarl*#$*
  64.     (mapcar
  65.       'setvar
  66.       *#$*sysvarnl*#$*
  67.       *#$*svarl*#$*
  68.     )
  69.   )
  70.   (setq *error* errtmp)
  71.   (setq *#$*sysvarnl*#$* nil
  72.         *#$*svarl*#$* nil
  73.         errtmp nil
  74.   )
  75.   (princ)
  76. )
  77. ;;; ==================================================================

评分

参与人数 1D豆 +6 收起 理由
XDSoft + 6 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2013-6-6 21:17:14 | 显示全部楼层
本帖最后由 taner 于 2013-6-6 21:38 编辑
  1. <div class="blockcode"><blockquote>;;; 严重声明,大部份是抄来的,抄的时候没记录出处
  2. ;;; 用法:(p-s '("osmode" 0 "cmdecho"  0 ...) t)
  3. (defun p-s (varlst mark)
  4.   (setq undo$mark mark)
  5.   (if undo$mark
  6.     (th-undos)
  7.   )
  8.   (defun myerr (errmsg)
  9.     (if (not (wcmatch (strcase errmsg t) "*break,*cancel*,*exit*"))
  10.       (princ (strcat "\nError: " errmsg))
  11.     )
  12.     (p-e)
  13.   )
  14.   (setq errtmp *error*)
  15.   (setq *error* myerr)
  16.   (if varlst
  17.     (setq *#$*sysvarnl*#$* (th-sysvar-change varlst))
  18.   )
  19.   (princ)
  20. )
  21. (defun p-e ()
  22.   (if undo$mark
  23.     (th-undoe)
  24.   )
  25.   (if *#$*sysvarnl*#$*
  26.     (th-sysvar-change *#$*sysvarnl*#$*)
  27.   )
  28.   (setq *error* errtmp)
  29.   (setq *#$*sysvarnl*#$* nil
  30.         errtmp nil
  31.         undo$mark nil
  32.   )
  33.   (princ)
  34. )
  35. (defun th-undos ()
  36.   (th-undoe)
  37.   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  38. )
  39. (defun th-undoe ()
  40.   (while (= 8 (logand 8 (getvar 'undoctl)))
  41.     (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  42.   )
  43. )
  44. (defun th-sysvar-change        (lst / sys-tmp)        ; 返回改变前的系统变量值表
  45.   (if (= (type lst) 'list)
  46.     (mapcar
  47.       (function        (lambda        (x)
  48.                   (setq        sys-tmp        (append
  49.                                   sys-tmp
  50.                                   (list (car x))
  51.                                   (list (getvar (car x)))
  52.                                 )
  53.                   )
  54.                   (setvar (car x) (cadr x))
  55.                 )
  56.       )
  57.       (txt-lst-split lst 2)
  58.     )
  59.   )
  60.   sys-tmp
  61. )

  62. (defun txt-lst-split (li n / return a len)
  63.   (while li
  64.     (setq a   nil
  65.           len (length li)
  66.     )
  67.     (repeat (if        (<= n len)
  68.               n
  69.               len
  70.             )
  71.       (setq a  (cons (car li) a)
  72.             li (cdr li)
  73.       )
  74.     )
  75.     (setq return (cons (reverse a) return))
  76.   )
  77.   (reverse return)
  78. )

评分

参与人数 1D豆 +6 收起 理由
XDSoft + 6 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

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

使用道具 举报

发表于 2007-3-5 21:25:30 | 显示全部楼层
我也对这种*开头的变量感到晕菜,高手介绍一二。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2007-7-27 10:11:41 | 显示全部楼层

  1.   [FONT=courier new]
  2. ;;; valst为表如'(("odmode" 1)("cmdecho" 0)...)或nil。
  3. ;;;如果主程序中沒有用COMMAND命令,則在主程序运行的起
  4. ;;;始位置加一个无谓的command,如“(command "color" "")”。
  5. (defun lovett (varlst  / sysnamelst valuelst)
  6.   (command "undo" "be")
  7.   (if varlst
  8.     (setq *#$*sysvarnl*#$* (mapcar
  9.                              'car
  10.                              varlst
  11.                            )
  12.           sysnamelst *#$*sysvarnl*#$*
  13.           valuelst (mapcar
  14.                      'cadr
  15.                      varlst
  16.                    )
  17.     )
  18.   )
  19.   (defun myerr (errmsg)
  20.     (if (not (member errmsg '("console break" "Function Cancelled")))
  21.       (princ (strcat "\nError: " errmsg))
  22.     )
  23.     (hatett)
  24.   )
  25.   (setq errtmp *error*)
  26.   (setq *error* myerr)
  27.   (if *#$*sysvarnl*#$*
  28.     (progn
  29.       (setq *#$*svarl*#$* (mapcar
  30.                             'getvar
  31.                             *#$*sysvarnl*#$*
  32.                           )
  33.       )
  34.       (mapcar
  35.         'setvar
  36.         sysnamelst
  37.         valuelst
  38.       )
  39.     )
  40.   )
  41.   (princ)
  42. )
  43. (defun hatett ()
  44.       (command ".undo" "E")
  45.     (if *#$*svarl*#$*
  46.     (mapcar
  47.       'setvar
  48.       *#$*sysvarnl*#$*
  49.       *#$*svarl*#$*
  50.     )
  51.   )
  52.   (setq *error* errtmp)
  53.   (setq *#$*sysvarnl*#$* nil
  54.         *#$*svarl*#$* nil
  55.         errtmp nil
  56.   )
  57.   (princ)
  58. )
  59.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-7-27 11:54:58 | 显示全部楼层
一般的小功能程序,实在没有必要做得这么复杂。
将错误消除在内部才是正道。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-7-29 16:49:58 | 显示全部楼层
(command ".undo" "E")
没有必要写进去,根据需要加。有些函数不希望调用命令的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2007-7-31 08:13:46 | 显示全部楼层

  1. ;;;看看明經上的一段文章
  2. 一个完善的程序应该有较好的出错处理,这是在所有Lisp教材上都提及的,但程序的Undo处理就说得很少或没有提及。
  3.     其实Undo处理对程序来说也是非常重要的,尤其对有较多输出的复杂程序而言,不能解决Undo问题,使用起来会极不方便。
  4.     对于Undo问题的解决,一种方法是尽量少用或不用command函数,即不调用原始命令,这是一种较好的方法,但必须注意的是,一段程序必须至少有一次调用command函数,否则Undo命令将取消程序运行前的前一次命令,解决的方法是在程序运行的起始位置加一个无谓的command,如“(command "color" "")”。
  5.     有时不使用command函数不能达到我们要求的一些功能,或使得程序过于复杂,我们可能需要使用一些command函数(原始命令),这是就应该在程序中进行Undo处理,即使用Undo命令的编组功能。
  6.     例五是一段程序出错函数与Undo处理的示例。
  7. ************************************************
  8. ;;例五
  9. (defun newerr (s)                                    ;出错函数
  10.   (if s
  11.     (progn
  12.       (term_dialog)                                 ;使用对话框时使用
  13.       (if olderr (setq *error* olderr))             ;出错函数恢复
  14.       (if oldvar (setvar ... oldvar))               ;系统变量恢复
  15.       (if olderr (setq *error* olderr))             ;出错函数恢复
  16.       (command "_.undo" "_e")                       ;Undo编组结束
  17.     )
  18.   )
  19.   (princ)
  20. )

  21. (defun c:my(/ ...)                                  ;主程序(主函数)
  22.   (setvar "cmdecho" 0)                              ;取消命令回显提示
  23.   (command "_.undo" "_BE")                          ;Undo编组开始
  24.   (setq olderr *error* *error* newerr)              ;调用自定义出错函数
  25.   (setq oldvar (getvar ...))                        ;保存相关系统变量
  26.   (setvar ...                                       ;设置系统变量
  27.   ...                                               ;程序段
  28.   ...
  29.   (setvar ... oldvar)                               ;恢复系统变量
  30.   (setq *error* olderr)                             ;恢复出错函数
  31.   (command "_.undo" "_E")                           ;结束Undo命令编组
  32.   (princ)                                           ;取消程序返回值
  33. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-7-31 12:02:59 | 显示全部楼层
看了这么多,我也帖一个自己的。

  1. ;;______存储系统变量______
  2. (defun cmdme0 (/ *syslst* *sysval* *acaddoc* )
  3.   (vl-load-com)
  4.   (setq *acaddoc* (vla-get-activedocument (vlax-get-acad-object)))
  5.   (setq        *syslst* '("AUNITS"          "AUTOSNAP"         "AUPREC" ;|"DRAWORDERCTL"|;   "ATTDIA"
  6.                    "BLIPMODE"          "CECOLOR"         "CELTYPE"        "CELTSCALE"    "CELWEIGHT"
  7.                    "CLAYER" ;|"CENTERMT"|;         "CHAMFERA"        "CHAMFERB"     "CHAMFERC"
  8.                    "CHAMFERD"          "CHAMMODE"         "CIRCLERAD"        "CMDECHO"      "CMLSCALE"
  9.                    "CMLSTYLE"          "CTAB"         "CURSORSIZE" ;|"DBLCLKEDIT"|; "FILEDIA"
  10.                    "FILLETRAD"          "FILLMODE" ;|"HPGAPTOL"|;        "HPANG"               "HIGHLIGHT"
  11.                    "LUNITS"          "NOMUTT"         "PICKFIRST"        "TEXTSTYLE"    "Tilemode"
  12.                    "OSMODE"          "ORTHOMODE"         "PLINEWID"        "PELLIPSE"     "PROXYGRAPHICS"
  13.                    "LTSCALE"          "PSLTSCALE"         "INSUNITS"        "SNAPANG"      "qaflags"
  14.                   )
  15.   )
  16.   (setq *sysval* (mapcar 'getvar *syslst*))
  17.   (vlax-ldata-put "Sys-Me" "sysval" *sysval*)
  18.   (vlax-ldata-put "Sys-Me" "syslst" *syslst*)
  19.   (setvar "cmdecho" 0)
  20.   (vla-startundomark *acaddoc*)
  21. )
  22. ;;______还原系统变量______
  23. (defun cmdme1 (/ *syslst* *sysval* *acaddoc* old_time new_time)
  24.   (setvar "cmdecho" 1)
  25.   (term_dialog)
  26.   (redraw)
  27.   (setq        *syslst*  (vlax-ldata-get "Sys-Me" "syslst")
  28.         *sysval*  (vlax-ldata-get "Sys-Me" "sysval")
  29.         *acaddoc* (vla-get-activedocument (vlax-get-acad-object))
  30.   )
  31.   (mapcar 'setvar *syslst* *sysval*)
  32.   (vla-endundomark *acaddoc*)
  33.   (and (vlax-ldata-get "Dream.Fei" "Dcl_name")
  34.        (vl-file-size (vlax-ldata-get "Dream.Fei" "Dcl_name"))
  35.        (not(vl-file-delete (vlax-ldata-get "Dream.Fei" "Dcl_name")))
  36.        (princ "\n有临时dcl文件存在,但该文件无法被删除")
  37.   )
  38.   (princ)
  39. )

  40. 应用:
  41. (defun c:test(/ *olderr* *myerr*)
  42. (defun *myerr* (msg)
  43.   (and (/= msg "Function canceled")
  44.          (/= msg "quit / exit abort")
  45.          (princ (strcat "\nError: " msg))
  46.   )
  47.   (cmdme1)
  48. )
  49. (setq *olderr* *error*)
  50. (setq *error*  *myerr*)
  51. (cmdme0)
  52. .........
  53. (cmdme1)
  54. )

一:需要还原哪些变量可以自己定,而且很方便。
二:没有全局变量,省得冲突。
三:有没有对话框都可以直接(terM_dialog)没啥影响。
四:不使用command命令.

vl-file-*** 段是用来假设如果有临时的dcl文件。一般动态生成的dcl我都是存在那个东东里面。

----
至于5楼所说的,我也这样觉得。
但问题是,这个是系统初始和还原,与程序大小没什么必然联系,这只不过是为了通用而写。

另外一个疑惑就是 *error* 函数的使用,我一直想写个通用的,但没搞得定。还望版主们出手给个点子。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2007-8-3 08:47:23 | 显示全部楼层
请教一下,(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))与(command "undo" "be")有啥区别?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-6-7 12:28:54 | 显示全部楼层
确实,一些简单的程式不需要把头尾搞得太复杂,应该视情况而定。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 02:48 , Processed in 0.346145 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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