帮忙找下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: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
)
明明有最简单的写法,非要搞最垃圾的写法 没看懂,这是要干啥?
(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: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
)
判断块是否含有属性? 每次空选 都会积攒一次 空值的 choose_insert 至于为什么不知道 测试出来的实际结果就这样 sandyvs 发表于 2024-11-12 11:54
没看懂,这是要干啥?
(defun choose_insert (/ a b)
(princ "\n***必须选择属性块!***")
未选中属性快则继续选。 飞雪神光 发表于 2024-11-12 12:40
每次空选 都会积攒一次 空值的 choose_insert 至于为什么不知道 测试出来的实际结果就这样
是啊,就想知道为什么,哈哈 (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)
) (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
) ssyfeng 发表于 2024-11-12 12:22
判断块是否含有属性?
要选择属性快,然后对其操作 gaics 发表于 2024-11-12 13:12
未选中属性快则继续选。
额,咋说呢,它会把你把你选择的都判断遍,我测试了下,应该是这个函数只返回你第一次选择的结果,比如你第一次空选就返回空,第一次选择文字会返回文字,
页:
[1]
2