乐筑天下

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

[编程交流] 我的第一个高效Lisp程序

[复制链接]

12

主题

119

帖子

107

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 09:56:15 | 显示全部楼层 |阅读模式
作为一名自学成才的程序员,我为这一小小的成就感到自豪。。。我将此提交给您审阅/审查/娱乐。。。。。我只是在等别人说,“你本可以用5行来完成这件事!”
 
它是我们日常使用的标准部件。
通常直径=6,长度=15
 
最后,我想添加一个错误陷阱和一些条件。。。长度不能小于4,直径不能小于2.25,并应用IF。。。。但这是一个好的开始。。。对我来说,无论如何。。。
  1. ;                     ;
  2. ;; SIMPLE BAR EJECTOR;;
  3. ;                     ;
  4. ;      JPLANERA       ;
  5. (defun C:EJ ()
  6. (setq dia(getreal "\nEnter bar diameter: ")
  7. lg (getreal "\nEnter ejector height: ")
  8. IP (getpoint "\nSelect insertion point:")
  9. OLDORTHO (GETVAR "ORTHOMODE")
  10. rad (/ dia 2)
  11. ;ALL POS X VALUES
  12. X1 (+(car ip) 0.75)
  13. X2 (+(car ip) 1)
  14. X3 (+(car ip) 1.125)
  15. X4 (-(+(car ip) rad) 0.125)
  16. X5 (+(car ip) rad)
  17. ;ALL POS Y VALUES
  18. Y1 (cadr ip)
  19. Y2 (+(cadr ip) 0.25)
  20. Y3 (+(cadr ip) 8.875)
  21. Y4 (+(cadr ip) 9)
  22. Y5 (+(cadr ip) 9.125)
  23. Y6 (+(cadr ip) 11)
  24. Y7 (+(cadr ip) 11.7089)
  25. Y8 (-(+(cadr ip) lg 9) 2.7089)
  26. Y9 (-(+(cadr ip) lg 9) 2)
  27. Y10(-(+(cadr ip) lg 9) 0.125)
  28. Y11(+(cadr ip) lg 9)
  29. ;LIST GENERATOR
  30.        p1 (list X1 Y1)
  31. p2 (list X2 Y2)
  32. p3 (list X2 Y3)
  33. p4 (list X3 Y4)
  34. p5 (list X4 Y4)
  35. p6 (list X5 Y5)
  36. p7 (list X5 Y6)
  37. p8 (list X4 Y7)
  38. p9 (list X4 Y8)
  39. p10 (list X5 Y9)
  40. p11 (list X5 Y10)
  41. p12 (list X4 Y11)
  42. )
  43. (SETVAR "ORTHOMODE" 1)
  44. (entmake (list '(0 . "LWPOLYLINE")
  45.   '(100 . "AcDbEntity")
  46.   '(100 . "AcDbPolyline")
  47.   '(90 . 14)
  48.   '(8 . "EJECTORS")
  49.   (cons 10 ip)
  50.   (cons 10 p1)
  51.   (cons 42  0.414214)
  52.   (cons 10 p2)
  53.   (cons 10 p3)
  54.   (cons 42  -0.414214)
  55.   (cons 10 p4)
  56.   (cons 10 p5)
  57.   (cons 42  0.414214)
  58.   (cons 10 p6)
  59.   (cons 10 p7)
  60.   (cons 10 p8)
  61.   (cons 10 p9)
  62.   (cons 10 p10)
  63.   (cons 10 p11)
  64.   (cons 42  0.414214)
  65.   (cons 10 p12)
  66.   (list 10 (car ip) (+(cadr ip) lg 9))
  67.   '(70 . 0)))
  68. (command "mirror" "l" "[email="" ip "@0,1"]" ip "@0,1[/email]" "")
  69. (SETVAR "ORTHOMODE" OLDORTHO)
  70. )
回复

使用道具 举报

7

主题

340

帖子

338

银币

初来乍到

Rank: 1

铜币
37
发表于 2022-7-6 10:04:52 | 显示全部楼层
恭喜!
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 10:11:21 | 显示全部楼层
 
干得好!
 
它看起来像是一个你击打某人的桨,他们回答:“谢谢你,先生,我可以再要一个吗?”
 
我希望这些有很大的需求?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 10:19:02 | 显示全部楼层
只是几点建议,这只是我做事的方式,如果你的代码正常,就没有对错,不要改变它
 
Y1(cadr ip),然后y2(+Y1 0.25),而不是每次的cadr,对于X相同
 
将“osmode”设置为0是一个好习惯Autocad有时会捕捉到一个近在咫尺的对象,如果将cmdecho设置为1,则会停止命令行显示您在做什么,这只是在调试时分散了注意力而已
 
 
例如(setq OLDORTHO(GETVAR“ORTHOMODE”)oldsnap(GETVAR“osmode”)(setvar“cmdecho”1)完成后重置
 
大概
(setq直径3.9)
(虽然(
(setq dia(getreal“\n输入棒直径:”)
)
回复

使用道具 举报

12

主题

119

帖子

107

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 10:21:16 | 显示全部楼层
谢谢AL,
 
发布原始代码后,我返回并添加了所有必要的变量设置。我还将程序分解为两个子例程,用于不同的情况。我将进一步调整,并尝试您的建议来简化代码。WHILE语句的目的是什么?这是不是说,“只有当直径大于4时才是真实的?”
回复

使用道具 举报

20

主题

257

帖子

237

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 10:28:03 | 显示全部楼层
“while”构成循环
 
祝贺你第一次编码!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 10:37:04 | 显示全部楼层
您说过长度不能小于4以上,所以while is的想法是,它会不断要求输入,直到您回答4或以上,也会对其进行更改
 
(虽然(
(setq dia(getreal“\n输入棒直径:”);按回车键=4.0作为答案只是标准答案的捷径
(if(=直径nil)(setq dia 4.0))
)
回复

使用道具 举报

12

主题

119

帖子

107

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 10:41:41 | 显示全部楼层
啊,我明白了。。。我已将程序细化为包含2个子例程,因此我的主程序包含所有输入信息。因为我已经添加了第二个例程,我不需要while循环,我可以只运行第二个例程,它可以调整大小。。这是正确的程序/格式吗??
 
  1. (defun C:EJ ()
  2. (initget 7)
  3. (setq dia(getreal "\nEnter bar diameter: "))
  4. (if (<= 2.5 dia)
  5.    (progn
  6.      (initget 7)
  7.      (setq lg (getreal "\nEnter ejector height: "))
  8.      (initget 7)
  9.      (setq IP (getpoint "\nSelect insertion point: "))
  10.      (if (>= lg 5.5)(EJSTANDARD)(EJFLAT))
  11.    )
  12.    (progn
  13.      (alert "BAR DIAMETER MUST BE\nGREATER THAN 2.500"")
  14.      (PRINC)
  15.    );End progn
  16.   );End if
  17. );End defun

 
谢谢大家的意见。
 
 
编辑:现在我想到了。。我可以把while循环放在那里,而不是警报,用于2.500!杜
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:47:22 | 显示全部楼层
你好,JPlanera,
 
我个人不喜欢强迫用户点击Esc退出程序,因为这被认为是一个错误。如果用户不提供商品,我宁愿允许程序退出。
 
以下是我可能会如何处理提示:
 
[code](定义c:EJ(/dia lg ip)(while(and(setq dia(getdist)“\n指定棒直径:”)(<dia 2.5))(princ“\n**棒直径必须大于或等于2.5**”)(if(and dia(progn(initget 6)(setq lg(getdist”\n指定喷射器高度:”))(setq ip(getpoint“\n选择插入点:”)(if(
回复

使用道具 举报

12

主题

119

帖子

107

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 10:55:41 | 显示全部楼层
谢谢李。我的经验缺乏的一点是良好的错误管理,或者输入保护(如果愿意的话)。我一直在努力让我的公司为一些正式课程买单,但老实说,在你和杰夫·桑德斯的网站之间,我慢慢不需要这些课程了!!哈哈哦顺便说一句,你最近去过聊天区吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 05:36 , Processed in 1.048477 second(s), 72 queries .

© 2020-2025 乐筑天下

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