选择特定的图元类型AutoLisp

选择特定的图元类型AutoLisp,lisp,autocad,autocad-plugin,autolisp,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

选择点时,是否有方法过滤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: "))
我希望上面的假口齿不清有助于理解我想问的问题


提前感谢。

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

(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的新手,也许你会花上几个星期的时间来解决这个问题。所以如果你能花这么多时间在这个问题上,那么也许你遇到的问题可能是用过滤OSNAP的另一种方式来处理的。

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

(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的初学者,也许你会花上几个星期的时间来解决这个问题。所以,如果你能花这么多时间来解决这个问题。也许你遇到的问题可以用另一种方式来处理,而不是过滤OSNAP。

< AutoLISP <代码> OSNAP < /Case>函数可以用来返回一个点到GEO的点。但是,使用提供的对象捕捉修改器时,此函数不会过滤候选几何体

因此,您也可以将
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)
)

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)
)