乐筑天下

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

[编程交流] Lisp函数无法正常工作

[复制链接]

13

主题

48

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 11:11:14 | 显示全部楼层 |阅读模式
嘿,伙计们,这整件事都有点陌生。这是我自己编写的第一个代码。一个朋友告诉我关于错误捕获的事情,我打算以后用它来节省时间。
 
唯一的问题是,当我使用它时,它没有使用(setvars)命令,我觉得它可以工作,但我不知道为什么它不工作。我可以在“VLIDE”中加载1个defun setvars,然后从defun c:qc复制每一行,它以我希望的方式工作,任何帮助都会很好。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:37:12 | 显示全部楼层
欢迎来到CADTutor
 
我不知道为什么你的函数不起作用,请注意使用“qc”作为函数语法,因为你不应该使用AutoCAD别名作为函数语法。
 
这对我来说很有用:
 
  1. (defun setvars ( vl nlv inout / vlv )
  2. (if (= inout 0)
  3.    (progn
  4.      (setq vlv (mapcar 'getvar vl))
  5.      (mapcar 'setvar vl nlv)
  6.    )
  7.    (mapcar 'setvar vl nlv)
  8. )
  9. vlv
  10. )
  11. (defun c:test1 (/ *error* lst vlv )
  12. (defun *error* ( msg )
  13.    (and vlv (setvars lst vlv 1))
  14.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  15.        (princ (strcat "\n** Error: " msg " **")))
  16.    (princ)
  17. )
  18. (setq lst '("ORTHOMODE" "OSMODE")
  19.        vlv  (setvars lst '(0 0) 0))
  20. (command "_.line")
  21. (while (= 1 (logand 1 (getvar 'CMDACTIVE)))
  22.    (command pause)
  23. )
  24. (setvars lst vlv 1)
  25. (princ)
  26. )

 
但你也可以这样做:
 
  1. (defun setvars ( vl nlv / ol )
  2. (setq ol (mapcar 'getvar vl))
  3. (mapcar 'setvar vl nlv)
  4. ol
  5. )
  6. (defun c:test2 (/ *error* lst vlv )
  7. (defun *error* ( msg )
  8.    (and vlv (setvars lst vlv))
  9.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  10.        (princ (strcat "\n** Error: " msg " **")))
  11.    (princ)
  12. )
  13. (setq lst '("ORTHOMODE" "OSMODE")
  14.         vlv (setvars lst '(0 0)))
  15. (command "_.line")
  16. (while (= 1 (logand 1 (getvar 'CMDACTIVE)))
  17.    (command pause)
  18. )
  19. (setvars lst vlv)
  20. (princ)
  21. )

 
回复

使用道具 举报

13

主题

48

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:01:28 | 显示全部楼层
非常感谢李。我阅读了你的代码,发现了我的代码不起作用的原因。我的lisp按预期工作,但没有暂停用户输入。我还没来得及画线,它就已经Lisp程序了
 
 
我的新代码
 
  1. (defun setvars (vl nlv inout)
  2. (if(= inout 0)
  3.    (progn
  4.      (setq vlv (mapcar 'getvar vl))
  5.      (mapcar 'setvar vl nlv)
  6.    )
  7. )
  8. (if(= inout 1)
  9.    (progn
  10.      (mapcar 'setvar vl vlv)
  11.     )
  12. )
  13. )
  14. ;; quick test
  15. (defun c:test3 (/)
  16. (setq svin '(setvars '(ORTHOMODE OSMODE) '(1 16383) 0))
  17. (setq svout '(setvars '(ORTHOMODE OSMODE) '(1 16383) 1))
  18. (eval svin)
  19.    (command "_.line")
  20.    (while (= 1 (logand 1 (getvar 'CMDACTIVE)))
  21.      (command pause)
  22.    )
  23. (eval svout)
  24. )
  25. (defun *error* ( msg )
  26. (eval svout)
  27.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  28.      (princ (strcat "\n** Error: " msg " **")))
  29. (princ)
  30. )

 
现在,只要有人“试图逃跑”,它就会重置所有值。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 12:24:54 | 显示全部楼层
仅供参考,使用命令别名作为命令名并没有任何坏处。命令的优先级始终高于acad中定义的别名。pgp和不会影响对原始的任何调用,因为它们总是使用完整的命令名而不是别名来调用。然而,问题在于试图定义与现有命令同名的命令。
 
如。
  1. 4
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 11:37 , Processed in 0.396649 second(s), 60 queries .

© 2020-2025 乐筑天下

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