明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: gaics

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

[复制链接]
发表于 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
)
发表于 2024-11-12 16:51:28 | 显示全部楼层
递归没搞过,不清楚状况!
发表于 2024-11-12 17:14:24 | 显示全部楼层
  1. (defun choose_insert (/ blk)
  2.   (terpri)
  3.   (while (not
  4.            (and        (setq blk (car (entsel "\r***必须选择属性块!***")))
  5.                 (equal (cdr (assoc 66 (entget blk))) 1)
  6.            )
  7.          )
  8.   )
  9.   blk
  10. )
发表于 2024-11-12 21:54:43 | 显示全部楼层
要理解代码,否则,不要玩递归,递归在很多语言里面是被诟病的一种写法
发表于 2024-11-12 22:04:57 | 显示全部楼层
本帖最后由 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. )

明明有最简单的写法,非要搞最垃圾的写法
 楼主| 发表于 2024-11-13 08:34:39 | 显示全部楼层
dcl1214 发表于 2024-11-12 21:54
要理解代码,否则,不要玩递归,递归在很多语言里面是被诟病的一种写法

以后不玩了,哈哈
发表于 2024-11-13 12:03:07 | 显示全部楼层
gaics 发表于 2024-11-13 08:34
以后不玩了,哈哈

递归里尽量不要出现等价转换,要原汁原味…
发表于 2024-11-14 08:28:57 | 显示全部楼层
谢谢分享谢谢分享谢谢分享谢谢分享
发表于 2024-11-14 09:22:10 | 显示全部楼层
dcl1214 发表于 2024-11-12 22:04
明明有最简单的写法,非要搞最垃圾的写法

杜总威武,加上一句:这手也是帕金森,赶紧吃药吧
发表于 昨天 09:47 | 显示全部楼层
gaics 发表于 2024-11-12 13:12
未选中属性快则继续选。

  1. (defun tt(/ e)
  2. (while(not(setq e(ssget":E:S"'((0 . "insert")(66 . 1))))))
  3. e)

点评

谢谢哥!  发表于 昨天 13:37
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 15:05 , Processed in 0.153899 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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