明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9118|回复: 11

真奇怪呀,我的扑捉点老是自动取消

  [复制链接]
发表于 2011-9-10 17:26:22 | 显示全部楼层 |阅读模式
我在用坛子里面很多lsp程序后,扑捉命令全不取消,必须等重新设置一下,如果只用,刚刚设置的就又没有了,求高手们门诊一下呀 谢谢
发表于 2011-9-13 12:56:44 | 显示全部楼层
本帖最后由 cabinsummer 于 2011-9-13 12:58 编辑

其实这些程序的开发者没有完全理解操作者的习惯。
应该定义一个错误处理函数,用以恢复异常中断命令时的环境设置。
  1. (defun myerr(msg)
  2.   (command "undo" "e")
  3.   (setvar "osmode" os)
  4.   (setq *error* olderr)
  5. )

在主程序里应该有
  1. (defun c:mycmd(/ os olderr)
  2.   (setvar "cmdecho" 0)
  3.   (command "undo" "be")
  4.   (setq os (getvar "osmode"))
  5.   (setq olderr *error*)
  6.   (setq *error* myerr)
  7. ;;;用户代码
  8. ;;;(setvar "osmode" 0)
  9.   (myerr)
  10. )


回复 支持 1 反对 0

使用道具 举报

发表于 2011-9-11 14:06:48 | 显示全部楼层
我也是经常运到这样的情况
 楼主| 发表于 2011-9-12 10:18:45 | 显示全部楼层
求个高手们指点呀
发表于 2011-9-13 11:15:57 | 显示全部楼层
插件用多了,有些插件运行过程中会取消你的捕捉,你按esc取消运行这个插件的时候,你的捕捉也就被取消了,建议少用垃圾插件,如什么什么人工具中有许多命令会取消你的捕捉
楼主如果还是要用,建筑写个自用的捕捉,丢失时,恢复一下,如我个人使用
(defun c:y()
(command "osmode" "4847")
(princ "\n 已恢复愿望树自用捕捉变量!")
(princ)
  )
 楼主| 发表于 2011-9-14 22:26:21 | 显示全部楼层
cabinsummer 发表于 2011-9-13 12:56
其实这些程序的开发者没有完全理解操作者的习惯。
应该定义一个错误处理函数,用以恢复异常中断命令时的环 ...

请问  兄台  是把你的代码加在程序里面还是独立  谢谢

点评

加在里面  发表于 2011-9-14 22:29
发表于 2011-9-14 22:30:35 | 显示全部楼层
inhoo0 发表于 2011-9-14 22:26
请问  兄台  是把你的代码加在程序里面还是独立  谢谢

