乐筑天下

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

[编程交流] 使用上一个输入

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:34:16 | 显示全部楼层
 
美好的
我刚刚写了一些关于和函数的类似内容:
  1. (defun _and ( lst / r rtn )
  2. (not (vl-some '(lambda ( x ) (or (vl-catch-all-error-p (setq r (vl-catch-all-apply 'eval (list x)))) (not r))) lst))
  3. (setq rtn (cons r rtn))
  4. (reverse rtn)
  5. )
  1. (defun _and ( lst )
  2. (vl-every '(lambda ( x / r ) (if (not (vl-catch-all-error-p (setq r (vl-catch-all-apply 'eval (list x))))) r)) lst)
  3. )
  1. (if (setq p (_and '((getpoint "\n1st try: ") (getpoint "\n2nd try: ") (getpoint "\n3rd try: "))))
  2. p
  3. )

虽然性能和返回与and函数相同,但我希望不是T,而是得到一个评估列表的返回,因此可以这样合并:
  1. (if
  2. (_and
  3.         (setq lst
  4.                 '(
  5.                         (getpoint "\nSpecify circle's center: ")
  6.                         (getpoint "\nSpecify second point for radius: ")
  7.                 )
  8.         )
  9. )
  10. (command "_.CIRCLE" "_non" (car lst) "_non" (cadr lst))
  11. )

李,你有什么想法吗?
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:36:20 | 显示全部楼层
根据文档,(vl every)函数返回T或nil。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:38:53 | 显示全部楼层
 
我尝试将catch apply函数的结果收集到单独的列表中,以便返回结果,但这会影响整体性能,因此我得到的最接近的结果是:
  1. (defun MakeInputLst ( key func arglst mainALst / mainALst expr )
  2. (if
  3.         (and
  4.                 (= 'STR (type key)) (= 'SUBR (type func)) (listp arglst) (listp mainALst)
  5.                 (not (vl-catch-all-error-p (setq expr (vl-catch-all-apply 'func arglst))))
  6.         )
  7.         (setq mainALst (cons (cons key expr) mainALst))
  8. ); if
  9. mainALst
  10. );| defun MakeInputLst |; (or vlax-get-acad-object (vl-load-com)) (princ)
  11. (and
  12. (not (setq InputList (list)))
  13. (apply 'and (mapcar 'cdr (setq InputList (MakeInputLst "FirstPt"  getpoint (list "\nSpecify first point: ") InputList))))
  14. (apply 'and (mapcar 'cdr (setq InputList (MakeInputLst "SecondPt" getpoint (list "\nSpecify second point: ") InputList))))
  15. (apply 'and (mapcar 'cdr (setq InputList (MakeInputLst "ThirdPt" getpoint (list "\nSpecify third point: ") InputList))))
  16. (apply 'and (mapcar 'cdr (setq InputList (MakeInputLst "ent" entsel (list "\nSelect an entity to get its layer: ") InputList))))
  17. (mapcar
  18.         '(lambda (x)
  19.                 (and
  20.                         (member (car x) '("FirstPt" "SecondPt" "ThirdPt"))
  21.                         (entmakex (list (cons 0 "POINT") (assoc 8 (entget (car (cdr (assoc "ent" InputList))))) (cons 10 (cdr x))))
  22.                 )
  23.         )
  24.         InputList
  25. )
  26. ); and

我认为有一个更简单的方法。也许我会为此创建一个新的线程,因为OP的任务已经解决,我把这个问题重定向得太多了。
 
但正如你所见,我们的想法是跳过任何额外的setq,而是处理一个assoc列表,其中每个点对代表一个setq(为什么?-为什么不?)。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:43:15 | 显示全部楼层
 
首先,请注意,为了使用此函数返回的值,变量赋值应在对“_and”函数求值后进行求值:
对于“和”函数,有许多可能性:
  1. (defun _and ( lst / rtn )
  2.    (vl-every '(lambda ( x ) (if (setq x (catcheval x)) (setq rtn (cons x rtn)))) lst)
  3.    (reverse rtn)
  4. )
  5. (defun _and ( lst / val )
  6.    (if (and lst (setq val (catcheval (car lst)))) (cons val (_and (cdr lst))))
  7. )
  8. (defun _and ( lst / rtn val )
  9.    (while (and lst (setq val (catcheval (car lst))))
  10.        (setq rtn (cons val rtn)
  11.              lst (cdr lst)
  12.        )
  13.    )
  14.    (reverse rtn)
  15. )
  16. (defun catcheval ( x / r )
  17.    (if (not (vl-catch-all-error-p (setq r (vl-catch-all-apply 'eval (list x))))) r)
  18. )
修订:
  1. (defun _and ( lst / rtn )
  2.    (if (vl-every '(lambda ( x ) (if (setq x (catcheval x)) (setq rtn (cons x rtn)))) lst)
  3.        (reverse rtn)
  4.    )
  5. )
  6. (defun _and ( lst / foo )
  7.    (defun foo ( lst acc / val )
  8.        (if lst
  9.            (if (setq val (catcheval (car lst)))
  10.                (foo (cdr lst) (cons val acc))
  11.            )
  12.            (reverse acc)
  13.        )
  14.    )
  15.    (foo lst nil)
  16. )
  17. (defun _and ( lst / rtn val )
  18.    (while (and lst (setq val (catcheval (car lst))))
  19.        (setq rtn (cons val rtn)
  20.              lst (cdr lst)
  21.        )
  22.    )
  23.    (if (null lst) (reverse rtn))
  24. )
  25. (defun catcheval ( x / r )
  26.    (if (not (vl-catch-all-error-p (setq r (vl-catch-all-apply 'eval (list x))))) r)
  27. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:45:23 | 显示全部楼层
李,这似乎管用。我注意到它收集了所有非零评估,直到有一个零评估或列表结束:
  1. _$ (setq pts (_and '((getpoint "\n1st try: ") (getpoint "\n2nd try: ") (getpoint "\n3rd try: "))))
  2. nil [color="green"]; hit enter (no points specified)[/color]
  3. _$ (setq pts (_and '((getpoint "\n1st try: ") (getpoint "\n2nd try: ") (getpoint "\n3rd try: "))))
  4. ((140.658 116.678 0.0)) [color="green"]; first point specified, then pressed enter[/color]
  5. _$ (setq pts (_and '((getpoint "\n1st try: ") (getpoint "\n2nd try: ") (getpoint "\n3rd try: "))))
  6. ((140.658 116.678 0.0) (156.932 167.24 0.0)) [color="green"]; first and second point specified, then pressed enter[/color]
  7. _$ (setq pts (_and '((getpoint "\n1st try: ") (getpoint "\n2nd try: ") (getpoint "\n3rd try: "))))
  8. ((94.3117 156.279 0.0) (101.034 182.797 0.0) (188.065 174.665 0.0)) [color="green"]; all points specified[/color]
  9. _$

因此,通过比较列表的长度,可以确定提示的所有内容是否都是非零值,因此代码继续:
  1. (defun C:test ( / lst )
  2.         (if        
  3.         (=
  4.                 (length (setq lst '( (getpoint "\nFirst point: ") (getpoint "\nSecond point: "))))
  5.                 (length (setq lst (_and lst)))
  6.         )
  7.         (command "_.LINE" "_non" (car lst) "_non" (cadr lst) "")
  8. )
  9. (princ)
  10. )

我注意到了一个小问题:
  1. 20

 
非常感谢李!
每次我玩/尝试这个时,我都会尝试在代码中包含你的名字。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:50:49 | 显示全部楼层
谢谢你发现了拼写错误!
回复

使用道具 举报

10

主题

895

帖子

887

银币

初来乍到

Rank: 1

铜币
49
发表于 2022-7-5 17:52:03 | 显示全部楼层
按下向上箭头键怎么样?
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:56:11 | 显示全部楼层
 
不用担心,李,
我非常感谢你的帮助!
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:59:34 | 显示全部楼层
IMO更合理的做法是将Lee的“vl every”建议修改为:
  1. 21
回复

使用道具 举报

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 18:02:00 | 显示全部楼层
它过去很管用,但我想知道什么时候以及为什么会出现在什么新的AutoCAD版本中?迷路了,我一直没能弄明白。是否有任何setvar控制箭头键行为??
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 08:47 , Processed in 0.469747 second(s), 70 queries .

© 2020-2025 乐筑天下

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