把刚才发的程序改动一下就可以了。 - (defun c:wzbz (/ oldosmode pt1 te_1 te_2
- obj_number_list tename txtlist e1
- e2 n texthb pthb ent
- ent1 tetbox tc col textpt1
- textpt3 plin_p1 plin_p3 rectang_point_list
- )
- (setq oldosmode (getvar "osmode"))
- (setvar "osmode" 0)
- (prompt "\n文字合并")
- (while (setq pt1 (getpoint "\n请框选文字对象-->"))
- (setq pt2 (getcorner pt1 "\n请框选文字对象-->"))
- (setq te_1 (ssget "c" pt1 pt2 '((0 . "TEXT"))))
- (setq te_2 (ssget "c" pt1 pt2 '((0 . "MTEXT"))))
- ;;合并选择集
- (if (/= te_2 nil)
- (while (setq mtextname (ssname te_2 0))
- (setq te_1 (ssadd mtextname te_1))
- (setq te_2 (ssdel mtextname te_2))
- )
- )
- ;;生成一表,对象按X坐标由大到小排列
- (setq obj_number_list '())
- (while (setq tename (ssname te_1 0))
- (setq txtpoint (cdr (assoc 10 (entget tename))))
- ;;构造点坐标文字名称表
- (setq txtlist (cons txtpoint tename))
- (setq obj_number_list (cons txtlist obj_number_list))
- (setq te_1 (ssdel tename te_1))
- )
- ;;对obj_number_list按X坐标由小到大排序
- (setq obj_number_list
- (vl-sort obj_number_list
- (function (lambda (e1 e2)
- (> (caar e1) (caar e2))
- )
- )
- )
- )
- ;;循环取表元素,合并文字
- (setq n 0
- texthb ""
- )
- (repeat (length obj_number_list)
- (setq texthb
- (strcat
- (cdr (assoc 1 (entget (cdr (nth n obj_number_list)))))
- texthb
- )
- )
- (setq n (1+ n))
- )
- ;;取第一文字坐标
- (setq pthb (caar (reverse obj_number_list)))
- ;;删除其它文字
- (setq obj_number_list1 (cdr (reverse obj_number_list)))
- (foreach n obj_number_list1
- (command "erase" (cdr n) "")
- )
- ;;修改第一个文字
- (setq ent (cdar (reverse obj_number_list)))
- (setq ent1 (entget ent))
- (setq ent1 (subst (cons 1 texthb) (assoc 1 ent1) ent1))
- (entmod ent1)
- (command "move" (entlast) "" pthb pause)
- )
- (PRINC)
- )
|