Search code examples
lispautocadautocad-pluginautolisp

Select Specific Entity Type AutoLisp


When selecting a point is there a way to filter OSNAP to only snap onto a specific entity type and not an entity of another type. eg

Snap only to lines.

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

Snap only to arcs.

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

Snap only to polyline.

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

I hope the fake lisp above helps in understanding what I'm trying to ask.

Thanks in advance.


Solution

  • The AutoLISP osnap function can be used to return a point snapped to geometry using a supplied Object Snap modifier, however, this function will not filter the candidate geometry.

    Therefore, you could alternatively supply the point returned by getpoint as the point argument for a filtered ssget selection, or test the entity returned by the nentselp function.

    Here is a possible solution using 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)
    )
    

    Here is a possible solution using 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)
    )