明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2279|回复: 5

[经验] 发一个具有系统变量、捕捉设置错误自动恢复的代码模版

[复制链接]
发表于 2014-10-16 17:28:10 | 显示全部楼层 |阅读模式
  1. (vl-load-com)

  2. (defun p-error-handler (s)
  3.   (if (or (= s "Function cancelled")
  4.     (= s "quit / exit abort")
  5.     (= s "函数被取消")
  6.       )
  7.     (princ)
  8.     (princ s)
  9.   )
  10.   (while (not (equal (getvar "CMDNAMES") "")) (command nil))
  11.   (p-osnap-restore)
  12.   (p-undogroup-end)
  13.   (p-error-end)
  14.   (princ)
  15. )


  16. (defun p-osnap-disable ()
  17.   ;; g-saved-osmode - 全局变量
  18.   ;; 保存捕捉状态,仅保存第一次调用p-osnap-disable时的osmode 值
  19.   (if (null g-saved-osmode)
  20.     (setq g-saved-osmode (getvar "osmode"))
  21.   )
  22.   ;; 禁用捕捉
  23.   (if (< g-saved-osmode 16384)
  24.     (setvar "osmode" (+ g-saved-osmode 16384))
  25.   )
  26. )


  27. (defun p-osnap-restore ()
  28.   ;; 仅当g-saved-osmode值不为nil时才进行恢复
  29.   (if (not (null g-saved-osmode))
  30.     (progn
  31.       (setvar "osmode" g-saved-osmode)
  32.       (setq g-saved-osmode nil)
  33.     )
  34.   )
  35. )


  36. (defun p-undogroup-start ()
  37.   ;; g-undogroup-started - 全局变量
  38.   (if (not g-undogroup-started)
  39.     (progn
  40. ;;;      (command ".undo" "BE")
  41.       (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  42.       (setq g-undogroup-started t)
  43.     )
  44.   )
  45. )


  46. (defun p-undogroup-end ()
  47.   (if g-undogroup-started
  48. ;;;    (command ".undo" "E")
  49.     (progn
  50.       (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  51.       (setq g-undogroup-started nil)
  52.     )
  53.   )
  54. )


  55. (defun p-safe-setvars (pairs / changed name old value)
  56.   (foreach pair  pairs
  57.     (setq name  (car pair)
  58.     value  (cdr pair)
  59.     old  (getvar name)
  60.     )
  61.     ;; 如果old = nil,可能是当前CAD版本不支持该变量
  62.     ;; 此时放弃对变量进行修改
  63.     (if  old
  64.       (progn
  65.   (setq changed (cons (cons name old) changed))
  66.   (setvar name value)
  67.       )
  68.     )
  69.   )
  70.   changed ;_ 返回旧值列表
  71. )


  72. (defun p-error-start (vars /)
  73.   (setq g-saved-sysvars (p-safe-setvars vars))
  74. )


  75. (defun p-error-end ()
  76.   (if g-saved-sysvars
  77.     (progn
  78.       (p-safe-setvars g-saved-sysvars)
  79.       (setq g-saved-sysvars nil)
  80.     )
  81.   )
  82. )


  83. (defun c:test (/ *error* p1 p2)
  84.   (defun *error* (s)
  85.     (p-error-handler s)
  86.     ;; TODO:在此增加额外的错误恢复处理....
  87.   )

  88.   ;; 需要设置其它系统变量在表中增加,p-error-end 函数自动恢复旧值
  89.   (p-error-start '(("CMDECHO" . 0)))

  90.   ;; TODO: 增加用户交互代码,如getpoint getreal getkword...
  91.   (setq  p1 (getpoint)
  92.   p2 (getpoint)
  93.   )

  94.   (p-undogroup-start) ;_根据需要增加,后续内容将改变图形数据库

  95.   (p-osnap-disable) ;_根据需要增加,要在用户交互代码之后,受影响的绘图过程前调用

  96.   ;; TODO:在此增加用户过程
  97.   (command ".LINE" p1 p2 "")

  98.   (p-osnap-restore) ;_与p-osnap-disable成对使用

  99.   (p-undogroup-end) ;_与p-undogroup-start成对使用
  100.   (p-error-end)
  101.   (princ)
  102. )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-10-16 17:46:12 | 显示全部楼层
谢谢楼主分享。
发表于 2014-10-16 21:18:41 | 显示全部楼层
lisp要达到自由的境界不可能啊,各有各的招数,顶一个
发表于 2014-10-16 21:48:46 来自手机 | 显示全部楼层
顶起,又学一招
发表于 2014-10-16 22:28:21 | 显示全部楼层
先收了,有空再看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-28 04:27 , Processed in 0.137353 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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