John
Here is my take on the routine.
It does not need the Undo, on my system anyway.
I gave the option of pickfirst or entsel or ssget.
;;;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;;; FUNCTION
;;; To filter a preselected selection set for object types
;;; listed in the variable list lst
;;;
;;; ARGUMENTS
;;; lst -> a list of object types like ("TEXT" "MTEXT")
;;; nil will allow all types
;;;
;;; USAGE
;;; (setq ss (getpickfirst typs))
;;;
;;; PLATFORMS
;;; 2000+
;;;
;;; AUTHOR
;;; Copyright© 2004 Charles Alan Butler
;;; Co-author S. Madsen
;;; ab2draft@TampaBay.rr.com
;;;
;;; VERSION
;;; 1.1 Sep. 18, 2004
;;;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
(defun getpickfirst (lst / ss a ent)
;; lst is a list of object types like ("TEXT" "MTEXT")
(cond ((and (setq ss (cadr (ssgetfirst))) ; get previously selected sel set
lst ; nil will allow all types
)
(setq a 0) ; set pointer
(repeat (sslength ss) ; foreach object in sel set
(setq ent (ssname ss a) ; get obj name
a (1+ a)
) ; increment counter
;; is obj not a member of the list ?
(and (not (member (cdr (assoc 0 (entget ent))) lst))
(ssdel ent ss) ; if not a member remove it from ss
(setq a (1- a)) ; and deincrement pointer
) ; and
) ; repeat
) ; end cons 1
) ; end cond stmt
;; if ss is a pick set and has objects then return the selection set
(if (and (= (type ss) 'pickset) (/= 0 (sslength ss)))
ss
)
;; else return nil because when IF fails it returns nil
) ; end defun
(defun IsLocked (lname)
(= (vlax-get-property
(vla-item
(vla-get-Layers
(vla-get-ActiveDocument
(vlax-get-acad-object)
)
)
lname
) ; layer name
'Lock
)
:vlax-true
)
)
(defun c:ent2lyr (/ ent ss obj lyr i)
(if
(or (setq ss (getpickfirst nil))
(setq ent (entsel "\nSelect entity to move to current layer."))
(null (prompt "\nSelect a group of objects to move to current layer."))
(setq ss (ssget))
)
(cond
(ent
(if (IsLocked
(setq lyr (vlax-get-property
(setq obj (vlax-ename->vla-object (car ent)))
'LAYER
)
)
)
(prompt (strcat "\n** Locked Layer -->" lyr " **"))
(vlax-put-property obj 'LAYER (getvar "clayer"))
)
)
(T
(setq i -1)
(while (setq ent (ssname ss (setq i (1+ i))))
(if (IsLocked
(setq lyr (vlax-get-property
(setq obj (vlax-ename->vla-object ent))
'LAYER
)
)
)
(prompt (strcat "\n** Locked Layer -->" lyr " **"))
(vlax-put-property obj 'LAYER (getvar "clayer"))
)
)
)
)
)
(princ)
)