乐筑天下

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

[编程交流] 带逃逸追踪spo的grread

[复制链接]

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 15:17:56 | 显示全部楼层 |阅读模式
你好。
 
在我做的一个例程中,我使用grread来捕获使用“escape”来取消选择,而不退出例程。我非常失望地看到(在AutoCAD 2015 sp2中),它偶尔会失败并退出。我发现,在2015年,如果轨迹参数为T,则逃逸陷阱很可能在使用逃逸的前1到3次中失败。当然,当grread用于提供动态预览时,需要Track参数。这是我的命令行,在第三次尝试aa和第二次尝试bb时显示bomb
 
如果轨迹参数为假,即使通常在让一个滑倒之前正确捕捉20-50次,它仍然会爆炸。我尝试了两种方法,都使用catch-all-apply,一种使用error-p来捕捉,另一种强制输入一个nil值。两种方法的结果相似。
 
你能试试(aa T)和(bb T)吗,然后试试垃圾邮件转义。请告诉我它是否有效或失败,以及您试用的产品/年份。(注意:使用Enter退出2个功能)
  1. ;http://www.theswamp.org/index.php?topic=27900.msg334947#msg334947
  2. ;_GetChar by mp modified to test grread escape traping
  3. (defun aa (track / done data key result);
  4.    ;;  return the character for the key pressed
  5.    
  6.    (while (not done)
  7.        ;;  stay in the loop until the user presses a key
  8.        (vl-catch-all-apply
  9.           '(lambda ( )
  10.                (setq
  11.                    data nil
  12.                    data (grread track 14 1)
  13.                )
  14.            )
  15.        )
  16.        (setq
  17.            key    (car data)
  18.            result (cadr data)
  19.        )
  20.        (cond
  21.            ;;  user pressed <esc>
  22.            ((null data) (princ "\nescape"))
  23.            ;;  user pressed a key
  24.            ((eq 2 key) (setq done t))
  25.            ;;  user hit right mouse button, consider same as enter
  26.            ((eq 25 key)(setq done t result 13))
  27.        )
  28.    )
  29.    (chr result)
  30. )
  31. ;http://www.theswamp.org/index.php?topic=27900.msg334940#msg334940
  32. ;test by cab modified to test grread escape traping
  33. ;originally (grread t 11 0). End up failing either if grread track argument is nil or t
  34. ;hit enter to exit
  35. (defun bb (track / input LastPT ent obj )
  36. (vl-load-com)
  37. (while ; stay in loop until one of the COND statements return nil
  38.    (progn
  39.      (setq input (vl-catch-all-apply 'grread (list track (+ 1 2  0)))
  40.    (cond
  41.      ((vl-catch-all-error-p input)
  42.   (princ "\nPressed escape ")
  43.   t ; exit
  44.      )
  45.      ((= 5 (car input)) ; pointing device
  46.       (cond
  47.         ((and LastPT (< (distance (cadr input) LastPT) 0.0001))) ; no update if same point
  48.         ((setq ent (nentselp (setq LastPT (cadr input))))
  49.    (setq obj (vlax-ename->vla-object (car ent)))
  50.    (princ (strcat "\nFound a " (vla-get-objectname obj) " at "(vl-princ-to-string (cadr ent))))
  51. )
  52.       )
  53.       t ; stay in loop
  54.      )
  55.      ((= 2 (car input)) ; Keyboard input
  56.       (princ (vl-prin1-to-string input))
  57.       (if (= (cadr input) 13)
  58.           nil ;exit loop
  59.           t) ; stay in loop
  60.       )
  61.      ((= 3 (car input))  ; Selected 3d point
  62.       (if (setq ent (nentselp (cadr input)))
  63. (progn
  64.    (setq obj (vlax-ename->vla-object (car ent)))
  65.    (princ (strcat "\nFound a " (vla-get-objectname obj) " at the point selected: "(vl-princ-to-string (cadr ent))))
  66.    )
  67. )
  68.       t ; stay in loop
  69.       )
  70.      )
  71.     )
  72.    ) ; while
  73. (princ)
  74. )

 
这个问题只在cad 2015中出现吗?(欢迎评论/建议)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:26:21 | 显示全部楼层
所有4种变体似乎在我的ACAD 2017上运行良好(他们正在打印escape已被按下)。
只有一次我能够计算出一个错误——我认为是(bb t),但它是初始的,所以我无法在进一步的测试中再现它。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:34:02 | 显示全部楼层
在bb版本中,你不应该使用nil而不是t吗?
 
 
  1. ((vl-catch-all-error-p input) (princ "\nPressed escape ") t ); exit

 
 
  1. ((vl-catch-all-error-p input) (princ "\nPressed escape ") nil )

 
 
假设您想在按下escape时离开循环。。。
 
 
gr.Rlx
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:42:25 | 显示全部楼层
 
您甚至可以:
 
  1. ((vl-catch-all-error-p input) (prompt "\nPressed escape ") )
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:48:29 | 显示全部楼层
 
 
做得好,你甚至保存了3个字符!
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:56:21 | 显示全部楼层
 
我通过研究Lee的一些代码来了解这个提示/普林斯返回技巧,当时他正在循环一个cond结构,有时他普林斯,有时提示。
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 15:59:04 | 显示全部楼层
 
嗨,Jef&伙计们
在ac2007上测试
(aa nil)-光标缺失,但您将curtype设置为1,则没有问题
因此,所有4个测试都正常无误
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 16:05:38 | 显示全部楼层
@RLX公司
否,请参见下文。 
不,在按下escape后,我一直在循环中。我做的Lisp程序是(应该)在不中断Lisp程序的情况下“返回”的,例如,想想ssget是如何工作的:如果你输入第一个点,点击escape不会退出/错误ssget,而只是取消第一个点。。。我做了一些本该这样做的事情,但逃生陷阱50%的时间都失败了,不管怎样还是退出了。我使用跟踪T作为跟踪鼠标位置来更新动态显示。这里的例子是我找到并单独修改的一些片段,看看它们是否也会通过mashiling escape爆炸(因此我修改它们以在点击escape后保留在grread中),试图找出我的代码的逃逸陷阱失败是否是由于其他原因,例如grread与我使用的其他函数的组合,但就我而言,我的代码和两个示例都有相同的行为/随机失败。这使我能够找出罪魁祸首,这很明显是使用grread和跟踪以及2015的结合。 
在我看来,即使是一次也太多了。如果一个代码因为我的代码之外的bug而意外崩溃,那么这个bug是我无法修复的。这就像有一个反应器在代码出错之前中断代码,但有时反应器触发得太慢-在评估错误之后? 
好的,谢谢大家的努力和反馈,我很感激!
注:这不是我第一次发现一个似乎只存在于CAD 2015上的bug。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:12:50 | 显示全部楼层
 
前一段时间我读了两遍(http://www.cadtutor.net/forum/showthread.php?102976-Lisp用于复制文本。。。主题/页面的变化2),但最终这一切都取决于你的应用程序要做什么。我只在特殊情况下使用grread(当然也只是为了好玩),但我希望您能找到一个可接受的解决方案
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 16:23:25 | 显示全部楼层
到目前为止,当逃生陷阱失败时,一切都按计划进行。。。这只是我编写代码的全部目的^^可接受的解决方案?我想我可能已经找到了一个,但我需要一个lisp编辑器。让我们拭目以待Bricscad 18.2(带BLADE editor)何时可用于Linux。我真的等不及要认真尝试抛弃Autodesk和Microsoft了。
161757o3zhsy7ph33aoabp.png
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:04 , Processed in 1.257964 second(s), 75 queries .

© 2020-2025 乐筑天下

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