乐筑天下

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

[编程交流] 如何知道“命令”抽屉

[复制链接]

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:01:53 | 显示全部楼层 |阅读模式
您好,很抱歉标题混淆,不知道该如何标记。
 
If一直在寻找一种快速方法,以确定某个命令是否成功创建了它所要求的内容,特别是使用OFFSET命令,并选择生成的对象。基本上,我有一个LISP例程,将多段线偏移到内部,但我希望它无限期地偏移对象,直到无法再偏移为止。见附件。
 
因此,如果使用到多段线内部的偏移,可能会发生3种情况:
 
1) 多段线偏移并在另一条多段线内创建一条多段线
2) 多段线是偏移的,但会在另一条多段线内创建多条多段线,如果形状不规则,则会发生这种情况,我需要选择所有创建的偏移多段线以继续对其进行偏移
3) 偏移值太大,不会生成任何对象
 
如果我这样做,我会在命令行中得到一个OFFSET命令返回“Cannot OFFSET that object”的点,有没有办法在LISP中捕捉到这个消息?或者该命令是否返回错误?
或者当EXTEND返回“对象不与边相交”
 
到目前为止,我的选择是:
 
选项1)使用getlast设置变量,执行命令并检查getlast值是否更改。我尝试了这个方法,它可以工作,但是,这只告诉我是否创建了一个对象,而不是多少个或它们的ID。
 
选项2)在一个新层中执行命令,然后选择该层上的所有对象(我没有太多的经验,但我很确定这是可能的),如果没有创建任何对象,我猜会返回NIL。
 
我对ssget选项做了一些研究,但它们似乎都不适用于我,我甚至找到了一个LISP来设置pline作为选择边界,但我不能保证在新创建的pline中不会有其他对象。
 
有人有更快/更简单的方法吗?我对整个LISP编程都很陌生,所以仍然不确定有些东西是如何工作的。
 
很抱歉,如果帖子很长,我试图包括我找到/尝试到现在为止的大部分内容。祝你今天愉快
抵消图纸
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:09:28 | 显示全部楼层
我还研究了“vl cmdf”,但据我所知,即使没有执行命令,它也总是返回“T”。谢谢
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:21:44 | 显示全部楼层
我想到的两种方法。。。。
 
如果要重复调用命令,请存储ENTLAST,调用您的命令,并将另一个对ENTLAST的调用与之前存储的值进行比较。如果不相等,则用新值覆盖原始值,然后再次重复该序列。
 
根据您的熟练程度,您可以使用Visual LISP调用Offset()方法,并钩住ObjectAppended事件来确定相同的方法。无可否认,这一方案更为复杂,但效率更高,尤其是在大面积地区。
 
干杯
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:28:13 | 显示全部楼层
我一直在使用一些视觉LISP,但我只是从互联网上复制了它们,所以在这方面没有太多经验。我对offset()方法做了一些研究,但尽管它似乎返回了绘制对象的数据,但我仍然不确定如果创建了两个以上的对象,它会如何返回。提到了以“变量数组”形式返回数据的变量,但并不确定这意味着什么。只要有时间,我就会玩一玩,看看它是怎么工作的。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:31:20 | 显示全部楼层
比较两者的返回值:
 
  1. (vla-offset <obj> <distance>)

 
 
... 以及:
 
  1. (vlax-invoke <obj> 'offset <distance>)
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:40:16 | 显示全部楼层
很好,使用(vlax invoke’offset)将绘制对象,并返回一个列表,其中包含由命令创建的所有对象的名称,如下所示:
 
  1. (#<VLA-OBJECT  IAcadLWPolyline 01ece35c> #<VLA-OBJECT IAcadLWPolyline  01ed026c> #<VLA-OBJECT IAcadLWPolyline 01ed02bc>)

 
基于CAB中的LISPhttp://www.theswamp.org/index.php?topic=2899.5;wap2,我使用了以下内容:
 
  1. (defun c:offset (/ ename dist err_obj vobj enew)
  2. (setq enew (entlast))
  3. (vl-load-com)
  4.    (and
  5.        (null (initget 7))
  6.        (setq dist (getdist "\nEnter offset distance: "))
  7.        (while (setq ent (entsel "\nSelect object to offset."))
  8.            (if (and (setq vobj (vlax-ename->vla-object (car ent)))
  9.                    (vlax-method-applicable-p vobj "Offset")
  10.                )
  11.                (progn
  12.                   
  13.                    (if (vl-catch-all-error-p
  14.                        (vl-catch-all-apply 'vlax-invoke
  15.                        (list vobj 'Offset (- dist))))
  16.                        (prompt "\nNegative distance failed.")
  17.                         (setq enew (vlax-invoke vobj 'offset (- dist)));  This makes the offset done twice, must put it inside the error catch,  but how??
  18.                    )
  19.                )
  20.                (prompt "\n*** Can not offset that object, try again. ***")
  21.            )
  22.        )
  23.    )
  24.    (princ)
  25. )
  26. (princ)

 
所以所要做的就是修改,使其从“vlax调用”中获取列表,而不是再次要求选择下一个对象,这应该很容易。然而,它绘制了两次偏移量(显然,因为它在“if”中有两个要偏移的调用),所以我正在考虑放置
 
  1. (setq enew (vlax-invoke vobj 'offset (- dist)))

 
线路内部捕捉到错误,但无法使其工作。我以后再谈,因为已经太晚了。
 
感谢所有的帮助和评论!!
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:42:41 | 显示全部楼层
不客气;我很乐意帮助。。。谢谢你,感谢你的消息来源。
 
 
 
... 记住使用
  1. tags. <p> </p><p>Cheers</p>
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:51:02 | 显示全部楼层
同样感谢你关于代码标签的提示,我不知道(像往常一样,我没有读过“如何发布”指南),但确实让阅读变得更容易,所以我编辑了我以前的帖子
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:58:44 | 显示全部楼层
别担心;我们都从某个地方开始。
 
在寻求帮助之前,你能控制自己正在做什么,你相信你的消息来源,并且你主动修改你的帖子以添加内容
  1. tags... You're going to fit in just fine here.
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 00:07:24 | 显示全部楼层
最后,在这里,它将偏移多个对象,多次。请参阅代码中的说明以了解其工作原理。欢迎提出任何意见/改进。当然,我不得不说我不是lisp专业人士,所以我不能保证用这段代码得到的任何结果,所以请小心使用。
 
但我有两个问题:
1) 如果我在使用这个lisp后使用“undo”命令,它将撤销偏移量加上lisp之前的最后一个动作(ej,如果我画一个圆,然后使用这个lisp来偏移它,然后点击“undo”,它将删除偏移量加上圆)有什么想法吗?
2) 有没有办法避免用户输入的变量出现在命令历史记录中?
 
再次感谢您的帮助。祝您有个美好的一天!!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 03:01 , Processed in 0.999382 second(s), 72 queries .

© 2020-2025 乐筑天下

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