你可以贴一个小程序,我给你稍微改一下,并做上注释
 楼主| 发表于 2011-9-14 23:05:43 | 显示全部楼层
  1. (defun c:eb()     ;erase box
  2.     (setvar "cmdecho" 0 )
  3.     (setvar "osmode"  0 )
  4.     (setvar "regenmode" 0)
  5.     (command "layer" "off" "cen" "")
  6.     (command "layer" "off" "dqx" "")
  7.     (setq pt1 (getpoint "\n???:"))
  8.     (setq pt2 (getcorner pt1 "\n???:"))
  9. (while ( or (not(eq pt1 nil))(not(eq pt2 nil)))
  10.     (setq s nil)
  11.     (setq s(ssget "c" pt1 pt2))
  12.     (while (= s nil)
  13.            (progn
  14.               (alert "???????????????!")
  15.               (setq pt1 (getpoint "\n???:"))
  16.               (setq pt2 (getcorner pt1 "\n???:"))
  17.               (setq s(ssget "c" pt1 pt2))
  18.            )
  19.     )
  20.     (if (> (sslength s) 25)
  21.         (progn
  22.              (alert "??????????!!!!")
  23.              (quit)
  24.          )
  25.     )
  26.     ;(princ "\n???????????????,?????:")
  27.     ;(setq s_w (ssget))
  28.     ;(if (= s_w nil)
  29.     ;    (setq s_w (ssadd))
  30.     ;)
  31.     (setq max_x(max (car  pt1) (car  pt2))
  32.           max_y(max (cadr pt1) (cadr pt2))
  33.           min_x(min (car  pt1) (car  pt2))
  34.           min_y(min (cadr pt1) (cadr pt2))
  35.     )
  36.    
  37.     (setq sline (ssadd))
  38.     (setq i0 0)
  39.     (while (ssname s i0)
  40.            (if (= (cdr (assoc 0 (entget (ssname s i0)))) "LINE")
  41.                (ssadd (ssname s i0) sline)
  42.            )
  43.            (setq i0 (+ i0 1 ))
  44.     )
  45.     (setq int_list (list))
  46.     (while (ssname sline 0)
  47.            (setq pta  (cdr (assoc 10 (entget (ssname sline 0)))))
  48.            (setq ptb  (cdr (assoc 11 (entget (ssname sline 0)))))
  49.            (ssdel (ssname sline 0) sline)
  50.            (setq k 0)
  51.            (while (ssname sline k)
  52.                   (setq ptk1  (cdr (assoc 10 (entget (ssname sline k)))))
  53.                   (setq ptk2  (cdr (assoc 11 (entget (ssname sline k)))))
  54.                   (setq int(inters pta ptb ptk1 ptk2 ))
  55.                   (if (and ( > (car  int) min_x)
  56.                            ( < (car  int) max_x)
  57.                            ( > (cadr int) min_y)
  58.                            ( < (cadr int) max_y)
  59.                       )
  60.                       (setq int_list(cons int int_list))
  61.                   )
  62.                   (setq k (+ k 1))
  63.            )
  64.      )

  65.      (setq a        (car int_list))
  66.      (while a
  67.            (setq a1(list(+(car a) 0.00000000001)(+(cadr a) 0.00000000001)))
  68.            (setq a2(list(-(car a) 0.00000000001)(-(cadr a) 0.00000000001)))
  69.            (setq vl (ssget "c" a1 a2 ))
  70.            (setq ii 0)
  71.            (while (ssname vl ii)
  72.                   ;(if (not(ssmemb(ssname vl ii) s_w))
  73.                      ; (progn
  74.                          (setq ent (ssname vl ii))
  75.                          (command "break" ent a "@")
  76.                       ;)
  77.                   ;)
  78.                   (setq ii (+ ii 1 ))
  79.            )
  80.            (setq int_list (cdr int_list))
  81.            (setq a        (car int_list))
  82.       )
  83.            
  84.       (setq del_line (ssget "w" pt1 pt2))
  85.       (if del_line
  86.           (command "erase" del_line "")
  87.        )
  88.        (setq pt1 (getpoint "\n???:"))
  89.        (if (eq pt1 nil)
  90.           (setq pt2 nil)
  91.           (setq pt2 (getcorner pt1 "\n???:"))
  92.        )
  93. );while
  94.       (command "layer" "on" "cen" "")
  95.       (command "layer" "on" "dqx" "")
  96.       (setvar "regenmode" 0)
  97.       (SETVAR "OSMODE" 32)
  98.       (REDRAW)
  99.       (princ "\n????.????")
  100.       (princ)
  101. )
坛子里面的  就这个  你看看

点评

好多问号啊  发表于 2011-9-14 23:14
 楼主| 发表于 2011-9-14 23:06:26 | 显示全部楼层
cabinsummer 发表于 2011-9-14 22:30
你可以贴一个小程序,我给你稍微改一下,并做上注释

兄台  你帮忙看看

点评

