明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 352|回复: 18

[提问] 帮忙找下if语句的bug

[复制链接]
发表于 前天 11:29 | 显示全部楼层 |阅读模式
(defun choose_insert (/ a b)
  (princ "\n***必须选择属性块!***")
  (if (setq a (entsel))
    (progn (setq b (vlax-ename->vla-object (car a)))
           (if (= (vla-Get-ObjectName b) "AcDbBlockReference")
             (if (= (vla-Get-HasAttributes b) :VLAX-TRUE)
               (princ "ok")
               (choose_insert)
             )
             (choose_insert)
           )
    )
    (choose_insert)
  )
b
)
要求选择属性块。如果第一次鼠标空选、第二次成功选中属性块,程序又会跳回最外层if,重新执行(choose_insert),导致返回值出错。
但是如果把结尾的b移动到 (princ "ok")位置就不会出错。

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 前天 22:04 | 显示全部楼层
本帖最后由 dcl1214 于 2024-11-12 22:07 编辑

  1. (defun choose_insert (/ e ents go obj pick)
  2.   (setq go t)
  3.   (setq ents nil)
  4.   (setq i 1)
  5.   (while (and go (<= i 2))
  6.     (setq pick (vl-catch-all-apply 'entsel (list "必须选择属性块")))
  7.     (if        (vl-catch-all-error-p pick)
  8.       (progn (setq go nil)
  9.              (setq pick nil)
  10.              (alert "按下了键盘esc,程序退出了")
  11.       )
  12.     )
  13.     (and (setq e (car pick))
  14.          (setq obj (vlax-ename->vla-object e))
  15.     )
  16.     (if        (and obj
  17.              (= (vla-Get-ObjectName obj) "AcDbBlockReference")
  18.              (= (vla-Get-HasAttributes obj) :VLAX-TRUE)
  19.         )
  20.       (progn (setq ents (cons e ents)) (setq go nil))
  21.     )
  22.     (setq i (1+ i))
  23.     (if        (> i 2)
  24.       (alert "给了您2次机会了,还是没选中,赶快将鼠标扔了")
  25.     )
  26.     (print)
  27.   )
  28.   ents
  29. )

明明有最简单的写法,非要搞最垃圾的写法
发表于 前天 11:54 | 显示全部楼层
没看懂,这是要干啥?
(defun choose_insert (/ a b)
  (princ "\n***必须选择属性块!***")
  (if (and (setq a (entsel))
                                (setq b (vlax-ename->vla-object (car a)))
                                (=(vla-Get-ObjectName b) "AcDbBlockReference")
                                (= (vla-Get-HasAttributes b) :VLAX-TRUE)
                        )
                b
                (choose_insert)
        )
)
发表于 前天 15:11 | 显示全部楼层
本帖最后由 mahuan1279 于 2024-11-12 15:14 编辑

递归的BUG很多……

(defun choose_insert ()
  (princ "\n***必须选择属性块!***")
  (if (setq a (entsel))
    (progn (setq b (vlax-ename->vla-object (car a)))
           (if (= (vla-Get-ObjectName b) "AcDbBlockReference")
             (if (= (vla-Get-HasAttributes b) :VLAX-TRUE)
               (princ "ok")
               (choose_insert)
             )
             (choose_insert)
           )
    )
    (choose_insert)
  )
b
)
发表于 前天 12:22 | 显示全部楼层
判断块是否含有属性?
发表于 前天 12:40 | 显示全部楼层
每次空选 都会积攒一次 空值的 choose_insert 至于为什么不知道 测试出来的实际结果就这样
 楼主| 发表于 前天 13:12 | 显示全部楼层
sandyvs 发表于 2024-11-12 11:54
没看懂,这是要干啥?
(defun choose_insert (/ a b)
  (princ "\n***必须选择属性块!***")

未选中属性快则继续选。
 楼主| 发表于 前天 13:16 | 显示全部楼层
飞雪神光 发表于 2024-11-12 12:40
每次空选 都会积攒一次 空值的 choose_insert 至于为什么不知道 测试出来的实际结果就这样

是啊,就想知道为什么,哈哈
发表于 前天 13:18 | 显示全部楼层
  1. (defun choose_insert (/ a b)
  2.   (princ "\n***必须选择属性块!***")
  3.   (while (and (setq a (entsel))
  4.               (setq b (vlax-ename->vla-object (car a)))
  5.               (= (vla-Get-ObjectName b) "AcDbBlockReference")
  6.               (= (vla-Get-HasAttributes b) :VLAX-TRUE)
  7.          )
  8.     (princ "ok")
  9.   )
  10.   (princ)
  11. )
发表于 前天 13:21 | 显示全部楼层
  1. (defun choose_insert (/ a b)
  2.   (princ "\n***必须选择属性块!***")
  3.   (while (not (and (setq a (entsel))
  4.               (setq b (vlax-ename->vla-object (car a)))
  5.               (= (vla-Get-ObjectName b) "AcDbBlockReference")
  6.               (= (vla-Get-HasAttributes b) :VLAX-TRUE))))
  7.   b
  8. )
 楼主| 发表于 前天 13:23 | 显示全部楼层
ssyfeng 发表于 2024-11-12 12:22
判断块是否含有属性?

要选择属性快,然后对其操作
发表于 前天 15:11 | 显示全部楼层
gaics 发表于 2024-11-12 13:12
未选中属性快则继续选。

额,咋说呢,它会把你把你选择的都判断遍,我测试了下,应该是这个函数只返回你第一次选择的结果,比如你第一次空选就返回空,第一次选择文字会返回文字,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:40 , Processed in 0.324080 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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