gaics 发表于 2024-11-12 11:29:58

帮忙找下if语句的bug

(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")位置就不会出错。

dcl1214 发表于 2024-11-12 22:04:57

本帖最后由 dcl1214 于 2024-11-12 22:07 编辑

(defun choose_insert (/ e ents go obj pick)
(setq go t)
(setq ents nil)
(setq i 1)
(while (and go (<= i 2))
    (setq pick (vl-catch-all-apply 'entsel (list "必须选择属性块")))
    (if      (vl-catch-all-error-p pick)
      (progn (setq go nil)
             (setq pick nil)
             (alert "按下了键盘esc,程序退出了")
      )
    )
    (and (setq e (car pick))
         (setq obj (vlax-ename->vla-object e))
    )
    (if      (and obj
             (= (vla-Get-ObjectName obj) "AcDbBlockReference")
             (= (vla-Get-HasAttributes obj) :VLAX-TRUE)
      )
      (progn (setq ents (cons e ents)) (setq go nil))
    )
    (setq i (1+ i))
    (if      (> i 2)
      (alert "给了您2次机会了,还是没选中,赶快将鼠标扔了")
    )
    (print)
)
ents
)

明明有最简单的写法,非要搞最垃圾的写法

sandyvs 发表于 2024-11-12 11:54:14

没看懂,这是要干啥?
(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)
        )
)

mahuan1279 发表于 2024-11-12 15:11:26

本帖最后由 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
)

ssyfeng 发表于 2024-11-12 12:22:59

判断块是否含有属性?

飞雪神光 发表于 2024-11-12 12:40:17

每次空选 都会积攒一次 空值的 choose_insert 至于为什么不知道 测试出来的实际结果就这样

gaics 发表于 2024-11-12 13:12:32

sandyvs 发表于 2024-11-12 11:54
没看懂,这是要干啥?
(defun choose_insert (/ a b)
(princ "\n***必须选择属性块!***")


未选中属性快则继续选。

gaics 发表于 2024-11-12 13:16:00

飞雪神光 发表于 2024-11-12 12:40
每次空选 都会积攒一次 空值的 choose_insert 至于为什么不知道 测试出来的实际结果就这样

是啊,就想知道为什么,哈哈

自贡黄明儒 发表于 2024-11-12 13:18:07

(defun choose_insert (/ a b)
(princ "\n***必须选择属性块!***")
(while (and (setq a (entsel))
              (setq b (vlax-ename->vla-object (car a)))
              (= (vla-Get-ObjectName b) "AcDbBlockReference")
              (= (vla-Get-HasAttributes b) :VLAX-TRUE)
       )
    (princ "ok")
)
(princ)
)

lijiao 发表于 2024-11-12 13:21:44

(defun choose_insert (/ a b)
(princ "\n***必须选择属性块!***")
(while (not (and (setq a (entsel))
              (setq b (vlax-ename->vla-object (car a)))
              (= (vla-Get-ObjectName b) "AcDbBlockReference")
              (= (vla-Get-HasAttributes b) :VLAX-TRUE))))
b
)

gaics 发表于 2024-11-12 13:23:01

ssyfeng 发表于 2024-11-12 12:22
判断块是否含有属性?

要选择属性快,然后对其操作

sandyvs 发表于 2024-11-12 15:11:02

gaics 发表于 2024-11-12 13:12
未选中属性快则继续选。

额,咋说呢,它会把你把你选择的都判断遍,我测试了下,应该是这个函数只返回你第一次选择的结果,比如你第一次空选就返回空,第一次选择文字会返回文字,
页: [1] 2
查看完整版本: 帮忙找下if语句的bug