如何利用*error*函数解决代码运行出错处理的问题。
本帖最后由 hubeiwdlue 于 2023-8-12 22:43 编辑学习ssget和entsel函数,写了一个简单的查找相同文字的代码,但是如果选择图元不是文字,就会报错,但是entsel好像不带筛选功能,请教各位大神,这个问题应该怎么解决呢。
[*](defun c:xy()
[*](princ "\n请选择要查找的文字:")
[*](setq a (entsel))
[*](setq b (entget (car a)))
[*](initget 1 "q k")
[*](setq ky (getkword "\n[全图(q)/框选(k)]"))
[*](cond
[*] ((= ky "q") (setq tt (ssget "_X" (list(cons 0 "*text")(cons 1 (cdr(assoc 1 b)))))))
[*] ((= ky "k") (setq tt (ssget(list(cons 0 "*text")(cons 1 (cdr(assoc 1 b)))))))
[*] )
[*](sssetfirst nil tt)
[*](princ)
[*])
本帖最后由 hubeiwdlue 于 2023-8-12 19:41 编辑
我自己用一个笨办法解决了,就是加一个判断语句。
(defun c:xy()
(princ "\n请选择要查找的文字:")
(setq a (entsel))
(setq b (entget (car a)))
(setq pd (cdr(assoc 0 b)))
(if (or(= pd "TEXT")(= pd "MTEXT"))
(progn
(initget 1 "q k")
(setq ky (getkword "\n[全图(q)/框选(k)]"))
(cond
((= ky "q") (setq tt (ssget "_X" (list(cons 0 "*text")(cons 1 (cdr(assoc 1 b)))))))
((= ky "k") (setq tt (ssget(list(cons 0 "*text")(cons 1 (cdr(assoc 1 b)))))))
)
(sssetfirst nil tt)
)
(c:xy)
)
(princ)
)
其实我本来是想利用*error*函数解决的,因为我最近在看着这个函数,但一直是一知半解的。不清楚能否用*error*函数解决,或者其他类似的函数。
另外还有两个问题请教各位大神。
①不清楚lisp有没有VB中的goto语句类似的语句,它配合判断语句,有时候还是蛮有用的。
②VB针对报错有两个语句,“On Error Resume Next当代码运行错误时,忽略,继续向下运行。”“If Err.Number = 0 Then”当报错的时候,则执行以下语句。lisp有没有类似的用法。
(princ "\n请选择要查找的文字:")
(SETQ LOOP NIL)
(WHILE (AND (setq a (CAR (entsel)))
(NOT (or (= (CDR (ASSOC 0 (ENTGET A))) "TEXT")
(= (CDR (ASSOC 0 (ENTGET A))) "MTEXT")
)
)
)
(setq LOOP T)
)
(IF (NOT LOOP)(VL-EXIT-WITH-VALUE 0))
(setq b (entget a))
(initget 1 "q k")
后续自己玩吧 liuhe 发表于 2023-8-14 09:01
后续自己玩吧
谢谢指导,我好好学习下。 liuhe 发表于 2023-8-14 09:01
后续自己玩吧
最近一直加班很严重,没时间看,您的这个代码别的都能看懂,就是这个函数(VL-EXIT-WITH-VALUE 0)的作用是什么看不懂,帮助文件显示是"将值返回到从其他名称空间调用 VLX 的函数",但是我还是不明白怎么用。 试了一下,用*error*函数能否递归调用原函数,从而实现多次循环选择。试用情况是,似乎系统默认自定义的*error*函数只又第一次调用的时候有效,第二次调用的话,会用系统默认的*error*函数替换自定义函数。
(defun c:xy()
(defun err1 (sss)
(if sss
(progn
(princ "\n错误,仅能选择文字,请重新选择:")
(setq *error* olderr)
(c:xy)
)
)
)
(setq olderr *error*
*error* err1
)
(princ "\n请选择要查找的文字:")
(setq a (entsel))
(setq b (entget (car a)))
(initget 1 "q k")
(setq ky (getkword "\n[全图(q)/框选(k)]"))
(cond
((= ky "q") (setq tt (ssget "_X" (list(cons 0 "*text")(cons 1 (cdr(assoc 1 b)))))))
((= ky "k") (setq tt (ssget(list(cons 0 "*text")(cons 1 (cdr(assoc 1 b)))))))
)
(sssetfirst nil tt)
(princ)
) hubeiwdlue 发表于 2023-8-19 14:36
最近一直加班很严重,没时间看,您的这个代码别的都能看懂,就是这个函数(VL-EXIT-WITH-VALUE 0)的作用是 ...
退出程序,相当于exit,但是命令行不显示 liuhe 发表于 2023-8-19 16:10
退出程序,相当于exit,但是命令行不显示
哦。谢谢您。
页:
[1]