Layer Control ~ Lisp

I’m sure everyone has had an occasion where a layer was off/frozen/locked that you needed to re-activate, I know I sure have. Sometimes its takes you a minute to find the layer in the drop down or layer manager. Dont you wish you could speed up that process, and only show which layers are off/frozen/locked?

Then your in luck, because I have the perfect lisp for you!

This lisp was created by Phanaem found HERE on the AutoDesk community!
I only made a few minor edits to my liking.

This lisp will display a DCL that will allow you to select off/frozen/locked and turn them back on.



; Turn ON, Thaw ar Unlock layers
; Stefan M. - 04.06.2013
; Edited by Jonathan Norton

(defun C:LCON ( / *error* acDoc filen filew id l layers r c l_frz l_off l_lck selected_layers prop val)
  (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark acDoc)

  (defun *error* (m)
      (not (wcmatch (strcase m) "*CANCEL*,*QUIT*"))
      (princ (strcat "\nError: " m))
    (vla-endundomark acDoc)
  (defun prompt_list ()
    (start_list "a_list")
      (setq l (cond
                ((= "1" *tog1*) l_off)
                ((= "1" *tog2*) l_frz)
                ((= "1" *tog3*) l_lck)

  (vlax-for la (setq layers (vla-get-layers acDoc))
    (if (eq (vla-get-LayerOn la) :vlax-false)
      (setq l_off (cons (vla-get-Name la) l_off))
    (if (eq (vla-get-Freeze la) :vlax-true)
      (setq l_frz (cons (vla-get-Name la) l_frz))
    (if (eq (vla-get-Lock la) :vlax-true)
      (setq l_lck (cons (vla-get-Name la) l_lck))
  (setq l_off (acad_strlsort l_off)
        l_frz (acad_strlsort l_frz)
        l_lck (acad_strlsort l_lck)
  (if (or l_off l_frz l_lck) 
      (setq filew (open (setq filen (strcat (getvar 'dwgprefix) "temp_layer_dialog.dcl")) "w"))
        "layer_on_dialog : dialog {
       label = \"Layer Control\";
       : column {
       : list_box { label = \"Select Layer:\"; key = \"a_list\"; width = 40; height = 15; multiple_select = true; allow_accept = true;}
       : radio_column {
       : radio_button { label = \"Off Layers\";    key = \"tog1\"; }
       : radio_button { label = \"Frozen Layers\"; key = \"tog2\"; }
       : radio_button { label = \"Locked Layers\"; key = \"tog3\"; }}
       ok_cancel;}}" filew)
      (close filew)
        (>= (setq id (load_dialog filen)) 0)
           (new_dialog "layer_on_dialog" id)
              (or *tog1* (setq *tog1* "1"))
              (or *tog2* (setq *tog2* "0"))
              (or *tog3* (setq *tog3* "0"))
              (action_tile "a_list" "(setq selected_layers $value)")
              (action_tile "tog1"   "(setq *tog1* \"1\" *tog2* \"0\" *tog3* \"0\" selected_layers nil) (prompt_list)")
              (action_tile "tog2"   "(setq *tog1* \"0\" *tog2* \"1\" *tog3* \"0\" selected_layers nil) (prompt_list)")
              (action_tile "tog3"   "(setq *tog1* \"0\" *tog2* \"0\" *tog3* \"1\" selected_layers nil) (prompt_list)")
              (set_tile "tog1" *tog1*)
              (set_tile "tog2" *tog2*)
              (set_tile "tog3" *tog3*)
              (mode_tile "tog1" (if l_off 0 1))
              (mode_tile "tog2" (if l_frz 0 1))
              (mode_tile "tog3" (if l_lck 0 1))
              (setq r (start_dialog))
              (unload_dialog id)
            (princ "\nWrong dialog definition")
         (princ "\nDCL file not found")
      (if (findfile filen) (vl-file-delete filen))
        (and (= r 1) selected_layers)
           (setq prop (cond
                        ((= "1" *tog1*) 'LayerON)
                        ((= "1" *tog2*) 'Freeze)
                        ((= "1" *tog3*) 'Lock)
                 val  (cond
                        ((= "1" *tog1*) -1)
                        ((= "1" *tog2*) 0)
                        ((= "1" *tog3*) 0)
           (foreach x (read (strcat "(" selected_layers ")"))
             (vlax-put (vla-item layers (nth x l)) prop val)
      (vla-regen acDoc acActiveViewport)
    (Alert "All Layers On/Active")
  (*error* nil)

Lock All Viewports ~ Lisp

It never fails! Every time I have to work on somebody else’s drawings, their viewports are never locked! I got tired of click every viewport and locking them manually, so I created this lisp!

(defun c:vpl (/ kw kval doc adoc lao cnt inc cvprt blk pw)
   (initget 1 "LOCK UNLOCK")
   (setq kw (getkword "\nLOCK or UNLOCK ALL VPORTS [LOCK/UNLOCK]: "))
   (setq kw (strcase kw))
      (if (= kw "LOCK")
      (setq kval :vlax-true)
      (if (= kw "UNLOCK")
      (setq kval :vlax-false)
(setq doc (vlax-get-object "AutoCad.Application")
adoc (vla-get-ActiveDocument doc)
lao (vla-get-Layouts adoc)
cnt (vla-get-Count lao)
inc 0
(repeat cnt
(setq cvprt (vla-Item lao inc)
inc (+ inc 1)
blk (vla-get-Block cvprt)
(vlax-for itm blk
(vlax-property-available-p itm 'DisplayLocked)
(vla-put-DisplayLocked itm kval)
(vla-update itm)

Mtext Background Mask ~ Lisp

I hope everyone had a great Christmas and New years!

If you ever use a background mask for your text, you know how many steps it takes to turn the back ground mask on. Well here is a lisp to make it a lot easier!

Color: 8
Border: 1.1

(defun c:mblank ( / js n dxf_ent)
(setq js (ssget '((0 . "MTEXT"))))
(repeat (setq n (sslength js))
(setq dxf_ent (entget (ssname js (setq n (1- n)))))
(entmod (append dxf_ent '((90 . 1) (63 . 8) (45 . 1.1) (441 . 0))))

Space Dimensions With DimSpace

With the DimSpace command, you simply select your baseline dimensions, then use this command to evenly space them so they look great!

(In case you didn’t know, the dimensions should be spaced 3/8″ apart)

Here’s the sequence:

  • Command: DimSpace
  • Select base dimension:
  • Select dimensions to space: (Select the rest of the dimensions.)
  • Enter value or [Auto] < Auto >: (AutoCAD selects a value to space them, or you can input your own specific value.)

Spacing Value Tip:
You can use a spacing value of 0 (zero) to align the dimension lines of selected linear and angular dimensions end to end.

AutoLisp Tip:
If your like me, you want to automate the process as much as possible. This syntax will automatically input the distance for you. The only negative to this, is you can only select one dimension at a time instead of windowing multiple.

(Command "dimspace" pause pause "" ".375")

Copy & Rotate

I had a co-worker ask me if I could write a lisp that would copy & rotate an object.

AutoCAD does have an out-of-the-box move/copy/rotate but my co-worker was looking for something that was more stream line, so I developed this simple copy & rotate lisp.


(defun c:CopyR (/ *error*)

(defun *error* ( msg )
(if (not (member msg '("Function cancelled" "quit / exit abort")))
(princ (strcat "\nError: " msg))
(princ "\nCopy & Rotate:\n")
(setq ss (ssget))
(command "copy" ss "" "0" "0")
(command "move" ss "" pause pause)
(command "rotate" ss "" "@" pause)

Load Lisp with push of a button

If you have multiple custom toolbars, it may be come tedious to attach each lisp file.

Instead, have your button load the file for you and launch the command!

This only works if you have a support folder pointed where you store custom lisp files.

^C^C_(if (not c:YourCommandHere)(load “lisp file”)) YourCommandHere


^C^C_(if (not c:blank)(load “text_blank”)) blank

If you don’t have a support folder pointed to your custom lisp files, you have to define the path in the command:

^C^C(if (not c:YourCommandHere)(load “C://YourFile//Path//Here.lsp”))YourCommand

SetByLayer (Pre 2008)

Using an older version of AutoCAD, I realized that the SetByLayer command doesn’t exist, so I wrote a simple lisp to fix that.

(defun c:setbylayer ()

(prompt "\nSelect objects:

(setq s1 (ssget))

(command "chprop" s1 "" "color" "bylayer" "LT" "bylayer" "lweight" "bylayer" "")