参考:

- (defun C:COPYROTATE ()
- (setq theset nil thelist nil mflag 0 rflag nil)
- (setq startent (entlast)); obtain last entity in database
- (prompt "Pick Objects to Copy: ")
- (setq sset (ssget)); object selection
- (initget 1 "Multiple")
- (setq bpt (getpoint "\nBasepoint/Multiple: ")); basepoint or m for multiple
- (if (= (type bpt) 'STR)
- (progn
- (setq mflag 1)
- (initget 1 "Fixed")
- (setq bpt (getpoint "\nBasepoint (mult. copies)/Fixed angle:")); base point or f for fixed rotation angle
- (if (= (type bpt) 'STR)
- (progn
- (setq rflag 1)
- (setq bpt (getpoint "\nBasepoint (mult. copies and fixed angle): "))
- (setq fang (getangle bpt "\nFixed Angle:"));fixed angle for rotation
- );progn
- );if
- );progn
- );if
- ; loop until mflag becomes nil
- (while mflag
- (progn
- (setq startent (entlast))
- (setq npt (getpoint bpt "Newpoint: "))
- (command "copy" sset "" bpt npt)
- (setq thelist (list (cdr (assoc 5 (entget startent)))))
- (setq nextone startent)
- (while nextone
- (progn
- (setq nextone (entnext nextone))
- (if nextone (setq thelist (cons (cdr (assoc 5 (entget nextone))) thelist)))
- );progn
- );while
- (setq thelist (cdr (reverse thelist))); list of entity handles for copied group
- (ssmake thelist)
- (if rflag
- (command "rotate" theset "" npt (rtd fang))
- (command "rotate" theset "" npt pause)
- );if
- (setq theset nil thelist nil); reset list and selection set
- (if (= mflag 0) (setq mflag nil)); drop out of while if not multiple
- );progn
- );while
- (if (equal npt bpt) (redraw)); if @ was used for newpoint redraw old object
- (setq theset nil thelist nil);try to clean up after one's self
- );defun
- ;turn list of ehandles to selection set
- (defun ssmake(sslist)
- (setq theset (ssadd))
- (foreach ent sslist (ssadd (handent ent) theset))
- )
|