;Select objects by their annotation scale
;CAD Studio, portions Harrie vanZeeland

(defun c:SelByAnnoScale ( / ss scale)

 (defun fld (code ent)(cdr (assoc code ent)))

 ;; return (T) if annotation scale SC exist
 ;; used by an entity EN or nil if none
 ;; (ent_scales-p (car (entsel)) "1:10")
 (defun ent_scales-p (en sc)
  (if (and (setq en (fld 360 (entget en)))
       (setq en (dictsearch en "AcDbContextDataManager"))
       (setq en (dictsearch (fld -1 en) "ACDB_ANNOTATIONSCALES"))
      )
   (vl-remove nil (mapcar '(lambda(y)(eq sc (fld 300 (entget (fld 340 (entget y))))))
    (apply 'append (mapcar '(lambda (x)(if (eq (car x) 350)(list (cdr x)))) en))
   ))
  )
 )

 (setq ss (ssget "_X" '((0 . "INSERT,HATCH,*TEXT,*LEADER,DIMENSION,TOLERANCE,ATTDEF"))))
 (setq scale (getstring "\nScale to match <1:10>: "))
 (if (= scale "")(setq scale "1:10"))
 (mapcar (function (lambda(x)(if (not (ent_scales-p x scale))(ssdel x ss))))(mapcar 'cadr (ssnamex ss)))
 (if (and ss (> (sslength ss) 0))
  (progn (princ (strcat "\n" (itoa (sslength ss)) " selected"))(sssetfirst nil ss))
  (princ "\nnothing found")
 )
 (princ)
)
