真奇怪呀,我的扑捉点老是自动取消
我在用坛子里面很多lsp程序后,扑捉命令全不取消,必须等重新设置一下,如果只用,刚刚设置的就又没有了,求高手们门诊一下呀 谢谢 本帖最后由 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)
)
我也是经常运到这样的情况 求个高手们指点呀 插件用多了,有些插件运行过程中会取消你的捕捉,你按esc取消运行这个插件的时候,你的捕捉也就被取消了,建议少用垃圾插件,如什么什么人工具中有许多命令会取消你的捕捉
楼主如果还是要用,建筑写个自用的捕捉,丢失时,恢复一下,如我个人使用
(defun c:y()
(command "osmode" "4847")
(princ "\n 已恢复愿望树自用捕捉变量!")
(princ)
) cabinsummer 发表于 2011-9-13 12:56 static/image/common/back.gif
其实这些程序的开发者没有完全理解操作者的习惯。
应该定义一个错误处理函数,用以恢复异常中断命令时的环 ...
请问兄台是把你的代码加在程序里面还是独立谢谢 inhoo0 发表于 2011-9-14 22:26 static/image/common/back.gif
请问兄台是把你的代码加在程序里面还是独立谢谢
你可以贴一个小程序,我给你稍微改一下,并做上注释 (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)
)坛子里面的就这个你看看 cabinsummer 发表于 2011-9-14 22:30 static/image/common/back.gif
你可以贴一个小程序,我给你稍微改一下,并做上注释
兄台你帮忙看看 本帖最后由 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