0

选择一个点时,有一种方法可以过滤 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 有助于理解我要问的问题。

提前致谢。

4

2 回答 2

2

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

因此,您也可以将返回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)
)
于 2018-01-02T16:24:51.947 回答
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" ) )
        ) )
    )

您必须绘制自己的 osnap 标记(例如(grvecs)根据系统变量按大小绘制形状"VIEWSIZE" "SCREENSIZE"。您需要处理极坐标跟踪、正交模式、键盘上的按键。我前段时间尝试过,但没有处理所有案例,我的代码是几百行代码。对不起,我不能分享所有的代码。

因此,如果您是 AutoLISP 的初学者,您可能会花费数周甚至数月的时间来解决问题。所以考虑一下你是否可以在这个问题上花这么多时间。也许您遇到的问题可能会以过滤osnaps之外的其他方式处理。

于 2017-10-31T08:31:10.153 回答