明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8717|回复: 22

[已解答] Text转Mtext

  [复制链接]
发表于 2014-1-27 18:56 来自手机 | 显示全部楼层 |阅读模式
30明经币
本帖最后由 自贡黄明儒 于 2014-1-27 18:57 编辑

我希望—个单行文本对象,转成多行文字,转换后看起来位置基本不变。原来在论坛上看到过,今天搜了半天也没找到,请各位高人邦—下忙,币不多,是个意思

最佳答案

查看完整内容

觉得TENT开始的数据要反过来,这样在后面再次颠倒时才正确。 MTEXT的插入点在左上角,这可以用函数计算出来。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-1-27 18:56 | 显示全部楼层
觉得TENT开始的数据要反过来,这样在后面再次颠倒时才正确。
MTEXT的插入点在左上角,这可以用函数计算出来。

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-1-27 19:41 | 显示全部楼层
(defun c:tt(/ s1 t2 sstoes p b l);;用了自贡黄明儒的通用排序函数
  (defun SstoEs(ss / a en lst)
    (if ss(progn(setq a -1)
      (while(setq en(ssname ss(setq a(1+ a))))(setq lst (cons en lst)))))
    lst);defun end
  (defun ssPtsSort(ssPts KEY FUZZ / E EN FUN LST N SORTPTS SORTSS);;by自贡黄明儒 2013年9月9日
    (defun sortpts (PTS FUN xyz FUZZ)
      (vl-sort pts'(lambda (a b)(if(not(equal(xyz a)(xyz b)fuzz))(fun(xyz a)(xyz b)))))
      )
  (defun sortpts1 (PTS KEY FUZZ)
    (setq Key (vl-string->list Key))
     (foreach xyz (reverse Key)
       (cond ((< xyz 100)
              (setq fun >
                    xyz(nth(- xyz 88)(list car cadr caddr))))
             (T(setq fun <
                     xyz(nth(- xyz 120)(list car cadr caddr)))))
       (setq Pts(sortpts Pts fun xyz fuzz)))
    )
    (cond((=(type ssPts)'PICKSET)
          (repeat(setq n(sslength ssPts))
            (if(and(setq e(ssname ssPts(setq n(1- n))))
                   (setq en(entget e)))
              (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))))
          (mapcar 'last (sortpts1 lst KEY FUZZ)))
         ((Listp ssPts)(cond ((vl-consp (car ssPts)) (sortpts1 ssPts KEY FUZZ))
                             ((= (type (car ssPts)) 'ENAME)
                              (foreach e ssPts(if(setq en(entget e))(setq lst(cons(append(cdr(assoc 10 en))(list e))lst))))
                              (mapcar'last(sortpts1 lst KEY FUZZ)))))
         )
    );defun end
  (prompt "请选择要合并为多行文本的单行文字对象")
  (setq s1(SstoEs(ssget'((0 . "TEXT"))))T2"")
  (if s1(progn
    (setq s1 (ssPtsSort s1 "Yx" 0.5)
          b(entget(car s1))
          t2(cdr(assoc 1 b))l 1)
    (foreach a(cdr s1)(setq c(cdr(assoc 1(entget a)))l(if(>(strlen c)l)(strlen c)l)t2(strcat t2"\\P"c)))
    (while(null(setq p(getpoint"指定多行文本左上角点"))))
    (entmake(list(cons 0 "MTEXT")(cons 100 "AcDbEntity")(cons 100  "AcDbMText")(cons 10 P)(assoc 40 b)
           (cons 41 (* l (cdr(assoc 40 b))))(cons 1 t2)(assoc 7 b)(cons 71 1)(cons 73 1)))))
  )

点评

可不可以帮修成在程序运行后将原选中文本删除!  发表于 2015-9-6 23:07
黄总,可以改成不分大小写的排序吗?!  发表于 2015-7-22 10:09

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-1-27 19:45 | 显示全部楼层
l楼主是高手,这个问题应该难不倒楼主,我想楼主是会编的。
回复

使用道具 举报

 楼主| 发表于 2014-1-27 19:59 来自手机 | 显示全部楼层
香田里浪人 发表于 2014-1-27 19:45
l楼主是高手,这个问题应该难不倒楼主,我想楼主是会编的。

你的是多个Text,太复杂了,我希望是—个
回复

使用道具 举报

发表于 2014-1-27 20:20 | 显示全部楼层
希望有用。
  1. ;;; Add MText to drawing
  2. ;;; #InsertionPoint - MText insertion point
  3. ;;; #String - String to place in created MText object
  4. ;;; #Width - Width of MText object (if nil, will be 0 width)
  5. ;;; #Layer - Layer to place Mtext object on (nil for current)
  6. ;;; #Justification - Justification # for Mtext object
  7. ;;;                     1 or nil= TopLeft
  8. ;;;                     2= TopCenter
  9. ;;;                     3= TopRight
  10. ;;;                     4= MiddleLeft
  11. ;;;                     5= MiddleCenter
  12. ;;;                     6= MiddleRight
  13. ;;;                     7= BottomLeft
  14. ;;;                     8= BottomCenter
  15. ;;;                     9= BottomRight
  16. ;;; Alan J. Thompson, 05.23.09
  17. (defun AT:MText (#InsertionPoint #String #Width #Layer #Justification / #Width
  18.                  #Space #Insertion #Object
  19.                 )
  20.   (or #Width (setq #Width 0))
  21.   (or *AcadDoc*
  22.       (setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object)))
  23.   ) ;_ or
  24.   (setq #Space     (if (or (eq acmodelspace
  25.                                (vla-get-activespace *AcadDoc*)
  26.                            ) ;_ eq
  27.                            (eq :vlax-true (vla-get-mspace *AcadDoc*))
  28.                        ) ;_ or
  29.                      (vla-get-modelspace *AcadDoc*)
  30.                      (vla-get-paperspace *AcadDoc*)
  31.                    ) ;_ if
  32.         #Insertion (cond
  33.                      ((vl-consp #InsertionPoint) (vlax-3d-point #InsertionPoint))
  34.                      ((eq (type #InsertionPoint) 'variant) #InsertionPoint)
  35.                      (T nil)
  36.                    ) ;_ cond
  37.   ) ;_ setq
  38.   ;; create MText object
  39.   (setq #Object (vla-addmtext #Space #Insertion #Width #String))
  40.   ;; change layer, if applicable
  41.   (and #Layer
  42.        (tblsearch "layer" #Layer)
  43.        (vla-put-layer #Object #Layer)
  44.   ) ;_ and
  45.   ;; change justification & match insertion point with new justification
  46.   (cond ((member #Justification (list 1 2 3 4 5 6 7 8 9))
  47.          (vla-put-attachmentpoint #Object #Justification)
  48.          (vla-move #Object
  49.                    (vla-get-InsertionPoint #Object)
  50.                    #Insertion
  51.          ) ;_ vla-move
  52.         )
  53.   ) ;_ cond
  54.   #Object
  55. ) ;_ defun
回复

使用道具 举报

 楼主| 发表于 2014-1-27 21:22 来自手机 | 显示全部楼层
香田里浪人 发表于 2014-1-27 19:45
l楼主是高手,这个问题应该难不倒楼主,我想楼主是会编的。

高手实不敢当。我只不过熟读唐诗三百首而已。你最后贴的代码在手机上看不见,明天好好学习—下。对MText控制点我还不熟习
回复

使用道具 举报

发表于 2014-1-27 21:58 | 显示全部楼层
大大好,小弟有个思路不知是否可行:
首先,替换组码肯定是行不通了,那么只好创建了。
通过组码表找到需要转换的单行文字的内容、样式、大小等等,然后通过程序取得“MTEXT”的entmake最少关键元素(只有三个,肯定不够完善),比如插入点就没有,至于大大说的位置不能变,小弟的想法是:创建多行文字默认的插入点是左上方,而单行文字的插入点是左下方,所以必须修改多行文字插入点的位置,也就是71这个组码,默认的是(71 . 1)这是左上,需要修改成(71 . 7)变成左下,最后加上创建多行文字的关键元素,以及字高,样式……等等创建,最最后,用(detdel 图元名)删除那个单行文字,完毕!
    额......   以上就是小弟愚见,还望大大莫笑,各位看官莫笑!

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-1-27 22:24 来自手机 | 显示全部楼层
重慶崽兒 发表于 2014-1-27 21:58
大大好,小弟有个思路不知是否可行:
首先,替换组码肯定是行不通了,那么只好创建了。
通过组码表找到需 ...

谢谢,分析得透彻,赞
回复

使用道具 举报

 楼主| 发表于 2014-1-28 07:57 | 显示全部楼层
重慶崽兒 发表于 2014-1-27 21:58
大大好,小弟有个思路不知是否可行:
首先,替换组码肯定是行不通了,那么只好创建了。
通过组码表找到需 ...

这是我昨天写的,有点问题
  1. ;;单行文字变多行文字
  2. (defun text2mtext (e / EN ILIST TENT)
  3.   (setq en (entget e))
  4.   (Setq TENT '((0 . "MTEXT")(100 . "AcDbMText")))
  5.   (ForEach INUM        '(7 8 10 40 41 71 72 1 7 11 42 43 50 73)
  6.     (If        (Setq ILIST (Assoc INUM en))
  7.       (Setq TENT (Cons ILIST TENT))
  8.     )
  9.   )  
  10.   (entdel e)
  11.   (EntMake (Reverse TENT))
  12. )
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 17:51 , Processed in 0.195407 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表