如何知道“命令”抽屉
您好,很抱歉标题混淆,不知道该如何标记。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编程都很陌生,所以仍然不确定有些东西是如何工作的。
很抱歉,如果帖子很长,我试图包括我找到/尝试到现在为止的大部分内容。祝你今天愉快
抵消图纸 我还研究了“vl cmdf”,但据我所知,即使没有执行命令,它也总是返回“T”。谢谢 我想到的两种方法。。。。
如果要重复调用命令,请存储ENTLAST,调用您的命令,并将另一个对ENTLAST的调用与之前存储的值进行比较。如果不相等,则用新值覆盖原始值,然后再次重复该序列。
根据您的熟练程度,您可以使用Visual LISP调用Offset()方法,并钩住ObjectAppended事件来确定相同的方法。无可否认,这一方案更为复杂,但效率更高,尤其是在大面积地区。
干杯 我一直在使用一些视觉LISP,但我只是从互联网上复制了它们,所以在这方面没有太多经验。我对offset()方法做了一些研究,但尽管它似乎返回了绘制对象的数据,但我仍然不确定如果创建了两个以上的对象,它会如何返回。提到了以“变量数组”形式返回数据的变量,但并不确定这意味着什么。只要有时间,我就会玩一玩,看看它是怎么工作的。 比较两者的返回值:
(vla-offset <obj> <distance>)
... 以及:
(vlax-invoke <obj> 'offset <distance>)
很好,使用(vlax invoke’offset)将绘制对象,并返回一个列表,其中包含由命令创建的所有对象的名称,如下所示:
(#<VLA-OBJECTIAcadLWPolyline 01ece35c> #<VLA-OBJECT IAcadLWPolyline01ed026c> #<VLA-OBJECT IAcadLWPolyline 01ed02bc>)
基于CAB中的LISPhttp://www.theswamp.org/index.php?topic=2899.5;wap2,我使用了以下内容:
(defun c:offset (/ ename dist err_obj vobj enew)
(setq enew (entlast))
(vl-load-com)
(and
(null (initget 7))
(setq dist (getdist "\nEnter offset distance: "))
(while (setq ent (entsel "\nSelect object to offset."))
(if (and (setq vobj (vlax-ename->vla-object (car ent)))
(vlax-method-applicable-p vobj "Offset")
)
(progn
(if (vl-catch-all-error-p
(vl-catch-all-apply 'vlax-invoke
(list vobj 'Offset (- dist))))
(prompt "\nNegative distance failed.")
(setq enew (vlax-invoke vobj 'offset (- dist)));This makes the offset done twice, must put it inside the error catch,but how??
)
)
(prompt "\n*** Can not offset that object, try again. ***")
)
)
)
(princ)
)
(princ)
所以所要做的就是修改,使其从“vlax调用”中获取列表,而不是再次要求选择下一个对象,这应该很容易。然而,它绘制了两次偏移量(显然,因为它在“if”中有两个要偏移的调用),所以我正在考虑放置
(setq enew (vlax-invoke vobj 'offset (- dist)))
线路内部捕捉到错误,但无法使其工作。我以后再谈,因为已经太晚了。
感谢所有的帮助和评论!! 不客气;我很乐意帮助。。。谢谢你,感谢你的消息来源。
... 记住使用
tags. <p> </p><p>Cheers</p> 同样感谢你关于代码标签的提示,我不知道(像往常一样,我没有读过“如何发布”指南),但确实让阅读变得更容易,所以我编辑了我以前的帖子 别担心;我们都从某个地方开始。
在寻求帮助之前,你能控制自己正在做什么,你相信你的消息来源,并且你主动修改你的帖子以添加内容
tags... You're going to fit in just fine here. 最后,在这里,它将偏移多个对象,多次。请参阅代码中的说明以了解其工作原理。欢迎提出任何意见/改进。当然,我不得不说我不是lisp专业人士,所以我不能保证用这段代码得到的任何结果,所以请小心使用。
但我有两个问题:
1) 如果我在使用这个lisp后使用“undo”命令,它将撤销偏移量加上lisp之前的最后一个动作(ej,如果我画一个圆,然后使用这个lisp来偏移它,然后点击“undo”,它将删除偏移量加上圆)有什么想法吗?
2) 有没有办法避免用户输入的变量出现在命令历史记录中?
再次感谢您的帮助。祝您有个美好的一天!!
页:
[1]