乐筑天下

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

[编程交流] 写这篇文章的捷径?

[复制链接]

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 09:58:46 | 显示全部楼层 |阅读模式
我正在寻找一种较短的方法来写我的Lisp程序下面的“不是”部分。
 
我有10个“not”语句排成一行,我一生似乎都无法在谷歌上键入正确的搜索词来获得我想要的答案。
 
 
保持宏的相同逻辑,你们这些经验丰富的程序员如何编写宏的“not”部分?
 
谢谢你的帮助
 
 
  1. (defun C:test ()
  2. (vl-load-com)
  3. (setq
  4. acadObject (vlax-get-acad-object)
  5. acadActiveDocument (vla-get-ActiveDocument acadObject)
  6. acadLayers (vla-get-Layers acadActiveDocument)
  7. )
  8. (vlax-for Layer acadLayers
  9. (if
  10. (progn
  11. (not (eq (vla-get-PlotStyleName Layer) "As Drawn"))
  12. (not (eq (vla-get-PlotStyleName Layer) "10% Screen"))
  13. (not (eq (vla-get-PlotStyleName Layer) "20% Screen"))
  14. (not (eq (vla-get-PlotStyleName Layer) "30% Screen"))
  15. (not (eq (vla-get-PlotStyleName Layer) "40% Screen"))
  16. (not (eq (vla-get-PlotStyleName Layer) "50% Screen"))
  17. (not (eq (vla-get-PlotStyleName Layer) "60% Screen"))
  18. (not (eq (vla-get-PlotStyleName Layer) "70% Screen"))
  19. (not (eq (vla-get-PlotStyleName Layer) "80% Screen"))
  20. (not (eq (vla-get-PlotStyleName Layer) "90% Screen"))
  21. )
  22. (vla-put-PlotStyleName Layer "As Drawn")
  23. )
  24. )
  25. (princ)
  26. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:03:53 | 显示全部楼层
记住progn函数是如何工作的-只有最后一个not语句会被考虑在内-其余的都是多余的。在代码中,您应该用和替换progn,以确保满足所有条件,或者更好。。。
 
我可能会这样做:
 
  1. (defun c:test nil (vl-load-com)
  2. (vlax-for layer
  3.    (vla-get-layers
  4.      (vla-get-ActiveDocument (vlax-get-acad-object))
  5.    )
  6.    (if (not (wcmatch (vla-get-PlotStyleName layer) "As Drawn,#0% Screen"))
  7.      (vla-put-PlotStyleName layer "As Drawn")
  8.    )
  9. )
  10. (princ)
  11. )
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 10:09:06 | 显示全部楼层
谢谢李
 
我知道有一种方法可以把我的书变成一个句子。
 
 
我在每个逗号后面加了空格“如图所示,10%屏幕,20%屏幕”,迫使所有内容都如图所示,这导致了10个“not”语句。
删除空格,它现在就可以工作了。
 
 
感谢(progn)tid位,我没有百分之百意识到这一点,我会记住这一点
 
通配符功能使其更短。
 
问题:
 
我在研究中看到过,但#符号有什么作用#0%屏幕
 
谢谢
回复

使用道具 举报

3

主题

6

帖子

2

银币

初来乍到

Rank: 1

铜币
17
发表于 2022-7-6 10:13:13 | 显示全部楼层
你好
我建议使用“cond”而不是带有“not”的“if”结构。
 
  1. (cond ((eq (vla-get-PlotStyleName Layer) "As Drawn")     (DO-SOMETHING))
  2.         ((eq (vla-get-PlotStyleName Layer) "10% Screen") (DO-SOMETHING-ELSE))
  3.         (ETCETERA)
  4.         (T  (DO-SOMETHING-IF-NONE-OF-ABOVE))
  5. );end-of-conditional

 
卡尔
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 10:19:16 | 显示全部楼层
谢谢Karl
 
看到不同的方法来做同一件事很好,它保持了选项的开放性,我可以看到不同的方法来编写代码。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:22:28 | 显示全部楼层
也许可视化progn函数的方法是作为一个“包装器”,允许您向具有单个参数的函数提供许多表达式-progn将仅计算提供给它的表达式,因此单个progn表达式可以提供给其他函数。
 
一些例子:
 
如果
 
  1. (if <test expr>
  2. <do this>
  3. <else this>
  4. )
  1. (if <test expr>
  2. (progn
  3.    <do this>
  4.    <and this>
  5.    <and this>
  6. )
  7. <else this>
  8. )
  1. (if <test expr>
  2. <do this>
  3. (progn
  4.    <else this>
  5.    <and this>
  6.    <and this>
  7. )
  8. )
  1. (if <test expr>
  2. (progn
  3.    <do this>
  4.    <and this>
  5.    <and this>
  6. )
  7. (progn
  8.    <else this>
  9.    <and this>
  10.    <and this>
  11. )
  12. )
  1. (if
  2. (progn
  3.    <do this>
  4.    <and this>
  5.    <test expr>
  6. )
  7. <do this>
  8. <else this>
  9. )

 
  1. (while <test expr>
  2. <do this>
  3. <and this>
  4. <and this>
  5. )
  1. (while
  2. (progn
  3.    <do this>
  4.    <and this>
  5.    <test expr>
  6. )
  7. <do this>
  8. <and this>
  9. <and this>
  10. )

 
使用VLIDE帮助(请参阅此处和此处)查看wcmatch函数的文档以查看完整参考,#匹配任何单个数字字符。
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 10:27:41 | 显示全部楼层

 
谢谢你的帮助
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:33:55 | 显示全部楼层
 
别担心
回复

使用道具 举报

23

主题

117

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
123
发表于 2022-7-6 10:40:08 | 显示全部楼层

 
我希望这不是一个“愚蠢的笨蛋”问题
 
您的通配符示例运行良好,而Karls(cond)选项也运行良好
但就我的一生而言,我不知道如何使用(and)函数。帮助菜单给了我一个与我所做的事情无关的例子,我甚至在谷歌或这个论坛上都找不到一个例子
你能帮我举个例子吗?
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:43:06 | 显示全部楼层
例子:
 
  1. (if
  2. (and
  3.    (setq pt1 (getpoint "\nPoint1: "))
  4.    (setq pt2 (getpoint "\nPoint2: "))
  5. )
  6. <do this>
  7. <else do this>
  8. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 00:38 , Processed in 0.550041 second(s), 72 queries .

© 2020-2025 乐筑天下

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