hubeiwdlue 发表于 2023-8-12 15:47:43

如何利用*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:18:10

本帖最后由 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有没有类似的用法。

liuhe 发表于 2023-8-14 09:01:42

(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")


后续自己玩吧

hubeiwdlue 发表于 2023-8-14 12:09:27

liuhe 发表于 2023-8-14 09:01
后续自己玩吧

谢谢指导,我好好学习下。

hubeiwdlue 发表于 2023-8-19 14:36:48

liuhe 发表于 2023-8-14 09:01
后续自己玩吧

最近一直加班很严重,没时间看,您的这个代码别的都能看懂,就是这个函数(VL-EXIT-WITH-VALUE 0)的作用是什么看不懂,帮助文件显示是"将值返回到从其他名称空间调用 VLX 的函数",但是我还是不明白怎么用。

hubeiwdlue 发表于 2023-8-19 14:54:41

   试了一下,用*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)
)

liuhe 发表于 2023-8-19 16:10:25

hubeiwdlue 发表于 2023-8-19 14:36
最近一直加班很严重,没时间看,您的这个代码别的都能看懂,就是这个函数(VL-EXIT-WITH-VALUE 0)的作用是 ...

退出程序,相当于exit,但是命令行不显示

hubeiwdlue 发表于 2023-8-19 16:20:40

liuhe 发表于 2023-8-19 16:10
退出程序,相当于exit,但是命令行不显示

哦。谢谢您。
页: [1]
查看完整版本: 如何利用*error*函数解决代码运行出错处理的问题。