见10楼注释  发表于 2011-9-14 23:34
发表于 2011-9-14 23:33:31 | 显示全部楼层
本帖最后由 cabinsummer 于 2011-9-14 23:37 编辑

  1. ;;;定义错误处理函数
  2. (defun myerr(msg)          ;;参数msg必须有
  3.   (command "undo" "e")     ;;undo定义结束
  4.   (setvar "osmode" os)     ;;恢复主函数中保存的osmode状态
  5.   (setvar "regenmode" rg)  ;;恢复主函数中保存的regenmode状态
  6.   (setq *error* olderr)    ;;恢复系统错误处理函数原始定义
  7. )

  8. ;;;定义主函数
  9. ;;;主函数中要对系统错误处理函数进行重新定义
  10. (defun c:eb(/ os rg olderr)          ;;加入局部参数os、rg和olderr,以避免多次运行程序时全局参数互相干扰
  11.     (setvar "cmdecho" 0 )
  12.     (command "undo" "be")            ;;undo定义开始,"be"与"e"配对使用。可以undo一次到be定义的位置
  13.     (setq os (getvar "osmode"))      ;;在给osmode参数赋值前先将当前状态保存到局部变量os中
  14.     (setq rg (getvar "regenmode"))   ;;在给regenmode参数赋值前先将当前状态保存到局部变量rg中
  15.     (setq olderr *error*)            ;;在重新定义系统错误处理函数*error*先保存*error*的原始定义
  16.     (setq *error* myerr)             ;;重新定义系统错误处理函数为自己定义的函数myerr
  17.     (setvar "osmode"  0 )
  18.     (setvar "regenmode" 0)
  19.     (command "layer" "off" "cen" "")
  20.     (command "layer" "off" "dqx" "")
  21.     (setq pt1 (getpoint "\n???:"))
  22.     (setq pt2 (getcorner pt1 "\n???:"))
  23. (while ( or (not(eq pt1 nil))(not(eq pt2 nil)))
  24.     (setq s nil)
  25.     (setq s(ssget "c" pt1 pt2))
  26.     (while (= s nil)
  27.            (progn
  28.               (alert "???????????????!")
  29.               (setq pt1 (getpoint "\n???:"))
  30.               (setq pt2 (getcorner pt1 "\n???:"))
  31.               (setq s(ssget "c" pt1 pt2))
  32.            )
  33.     )
  34.     (if (> (sslength s) 25)
  35.         (progn
  36.              (alert "??????????!!!!")
  37.              (quit)
  38.          )
  39.     )
  40.     ;(princ "\n???????????????,?????:")
  41.     ;(setq s_w (ssget))
  42.     ;(if (= s_w nil)
  43.     ;    (setq s_w (ssadd))
  44.     ;)
  45.     (setq max_x(max (car  pt1) (car  pt2))
  46.           max_y(max (cadr pt1) (cadr pt2))
  47.           min_x(min (car  pt1) (car  pt2))
  48.           min_y(min (cadr pt1) (cadr pt2))
  49.     )
  50.    
  51.     (setq sline (ssadd))
  52.     (setq i0 0)
  53.     (while (ssname s i0)
  54.            (if (= (cdr (assoc 0 (entget (ssname s i0)))) "LINE")
  55.                (ssadd (ssname s i0) sline)
  56.            )
  57.            (setq i0 (+ i0 1 ))
  58.     )
  59.     (setq int_list (list))
  60.     (while (ssname sline 0)
  61.            (setq pta  (cdr (assoc 10 (entget (ssname sline 0)))))
  62.            (setq ptb  (cdr (assoc 11 (entget (ssname sline 0)))))
  63.            (ssdel (ssname sline 0) sline)
  64.            (setq k 0)
  65.            (while (ssname sline k)
  66.                   (setq ptk1  (cdr (assoc 10 (entget (ssname sline k)))))
  67.                   (setq ptk2  (cdr (assoc 11 (entget (ssname sline k)))))
  68.                   (setq int(inters pta ptb ptk1 ptk2 ))
  69.                   (if (and ( > (car  int) min_x)
  70.                            ( < (car  int) max_x)
  71.                            ( > (cadr int) min_y)
  72.                            ( < (cadr int) max_y)
  73.                       )
  74.                       (setq int_list(cons int int_list))
  75.                   )
  76.                   (setq k (+ k 1))
  77.            )
  78.      )
  79.      (setq a        (car int_list))
  80.      (while a
  81.            (setq a1(list(+(car a) 0.00000000001)(+(cadr a) 0.00000000001)))
  82.            (setq a2(list(-(car a) 0.00000000001)(-(cadr a) 0.00000000001)))
  83.            (setq vl (ssget "c" a1 a2 ))
  84.            (setq ii 0)
  85.            (while (ssname vl ii)
  86.                   ;(if (not(ssmemb(ssname vl ii) s_w))
  87.                      ; (progn
  88.                          (setq ent (ssname vl ii))
  89.                          (command "break" ent a "@")
  90.                       ;)
  91.                   ;)
  92.                   (setq ii (+ ii 1 ))
  93.            )
  94.            (setq int_list (cdr int_list))
  95.            (setq a        (car int_list))
  96.       )
  97.            
  98.       (setq del_line (ssget "w" pt1 pt2))
  99.       (if del_line
  100.           (command "erase" del_line "")
  101.        )
  102.        (setq pt1 (getpoint "\n???:"))
  103.        (if (eq pt1 nil)
  104.           (setq pt2 nil)
  105.           (setq pt2 (getcorner pt1 "\n???:"))
  106.        )
  107. );while
  108.       (command "layer" "on" "cen" "")
  109.       (command "layer" "on" "dqx" "")
  110. ;;;      (setvar "regenmode" 0)      此行可以注释掉
  111. ;;;      (setvar "osmode" 32)        此行可以注释掉
  112.       (myerr)                        ;;;程序结束前恢复系统原始状态
  113.       (REDRAW)
  114.       (princ "\n????.????")
  115.       (princ)
  116. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 13:50 , Processed in 0.177338 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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