Here is one of my old routine that may be of interest to you.
;;; CopyRotate.lsp by Charles Alan Butler
;;; Copyright 2008
;;; by Precision Drafting & Design All Rights Reserved.
;;; Contact at TheSwamp.org
;;;
;;; Version 5.2 Sep 04, 2008
;;;
;;; DESCRIPTION
;;; User pick base point then selects object(s)
;;; Paste mode until Escape is pressed
;;; Once placed user selects rotation angle
;;;
;;; Command Line Usage
;;; Command: copyr
;;;;; Copy objects, then paste & rotate new copy
(defun c:copyr (/ pt npt ss elast ssnew ale_lastent ale_ss-after *error*
MoveStarted osmodetmp usrosmode)
(princ "\nVwerion 5 CopyR lisp")
;; error function & Routine Exit
(defun *error* (msg)
(if
(not
(member
msg
'("console break" "Function cancelled" "quit / exit abort" "")
)
)
(princ (strcat "\nError: " msg))
) ; endif
(and usrosmode (setvar "osmode" usrosmode))
(and usrormode (setvar "orthomode" usrormode))
(if (and MoveStarted ssnew)
(command "._erase" ssnew "")
)
)
;; Rune Wold and Michael Puckett - modified ale_lastent ale_ss-after
(defun ale_lastent (/ entnam outval)
(and
(setq outval (entlast))
(while (setq entnam (entnext outval))
(setq outval entnam)
)
)
outval
)
(defun ale_ss-after (entnam / entnxt selset)
(cond
((not entnam) (ssget "_X"))
((setq entnxt (entnext entnam))
(setq selset (ssadd entnxt))
(while (setq entnxt (entnext entnxt))
(if (entget entnxt)
(ssadd entnxt selset)
)
)
selset
)
)
)
(setq usrosmode (getvar "osmode")) ; reset when routine ends
(setq usroRmode (getvar "orthomode")) ; reset when routine ends
(setq osmodetmp (getvar "osmode")) ; temp setting
(setq ormodetmp (getvar "orthomode")) ; temp setting
(if (and (null (prompt "\nSelect objects to copy:"))
(setq ss (ssget))
(setq pt (getpoint "\nPick base point:"))
)
(progn
(setvar "osmode" 0)
(command "._copybase" pt ss "") ; get object(s) to copy
(command "._undo" "_begin")
(setq elast (ale_lastent))
(command "._pasteclip" pt) ; Create a Copy in the drawing, then move it
(setq ssnew (ale_ss-after elast))
(while
(progn
(setq MoveStarted t)
(setvar "osmode" 0)
(setvar "orthomode" 0)
(command "._move" ssnew "" pt)
;;(setvar "osmode" osmodetmp)
(command pause)
(if (or (and (null npt) (setq npt (getvar "lastpoint")))
(> (distance pt (setq npt (getvar "lastpoint"))) 0.0001))
(progn
;; allow user to rotate
(setvar "osmode" osmodetmp)
(setvar "orthomode" 1)
(command "._rotate" ssnew "" "_non" npt)
(command pause)
(setq MoveStarted nil)
(setq osmodetmp (getvar "osmode"))
(command "._undo" "_end")
(command "._undo" "_begin")
;; get last item in database
(setq elast (ale_lastent))
(setvar "osmode" 0)
(command "._pasteclip" pt)
;; get new items pasted.
(setq ssnew (ale_ss-after elast))
t ; stay in loop
)
)
)
) ; while
) ; progn
) ; endif
(*error* "")
(command "._undo" "_end")
(princ)
)
(princ)