Here is a great routine I have been playing around with. I need help in the RECTANGLEBOX function I added. I want the arrow leader tail to connect with the rectangular box....the way it is now, there is a gap or overlap. Gary ;;; BUB-NOTE.LSP BUBBLE NOTE (c) 2003 Ray Burnstad Bonus Winner ;;; Ray Burnstad ;;; Bubble note error function (defun bub_note_buberr (msg) (if OE (setq *ERROR* OE)) (if BM (setvar "BLIPMODE" BM)) (if OSM (setvar "OSMODE" OSM)) (if SM (setvar "SNAPMODE" SM)) msg ) ;;; Main function (defun BNOTIT (/ SS TXTLIM LL UR MP NX NY P1 SB NIC SSET TMP) ;;(ARCH:F_S-VAR) (setvar "OSMODE" 0) ;;(ARCH:CUSTOM_LAYERS-SYMB) (setq SSET (ssadd)) (princ " * Select all text to be included in (Bubble Outline) *") (setq SS (ssget '((-4 . "<OR")(0 . "TEXT")(0 . "MTEXT")(-4 . "OR>")))) (if SS (progn (setvar "CMDECHO" 0) (setq BM (getvar "BLIPMODE") SM (getvar "SNAPMODE") OSM (getvar "OSMODE") OE *ERROR* *ERROR* bub_note_buberr TXTLIM (bub_note_txt_lim SS) LL (car TXTLIM) UR (cadr TXTLIM) MP (polar LL (angle LL UR) (/(distance LL UR)2)) LC (caddr TXTLIM) NX (fix(-(/(-(car UR)(car LL))LC)0.5)) NY (fix(-(/(-(cadr UR)(cadr LL))LC)0.5)) LL (list (-(car MP)(/(*(1+ NX)LC)2)) (-(cadr MP)(/(*(1+ NY)LC)2))) SP (list (-(car MP)(/(* NX LC)2)) (+(cadr MP)(/(*(+ NY 2)LC)2))) ) (setq PLST (list LL) P1 LL) (repeat (1+ NX) (setq P1 (polar P1 0 LC) PLST (cons P1 PLST))) (repeat (1+ NY) (setq P1 (polar P1(* 0.5 pi)LC) PLST (cons P1 PLST))) (repeat (1+ NX) (setq P1 (polar P1 pi LC) PLST (cons P1 PLST))) (repeat NY (setq P1 (polar P1 (* 1.5 pi) LC) PLST (cons P1 PLST))) (setvar "BLIPMODE" 0) (setvar "SNAPMODE" 0) (defun CLOUDBOX () (setvar "CMDECHO" 0) (command "PLINE" SP "A") (bub_note_drawbub 0 NX) (bub_note_drawbub 270 NY) (bub_note_drawbub 180 NX) (bub_note_drawbub 90 NY) (command "") (princ) ) (defun RECTANGLEBOX (/ XDIS) (setvar "CMDECHO" 0) ;;(command "rectangle" (list XMIN YMIN)(list XMAX YMAX)) (setq XDIS (* (getvar "textsize")1.0)) (command "rectangle" (list (- (car LL)XDIS)(- (cadr LL)XDIS))(list (+ (car UR)XDIS)(+ (cadr UR)XDIS))) (command "pedit" "l" "w" (* XDIS 0.125) "") (princ) ) (initget "C R") (setq tmp (getkword " * Select Box Type: <C>loud <R>ectangle *" ) ) (cond ((= tmp "C")(CLOUDBOX)) ((or (= tmp "R")(= tmp nil))(RECTANGLEBOX)) ) (setq SSET (ssadd (entlast) SSET)) (setvar "BLIPMODE" BM) (setvar "OSMODE" OSM) (setvar "CMDECHO" 0) (if (setq P1 (bub_note_get_point)) (progn (command "SOLID" (nth 1 VECS) (nth 2 VECS) (nth 5 VECS) "" "") ;;(command "PLINE" (nth 1 VECS) (nth 2 VECS) (nth 5 VECS) "" "") (setq SSET (ssadd (entlast) SSET)) (command "LINE" (nth 10 VECS) (polar (nth 11 VECS) (angle(nth 11 VECS)(nth 10 VECS)) (/ LC(sqrt 2))) "") (setq SSET (ssadd (entlast) SSET)) (ARCH:RAND*NO) (setq NIC (strcat "BUB-" *NO)) (command "-group" "" (princ NIC) "" (princ SSET) "") (princ) ) ) (setvar "SNAPMODE" SM) (setvar "CMDECHO" 1) (setq *ERROR* OE) ) ) (setvar "CMDECHO" 1) ;;(ARCH:F_R-VAR) (princ) ) ;;; Draws bubble border polyline (defun bub_note_drawbub (A N / DI) (setq DI (/(* A pi)180) A (+ A 45) SP (polar SP DI LC)) (repeat N (command "D" A SP) (setq SP (polar SP DI LC))) (setq SP (polar SP (- DI(/ pi 2)) LC)) (command "D" A SP) ) ;;; Dymanically draws arrowhead while user picks point (defun bub_note_get_point ( / DONE IP SOURCE CP) (setq VECS nil) (princ " * Pick Arrow Point (Return for none) *") (while (not DONE) (setq IP (grread 'T 4 1) SOURCE (car IP) CP (cadr IP)) (if VECS (grvecs VECS)) (cond((= SOURCE 2) ; if keyboard (cond((= CP 2) (if (=(getvar "SNAPMODE")0) ; F9 (setvar "SNAPMODE" 1) (setvar "SNAPMODE" 0))) ((= CP 4) (if (=(getvar "COORDS")0) ; F6 (setvar "COORDS" 1) (setvar "COORDS" 0))) ((or(= CP 13)(= CP 32)) ; Enter or Space Bar (grvecs VECS) (setq DONE T CP nil)) ) (grvecs VECS) ) ((= SOURCE 3)(setq DONE T)) ; if pick point ((= SOURCE 5)(grvecs(setq VECS(bub_note_calc_ah CP)))) ; if drag ((and(= SOURCE 6)(= CP 0)) ; 2 button (return) (setq DONE T CP nil)) ) ) CP ) ;;; Calculate arrow head vectors (defun bub_note_calc_ah (P / A B ANG P1 P2 P3 VL) (setq A (nth 0 PLST) B (distance A P) N 1) (repeat (1-(length PLST)) (if (<(distance(nth N PLST)P)B) (setq A (nth N PLST) B (distance A P))) (setq N (1+ N)) ) (setq ANG (angle P A) P1 (polar P ANG LC) P2 (polar P1 (+ ANG(/ pi 2)) (/ LC 6)) P3 (polar P1 (- ANG(/ pi 2)) (/ LC 6)) VL (list 257 P2 P 257 P P3 257 P2 P3 257 P1 A) ) ) ;;; Returns limits of bounding box and maximum text height (defun bub_note_txt_lim (SS / ELST X Y H XMIN XMAX YMIN YMAX N P0 P1 P2 P3 P4 ANG SINROT COSROT T1 T2) (setq ELST (entget(ssname SS 0))) (cond ((=(cdr(assoc 0 ELST))"TEXT") (setq X (cadr (assoc 10 ELST)) Y (caddr(assoc 10 ELST)) H (*(cdr (assoc 40 ELST))1.5) XMIN X XMAX X YMIN Y YMAX Y N 0) (repeat (sslength SS) (setq ELST (entget(ssname SS N)) P0 (cdr(assoc 10 ELST)) ANG (cdr(assoc 50 ELST)) SINROT (sin ANG) COSROT (cos ANG) T1 (car (textbox ELST)) T2 (cadr(textbox ELST)) P1 (list (+(car P0)(-(*(car T1)COSROT)(*(cadr T1)SINROT))) (+(cadr P0)(+(*(car T1)SINROT)(*(cadr T1)COSROT)))) P2 (list (+(car P0)(-(*(car T2)COSROT)(*(cadr T1)SINROT))) (+(cadr P0)(+(*(car T2)SINROT)(*(cadr T1)COSROT)))) P3 (list (+(car P0)(-(*(car T2)COSROT)(*(cadr T2)SINROT))) (+(cadr P0)(+(*(car T2)SINROT)(*(cadr T2)COSROT)))) P4 (list (+(car P0)(-(*(car T1)COSROT)(*(cadr T2)SINROT))) (+(cadr P0)(+(*(car T1)SINROT)(*(cadr T2)COSROT)))) ) (if (<(car P1)XMIN) (setq XMIN (car P1))) (if (>(car P1)XMAX) (setq XMAX (car P1))) (if (<(cadr P1)YMIN) (setq YMIN (cadr P1))) (if (>(cadr P1)YMAX) (setq YMAX (cadr P1))) (if (<(car P2)XMIN) (setq XMIN (car P2))) (if (>(car P2)XMAX) (setq XMAX (car P2))) (if (<(cadr P2)YMIN) (setq YMIN (cadr P2))) (if (>(cadr P2)YMAX) (setq YMAX (cadr P2))) (if (<(car P3)XMIN) (setq XMIN (car P3))) (if (>(car P3)XMAX) (setq XMAX (car P3))) (if (<(cadr P3)YMIN) (setq YMIN (cadr P3))) (if (>(cadr P3)YMAX) (setq YMAX (cadr P3))) (if (<(car P4)XMIN) (setq XMIN (car P4))) (if (>(car P4)XMAX) (setq XMAX (car P4))) (if (<(cadr P4)YMIN) (setq YMIN (cadr P4))) (if (>(cadr P4)YMAX) (setq YMAX (cadr P4))) (if (>(cdr(assoc 40 ELST))H) (setq H (cdr(assoc 40 ELST)))) (setq N (1+ N)) ) ) ((=(cdr(assoc 0 ELST))"MTEXT") (setq P1 (cdr(assoc 10 ELST)) ; Upper Left P2 (polar P1 (cdr(assoc 50 ELST)) (cdr(assoc 42 ELST))) ; Upper Right P3 (polar P2 (-(cdr(assoc 50 ELST))(/ pi 2)) (cdr(assoc 43 ELST))) ; Lower Right P4 (polar P1 (-(cdr(assoc 50 ELST))(/ pi 2)) (cdr(assoc 43 ELST))) ; Lower Left XMIN (cadr(assoc 10 ELST)) YMAX (caddr(assoc 10 ELST)) XMAX XMIN YMIN YMAX H (*(cdr (assoc 40 ELST))1.5) ) (if (<(car P2)XMIN) (setq XMIN (car P2))) (if (>(car P2)XMAX) (setq XMAX (car P2))) (if (<(cadr P2)YMIN) (setq YMIN (cadr P2))) (if (>(cadr P2)YMAX) (setq YMAX (cadr P2))) (if (<(car P3)XMIN) (setq XMIN (car P3))) (if (>(car P3)XMAX) (setq XMAX (car P3))) (if (<(cadr P3)YMIN) (setq YMIN (cadr P3))) (if (>(cadr P3)YMAX) (setq YMAX (cadr P3))) (if (<(car P4)XMIN) (setq XMIN (car P4))) (if (>(car P4)XMAX) (setq XMAX (car P4))) (if (<(cadr P4)YMIN) (setq YMIN (cadr P4))) (if (>(cadr P4)YMAX) (setq YMAX (cadr P4))) ) ) (list (list XMIN YMIN) (list XMAX YMAX) H) )