This accounts for locked layers, error handling, and supports UNDO functionality as well:
Code:
(vl-load-com)
(defun _FOO (layerName / *error* acDoc oLayers layer oLayer lock)
(defun *error* (msg)
(foreach oLayer lock
(vla-put-lock oLayer :vlax-true)
)
(if acDoc
(progn
(vla-endundomark acDoc)
(vla-regen acDoc acallviewports)
)
)
(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)
)
(vla-startundomark
(setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
)
(setq oLayers (vla-get-layers acDoc))
(vlax-for block (vla-get-blocks acDoc)
(vlax-for x block
(if
(and
(= "AcDbHatch" (vla-get-objectname x))
(/= layerName (setq layer (vla-get-layer x)))
)
(progn
(if
(= :vlax-true
(vla-get-lock (setq oLayer (vla-item oLayers layer)))
)
(progn
(setq lock (cons oLayer lock))
(vla-put-lock oLayer :vlax-false)
)
)
(vla-put-layer x layerName)
)
)
)
)
(*error* nil)
)
Note - You may still receive associative hatch messages for boundary objects on locked layers.
Cheers