;;  OneMtext.lsp [command names: 1MT0, 1MT1, 1MT2]
;;  Based on Joe Burke from AutoCAD Customization 04-17-2009,
;;  Edited/expanded by Kent Cooper, last edited 5 August 2011
;;  The order of selection determines the result.
;;  Puts successive objects' content after first-selected object's content;
;;    number at end of command name = number of Enters between
;;    contents of each object [see comments at command definitions].
;;  The first Mtext/Text object selected is modified; others are deleted.
;;  If first object is Mtext, its defined width is retained.  If first object is
;;    Text and any others are Mtext with non-zero width, result takes on
;;    width of widest of those, to minimize effect on formatting.

(defun C:1MT0 (); all in one paragraph -- 1 space between, no Enter
  (1MT " "); Space for 'break' argument in 1MT
  (princ)
)
(defun C:1MT1 (); new paragraph for each object's content -- 1 Enter
  (1MT "\\P"); Enter for 'break' argument in 1MT
  (princ)
)
(defun C:1MT2 (); blank line & new paragraph for each object's content -- 2 Enters
  (1MT "\\P\\P"); 2 Enters for 'break' argument in 1MT
  (princ)
)

(defun 1MT (break / *error* done e lst obj wid str)
  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg))
    ); end if
    (command "_.regen" "_.undo" "_end")
    (setvar 'cmdecho cmde)
    (princ)
  ); end defun - *error*
  (vl-load-com)
  (setq cmde (getvar 'cmdecho))
  (setvar 'cmdecho 0)
  (command "_.undo" "_begin")
  (while (not done)
    (setvar 'errno 0)
    (setq e (car (entsel "\nSelect Text/Mtext to join: ")))
    (if
      (and
        (= (getvar 'errno) 0); picked something
        (wcmatch (cdr (assoc 0 (entget e))) "TEXT,MTEXT")
      ); end and
      (progn ; then
        (if (not (member (vlax-ename->vla-object e) lst))
          (setq lst (cons (vlax-ename->vla-object e) lst))
        ); end if
        (redraw e 3)
      ); end progn
      (if (= (getvar 'errno) 52); else -- if Enter/space
        (setq done T); then
        (prompt "\nNothing selected --"); else -- 'errno = 7
      ); end inner if
    ); end outer if
  ); end while
  (setq obj (last lst))
  (if (= (substr (vla-get-ObjectName obj) 5) "Text")
    ; first selected object is Text, not Mtext
    (progn; then
      (setq wid
        (apply 'max ; widest selected Mtext, if any
          (mapcar 'vla-get-Width
            (vl-remove-if
              '(lambda (x) (= (vla-get-ObjectName x) "AcDbText"))
              lst
            ); end vl-remove-if
          ); end mapcar
        ); end max
      ); end setq
      (command "_.txt2mtxt" (vlax-vla-object->ename obj) "")
      (setq obj (vlax-ename->vla-object (entlast)))
      (if (> wid 0) (vla-put-Width obj wid))
        ; only if there is Mtext with non-zero width among selection
    ); end progn
  ); end if -- first object Text [no else -- do nothing if Mtext]
  (setq str (vla-get-TextString obj))
  (foreach x (cdr (reverse lst))
    (setq str (strcat str break (vla-get-TextString x))); 'break' = intermediary Space/Enter(s)
    (vla-delete x)
  ); end foreach
  (vla-put-TextString obj str)
  (vla-put-LineSpacingStyle obj 2); Exactly
  (command "_.undo" "_end")
  (setvar 'cmdecho cmde)
  (prompt "\nType 1MT0/1MT1/1MT2 to join multiple Mtext and Text objects into One Mtext object.")
  (princ)
); end defun
