inhoo0 发表于 2011-9-10 17:26:22

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

我在用坛子里面很多lsp程序后,扑捉命令全不取消,必须等重新设置一下,如果只用,刚刚设置的就又没有了,求高手们门诊一下呀 谢谢

cabinsummer 发表于 2011-9-13 12:56:44

本帖最后由 cabinsummer 于 2011-9-13 12:58 编辑

其实这些程序的开发者没有完全理解操作者的习惯。
应该定义一个错误处理函数,用以恢复异常中断命令时的环境设置。
(defun myerr(msg)
(command "undo" "e")
(setvar "osmode" os)
(setq *error* olderr)
)
在主程序里应该有
(defun c:mycmd(/ os olderr)
(setvar "cmdecho" 0)
(command "undo" "be")
(setq os (getvar "osmode"))
(setq olderr *error*)
(setq *error* myerr)
;;;用户代码
;;;(setvar "osmode" 0)
(myerr)
)

戏男 发表于 2011-9-11 14:06:48

我也是经常运到这样的情况

inhoo0 发表于 2011-9-12 10:18:45

求个高手们指点呀

l64631778 发表于 2011-9-13 11:15:57

插件用多了,有些插件运行过程中会取消你的捕捉,你按esc取消运行这个插件的时候,你的捕捉也就被取消了,建议少用垃圾插件,如什么什么人工具中有许多命令会取消你的捕捉
楼主如果还是要用,建筑写个自用的捕捉,丢失时,恢复一下,如我个人使用
(defun c:y()
(command "osmode" "4847")
(princ "\n 已恢复愿望树自用捕捉变量!")
(princ)
)

inhoo0 发表于 2011-9-14 22:26:21

cabinsummer 发表于 2011-9-13 12:56 static/image/common/back.gif
其实这些程序的开发者没有完全理解操作者的习惯。
应该定义一个错误处理函数,用以恢复异常中断命令时的环 ...

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

cabinsummer 发表于 2011-9-14 22:30:35

inhoo0 发表于 2011-9-14 22:26 static/image/common/back.gif
请问兄台是把你的代码加在程序里面还是独立谢谢

你可以贴一个小程序,我给你稍微改一下,并做上注释

inhoo0 发表于 2011-9-14 23:05:43

(defun c:eb()   ;erase box
    (setvar "cmdecho" 0 )
    (setvar "osmode"0 )
    (setvar "regenmode" 0)
    (command "layer" "off" "cen" "")
    (command "layer" "off" "dqx" "")
    (setq pt1 (getpoint "\n???:"))
    (setq pt2 (getcorner pt1 "\n???:"))
(while ( or (not(eq pt1 nil))(not(eq pt2 nil)))
    (setq s nil)
    (setq s(ssget "c" pt1 pt2))
    (while (= s nil)
         (progn
            (alert "???????????????!")
            (setq pt1 (getpoint "\n???:"))
            (setq pt2 (getcorner pt1 "\n???:"))
            (setq s(ssget "c" pt1 pt2))
         )
    )
    (if (> (sslength s) 25)
      (progn
             (alert "??????????!!!!")
             (quit)
         )
    )
    ;(princ "\n???????????????,?????:")
    ;(setq s_w (ssget))
    ;(if (= s_w nil)
    ;    (setq s_w (ssadd))
    ;)
    (setq max_x(max (carpt1) (carpt2))
          max_y(max (cadr pt1) (cadr pt2))
          min_x(min (carpt1) (carpt2))
          min_y(min (cadr pt1) (cadr pt2))
    )
   
    (setq sline (ssadd))
    (setq i0 0)
    (while (ssname s i0)
         (if (= (cdr (assoc 0 (entget (ssname s i0)))) "LINE")
               (ssadd (ssname s i0) sline)
         )
         (setq i0 (+ i0 1 ))
    )
    (setq int_list (list))
    (while (ssname sline 0)
         (setq pta(cdr (assoc 10 (entget (ssname sline 0)))))
         (setq ptb(cdr (assoc 11 (entget (ssname sline 0)))))
         (ssdel (ssname sline 0) sline)
         (setq k 0)
         (while (ssname sline k)
                  (setq ptk1(cdr (assoc 10 (entget (ssname sline k)))))
                  (setq ptk2(cdr (assoc 11 (entget (ssname sline k)))))
                  (setq int(inters pta ptb ptk1 ptk2 ))
                  (if (and ( > (carint) min_x)
                           ( < (carint) max_x)
                           ( > (cadr int) min_y)
                           ( < (cadr int) max_y)
                      )
                      (setq int_list(cons int int_list))
                  )
                  (setq k (+ k 1))
         )
   )

   (setq a      (car int_list))
   (while a
         (setq a1(list(+(car a) 0.00000000001)(+(cadr a) 0.00000000001)))
         (setq a2(list(-(car a) 0.00000000001)(-(cadr a) 0.00000000001)))
         (setq vl (ssget "c" a1 a2 ))
         (setq ii 0)
         (while (ssname vl ii)
                  ;(if (not(ssmemb(ssname vl ii) s_w))
                     ; (progn
                         (setq ent (ssname vl ii))
                         (command "break" ent a "@")
                      ;)
                  ;)
                  (setq ii (+ ii 1 ))
         )
         (setq int_list (cdr int_list))
         (setq a      (car int_list))
      )
         
      (setq del_line (ssget "w" pt1 pt2))
      (if del_line
          (command "erase" del_line "")
       )
       (setq pt1 (getpoint "\n???:"))
       (if (eq pt1 nil)
          (setq pt2 nil)
          (setq pt2 (getcorner pt1 "\n???:"))
       )
);while
      (command "layer" "on" "cen" "")
      (command "layer" "on" "dqx" "")
      (setvar "regenmode" 0)
      (SETVAR "OSMODE" 32)
      (REDRAW)
      (princ "\n????.????")
      (princ)
)坛子里面的就这个你看看

