明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1090|回复: 7

如何利用*error*函数解决代码运行出错处理的问题。

[复制链接]
发表于 2023-8-12 15:47:43 | 显示全部楼层 |阅读模式
本帖最后由 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)
  • )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 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有没有类似的用法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-8-14 09:01:42 | 显示全部楼层
  1. (princ "\n请选择要查找的文字:")
  2.   (SETQ LOOP NIL)
  3.   (WHILE (AND (setq a (CAR (entsel)))
  4.               (NOT (or (= (CDR (ASSOC 0 (ENTGET A))) "TEXT")
  5.                        (= (CDR (ASSOC 0 (ENTGET A))) "MTEXT")
  6.                    )
  7.               )
  8.          )
  9.     (setq LOOP T)
  10.   )
  11.   
  12.   (IF (NOT LOOP)(VL-EXIT-WITH-VALUE 0))
  13.   (setq b (entget a))
  14.   (initget 1 "q k")



后续自己玩吧
 楼主| 发表于 2023-8-14 12:09:27 | 显示全部楼层

谢谢指导,我好好学习下。
 楼主| 发表于 2023-8-19 14:36:48 | 显示全部楼层

最近一直加班很严重,没时间看,您的这个代码别的都能看懂,就是这个函数(VL-EXIT-WITH-VALUE 0)的作用是什么看不懂,帮助文件显示是"将值返回到从其他名称空间调用 VLX 的函数",但是我还是不明白怎么用。
 楼主| 发表于 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)
)
发表于 2023-8-19 16:10:25 | 显示全部楼层
hubeiwdlue 发表于 2023-8-19 14:36
最近一直加班很严重,没时间看,您的这个代码别的都能看懂,就是这个函数(VL-EXIT-WITH-VALUE 0)的作用是 ...

退出程序,相当于exit,但是命令行不显示
 楼主| 发表于 2023-8-19 16:20:40 | 显示全部楼层
liuhe 发表于 2023-8-19 16:10
退出程序,相当于exit,但是命令行不显示

哦。谢谢您。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 10:05 , Processed in 0.156592 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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