#2
Try this lisp. I did some tweaking a long time ago to make it work with Intellicad, but I can't remember what I changed.


;;; CTEXT places text along an arc and edits this text also.
;;;
;;; R.K. McSwain 1998
;;;
;;; BETA - NO ERROR CHECKING - USE AT YOUR OWN RISK
;;;
;;; =================================================================================

(defun checkforfixed ()
(if (= (setq txthgt (cdr (assoc 40 (tblsearch "STYLE" (getvar "TEXTSTYLE"))))) 0)
;Test for fixed text height
(setq ;If height not fixed...
txthgt (getdist "\nText height: ") ;Get text height
cmd '(command "TEXT" "C" txtp txthgt txtang char) ;assign command list
)
(setq ;If height fixed...
cmd '(command "TEXT" "C" txtp txtang char) ;assign command list
)
);end if
)


;;;---------------------------------------------------------------------
(defun mkblk (/ ins_pt num ss1 i n )
(entmake (list '(0 . "BLOCK")'(2 . "*U")'(70 . 1)(cons 10 midp)))
(setq ss1 alid)
(setq i (sslength ss1))
(setq n (- 1))
(repeat i
(entmake (cdr (entget (ssname ss1 (setq n (1+ n))))))
)
(setq num (entmake '((0 . "ENDBLK")) ))
(command "._erase" ss1 "")
(entmake (list '(0 . "INSERT")(cons 2 num)(cons 10 midp)))

(setq bill (entlast))
(princ)
)


;;;---------------------------------------------------------------------
(defun angtoc (ang)
(setq ang
(rtos (atof (angtos ang 0 8)) 2 6)
)
(strcat "<<" ang)
)
;;;---------------------------------------------------------------------
(defun roro (item / ypoint pnta1)

(setq fset (ssadd bill))
(setq ypoint (trans (cdr (assoc 10 (entget item))) 0 1))
(setq pnta1 radp)
; (setq pnta1 (cal "cen"))
(command "._rotate" fset "" pnta1 "_r" pnta1 ypoint pause)
)
;;;---------------------------------------------------------------------
(defun errorhandler (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
;(command "._undo" "end")
;(command "u")
(setq *error* olderr) ; restore old *error* handler
(princ)
)
;;;---------------------------------------------------------------------
;;;MAIN FUNCTION

(defun c:ctext ()
(mainf "")
)
;;;-------------------------- end edit curved text -------------------------------------------

(defun mainf (arg1)
(setq olderr *error*)
(setq *error* errorhandler)
(command "._undo" "be")

; change ucs to world
(if (= (getvar "worlducs") 0)
(progn
(setq flagme "T")
(command "._ucs" "w")
)
)

(setvar "CMDECHO" 0) ;Turn command echo off

(setq start (ssadd))
(setq radp (getpoint "\nPick radius point: " )) ;Get radius point of text
(setq midp (getpoint "\nPick middle point of text: " radp)) ;Get midpoint of text
(if (or (= arg nil)(= arg1 ""))
(setq txt (getstring "\nText: " T)) ;Get text string
(setq txt arg1)
)
(setq radi (distance radp midp)) ;Determine radius
(setq txtlen (strlen txt)) ;Determine string length
(setq txtspc (cdr (assoc 41 (tblsearch "STYLE" (getvar "TEXTSTYLE"))))) ;Determine char width

(checkforfixed)


(setq orent ;Get text orientation
(strcase (getstring "\nIs base of text towards radius point <Y>: ")) ;upper
)

(curvework radp radi midp orent cmd)
)


(defun curvework ( radp radi midp orent cmd)

(if (or (= orent "") (= orent "Y")) ;calculate new radius length based on orientation
(setq radi2 (- radi (/ txthgt 2)))
(setq radi2 (+ radi (/ txthgt 2)))
);end if


(setq ;Calculate variables
arclen (* txtlen txtspc txthgt) ;calculate arc length
arclen (* 0.9 arclen)
txtspc (/ arclen txtlen) ;calculate arc length of one character
arcang (/ arclen radi2) ;calculate arc angle of one character
sang (- (+ (angle radp midp) (/ arcang 2)) (/ txtspc radi 2)) ;calc start angle of text
count 1 ;Initialize counter
)

(repeat txtlen ;Insert character loop
(if (or (= orent "") (= orent "Y")) ;Test text angle
(setq txtang (angtoc ;Preface angle w/ << for universal angular units in dec. string
(- sang (/ pi 2)) ;Convert start angle minus 90deg
)
txtpos count
)
;Calc angle for character towards radius and character position in string
(setq txtang (angtos (- sang (* pi 1.5)) 0) ;angle to a command function
txtpos (- (1+ txtlen) count)
)
;Calc angle for character away from radius and character position in string
)
(setq txtp (polar radp sang radi)) ;Calculate character point
(setq char (substr txt txtpos 1)) ;Get text character
(eval cmd) ;Execute command list
(setq alid (ssadd (entlast) start))
(setq count (1+ count)) ;Increment counter
(setq sang (- sang (/ txtspc radi))) ;Calculate new start angle
);End repeat loop

(mkblk) ;MKBLK FUNCTION MAKES A BLOCK OUT OF INDIVIDUAL CHARACTERS
(roro bill) ;RORO FUNCTION STARTS ROTATE COMMAND ON CURVED TEXT (FOR FINAL PLACEMENT)
(if (= flagme "T") (command "ucs" "p")) ;reset ucs to previous if changed to world
(command "._undo" "end")
(princ)
)
(repeat 35 (prompt "\n "))

(prompt " ..................... CTEXT.LSP ........................... ")
(prompt "\n ")
(prompt " .....................BETA VERSION 1.0........................... ")
(prompt "\n ")
(prompt " ........ Type CTEXT to create or edit curved text .............. ")
(prompt "\n ")
(prompt " ................... R.K. McSwain ............................... ")
(prompt "\n ")
(prompt " ........ yyz@pdq.net -- http://freeweb.pdq.net/yyz ........... ")
(repeat 8 (prompt "\n "))
(princ)
cron