Just had a look if Lisp could help, try this one:
Code:
;;; Mirror with blocks mirrored back again individualy
(defun c:MirrorB (/ ss en ed n pt1 pt2 ang erase MirrBlock)
(ErrorTrap '((("CMDECHO" . 0)) nil t))
;; Get selection of objects to mirror
(setq ss (ssget))
;; Get mirror points
(setq pt1 (getpoint "Specify first point of mirror line: ")
pt2 (getpoint pt1 "Specify second point of mirror line: ")
) ;_ end of setq
;; Get erase original
(initget "Yes No")
(setq erase (getkword "\nErase source objects? [Yes/No] <N>: "))
(setq en (entlast)) ;Get the last entity in the drawing (in case of No answer)
;; Perform normal mirror
(command "._MIRROR" ss "" "_non" pt1 "_non" pt2 erase)
(defun MirrBlock (en ed /)
;; Mirror block around its insertion point
(command "._MIRROR"
en
""
"_non"
(cdr (assoc 10 ed))
"_non"
(strcat "@100<<" (angtos ang))
"_Yes"
) ;_ end of command
) ;_ end of defun
;; Get the angle of mirror
(setq ang (angle pt1 pt2))
(if (= erase "Yes")
(progn ;Step through selection
(setq n 0) ;Initialize counter to zero
(while (< n (sslength ss)) ;Step through all entities in selection
(setq en (ssname ss n) ;Get nth entity in selection
ed (entget en) ;And its data
) ;_ end of setq
;; Check if block
(if (= "INSERT" (cdr (assoc 0 ed)))
(MirrBlock en ed) ;Mirror the block about its insertion point
) ;_ end of if
(setq n (1+ n)) ;Increment counter
) ;_ end of while
) ;_ end of progn
(progn ;Else step through new objects
(setq en (entnext en)) ;Get next new object after the mirror command
(while en ;While there's a new object
(setq ed (entget en)) ;Get its data
;; Check if block
(if (= "INSERT" (cdr (assoc 0 ed)))
(MirrBlock en ed) ;Mirror the block about its insertion point
) ;_ end of if
(setq en (entnext en)) ;Get the following new object
) ;_ end of while
) ;_ end of progn
) ;_ end of if
(ErrorTrap nil)
(princ)
) ;_ end of defun
Command is MirrorB, it works the same as the normal Mirror, but then mirrors each block around its insertion point again.
And save the attached file somewhere so it's loaded before the above. This is simply my error handling (in case the user presses Esc).