Written quickly, this uses the -LAYER Command in order to support both UNDO, and LAYERP functionality.
Code:
(vl-load-com)
(defun c:LayFrzDim (/ *error* ss layerName layers oldCmdecho clayer)
(defun *error* (msg)
(and oldCmdecho (setvar 'cmdecho oldCmdecho))
(cond ((not msg)) ; Normal exit
((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
((princ (strcat "\n** Error: " msg " ** "))) ; Fatal error, display it
)
(princ)
)
(if (setq ss (ssget "_x" '((0 . "DIMENSION"))))
(progn
(vlax-for x (setq ss
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
)
(if
(not
(vl-position (setq layername (vla-get-layer x)) layers)
)
(setq layers (cons layerName layers))
)
)
(vla-delete ss)
(setq oldCmdecho (getvar 'cmdecho))
(setvar 'cmdecho 0)
(setq clayer (getvar 'clayer))
(vl-cmdf
"._-layer"
"freeze"
(vl-string-right-trim
","
(apply 'strcat
(mapcar (function (lambda (x) (strcat x ",")))
(vl-remove-if
(function
(lambda (x) (= clayer x))
)
layers
)
)
)
)
""
)
)
(prompt "\n** No dimensions found ** ")
)
(*error* nil)
)