inhoo0 发表于 2011-9-14 23:06:26

cabinsummer 发表于 2011-9-14 22:30 static/image/common/back.gif
你可以贴一个小程序,我给你稍微改一下,并做上注释

兄台你帮忙看看

cabinsummer 发表于 2011-9-14 23:33:31

本帖最后由 cabinsummer 于 2011-9-14 23:37 编辑

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

;;;定义主函数
;;;主函数中要对系统错误处理函数进行重新定义
(defun c:eb(/ os rg olderr)          ;;加入局部参数os、rg和olderr,以避免多次运行程序时全局参数互相干扰
    (setvar "cmdecho" 0 )
    (command "undo" "be")            ;;undo定义开始,"be"与"e"配对使用。可以undo一次到be定义的位置
    (setq os (getvar "osmode"))      ;;在给osmode参数赋值前先将当前状态保存到局部变量os中
    (setq rg (getvar "regenmode"))   ;;在给regenmode参数赋值前先将当前状态保存到局部变量rg中
    (setq olderr *error*)            ;;在重新定义系统错误处理函数*error*先保存*error*的原始定义
    (setq *error* myerr)             ;;重新定义系统错误处理函数为自己定义的函数myerr
    (setvar "osmode"0 )
    (setvar "regenmode" 0)
    (command "layer" "off" "cen" "")
    (command "layer" "off" "dqx" "")
    (setq pt1 (getpoint "\n???:"))
    (setq pt2 (getcorner pt1 "\n???:"))
(while ( or (not(eq pt1 nil))(not(eq pt2 nil)))
    (setq s nil)
    (setq s(ssget "c" pt1 pt2))
    (while (= s nil)
         (progn
            (alert "???????????????!")
            (setq pt1 (getpoint "\n???:"))
            (setq pt2 (getcorner pt1 "\n???:"))
            (setq s(ssget "c" pt1 pt2))
         )
    )
    (if (> (sslength s) 25)
      (progn
             (alert "??????????!!!!")
             (quit)
         )
    )
    ;(princ "\n???????????????,?????:")
    ;(setq s_w (ssget))
    ;(if (= s_w nil)
    ;    (setq s_w (ssadd))
    ;)
    (setq max_x(max (carpt1) (carpt2))
          max_y(max (cadr pt1) (cadr pt2))
          min_x(min (carpt1) (carpt2))
          min_y(min (cadr pt1) (cadr pt2))
    )
   
    (setq sline (ssadd))
    (setq i0 0)
    (while (ssname s i0)
         (if (= (cdr (assoc 0 (entget (ssname s i0)))) "LINE")
               (ssadd (ssname s i0) sline)
         )
         (setq i0 (+ i0 1 ))
    )
    (setq int_list (list))
    (while (ssname sline 0)
         (setq pta(cdr (assoc 10 (entget (ssname sline 0)))))
         (setq ptb(cdr (assoc 11 (entget (ssname sline 0)))))
         (ssdel (ssname sline 0) sline)
         (setq k 0)
         (while (ssname sline k)
                  (setq ptk1(cdr (assoc 10 (entget (ssname sline k)))))
                  (setq ptk2(cdr (assoc 11 (entget (ssname sline k)))))
                  (setq int(inters pta ptb ptk1 ptk2 ))
                  (if (and ( > (carint) min_x)
                           ( < (carint) max_x)
                           ( > (cadr int) min_y)
                           ( < (cadr int) max_y)
                      )
                      (setq int_list(cons int int_list))
                  )
                  (setq k (+ k 1))
         )
   )
   (setq a      (car int_list))
   (while a
         (setq a1(list(+(car a) 0.00000000001)(+(cadr a) 0.00000000001)))
         (setq a2(list(-(car a) 0.00000000001)(-(cadr a) 0.00000000001)))
         (setq vl (ssget "c" a1 a2 ))
         (setq ii 0)
         (while (ssname vl ii)
                  ;(if (not(ssmemb(ssname vl ii) s_w))
                     ; (progn
                         (setq ent (ssname vl ii))
                         (command "break" ent a "@")
                      ;)
                  ;)
                  (setq ii (+ ii 1 ))
         )
         (setq int_list (cdr int_list))
         (setq a      (car int_list))
      )
         
      (setq del_line (ssget "w" pt1 pt2))
      (if del_line
          (command "erase" del_line "")
       )
       (setq pt1 (getpoint "\n???:"))
       (if (eq pt1 nil)
          (setq pt2 nil)
          (setq pt2 (getcorner pt1 "\n???:"))
       )
);while
      (command "layer" "on" "cen" "")
      (command "layer" "on" "dqx" "")
;;;      (setvar "regenmode" 0)      此行可以注释掉
;;;      (setvar "osmode" 32)      此行可以注释掉
      (myerr)                        ;;;程序结束前恢复系统原始状态
      (REDRAW)
      (princ "\n????.????")
      (princ)
)
页: [1] 2
查看完整版本: 真奇怪呀,我的扑捉点老是自动取消