以编程方式选择关闭
我有一个lisp,我正在尝试改进,它使用polar(基于用户选择的点)计算两个点,然后使用ssget选择一个对象,在两个点之间使用窗口选择。问题是,当用户选择点时,如果要选择的对象不在屏幕上,则进行选择的ssget失败。
下面是我的问题的一个可运行的示例:
(defun c:sother (/ a b c ent)
(setq b (polar (setq a (getpoint)) 0 5))
(setq c (polar b (dtr 315) 1))
(setq ent (entget (ssname (ssget "_W" b c) 0)))
;do something with ent
)
(defun dtr
(x)
(* PI (/ x 180.0))
)
用户首先选择一个点,然后程序在图形中的预期位置选择一个对象(程序没有创建对象)。
可以通过在大约(5.3448,-0.344)处绘制一个小圆来演示该问题,运行该程序并选择(0,0)作为点。如果选择初始点时圆在屏幕上可见,entget将返回实体信息。否则,它将失败。
我是否可以设置一个系统变量或类似的变量来解决这个问题(简单的解决方案)?或者我应该尝试通过查询数据库来选择对象(我认为有点复杂)。 你还没有发布你的代码,所以我可能会错过一些信息。。。为什么不直接将名称传递给选择集?
(defun _Select (ss)
;; Example:
;; (_Select (ssadd (car (entsel))))
(sssetfirst nil ss)
)
下面是一个快速示例:
(defun c:FOO (/ eName ss)
(if (and (setq eName (car (entsel "\nSelect an entity: ")))
(setq ss (ssadd eName))
)
(_Select ss)
)
(princ)
)
对不起,我已经用更详细的解释更新了最初的帖子。 我想你没有理解我的建议。。。不要使用窗口选择来创建选择集。相反,根据一些独特的识别标准(如图层、对象类型、XRecord等)将实体添加到选择集中。 要选择在选择时可能不在屏幕上的对象,一种解决方案是在评估ssget表达式之前临时缩放到选择区域,例如:
或者,使用Visual LISP:
然而,正如BlackBox上面所建议的那样,一种更可靠、更优雅的方法是直接从图形数据库中检索实体(ssget“X”模式),该方法基于其他独特特征,例如实体类型、图层、线型等,甚至使用独特的几何特性(例如圆心或半径,如果它确实是您试图选择的圆)。 谢谢你们,我想我只需要编写一个函数来使用(ssget“_X”)查找实体以及相对于选定点的位置。很高兴知道“_X”模式适用于屏幕外对象。 X是搜索整个dwg不确定您将如何使用它?我同意李做一个临时缩放,我遇到了这个问题之前,做其他事情,如多次圆角一次必须能够看到所有的线,它的工作。
我知道我要找的实体是文本,所以我可以通过DTEXT和MTEXT进行过滤,并获得其中一个,在由两点定义的矩形内有一个插入点。我的AutoLisp有点生锈了,我很确定这是可能的。
虽然暂时的变焦很诱人,因为李很友善地把它写了出来 您的ssget可以有多个过滤器,如(2。“Text,mtext”)与WP连接
页:
[1]