乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: StevJ

[编程交流] 层帮助,请

[复制链接]
CAB

29

主题

781

帖子

430

银币

中流砥柱

Rank: 25

铜币
526
发表于 2022-7-6 14:59:48 | 显示全部楼层
一点也不适合。
这里是子程序。
  1. (defun c:TEST ()
  2. ;;;  Returns T if On. nill if OFF or not found
  3. (defun islayeron (lname / entlst)
  4.    (and (= (type lname) 'str)
  5.         (setq entlst (tblsearch "layer" lname))
  6.         (null (minusp (cdr (assoc 62 entlst))))
  7.    )
  8. )                           ; end defun
  9. (if (islayeron "TEXT")      ;If TEXT layer is on,
  10.    (c:LISProutine1)          ; run routine 1
  11. )                           ;endif 1
  12. (if (islayeron "FIND")      ;If FIND layer is on,
  13.    (c:LISProutine2)          ; run routine 2
  14. )                           ;endif 2
  15. ;;  If both layers are off
  16. (if (and (not (islayeron "TEXT")) ;If TEXT layer is off *AND*
  17.           (not (islayeron "FIND")) ;if FIND layer is off,
  18.      )                     
  19.    (c:LISProutine3)          ; run routine 3
  20. )                           ;endif 3
  21. (PRINC)
  22. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:01:02 | 显示全部楼层
说得好,艾伦,我犯了条件错误。。。
回复

使用道具 举报

13

主题

146

帖子

136

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2022-7-6 15:05:14 | 显示全部楼层
好了,各位。
此IF版本之间的差异:
 
  1. (defun c:TEST ()
  2. (if (> (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
  3.       (c:LISProutine1)
  4. )
  5. (if (> (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0)
  6.       (c:LISProutine2)
  7. )
  8. (if (and (< (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
  9.         (< (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0))
  10.         (c:LISProutine3)
  11. )
  12. (PRINC)
  13. )

 
这个COND版本:
 
  1. (defun c:TEST ()
  2. (COND ((> (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
  3.      (c:LISProutine1)
  4.      )
  5.      ((> (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0)
  6.      (c:LISProutine2)
  7.      )
  8.      ((and (< (cdr (assoc 62 (entget (tblobjname "layer" "TEXT")))) 0)
  9.            (< (cdr (assoc 62 (entget (tblobjname "layer" "FIND")))) 0))
  10.      (c:LISProutine3)
  11.      )
  12. )
  13. (PRINC)
  14. )

 
对我来说似乎没有那么重要,而且它们都工作得一样好。
 
然而,IF版本似乎更像是一种“暴力”方法,
COND版本更干净,看起来不像是黑客作业,而不是IF版本。
 
CAB的入口,现在我看到它是如何实现的,也同样有效。谢谢,卡布。
不过,这似乎有点复杂。
 
我对丰富的选择满面春风,但有更喜欢的方法吗?
 
史蒂夫
.
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:08:51 | 显示全部楼层
与COND方法的不同之处在于,当COND到达返回T的测试表达式时,它计算该表达式之后的所有语句,并在那里结束。
 
而对于IF语句,则依次计算每个IF语句。
 
因此,如果文字层处于启用状态,而查找层处于启用状态:
 
在第二个版本中,将显示LispRoutine1,但不会显示LispRoutine2。
 
在IF版本中,将对两者进行评估。
 
希望这有点道理。。。
回复

使用道具 举报

13

主题

146

帖子

136

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2022-7-6 15:09:51 | 显示全部楼层
据我所知,在COND版本中,当计算第一个TRUE时,条件检查将退出,但在IF版本中,无论前面任何检查的结果如何,都会计算每一行。
 
因此,IF版本完成了任务,但牺牲了效率。
康德赢了。
 
谢谢
史蒂夫
.
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:14:38 | 显示全部楼层
 
但正如我上面所说的,如果两个层都打开了呢?
回复

使用道具 举报

13

主题

146

帖子

136

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2022-7-6 15:18:37 | 显示全部楼层
在IF版本中,两个子例程都运行。
 
在COND版本中,只有第一个子例程运行。
 
那么我使用哪种方法,可能取决于我在那种情况下想要发生什么。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:19:41 | 显示全部楼层
 
确切地说,我的印象是,如果满足条件,您希望例程运行。在第二个版本中,某些条件甚至可能没有经过测试。
回复

使用道具 举报

13

主题

146

帖子

136

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2022-7-6 15:22:42 | 显示全部楼层
我发现,由于自动处理图形的方式,只有一种状态可以为真,而其他状态将为假。
因此,要么文字层打开,要么查找层打开,要么两者都关闭。
 
这使得COND版本毕竟是更好的选择。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:26:21 | 显示全部楼层
 
好的,只要你理解差异,就不会有问题
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-5 06:25 , Processed in 0.350693 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表