选择特定实体类型AutoLisp

时间:2017-10-16 18:29:19

标签: lisp autocad autocad-plugin autolisp

选择一个点时,有一种方法可以过滤OSNAP,只捕捉到特定的实体类型,而不是另一种类型的实体。例如

仅捕捉到线条。

setq startpt (*SNAP FILTER CODE* "LINE" (getpoint "\nChoose Start Line : "))

仅捕捉到弧线。

setq startpt (*SNAP FILTER CODE* "ARC" (getpoint "\nChoose Start Arc: "))

仅捕捉到折线。

setq startpt (*SNAP FILTER CODE* "POLYLINE" (getpoint "\nChoose Start Polyline: "))

我希望上面的假lisp有助于理解我想要问的内容。

提前致谢。

2 个答案:

答案 0 :(得分:2)

AutoLISP osnap函数可用于使用提供的对象捕捉修改器返回捕捉到几何体的点,但是,此函数不会过滤候选几何体。

因此,您可以选择提供getpoint返回的点作为筛选ssget选择的点参数,或者测试nentselp函数返回的实体。

以下是使用ssget的可能解决方案:

(defun c:test1 ( / pnt )
    (while
        (and
            (setq pnt (getpoint "\nSelect start point on arc: "))
            (not (ssget pnt '((0 . "ARC"))))
        )
        (princ "\nThe point does not lie on an arc.")
    )
    (if pnt
        (princ (strcat "\nThe user picked (" (apply 'strcat (mapcar 'rtos pnt)) ")."))
        (princ "\nThe user did not supply a point.")
    )
    (princ)
)

以下是使用nentselp的可能解决方案:

(defun c:test2 ( / ent pnt )
    (while
        (and (setq pnt (getpoint "\nSelect start point on arc: "))
            (not
                (and
                    (setq ent (car (nentselp pnt)))
                    (= "ARC" (cdr (assoc 0 (entget ent))))
                )
            )
        )
        (princ "\nThe point does not lie on an arc.")
    )
    (if pnt
        (princ (strcat "\nThe user picked (" (apply 'strcat (mapcar 'rtos pnt)) ")."))
        (princ "\nThe user did not supply a point.")
    )
    (princ)
)

答案 1 :(得分:0)

可以处理这个问题,但它非常复杂。 我可以告诉你的是,您可以使用函数(grread)来获取用户输入(按下鼠标移动或键盘)。然后你必须分析返回值,考虑osnaps。在这里你可以像这样过滤:

(cond 
        ( ( = (vlax-get-property curve 'ObjectName ) "AcDbMLeader" ) ( progn
            ...
        ) )
        (  ( = (vlax-get-property curve 'ObjectName ) "AcDbPolyline"  ) ( progn
            ...
        ) )
        ( YOUR NEXT CASES ( progn
            ...
        ) )
        ( t  (progn
            (princ "\n*Error:NotImplementedYetForThisEntity\n" ) )
        ) )
    )

您必须根据系统变量(grvecs) "VIEWSIZE"绘制您自己的osnap标记(形状以"SCREENSIZE"大小绘制。您需要处理极坐标跟踪,正交模式,按下按键在键盘上。 我前段时间尝试过这样做,并没有处理每一个案例,我的代码是数百行代码。抱歉,我无法分享所有代码。

所以,如果您是AutoLISP的初学者,可能会花费数周时间,甚至可能需要几个月才能解决问题。因此,请考虑您是否可以在此问题上花费这么多时间。也许您遇到的问题可能会以不同于过滤osnaps的方式处理。