;;
;; Convert dynamic blocks (in current visibility state) to static
;;
;; Routine: UnDynamic by MP Seagull - March 26, 2010
;; 
;; MODIFIED BY Lanny Schiele (aka 'HatchMaker Maker') - 10/27/2017
;;

(vl-load-com)

(defun c:UnDynamic

    (   /
        _DefGetString
        _get_item
        _right
        _make_key
        _dynamic->static_block
        _get_locked
        _get_dynamic_inserts
        _main
    )

	;;;* GET STRING WITH DEFAULT
	(defun _DefGetString (prmpt default allowspace / d2)
	  (if allowspace
	    (setq
	      ans
	       (cond
	         ((not
	            (= (setq
	                 d2 (getstring T (strcat prmpt " <" default ">: "))
	               ) ;_ end of setq
	               ""
	            ) ;_ end of =
	          ) ;_ end of not
	          d2
	         )
	         (default)
	       ) ;_ end of cond
	    ) ;_ end of setq
	    (setq
	      ans
	       (cond
	         ((not
	            (= (setq d2 (getstring (strcat prmpt " <" default ">: ")))
	               ""
	            ) ;_ end of =
	          ) ;_ end of not
	          d2
	         )
	         (default)
	       ) ;_ end of cond
	    ) ;_ end of setq
	  ) ;_ end of if
	  ans
	) ;_ end of defun
  

    (defun _get_item ( collection key / item )
        (vl-catch-all-apply
           '(lambda ( ) (setq item (vla-item collection key)))
        )
        item
    )

    (defun _right ( str n / len )
        (if (< n (setq len (strlen str)))
            (substr str (1+ (- len n)))
            str
        )
    )

    (defun _make_key ( collection prefix len / key )
        (   (lambda ( i pad )
                (while
                    (_get_item collection
                        (setq key
                            (strcat prefix
                                (_right
                                    (strcat pad (itoa (setq i (1+ i))))
                                    len
                                )
                            )
                        )
                    )
                )
                key
            )
         ;;;0
            99999
            (   (lambda ( pad )
                    (while (< (strlen pad) len)
                        (setq pad (strcat "0" pad))
                    )
                    pad
                )
                ""
            )
        )
    )


    (defun _dynamic->static_block ( blocks insert len )
        (vla-ConvertToStaticBlock
            insert
            (_make_key blocks *UnDynamic:Prefix* len)
        )
    )


    (defun _get_locked ( layers / locked )
        (vlax-for layer layers
            (if (eq :vlax-true (vla-get-lock layer))
                (setq locked (cons layer locked))
            )
        )
        locked
    )


    (defun _get_dynamic_inserts ( blocks / block object inserts )
        (vlax-for block blocks
            (vlax-for object block
                (if (eq "AcDbBlockReference" (vla-get-objectname object))
                    (if (eq :vlax-true (vla-get-isdynamicblock object))
                        (setq inserts (cons object inserts))
                    )
                )
            )
        )
        inserts
    )
  

    (defun _get_dynamic_inserts_from_pickset ( ss / i object inserts )
        (setq i 0)
        (while (< i (sslength ss))
                (setq object (vlax-ename->vla-object (ssname ss i)))
                (if (eq "AcDbBlockReference" (vla-get-objectname object))
                    (if (eq :vlax-true (vla-get-isdynamicblock object))
                        (setq inserts (cons object inserts))
                    )
                )
                (setq i (1+ i))
        )
        inserts
    )


    (defun _main ( document / ss blocks inserts locked len )
        (if (not *UnDynamic:Prefix*)
          (setq *UnDynamic:Prefix* "STATIC_")
        )
        (if (and
              (setq blocks (vla-get-blocks document))
              (setq ss (ssget ":L" (list (cons 0 "INSERT"))))
              (setq inserts (_get_dynamic_inserts_from_pickset ss))
              (setq *UnDynamic:Prefix* (_DefGetString "\nPrefix for static block names" *UnDynamic:Prefix* T))
            )
;;;            (setq inserts
;;;                (_get_dynamic_inserts
;;;                    (setq blocks (vla-get-blocks document))
;;;                )
;;;            )
            
            (progn
;;;                (foreach layer (setq locked (_get_locked (vla-get-layers document)))
;;;                    (vla-put-lock layer :vlax-false)
;;;                )
;;;                (setq len (strlen (itoa (length inserts))))
                (setq len 6)
                (foreach insert inserts
                    (_dynamic->static_block blocks insert len)
                )
;;;                (foreach layer locked
;;;                    (vla-put-lock layer :vlax-true)
;;;                )
                (princ "\n...done.")
            )
            (princ "\nNo dynamic blocks found - no block inserts were changed.")
        )
        (princ)
    )

    (_main (vla-get-activedocument (vlax-get-acad-object)))

)